All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: Vandana Kannan <vandana.kannan@intel.com>,
	intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH] drm/i915/bxt: BLC implementation
Date: Tue, 05 May 2015 14:33:39 +0300	[thread overview]
Message-ID: <87sibb6yy4.fsf@intel.com> (raw)
In-Reply-To: <1430817716-5552-1-git-send-email-vandana.kannan@intel.com>

On Tue, 05 May 2015, Vandana Kannan <vandana.kannan@intel.com> wrote:
> Enabling BLC on BXT.
> Includes register definition, and new functions for BXT.
>
> In BXT, there are 2 sets of registers for BLC. Until there is clarity
> about which set would be effective, set 1 is being used.
> This would have to be re-visited if there is any change or when 2 LFPs are
> enabled on BXT.
>
> This patch enables brightness change which would be effected by use of
> hot-keys or sysfs entry.
>
> TODO:- BLC implementation will have to re-visited when
> 1. there is clarity about which set of registers has to be used and when.
> 2. CDCLK frequency is changed
>
> v2: Jani's review comments
> 	- Modified comment in i915_reg.h
> 	- Renamed register defintions
> 	- Removed definition of duty cycle max. Not required now and its not 64-bit.
>
> v3:
>   - Rebase on top of VLV/CHV backlight changes, in particuliar
>     bxt_set_backlight() now has a different prototype (Damien)
>
> Reviewed-by: Jani Nikula <jani.nikula@intel.com>

Yup.


> Signed-off-by: Vandana Kannan <vandana.kannan@intel.com>
> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
> Cc: Jani Nikula <jani.nikula@linux.intel.com>
> Cc: Shankar, Uma <uma.shankar@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_reg.h    | 12 ++++++
>  drivers/gpu/drm/i915/intel_panel.c | 87 +++++++++++++++++++++++++++++++++++++-
>  2 files changed, 98 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 36805b6..9d79e17 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3480,6 +3480,18 @@ enum skl_disp_power_wells {
>  #define UTIL_PIN_CTL		0x48400
>  #define   UTIL_PIN_ENABLE	(1 << 31)
>  
> +/* BXT backlight register definition. */
> +#define BXT_BLC_PWM_CTL1			0xC8250
> +#define   BXT_BLC_PWM_ENABLE			(1 << 31)
> +#define   BXT_BLC_PWM_POLARITY			(1 << 29)
> +#define BXT_BLC_PWM_FREQ1			0xC8254
> +#define BXT_BLC_PWM_DUTY1			0xC8258
> +
> +#define BXT_BLC_PWM_CTL2			0xC8350
> +#define BXT_BLC_PWM_FREQ2			0xC8354
> +#define BXT_BLC_PWM_DUTY2			0xC8358
> +
> +
>  #define PCH_GTC_CTL		0xe7000
>  #define   PCH_GTC_ENABLE	(1 << 31)
>  
> diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
> index d8686ce..06d0953 100644
> --- a/drivers/gpu/drm/i915/intel_panel.c
> +++ b/drivers/gpu/drm/i915/intel_panel.c
> @@ -535,6 +535,14 @@ static u32 vlv_get_backlight(struct intel_connector *connector)
>  	return _vlv_get_backlight(dev, pipe);
>  }
>  
> +static u32 bxt_get_backlight(struct intel_connector *connector)
> +{
> +	struct drm_device *dev = connector->base.dev;
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +
> +	return I915_READ(BXT_BLC_PWM_DUTY1);
> +}
> +
>  static u32 intel_panel_get_backlight(struct intel_connector *connector)
>  {
>  	struct drm_device *dev = connector->base.dev;
> @@ -615,6 +623,14 @@ static void vlv_set_backlight(struct intel_connector *connector, u32 level)
>  	I915_WRITE(VLV_BLC_PWM_CTL(pipe), tmp | level);
>  }
>  
> +static void bxt_set_backlight(struct intel_connector *connector, u32 level)
> +{
> +	struct drm_device *dev = connector->base.dev;
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +
> +	I915_WRITE(BXT_BLC_PWM_DUTY1, level);
> +}
> +
>  static void
>  intel_panel_actually_set_backlight(struct intel_connector *connector, u32 level)
>  {
> @@ -740,6 +756,18 @@ static void vlv_disable_backlight(struct intel_connector *connector)
>  	I915_WRITE(VLV_BLC_PWM_CTL2(pipe), tmp & ~BLM_PWM_ENABLE);
>  }
>  
> +static void bxt_disable_backlight(struct intel_connector *connector)
> +{
> +	struct drm_device *dev = connector->base.dev;
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +	u32 tmp;
> +
> +	intel_panel_actually_set_backlight(connector, 0);
> +
> +	tmp = I915_READ(BXT_BLC_PWM_CTL1);
> +	I915_WRITE(BXT_BLC_PWM_CTL1, tmp & ~BXT_BLC_PWM_ENABLE);
> +}
> +
>  void intel_panel_disable_backlight(struct intel_connector *connector)
>  {
>  	struct drm_device *dev = connector->base.dev;
> @@ -946,6 +974,33 @@ static void vlv_enable_backlight(struct intel_connector *connector)
>  	I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2 | BLM_PWM_ENABLE);
>  }
>  
> +static void bxt_enable_backlight(struct intel_connector *connector)
> +{
> +	struct drm_device *dev = connector->base.dev;
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +	struct intel_panel *panel = &connector->panel;
> +	u32 pwm_ctl;
> +
> +	pwm_ctl = I915_READ(BXT_BLC_PWM_CTL1);
> +	if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
> +		DRM_DEBUG_KMS("backlight already enabled\n");
> +		pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
> +		I915_WRITE(BXT_BLC_PWM_CTL1, pwm_ctl);
> +	}
> +
> +	I915_WRITE(BXT_BLC_PWM_FREQ1, panel->backlight.max);
> +
> +	intel_panel_actually_set_backlight(connector, panel->backlight.level);
> +
> +	pwm_ctl = 0;
> +	if (panel->backlight.active_low_pwm)
> +		pwm_ctl |= BXT_BLC_PWM_POLARITY;
> +
> +	I915_WRITE(BXT_BLC_PWM_CTL1, pwm_ctl);
> +	POSTING_READ(BXT_BLC_PWM_CTL1);
> +	I915_WRITE(BXT_BLC_PWM_CTL1, pwm_ctl | BXT_BLC_PWM_ENABLE);
> +}
> +
>  void intel_panel_enable_backlight(struct intel_connector *connector)
>  {
>  	struct drm_device *dev = connector->base.dev;
> @@ -1298,6 +1353,30 @@ static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe
>  	return 0;
>  }
>  
> +static int
> +bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
> +{
> +	struct drm_device *dev = connector->base.dev;
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +	struct intel_panel *panel = &connector->panel;
> +	u32 pwm_ctl, val;
> +
> +	pwm_ctl = I915_READ(BXT_BLC_PWM_CTL1);
> +	panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
> +
> +	panel->backlight.max = I915_READ(BXT_BLC_PWM_FREQ1);
> +	if (!panel->backlight.max)
> +		return -ENODEV;
> +
> +	val = bxt_get_backlight(connector);
> +	panel->backlight.level = intel_panel_compute_brightness(connector, val);
> +
> +	panel->backlight.enabled = (pwm_ctl & BXT_BLC_PWM_ENABLE) &&
> +		panel->backlight.level != 0;
> +
> +	return 0;
> +}
> +
>  int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
>  {
>  	struct drm_device *dev = connector->dev;
> @@ -1349,7 +1428,13 @@ void intel_panel_init_backlight_funcs(struct drm_device *dev)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  
> -	if (IS_BROADWELL(dev) || (INTEL_INFO(dev)->gen >= 9)) {
> +	if (IS_BROXTON(dev)) {
> +		dev_priv->display.setup_backlight = bxt_setup_backlight;
> +		dev_priv->display.enable_backlight = bxt_enable_backlight;
> +		dev_priv->display.disable_backlight = bxt_disable_backlight;
> +		dev_priv->display.set_backlight = bxt_set_backlight;
> +		dev_priv->display.get_backlight = bxt_get_backlight;
> +	} else if (IS_BROADWELL(dev) || IS_SKYLAKE(dev)) {
>  		dev_priv->display.setup_backlight = bdw_setup_backlight;
>  		dev_priv->display.enable_backlight = bdw_enable_backlight;
>  		dev_priv->display.disable_backlight = pch_disable_backlight;
> -- 
> 2.0.1
>

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2015-05-05 11:32 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-05  9:21 [PATCH] drm/i915/bxt: BLC implementation Vandana Kannan
2015-05-05 11:33 ` Jani Nikula [this message]
2015-05-06 11:17   ` Daniel Vetter
2015-05-05 14:30 ` shuang.he

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87sibb6yy4.fsf@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=vandana.kannan@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.