From: achew@nvidia.com (Andrew Chew)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V4 9/9] pwm_bl: Add mandatory backlight enable regulator
Date: Tue, 19 Mar 2013 11:59:33 -0700 [thread overview]
Message-ID: <1363719573-20926-10-git-send-email-achew@nvidia.com> (raw)
In-Reply-To: <1363719573-20926-1-git-send-email-achew@nvidia.com>
Many backlights need to be explicitly enabled. Typically, this is done
with a GPIO. For flexibility, we generalize the enable mechanism to a
regulator.
If an enable regulator is not needed, then a dummy regulator can be given
to the backlight driver. If a GPIO is used to enable the backlight,
then a fixed regulator can be instantiated to control the GPIO.
The backlight enable regulator can be specified in the device tree node
for the backlight, or can be done with legacy board setup code in the
usual way.
Signed-off-by: Andrew Chew <achew@nvidia.com>
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
Tested-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
.../bindings/video/backlight/pwm-backlight.txt | 14 +++++
drivers/video/backlight/pwm_bl.c | 59 ++++++++++++++++++----
2 files changed, 63 insertions(+), 10 deletions(-)
diff --git a/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt b/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt
index 1e4fc72..7e2e089 100644
--- a/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt
+++ b/Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt
@@ -10,6 +10,11 @@ Required properties:
last value in the array represents a 100% duty cycle (brightest).
- default-brightness-level: the default brightness level (index into the
array defined by the "brightness-levels" property)
+ - enable-supply: A phandle to the regulator device tree node. This
+ regulator will be turned on and off as the pwm is enabled and disabled.
+ Many backlights are enabled via a GPIO. In this case, we instantiate
+ a fixed regulator and give that to enable-supply. If a regulator
+ is not needed, then provide a dummy fixed regulator.
Optional properties:
- pwm-names: a list of names for the PWM devices specified in the
@@ -19,10 +24,19 @@ Optional properties:
Example:
+ bl_en: fixed-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "bl-en-supply";
+ regulator-boot-on;
+ gpio = <&some_gpio>;
+ enable-active-high;
+ };
+
backlight {
compatible = "pwm-backlight";
pwms = <&pwm 0 5000000>;
brightness-levels = <0 4 8 16 32 64 128 255>;
default-brightness-level = <6>;
+ enable-supply = <&bl_en>;
};
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
index 1fea627..e4922f5 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/regulator/consumer.h>
struct pwm_bl_data {
struct pwm_device *pwm;
struct device *dev;
+ bool enabled;
+ struct regulator *enable_supply;
unsigned int period;
unsigned int lth_brightness;
unsigned int *levels;
@@ -35,6 +38,42 @@ struct pwm_bl_data {
void (*exit)(struct device *);
};
+static void pwm_backlight_enable(struct backlight_device *bl)
+{
+ struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev);
+ int ret;
+
+ /* Bail if we are already enabled. */
+ if (pb->enabled)
+ return;
+
+ pwm_enable(pb->pwm);
+
+ ret = regulator_enable(pb->enable_supply);
+ if (ret)
+ dev_warn(&bl->dev, "Failed to enable regulator: %d", ret);
+
+ pb->enabled = true;
+}
+
+static void pwm_backlight_disable(struct backlight_device *bl)
+{
+ struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev);
+ int ret;
+
+ /* Bail if we are already disabled. */
+ if (!pb->enabled)
+ return;
+
+ ret = regulator_disable(pb->enable_supply);
+ if (ret)
+ dev_warn(&bl->dev, "Failed to disable regulator: %d", ret);
+
+ pwm_disable(pb->pwm);
+
+ pb->enabled = false;
+}
+
static int pwm_backlight_update_status(struct backlight_device *bl)
{
struct pwm_bl_data *pb = bl_get_data(bl);
@@ -51,7 +90,7 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
if (brightness == 0) {
pwm_config(pb->pwm, 0, pb->period);
- pwm_disable(pb->pwm);
+ pwm_backlight_disable(bl);
} else {
int duty_cycle;
@@ -65,7 +104,7 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
duty_cycle = pb->lth_brightness +
(duty_cycle * (pb->period - pb->lth_brightness) / max);
pwm_config(pb->pwm, duty_cycle, pb->period);
- pwm_enable(pb->pwm);
+ pwm_backlight_enable(bl);
}
if (pb->notify_after)
@@ -138,12 +177,6 @@ static int pwm_backlight_parse_dt(struct device *dev,
data->max_brightness--;
}
- /*
- * TODO: Most users of this driver use a number of GPIOs to control
- * backlight power. Support for specifying these needs to be
- * added.
- */
-
return 0;
}
@@ -206,6 +239,12 @@ static int pwm_backlight_probe(struct platform_device *pdev)
pb->exit = data->exit;
pb->dev = &pdev->dev;
+ pb->enable_supply = devm_regulator_get(&pdev->dev, "enable");
+ if (IS_ERR(pb->enable_supply)) {
+ ret = PTR_ERR(pb->enable_supply);
+ 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");
@@ -268,7 +307,7 @@ static int pwm_backlight_remove(struct platform_device *pdev)
backlight_device_unregister(bl);
pwm_config(pb->pwm, 0, pb->period);
- pwm_disable(pb->pwm);
+ pwm_backlight_disable(bl);
if (pb->exit)
pb->exit(&pdev->dev);
return 0;
@@ -283,7 +322,7 @@ static int pwm_backlight_suspend(struct device *dev)
if (pb->notify)
pb->notify(pb->dev, 0);
pwm_config(pb->pwm, 0, pb->period);
- pwm_disable(pb->pwm);
+ pwm_backlight_disable(bl);
if (pb->notify_after)
pb->notify_after(pb->dev, 0);
return 0;
--
1.8.1.5
next prev parent reply other threads:[~2013-03-19 18:59 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-19 18:59 [PATCH V4 0/9] Add mandatory regulator for all users of pwm-backlight Andrew Chew
2013-03-19 18:59 ` [PATCH V4 1/9] ARM: OMAP: board-4430sdp: Provide regulator to pwm-backlight Andrew Chew
2013-03-19 18:59 ` [PATCH V4 2/9] ARM: S3C24XX: " Andrew Chew
2013-03-19 18:59 ` [PATCH V4 3/9] ARM: pxa: " Andrew Chew
2013-03-19 18:59 ` [PATCH V4 4/9] ARM: EXYNOS: " Andrew Chew
2013-03-19 18:59 ` [PATCH V4 5/9] unicore32: " Andrew Chew
2013-03-19 18:59 ` [PATCH V4 6/9] ARM: mxs: " Andrew Chew
2013-03-19 21:27 ` Marek Vasut
2013-03-19 21:31 ` Andrew Chew
2013-03-19 21:35 ` Marek Vasut
2013-03-19 22:10 ` Stephen Warren
2013-03-20 8:23 ` Mark Brown
2013-03-20 14:03 ` Marek Vasut
2013-03-20 3:13 ` Shawn Guo
2013-03-19 18:59 ` [PATCH V4 7/9] ARM: vt8500: " Andrew Chew
2013-03-20 18:18 ` [Bulk] " Tony Prisk
2013-03-19 18:59 ` [PATCH V4 8/9] ARM: tegra: " Andrew Chew
2013-03-21 20:01 ` Stephen Warren
2013-03-22 10:29 ` Thierry Reding
2013-03-19 18:59 ` Andrew Chew [this message]
2013-03-20 18:00 ` [PATCH V4 9/9] pwm_bl: Add mandatory backlight enable regulator Stephen Warren
2013-03-20 22:19 ` Thierry Reding
2013-03-20 2:14 ` [PATCH V4 0/9] Add mandatory regulator for all users of pwm-backlight Shawn Guo
2013-03-20 2:24 ` Alex Courbot
2013-03-20 3:08 ` Shawn Guo
2013-03-20 7:13 ` Tony Prisk
2013-03-22 1:57 ` Alex Courbot
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=1363719573-20926-10-git-send-email-achew@nvidia.com \
--to=achew@nvidia.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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;
as well as URLs for NNTP newsgroup(s).