diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 76 | 
1 files changed, 75 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index a06ff07a4d3..a9e0c7bcd31 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -83,11 +83,15 @@ intel_pch_panel_fitting(struct drm_device *dev,  			u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay;  			if (scaled_width > scaled_height) { /* pillar */  				width = scaled_height / mode->vdisplay; +				if (width & 1) +				    	width++;  				x = (adjusted_mode->hdisplay - width + 1) / 2;  				y = 0;  				height = adjusted_mode->vdisplay;  			} else if (scaled_width < scaled_height) { /* letter */  				height = scaled_width / mode->hdisplay; +				if (height & 1) +				    height++;  				y = (adjusted_mode->vdisplay - height + 1) / 2;  				x = 0;  				width = adjusted_mode->hdisplay; @@ -273,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; @@ -305,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  |