diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 72 | 
1 files changed, 71 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 05f500cd9c2..a9e0c7bcd31 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -277,7 +277,7 @@ void intel_panel_enable_backlight(struct drm_device *dev)  	dev_priv->backlight_enabled = true;  } -void intel_panel_setup_backlight(struct drm_device *dev) +static void intel_panel_init_backlight(struct drm_device *dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; @@ -309,3 +309,73 @@ intel_panel_detect(struct drm_device *dev)  	return connector_status_unknown;  } + +#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE +static int intel_panel_update_status(struct backlight_device *bd) +{ +	struct drm_device *dev = bl_get_data(bd); +	intel_panel_set_backlight(dev, bd->props.brightness); +	return 0; +} + +static int intel_panel_get_brightness(struct backlight_device *bd) +{ +	struct drm_device *dev = bl_get_data(bd); +	return intel_panel_get_backlight(dev); +} + +static const struct backlight_ops intel_panel_bl_ops = { +	.update_status = intel_panel_update_status, +	.get_brightness = intel_panel_get_brightness, +}; + +int intel_panel_setup_backlight(struct drm_device *dev) +{ +	struct drm_i915_private *dev_priv = dev->dev_private; +	struct backlight_properties props; +	struct drm_connector *connector; + +	intel_panel_init_backlight(dev); + +	if (dev_priv->int_lvds_connector) +		connector = dev_priv->int_lvds_connector; +	else if (dev_priv->int_edp_connector) +		connector = dev_priv->int_edp_connector; +	else +		return -ENODEV; + +	props.type = BACKLIGHT_RAW; +	props.max_brightness = intel_panel_get_max_backlight(dev); +	dev_priv->backlight = +		backlight_device_register("intel_backlight", +					  &connector->kdev, dev, +					  &intel_panel_bl_ops, &props); + +	if (IS_ERR(dev_priv->backlight)) { +		DRM_ERROR("Failed to register backlight: %ld\n", +			  PTR_ERR(dev_priv->backlight)); +		dev_priv->backlight = NULL; +		return -ENODEV; +	} +	dev_priv->backlight->props.brightness = intel_panel_get_backlight(dev); +	return 0; +} + +void intel_panel_destroy_backlight(struct drm_device *dev) +{ +	struct drm_i915_private *dev_priv = dev->dev_private; +	if (dev_priv->backlight) +		backlight_device_unregister(dev_priv->backlight); +} +#else +int intel_panel_setup_backlight(struct drm_device *dev) +{ +	intel_panel_init_backlight(dev); +	return 0; +} + +void intel_panel_destroy_backlight(struct drm_device *dev) +{ +	return; +} +#endif  |