public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Alex Courbot <acourbot@nvidia.com>
To: Thierry Reding <thierry.reding@avionic-design.de>
Cc: Andrew Chew <AChew@nvidia.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/1] pwm_bl: Add support for backlight enable GPIO
Date: Tue, 5 Mar 2013 11:59:48 +0900	[thread overview]
Message-ID: <51355FA4.1090909@nvidia.com> (raw)
In-Reply-To: <20130304224611.GB17149@avionic-0098.mockup.avionic-design.de>

On 03/05/2013 07:46 AM, Thierry Reding wrote:
> * PGP Signed by an unknown key
>
> On Mon, Mar 04, 2013 at 01:49:49PM -0800, Andrew Chew wrote:
>> The backlight enable GPIO is specified in the device tree node for
>> backlight.
>>
>> Signed-off-by: Andrew Chew <achew@nvidia.com>
>> ---
>>   .../bindings/video/backlight/pwm-backlight.txt     |    2 ++
>>   drivers/video/backlight/pwm_bl.c                   |   32 +++++++++++++++++---
>>   include/linux/pwm_backlight.h                      |    2 ++
>>   3 files changed, 32 insertions(+), 4 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt b/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt
>> index 1e4fc72..1ed4f0f 100644
>> --- a/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt
>> +++ b/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt
>> @@ -14,6 +14,8 @@ Required properties:
>>   Optional properties:
>>     - pwm-names: a list of names for the PWM devices specified in the
>>                  "pwms" property (see PWM binding[0])
>> +  - enable-gpio: a GPIO that needs to be used to enable the backlight
>> +  - enable-gpio-active-high: polarity of GPIO is active high (default is low)
>>
>>   [0]: Documentation/devicetree/bindings/pwm/pwm.txt
>>
>> diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
>> index 069983c..f29f9c7 100644
>> --- a/drivers/video/backlight/pwm_bl.c
>> +++ b/drivers/video/backlight/pwm_bl.c
>> @@ -20,10 +20,13 @@
>>   #include <linux/pwm.h>
>>   #include <linux/pwm_backlight.h>
>>   #include <linux/slab.h>
>> +#include <linux/of_gpio.h>
>>
>>   struct pwm_bl_data {
>>   	struct pwm_device	*pwm;
>>   	struct device		*dev;
>> +	int			enable_gpio;
>> +	unsigned int		enable_gpio_flags;
>>   	unsigned int		period;
>>   	unsigned int		lth_brightness;
>>   	unsigned int		*levels;
>> @@ -146,10 +149,15 @@ static int pwm_backlight_parse_dt(struct device *dev,
>>   	}
>>
>>   	/*
>> -	 * TODO: Most users of this driver use a number of GPIOs to control
>> -	 *       backlight power. Support for specifying these needs to be
>> -	 *       added.
>> +	 * If "enable-gpio" is present, use that GPIO to enable the backlight.
>> +	 * The presence (or not) of "enable-gpio-active-high" will determine
>> +	 * the value of the GPIO.
>>   	 */
>> +	data->enable_gpio = of_get_named_gpio(node, "enable-gpio", 0);
>> +	if (of_property_read_bool(node, "enable-gpio-active-high"))
>> +		data->enable_gpio_flags = GPIOF_OUT_INIT_HIGH;
>> +	else
>> +		data->enable_gpio_flags = GPIOF_OUT_INIT_LOW;
>>
>>   	return 0;
>>   }
>> @@ -207,12 +215,23 @@ static int pwm_backlight_probe(struct platform_device *pdev)
>>   	} else
>>   		max = data->max_brightness;
>>
>> +	pb->enable_gpio = data->enable_gpio;
>> +	pb->enable_gpio_flags = data->enable_gpio_flags;
>>   	pb->notify = data->notify;
>>   	pb->notify_after = data->notify_after;
>>   	pb->check_fb = data->check_fb;
>>   	pb->exit = data->exit;
>>   	pb->dev = &pdev->dev;
>>
>> +	if (gpio_is_valid(pb->enable_gpio)) {
>> +		ret = gpio_request_one(pb->enable_gpio,
>> +			GPIOF_DIR_OUT | pb->enable_gpio_flags, "bl_en");
>> +		if (ret) {
>> +			dev_err(&pdev->dev, "failed to allocate bl_en gpio");
>> +			goto err_alloc;
>> +		}
>> +	}
>> +
>>   	pb->pwm = devm_pwm_get(&pdev->dev, NULL);
>>   	if (IS_ERR(pb->pwm)) {
>>   		dev_err(&pdev->dev, "unable to request PWM, trying legacy API\n");
>> @@ -221,7 +240,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
>>   		if (IS_ERR(pb->pwm)) {
>>   			dev_err(&pdev->dev, "unable to request legacy PWM\n");
>>   			ret = PTR_ERR(pb->pwm);
>> -			goto err_alloc;
>> +			goto err_gpio;
>>   		}
>>   	}
>>
>> @@ -255,6 +274,9 @@ static int pwm_backlight_probe(struct platform_device *pdev)
>>   	platform_set_drvdata(pdev, bl);
>>   	return 0;
>>
>> +err_gpio:
>> +	if (gpio_is_valid(data->enable_gpio))
>> +		gpio_free(data->enable_gpio);
>>   err_alloc:
>>   	if (data->exit)
>>   		data->exit(&pdev->dev);
>> @@ -269,6 +291,8 @@ static int pwm_backlight_remove(struct platform_device *pdev)
>>   	backlight_device_unregister(bl);
>>   	pwm_config(pb->pwm, 0, pb->period);
>>   	pwm_disable(pb->pwm);
>> +	if (gpio_is_valid(pb->enable_gpio))
>> +		gpio_free(pb->enable_gpio);
>>   	if (pb->exit)
>>   		pb->exit(&pdev->dev);
>>   	return 0;
>> diff --git a/include/linux/pwm_backlight.h b/include/linux/pwm_backlight.h
>> index 56f4a86..2706805 100644
>> --- a/include/linux/pwm_backlight.h
>> +++ b/include/linux/pwm_backlight.h
>> @@ -8,6 +8,8 @@
>>
>>   struct platform_pwm_backlight_data {
>>   	int pwm_id;
>> +	int enable_gpio;
>> +	unsigned int enable_gpio_flags;
>>   	unsigned int max_brightness;
>>   	unsigned int dft_brightness;
>>   	unsigned int lth_brightness;
>
> Hi Andrew,
>
> I'm Cc'ing Alexandre Courbot, who has been working on supporting this in
> a more generic way using power sequences. Generally this kind of support
> really belongs in the common display framework, but I guess we could add
> this one GPIO since it really is related only to the backlight. Usually
> more than just an enable for the backlight is required so I'm not sure
> how useful this really is.
>
> Alex, any thought?

It is very common for a GPIO to be involved in powering the backlight 
on, indeed. However it seems that in this patch the GPIO is set once and 
for all during probe and never touched afterwards. This means the 
backlight is still enabled (and consuming power) even when its value is 
zero - I'd at least like to see the GPIO disabled when this is the case 
to save power. Otherwise you can achieve the same result with a 
gpio-regulator defined to be always on in the DT, without touching the 
pwm-backlight driver.

Another issue is that if the GPIO is not explicitly set to -1 in the 
platform data, probe will try to acquire GPIO 0 and will fail. This 
would break compatibility with all existing users of pwm-backlight that 
rely on platform data.

And there is also the fact that the powering of backlights is often 
slightly more complicated than just an enabling GPIO - for Ventana we 
have at least one more regulator/GPIO involved. Maybe this regulator 
could be turned on forever in the DT - then pwm-backlight could use the 
enable GPIO to save power, but I suspect we would save even more power 
if we could turn the regulator off as well.

But overall I'm not against having enable GPIO support in this driver if 
this helps getting the job done while I finish proper power-sequence 
support. Andrew, does this single patch allow you to enable the 
backlight on some boards?

Alex.

  reply	other threads:[~2013-03-05  2:56 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-04 21:49 [PATCH 1/1] pwm_bl: Add support for backlight enable GPIO Andrew Chew
2013-03-04 22:46 ` Thierry Reding
2013-03-05  2:59   ` Alex Courbot [this message]
2013-03-05  4:00     ` Andrew Chew
2013-03-05  4:40       ` Alex Courbot
2013-03-05  4:48         ` Andrew Chew
2013-03-05  4:59           ` Alex Courbot
2013-03-05  5:14             ` Alex Courbot
2013-03-05  7:03             ` Thierry Reding

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=51355FA4.1090909@nvidia.com \
    --to=acourbot@nvidia.com \
    --cc=AChew@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=thierry.reding@avionic-design.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox