aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2013-11-08 09:48:55 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-12 18:07:59 -0500
commitc91c9f32843a1b433de5a1ead4789a6bc8d3d914 (patch)
tree2e6507efadbf04e1aa7dff1526320d0cacf455f9
parent58c68779e48fa6d60b97fadc3dcac61a6c318c4c (diff)
drm/i915: make asle notifications update backlight on all connectors
ALthough usually there's only one connector that supports backlight, this also finds the correct connector. Before, we only updated the connector on pipe A, which might not be the one with backlight. (This only made a difference on BYT.) Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_opregion.c43
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c4
3 files changed, 18 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 9460e54cf140..bcb47b83787d 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -159,6 +159,7 @@ struct intel_panel {
159 159
160 /* backlight */ 160 /* backlight */
161 struct { 161 struct {
162 bool present;
162 u32 level; 163 u32 level;
163 bool enabled; 164 bool enabled;
164 struct backlight_device *device; 165 struct backlight_device *device;
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 91b68dca0641..a0b5a99204a8 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -396,13 +396,10 @@ int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
396static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) 396static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
397{ 397{
398 struct drm_i915_private *dev_priv = dev->dev_private; 398 struct drm_i915_private *dev_priv = dev->dev_private;
399 struct drm_encoder *encoder;
400 struct drm_connector *connector; 399 struct drm_connector *connector;
401 struct intel_connector *intel_connector = NULL; 400 struct intel_connector *intel_connector;
402 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[0]; 401 struct intel_panel *panel;
403 struct opregion_asle __iomem *asle = dev_priv->opregion.asle; 402 struct opregion_asle __iomem *asle = dev_priv->opregion.asle;
404 u32 ret = 0;
405 bool found = false;
406 403
407 DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp); 404 DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
408 405
@@ -414,38 +411,24 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
414 return ASLC_BACKLIGHT_FAILED; 411 return ASLC_BACKLIGHT_FAILED;
415 412
416 mutex_lock(&dev->mode_config.mutex); 413 mutex_lock(&dev->mode_config.mutex);
414
417 /* 415 /*
418 * Could match the OpRegion connector here instead, but we'd also need 416 * Update backlight on all connectors that support backlight (usually
419 * to verify the connector could handle a backlight call. 417 * only one).
420 */ 418 */
421 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
422 if (encoder->crtc == crtc) {
423 found = true;
424 break;
425 }
426
427 if (!found) {
428 ret = ASLC_BACKLIGHT_FAILED;
429 goto out;
430 }
431
432 list_for_each_entry(connector, &dev->mode_config.connector_list, head)
433 if (connector->encoder == encoder)
434 intel_connector = to_intel_connector(connector);
435
436 if (!intel_connector) {
437 ret = ASLC_BACKLIGHT_FAILED;
438 goto out;
439 }
440
441 DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp); 419 DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp);
442 intel_panel_set_backlight(intel_connector, bclp, 255); 420 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
421 intel_connector = to_intel_connector(connector);
422 panel = &intel_connector->panel;
423 if (panel->backlight.present)
424 intel_panel_set_backlight(intel_connector, bclp, 255);
425 }
443 iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv); 426 iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv);
444 427
445out:
446 mutex_unlock(&dev->mode_config.mutex); 428 mutex_unlock(&dev->mode_config.mutex);
447 429
448 return ret; 430
431 return 0;
449} 432}
450 433
451static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi) 434static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi)
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 0a4aeaf96865..c80bffc21b5b 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -844,13 +844,17 @@ int intel_panel_setup_backlight(struct drm_connector *connector)
844 844
845 intel_backlight_device_register(intel_connector); 845 intel_backlight_device_register(intel_connector);
846 846
847 panel->backlight.present = true;
848
847 return 0; 849 return 0;
848} 850}
849 851
850void intel_panel_destroy_backlight(struct drm_connector *connector) 852void intel_panel_destroy_backlight(struct drm_connector *connector)
851{ 853{
852 struct intel_connector *intel_connector = to_intel_connector(connector); 854 struct intel_connector *intel_connector = to_intel_connector(connector);
855 struct intel_panel *panel = &intel_connector->panel;
853 856
857 panel->backlight.present = false;
854 intel_backlight_device_unregister(intel_connector); 858 intel_backlight_device_unregister(intel_connector);
855} 859}
856 860