Commit c91c9f32 authored by Jani Nikula's avatar Jani Nikula Committed by Daniel Vetter

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: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarImre Deak <imre.deak@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 58c68779
...@@ -159,6 +159,7 @@ struct intel_panel { ...@@ -159,6 +159,7 @@ struct intel_panel {
/* backlight */ /* backlight */
struct { struct {
bool present;
u32 level; u32 level;
bool enabled; bool enabled;
struct backlight_device *device; struct backlight_device *device;
......
...@@ -396,13 +396,10 @@ int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state) ...@@ -396,13 +396,10 @@ int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_encoder *encoder;
struct drm_connector *connector; struct drm_connector *connector;
struct intel_connector *intel_connector = NULL; struct intel_connector *intel_connector;
struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[0]; struct intel_panel *panel;
struct opregion_asle __iomem *asle = dev_priv->opregion.asle; struct opregion_asle __iomem *asle = dev_priv->opregion.asle;
u32 ret = 0;
bool found = false;
DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp); DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
...@@ -414,38 +411,24 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) ...@@ -414,38 +411,24 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
return ASLC_BACKLIGHT_FAILED; return ASLC_BACKLIGHT_FAILED;
mutex_lock(&dev->mode_config.mutex); mutex_lock(&dev->mode_config.mutex);
/* /*
* Could match the OpRegion connector here instead, but we'd also need * Update backlight on all connectors that support backlight (usually
* to verify the connector could handle a backlight call. * only one).
*/ */
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
if (encoder->crtc == crtc) {
found = true;
break;
}
if (!found) {
ret = ASLC_BACKLIGHT_FAILED;
goto out;
}
list_for_each_entry(connector, &dev->mode_config.connector_list, head)
if (connector->encoder == encoder)
intel_connector = to_intel_connector(connector);
if (!intel_connector) {
ret = ASLC_BACKLIGHT_FAILED;
goto out;
}
DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp); DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp);
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
intel_connector = to_intel_connector(connector);
panel = &intel_connector->panel;
if (panel->backlight.present)
intel_panel_set_backlight(intel_connector, bclp, 255); intel_panel_set_backlight(intel_connector, bclp, 255);
}
iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv); iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv);
out:
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
return ret;
return 0;
} }
static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi) static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi)
......
...@@ -844,13 +844,17 @@ int intel_panel_setup_backlight(struct drm_connector *connector) ...@@ -844,13 +844,17 @@ int intel_panel_setup_backlight(struct drm_connector *connector)
intel_backlight_device_register(intel_connector); intel_backlight_device_register(intel_connector);
panel->backlight.present = true;
return 0; return 0;
} }
void intel_panel_destroy_backlight(struct drm_connector *connector) void intel_panel_destroy_backlight(struct drm_connector *connector)
{ {
struct intel_connector *intel_connector = to_intel_connector(connector); struct intel_connector *intel_connector = to_intel_connector(connector);
struct intel_panel *panel = &intel_connector->panel;
panel->backlight.present = false;
intel_backlight_device_unregister(intel_connector); intel_backlight_device_unregister(intel_connector);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment