From mboxrd@z Thu Jan 1 00:00:00 1970 From: Clint Taylor Subject: Re: [PATCH v2 2/4] drm/i915: add some framework for backlight bl_power support Date: Tue, 19 Aug 2014 16:04:07 -0700 Message-ID: <53F3D7E7.5050805@intel.com> References: <6e06bca0350ecae9b2ccd3ca25f03464f745cc36.1407849872.git.jani.nikula@intel.com> <1407921012-11374-1-git-send-email-jani.nikula@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: Received: from mga03.intel.com (mga03.intel.com [143.182.124.21]) by gabe.freedesktop.org (Postfix) with ESMTP id 79F396E670 for ; Tue, 19 Aug 2014 16:05:05 -0700 (PDT) In-Reply-To: <1407921012-11374-1-git-send-email-jani.nikula@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Jani Nikula , intel-gfx@lists.freedesktop.org Cc: rodrigo.vivi@intel.com, kevin.strasser@intel.com, jesse.barnes@intel.com List-Id: intel-gfx@lists.freedesktop.org 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 > --- > 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 Tested_by: Clinton Taylor