diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 31 |
5 files changed, 39 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index aac1bf332f75..972e08e4e054 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -332,6 +332,7 @@ typedef struct drm_i915_private { | |||
332 | 332 | ||
333 | /* LVDS info */ | 333 | /* LVDS info */ |
334 | int backlight_level; /* restore backlight to this value */ | 334 | int backlight_level; /* restore backlight to this value */ |
335 | bool backlight_enabled; | ||
335 | struct drm_display_mode *panel_fixed_mode; | 336 | struct drm_display_mode *panel_fixed_mode; |
336 | struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */ | 337 | struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */ |
337 | struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */ | 338 | struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */ |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index f4d1797350f6..bc829bbc14c8 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -5802,6 +5802,8 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
5802 | encoder->base.possible_clones = | 5802 | encoder->base.possible_clones = |
5803 | intel_encoder_clones(dev, encoder->clone_mask); | 5803 | intel_encoder_clones(dev, encoder->clone_mask); |
5804 | } | 5804 | } |
5805 | |||
5806 | intel_panel_setup_backlight(dev); | ||
5805 | } | 5807 | } |
5806 | 5808 | ||
5807 | static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb) | 5809 | static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb) |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index d782ad9fd6db..74db2557d644 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -257,6 +257,9 @@ extern void intel_pch_panel_fitting(struct drm_device *dev, | |||
257 | extern u32 intel_panel_get_max_backlight(struct drm_device *dev); | 257 | extern u32 intel_panel_get_max_backlight(struct drm_device *dev); |
258 | extern u32 intel_panel_get_backlight(struct drm_device *dev); | 258 | extern u32 intel_panel_get_backlight(struct drm_device *dev); |
259 | extern void intel_panel_set_backlight(struct drm_device *dev, u32 level); | 259 | extern void intel_panel_set_backlight(struct drm_device *dev, u32 level); |
260 | extern void intel_panel_setup_backlight(struct drm_device *dev); | ||
261 | extern void intel_panel_enable_backlight(struct drm_device *dev); | ||
262 | extern void intel_panel_disable_backlight(struct drm_device *dev); | ||
260 | 263 | ||
261 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); | 264 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); |
262 | extern void intel_encoder_prepare (struct drm_encoder *encoder); | 265 | extern void intel_encoder_prepare (struct drm_encoder *encoder); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index aa2307080be2..4e7dcb330dad 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -106,7 +106,7 @@ static void intel_lvds_enable(struct intel_lvds *intel_lvds) | |||
106 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON); | 106 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON); |
107 | POSTING_READ(lvds_reg); | 107 | POSTING_READ(lvds_reg); |
108 | 108 | ||
109 | intel_panel_set_backlight(dev, dev_priv->backlight_level); | 109 | intel_panel_enable_backlight(dev); |
110 | } | 110 | } |
111 | 111 | ||
112 | static void intel_lvds_disable(struct intel_lvds *intel_lvds) | 112 | static void intel_lvds_disable(struct intel_lvds *intel_lvds) |
@@ -123,8 +123,7 @@ static void intel_lvds_disable(struct intel_lvds *intel_lvds) | |||
123 | lvds_reg = LVDS; | 123 | lvds_reg = LVDS; |
124 | } | 124 | } |
125 | 125 | ||
126 | dev_priv->backlight_level = intel_panel_get_backlight(dev); | 126 | intel_panel_disable_backlight(dev); |
127 | intel_panel_set_backlight(dev, 0); | ||
128 | 127 | ||
129 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON); | 128 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON); |
130 | 129 | ||
@@ -398,8 +397,6 @@ static void intel_lvds_prepare(struct drm_encoder *encoder) | |||
398 | struct drm_i915_private *dev_priv = dev->dev_private; | 397 | struct drm_i915_private *dev_priv = dev->dev_private; |
399 | struct intel_lvds *intel_lvds = to_intel_lvds(encoder); | 398 | struct intel_lvds *intel_lvds = to_intel_lvds(encoder); |
400 | 399 | ||
401 | dev_priv->backlight_level = intel_panel_get_backlight(dev); | ||
402 | |||
403 | /* We try to do the minimum that is necessary in order to unlock | 400 | /* We try to do the minimum that is necessary in order to unlock |
404 | * the registers for mode setting. | 401 | * the registers for mode setting. |
405 | * | 402 | * |
@@ -430,9 +427,6 @@ static void intel_lvds_commit(struct drm_encoder *encoder) | |||
430 | struct drm_i915_private *dev_priv = dev->dev_private; | 427 | struct drm_i915_private *dev_priv = dev->dev_private; |
431 | struct intel_lvds *intel_lvds = to_intel_lvds(encoder); | 428 | struct intel_lvds *intel_lvds = to_intel_lvds(encoder); |
432 | 429 | ||
433 | if (dev_priv->backlight_level == 0) | ||
434 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); | ||
435 | |||
436 | /* Undo any unlocking done in prepare to prevent accidental | 430 | /* Undo any unlocking done in prepare to prevent accidental |
437 | * adjustment of the registers. | 431 | * adjustment of the registers. |
438 | */ | 432 | */ |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 7350ec2515c6..e00d200df3db 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -250,3 +250,34 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level) | |||
250 | tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; | 250 | tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; |
251 | I915_WRITE(BLC_PWM_CTL, tmp | level); | 251 | I915_WRITE(BLC_PWM_CTL, tmp | level); |
252 | } | 252 | } |
253 | |||
254 | void intel_panel_disable_backlight(struct drm_device *dev) | ||
255 | { | ||
256 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
257 | |||
258 | if (dev_priv->backlight_enabled) { | ||
259 | dev_priv->backlight_level = intel_panel_get_backlight(dev); | ||
260 | dev_priv->backlight_enabled = false; | ||
261 | } | ||
262 | |||
263 | intel_panel_set_backlight(dev, 0); | ||
264 | } | ||
265 | |||
266 | void intel_panel_enable_backlight(struct drm_device *dev) | ||
267 | { | ||
268 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
269 | |||
270 | if (dev_priv->backlight_level == 0) | ||
271 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); | ||
272 | |||
273 | intel_panel_set_backlight(dev, dev_priv->backlight_level); | ||
274 | dev_priv->backlight_enabled = true; | ||
275 | } | ||
276 | |||
277 | void intel_panel_setup_backlight(struct drm_device *dev) | ||
278 | { | ||
279 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
280 | |||
281 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); | ||
282 | dev_priv->backlight_enabled = dev_priv->backlight_level != 0; | ||
283 | } | ||