Re: [Intel-gfx] [PATCH v2 2/4] drm/i915: add some framework for backlight bl_power support
On 08/13/2014 02:10 AM, Jani Nikula wrote: Make backlight class sysfs bl_power a sub-state of backlight enabled, if a backlight power connector callback is defined. It's up to the connector callback to handle the sub-state, typically in a way that respects panel power sequencing. v2: Post the version that does not oops. *facepalm*. Signed-off-by: Jani Nikula jani.nik...@intel.com --- drivers/gpu/drm/i915/intel_drv.h | 2 ++ drivers/gpu/drm/i915/intel_panel.c | 26 ++ 2 files changed, 28 insertions(+) diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 1b3d1d7e466e..43b7b6609f0e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -173,6 +173,8 @@ struct intel_panel { bool active_low_pwm; struct backlight_device *device; } backlight; + + void (*backlight_power)(struct intel_connector *, bool enable); }; struct intel_connector { diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 59b028f0b1e8..af5435634929 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -751,6 +751,8 @@ void intel_panel_disable_backlight(struct intel_connector *connector) spin_lock_irqsave(dev_priv-backlight_lock, flags); + if (panel-backlight.device) + panel-backlight.device-props.power = FB_BLANK_POWERDOWN; panel-backlight.enabled = false; 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); panel-backlight.enabled = true; + if (panel-backlight.device) + panel-backlight.device-props.power = FB_BLANK_UNBLANK; 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) { struct intel_connector *connector = bl_get_data(bd); + struct intel_panel *panel = connector-panel; struct drm_device *dev = connector-base.dev; 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); intel_panel_set_backlight(connector, bd-props.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); return 0; } @@ -1023,6 +1044,11 @@ static int intel_backlight_device_register(struct intel_connector *connector) panel-backlight.level, 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 * registration of multiple backlight devices in the driver. Reviewed_by: Clinton Taylor clinton.a.tay...@intel.com Tested_by: Clinton Taylor clinton.a.tay...@intel.com ___ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx
[Intel-gfx] [PATCH v2 2/4] drm/i915: add some framework for backlight bl_power support
Make backlight class sysfs bl_power a sub-state of backlight enabled, if a backlight power connector callback is defined. It's up to the connector callback to handle the sub-state, typically in a way that respects panel power sequencing. v2: Post the version that does not oops. *facepalm*. Signed-off-by: Jani Nikula jani.nik...@intel.com --- drivers/gpu/drm/i915/intel_drv.h | 2 ++ drivers/gpu/drm/i915/intel_panel.c | 26 ++ 2 files changed, 28 insertions(+) diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 1b3d1d7e466e..43b7b6609f0e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -173,6 +173,8 @@ struct intel_panel { bool active_low_pwm; struct backlight_device *device; } backlight; + + void (*backlight_power)(struct intel_connector *, bool enable); }; struct intel_connector { diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 59b028f0b1e8..af5435634929 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -751,6 +751,8 @@ void intel_panel_disable_backlight(struct intel_connector *connector) spin_lock_irqsave(dev_priv-backlight_lock, flags); + if (panel-backlight.device) + panel-backlight.device-props.power = FB_BLANK_POWERDOWN; panel-backlight.enabled = false; 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); panel-backlight.enabled = true; + if (panel-backlight.device) + panel-backlight.device-props.power = FB_BLANK_UNBLANK; 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) { struct intel_connector *connector = bl_get_data(bd); + struct intel_panel *panel = connector-panel; struct drm_device *dev = connector-base.dev; 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); intel_panel_set_backlight(connector, bd-props.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); return 0; } @@ -1023,6 +1044,11 @@ static int intel_backlight_device_register(struct intel_connector *connector) panel-backlight.level, 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 * registration of multiple backlight devices in the driver. -- 1.9.1 ___ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx