|
@@ -751,6 +751,8 @@ void intel_panel_disable_backlight(struct intel_connector *connector)
|
|
|
|
|
|
spin_lock_irqsave(&dev_priv->backlight_lock, flags);
|
|
spin_lock_irqsave(&dev_priv->backlight_lock, flags);
|
|
|
|
|
|
|
|
+ if (panel->backlight.device)
|
|
|
|
+ panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
|
|
panel->backlight.enabled = false;
|
|
panel->backlight.enabled = false;
|
|
dev_priv->display.disable_backlight(connector);
|
|
dev_priv->display.disable_backlight(connector);
|
|
|
|
|
|
@@ -957,6 +959,8 @@ void intel_panel_enable_backlight(struct intel_connector *connector)
|
|
|
|
|
|
dev_priv->display.enable_backlight(connector);
|
|
dev_priv->display.enable_backlight(connector);
|
|
panel->backlight.enabled = true;
|
|
panel->backlight.enabled = true;
|
|
|
|
+ if (panel->backlight.device)
|
|
|
|
+ panel->backlight.device->props.power = FB_BLANK_UNBLANK;
|
|
|
|
|
|
spin_unlock_irqrestore(&dev_priv->backlight_lock, flags);
|
|
spin_unlock_irqrestore(&dev_priv->backlight_lock, flags);
|
|
}
|
|
}
|
|
@@ -965,6 +969,7 @@ void intel_panel_enable_backlight(struct intel_connector *connector)
|
|
static int intel_backlight_device_update_status(struct backlight_device *bd)
|
|
static int intel_backlight_device_update_status(struct backlight_device *bd)
|
|
{
|
|
{
|
|
struct intel_connector *connector = bl_get_data(bd);
|
|
struct intel_connector *connector = bl_get_data(bd);
|
|
|
|
+ struct intel_panel *panel = &connector->panel;
|
|
struct drm_device *dev = connector->base.dev;
|
|
struct drm_device *dev = connector->base.dev;
|
|
|
|
|
|
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
|
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
|
@@ -972,6 +977,22 @@ static int intel_backlight_device_update_status(struct backlight_device *bd)
|
|
bd->props.brightness, bd->props.max_brightness);
|
|
bd->props.brightness, bd->props.max_brightness);
|
|
intel_panel_set_backlight(connector, bd->props.brightness,
|
|
intel_panel_set_backlight(connector, bd->props.brightness,
|
|
bd->props.max_brightness);
|
|
bd->props.max_brightness);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Allow flipping bl_power as a sub-state of enabled. Sadly the
|
|
|
|
+ * backlight class device does not make it easy to to differentiate
|
|
|
|
+ * between callbacks for brightness and bl_power, so our backlight_power
|
|
|
|
+ * callback needs to take this into account.
|
|
|
|
+ */
|
|
|
|
+ if (panel->backlight.enabled) {
|
|
|
|
+ if (panel->backlight_power) {
|
|
|
|
+ bool enable = bd->props.power == FB_BLANK_UNBLANK;
|
|
|
|
+ panel->backlight_power(connector, enable);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ bd->props.power = FB_BLANK_POWERDOWN;
|
|
|
|
+ }
|
|
|
|
+
|
|
drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
|
drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -1023,6 +1044,11 @@ static int intel_backlight_device_register(struct intel_connector *connector)
|
|
panel->backlight.level,
|
|
panel->backlight.level,
|
|
props.max_brightness);
|
|
props.max_brightness);
|
|
|
|
|
|
|
|
+ if (panel->backlight.enabled)
|
|
|
|
+ props.power = FB_BLANK_UNBLANK;
|
|
|
|
+ else
|
|
|
|
+ props.power = FB_BLANK_POWERDOWN;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Note: using the same name independent of the connector prevents
|
|
* Note: using the same name independent of the connector prevents
|
|
* registration of multiple backlight devices in the driver.
|
|
* registration of multiple backlight devices in the driver.
|