diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 10c7d39034e1..e019b2369861 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -162,19 +162,12 @@ static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) | |||
162 | return val; | 162 | return val; |
163 | } | 163 | } |
164 | 164 | ||
165 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | 165 | static u32 _intel_panel_get_max_backlight(struct drm_device *dev) |
166 | { | 166 | { |
167 | struct drm_i915_private *dev_priv = dev->dev_private; | 167 | struct drm_i915_private *dev_priv = dev->dev_private; |
168 | u32 max; | 168 | u32 max; |
169 | 169 | ||
170 | max = i915_read_blc_pwm_ctl(dev_priv); | 170 | max = i915_read_blc_pwm_ctl(dev_priv); |
171 | if (max == 0) { | ||
172 | /* XXX add code here to query mode clock or hardware clock | ||
173 | * and program max PWM appropriately. | ||
174 | */ | ||
175 | pr_warn_once("fixme: max PWM is zero\n"); | ||
176 | return 1; | ||
177 | } | ||
178 | 171 | ||
179 | if (HAS_PCH_SPLIT(dev)) { | 172 | if (HAS_PCH_SPLIT(dev)) { |
180 | max >>= 16; | 173 | max >>= 16; |
@@ -188,6 +181,22 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev) | |||
188 | max *= 0xff; | 181 | max *= 0xff; |
189 | } | 182 | } |
190 | 183 | ||
184 | return max; | ||
185 | } | ||
186 | |||
187 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | ||
188 | { | ||
189 | u32 max; | ||
190 | |||
191 | max = _intel_panel_get_max_backlight(dev); | ||
192 | if (max == 0) { | ||
193 | /* XXX add code here to query mode clock or hardware clock | ||
194 | * and program max PWM appropriately. | ||
195 | */ | ||
196 | pr_warn_once("fixme: max PWM is zero\n"); | ||
197 | return 1; | ||
198 | } | ||
199 | |||
191 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); | 200 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); |
192 | return max; | 201 | return max; |
193 | } | 202 | } |
@@ -213,7 +222,7 @@ static u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val) | |||
213 | return val; | 222 | return val; |
214 | } | 223 | } |
215 | 224 | ||
216 | u32 intel_panel_get_backlight(struct drm_device *dev) | 225 | static u32 intel_panel_get_backlight(struct drm_device *dev) |
217 | { | 226 | { |
218 | struct drm_i915_private *dev_priv = dev->dev_private; | 227 | struct drm_i915_private *dev_priv = dev->dev_private; |
219 | u32 val; | 228 | u32 val; |
@@ -311,9 +320,6 @@ void intel_panel_enable_backlight(struct drm_device *dev, | |||
311 | if (dev_priv->backlight_level == 0) | 320 | if (dev_priv->backlight_level == 0) |
312 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); | 321 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); |
313 | 322 | ||
314 | dev_priv->backlight_enabled = true; | ||
315 | intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); | ||
316 | |||
317 | if (INTEL_INFO(dev)->gen >= 4) { | 323 | if (INTEL_INFO(dev)->gen >= 4) { |
318 | uint32_t reg, tmp; | 324 | uint32_t reg, tmp; |
319 | 325 | ||
@@ -326,7 +332,7 @@ void intel_panel_enable_backlight(struct drm_device *dev, | |||
326 | * we don't track the backlight dpms state, hence check whether | 332 | * we don't track the backlight dpms state, hence check whether |
327 | * we have to do anything first. */ | 333 | * we have to do anything first. */ |
328 | if (tmp & BLM_PWM_ENABLE) | 334 | if (tmp & BLM_PWM_ENABLE) |
329 | return; | 335 | goto set_level; |
330 | 336 | ||
331 | if (dev_priv->num_pipe == 3) | 337 | if (dev_priv->num_pipe == 3) |
332 | tmp &= ~BLM_PIPE_SELECT_IVB; | 338 | tmp &= ~BLM_PIPE_SELECT_IVB; |
@@ -347,6 +353,14 @@ void intel_panel_enable_backlight(struct drm_device *dev, | |||
347 | I915_WRITE(BLC_PWM_PCH_CTL1, tmp); | 353 | I915_WRITE(BLC_PWM_PCH_CTL1, tmp); |
348 | } | 354 | } |
349 | } | 355 | } |
356 | |||
357 | set_level: | ||
358 | /* Call below after setting BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1. | ||
359 | * BLC_PWM_CPU_CTL may be cleared to zero automatically when these | ||
360 | * registers are set. | ||
361 | */ | ||
362 | dev_priv->backlight_enabled = true; | ||
363 | intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); | ||
350 | } | 364 | } |
351 | 365 | ||
352 | static void intel_panel_init_backlight(struct drm_device *dev) | 366 | static void intel_panel_init_backlight(struct drm_device *dev) |
@@ -419,7 +433,11 @@ int intel_panel_setup_backlight(struct drm_device *dev) | |||
419 | 433 | ||
420 | memset(&props, 0, sizeof(props)); | 434 | memset(&props, 0, sizeof(props)); |
421 | props.type = BACKLIGHT_RAW; | 435 | props.type = BACKLIGHT_RAW; |
422 | props.max_brightness = intel_panel_get_max_backlight(dev); | 436 | props.max_brightness = _intel_panel_get_max_backlight(dev); |
437 | if (props.max_brightness == 0) { | ||
438 | DRM_ERROR("Failed to get maximum backlight value\n"); | ||
439 | return -ENODEV; | ||
440 | } | ||
423 | dev_priv->backlight = | 441 | dev_priv->backlight = |
424 | backlight_device_register("intel_backlight", | 442 | backlight_device_register("intel_backlight", |
425 | &connector->kdev, dev, | 443 | &connector->kdev, dev, |