* Re: [PATCH v5 30/46] regulator: pwm: retrieve correct voltage
From: Mark Brown @ 2016-03-30 21:24 UTC (permalink / raw)
To: Boris Brezillon
Cc: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA, Mike Turquette,
Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA, Liam Girdwood,
Kamil Debski, lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare,
Guenter Roeck, Dmitry Torokhov,
linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu, Richard Purdie,
Jacek Anaszewski, linux-leds-u79uwXL29TY76Z2rM5mHXA,
Maxime Ripard, Chen-Yu Tsai, linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
Joachim Eastwood, Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han, Lee
In-Reply-To: <1459368249-13241-31-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 451 bytes --]
On Wed, Mar 30, 2016 at 10:03:53PM +0200, Boris Brezillon wrote:
> The continuous PWM voltage regulator is caching the voltage value in
> the ->volt_uV field. While most of the time this value should reflect the
> real voltage, sometime it can be sightly different if the PWM device
> rounded the set_duty_cycle request.
> Moreover, this value is not valid until someone has modified the regulator
> output.
Acked-by: Mark Brown <broonie@kernel.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply
* Re: [PATCH v5 28/46] regulator: pwm: swith to the atomic PWM API
From: Mark Brown @ 2016-03-30 21:23 UTC (permalink / raw)
To: Boris Brezillon
Cc: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA, Mike Turquette,
Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA, Liam Girdwood,
Kamil Debski, lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare,
Guenter Roeck, Dmitry Torokhov,
linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu, Richard Purdie,
Jacek Anaszewski, linux-leds-u79uwXL29TY76Z2rM5mHXA,
Maxime Ripard, Chen-Yu Tsai, linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
Joachim Eastwood, Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han, Lee
In-Reply-To: <1459368249-13241-29-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 261 bytes --]
On Wed, Mar 30, 2016 at 10:03:51PM +0200, Boris Brezillon wrote:
> pwm_config/enable/disable() have been deprecated in favor of
> pwm_apply_state().
> Replace all those calls with the equivalent pwm_get/apply_state().
Acked-by: Mark Brown <broonie@kernel.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply
* Re: [PATCH v5 27/46] regulator: pwm: adjust PWM config at probe time
From: Mark Brown @ 2016-03-30 21:22 UTC (permalink / raw)
To: Boris Brezillon
Cc: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA, Mike Turquette,
Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA, Liam Girdwood,
Kamil Debski, lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare,
Guenter Roeck, Dmitry Torokhov,
linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu, Richard Purdie,
Jacek Anaszewski, linux-leds-u79uwXL29TY76Z2rM5mHXA,
Maxime Ripard, Chen-Yu Tsai, linux-sunxi-/JYPxA39Uh5TLH3MbocFFw,
Joachim Eastwood, Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han, Lee
In-Reply-To: <1459368249-13241-28-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 321 bytes --]
On Wed, Mar 30, 2016 at 10:03:50PM +0200, Boris Brezillon wrote:
> The PWM attached to a PWM regulator device might have been previously
> configured by the bootloader.
> Make sure the bootloader and linux config are in sync, and adjust the PWM
> config if that's not the case.
Acked-by: Mark Brown <broonie@kernel.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply
* Re: [PATCH v5 00/46] pwm: add support for atomic update
From: Boris Brezillon @ 2016-03-30 20:18 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones, linux-fbdev
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
+Doug (sorry, I forgot to add you in to the recipient list)
On Wed, 30 Mar 2016 22:03:23 +0200
Boris Brezillon <boris.brezillon@free-electrons.com> wrote:
> Hello,
>
> This series adds support for atomic PWM update, or IOW, the capability
> to update all the parameters of a PWM device (enabled/disabled, period,
> duty and polarity) in one go.
>
> It also adds support for initial PWM state retrieval (or hardware readout),
> which should allow smooth handover between the bootloader and Linux. For
> example, critical PWM users (like critical regulators controlled by a PWM)
> can query the current PWM state, and adapt the PWM config without having
> to disable/enable the PWM, or abruptly change the period/dutycyle/polarity
> config.
>
> Thierry, I hope this version meets your expectations, if that's not the
> case, could you let me know quickly so I can adjust the implementation
> accordingly (I'd really like to get most of those changes in 4.7).
Oh, I forgot to mention that I'm not necessarily expecting all those
patches to be taken in one go. We only need patches 1 to 31 for the
problem exposed by Doug. Patch 32 is deprecating the non-atomic APIs and
patches 33 to 46 are switching all PWM users to the atomic APIs to avoid
compilation warnings.
It's up to you to decide which you'd like to take.
>
> Best Regards,
>
> Boris
>
> Changes since v4:
> - introduce pwm_args to expose per-board/platform config
> - deprecate non-atomic APIs
> - implement non-atomic functions as wrappers around atomic ones
> - patch all PWM users to use the atomic API
> - rename the ->reset_state() hook into ->get_state()
> - drop most acks
> - rework PWM config in the pwm-regulator driver
> - patch sun4i and sti PWM drivers to support HW readout
>
> Changes since v3:
> - rebased on pwm/for-next after pulling 4.4-rc1
> - replace direct access to pwm fields by pwm_get/set_xxx() helpers, thus
> fixing some build errors
> - split changes to allow each maintainer to review/ack or take the
> modification through its subsystem
>
> Changes since v2:
> - rebased on top of 4.3-rc2
> - reintroduced pwm-regulator patches
>
> Changes since v1:
> - dropped applied patches
> - squashed Heiko's fixes into the rockchip driver changes
> - made a few cosmetic changes
> - added kerneldoc comments
> - added Heiko's patch to display more information in debugfs
> - dropped pwm-regulator patches (should be submitted separately)
>
> *** BLURB HERE ***
>
> Boris Brezillon (45):
> pwm: rcar: make use of pwm_is_enabled()
> backlight: pwm_bl: remove useless call to pwm_set_period()
> backlight: lm3630a_bl: stop messing with the pwm->period field
> pwm: get rid of pwm->lock
> pwm: introduce the pwm_args concept
> pwm: use pwm_get/set_xxx() helpers where appropriate
> clk: pwm: use pwm_get_args() where appropriate
> hwmon: pwm-fan: use pwm_get_args() where appropriate
> misc: max77693-haptic: use pwm_get_args() where appropriate
> leds: pwm: use pwm_get_args() where appropriate
> regulator: pwm: use pwm_get_args() where appropriate
> fbdev: ssd1307fb: use pwm_get_args() where appropriate
> backlight: pwm_bl: use pwm_get_args() where appropriate
> pwm: keep PWM state in sync with hardware state
> pwm: introduce the pwm_state concept
> pwm: move the enabled/disabled info into pwm_state
> pwm: add the PWM initial state retrieval infra
> pwm: add the core infrastructure to allow atomic update
> pwm: switch to the atomic API
> pwm: rockchip: add initial state retrieval
> pwm: rockchip: avoid glitches on already running PWMs
> pwm: rockchip: add support for atomic update
> pwm: sti: add support for initial state retrieval
> pwm: sti: avoid glitches on already running PWMs
> pwm: sun4i: implement hardware readout
> regulator: pwm: adjust PWM config at probe time
> regulator: pwm: swith to the atomic PWM API
> regulator: pwm: properly initialize the ->state field
> regulator: pwm: retrieve correct voltage
> pwm: update documentation
> pwm: deprecate pwm_config(), pwm_enable() and pwm_disable()
> pwm: replace pwm_disable() by pwm_apply_state()
> clk: pwm: switch to the atomic API
> hwmon: pwm-fan: switch to the atomic API
> input: misc: max77693: switch to the atomic API
> input: misc: max8997: switch to the atomic PWM API
> input: misc: pwm-beeper: switch to the atomic PWM API
> leds: pwm: switch to the atomic PWM API
> backlight: lm3630a: switch to the atomic PWM API
> backlight: lp855x: switch to the atomic PWM API
> backlight: lp8788: switch to the atomic PWM API
> backlight: pwm_bl: switch to the atomic PWM API
> video: ssd1307fb: switch to the atomic PWM API
> drm: i915: switch to the atomic PWM API
> ARM: s3c24xx: rx1950: switch to the atomic PWM API
>
> Heiko Stübner (1):
> pwm: add information about polarity, duty cycle and period to debugfs
>
> Documentation/pwm.txt | 27 +++-
> arch/arm/mach-s3c24xx/mach-rx1950.c | 17 +-
> drivers/clk/clk-pwm.c | 36 ++++-
> drivers/gpu/drm/i915/intel_panel.c | 39 +++--
> drivers/hwmon/pwm-fan.c | 88 ++++++----
> drivers/input/misc/max77693-haptic.c | 28 +++-
> drivers/input/misc/max8997_haptic.c | 23 ++-
> drivers/input/misc/pwm-beeper.c | 46 ++++--
> drivers/leds/leds-pwm.c | 15 +-
> drivers/pwm/core.c | 186 ++++++++++-----------
> drivers/pwm/pwm-clps711x.c | 2 +-
> drivers/pwm/pwm-crc.c | 2 +-
> drivers/pwm/pwm-lpc18xx-sct.c | 9 +-
> drivers/pwm/pwm-lpc32xx.c | 9 +-
> drivers/pwm/pwm-omap-dmtimer.c | 2 +-
> drivers/pwm/pwm-pxa.c | 2 +-
> drivers/pwm/pwm-rcar.c | 2 +-
> drivers/pwm/pwm-rockchip.c | 156 +++++++++++++++---
> drivers/pwm/pwm-spear.c | 9 +-
> drivers/pwm/pwm-sti.c | 67 +++++++-
> drivers/pwm/pwm-sun4i.c | 73 ++++++---
> drivers/pwm/sysfs.c | 98 ++++++++---
> drivers/regulator/pwm-regulator.c | 151 ++++++++++++++---
> drivers/video/backlight/lm3630a_bl.c | 15 +-
> drivers/video/backlight/lp855x_bl.c | 15 +-
> drivers/video/backlight/lp8788_bl.c | 17 +-
> drivers/video/backlight/pwm_bl.c | 51 +++---
> drivers/video/fbdev/ssd1307fb.c | 28 +++-
> include/linux/pwm.h | 303 ++++++++++++++++++++++++++---------
> 29 files changed, 1096 insertions(+), 420 deletions(-)
>
--
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
^ permalink raw reply
* [PATCH v5 46/46] ARM: s3c24xx: rx1950: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Replace pwm_disable/enable/config() by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
arch/arm/mach-s3c24xx/mach-rx1950.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c
index 774c982..2dc9487 100644
--- a/arch/arm/mach-s3c24xx/mach-rx1950.c
+++ b/arch/arm/mach-s3c24xx/mach-rx1950.c
@@ -384,10 +384,15 @@ static struct pwm_device *lcd_pwm;
static void rx1950_lcd_power(int enable)
{
+ struct pwm_state pstate;
int i;
static int enabled;
+
if (enabled = enable)
return;
+
+ pwm_get_state(lcd_pwm, &pstate);
+
if (!enable) {
/* GPC11-GPC15->OUTPUT */
@@ -433,15 +438,21 @@ static void rx1950_lcd_power(int enable)
/* GPB1->OUTPUT, GPB1->0 */
gpio_direction_output(S3C2410_GPB(1), 0);
- pwm_config(lcd_pwm, 0, LCD_PWM_PERIOD);
+
+ pstate.enabled = false;
+ pstate.period = LCD_PWM_PERIOD;
+ pstate.duty_cycle = 0;
+ pwm_apply_state(lcd_pwm, &pstate);
pwm_disable(lcd_pwm);
/* GPC0->0, GPC10->0 */
gpio_direction_output(S3C2410_GPC(0), 0);
gpio_direction_output(S3C2410_GPC(10), 0);
} else {
- pwm_config(lcd_pwm, LCD_PWM_DUTY, LCD_PWM_PERIOD);
- pwm_enable(lcd_pwm);
+ pstate.enabled = true;
+ pstate.period = LCD_PWM_PERIOD;
+ pstate.duty_cycle = LCD_PWM_DUTY;
+ pwm_apply_state(lcd_pwm, &pstate);
gpio_direction_output(S3C2410_GPC(0), 1);
gpio_direction_output(S3C2410_GPC(5), 1);
--
2.5.0
^ permalink raw reply related
* [PATCH v5 45/46] drm: i915: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/gpu/drm/i915/intel_panel.c | 39 +++++++++++++++++++++++++-------------
1 file changed, 26 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 21ee647..b86bd20 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -538,10 +538,10 @@ static u32 bxt_get_backlight(struct intel_connector *connector)
static u32 pwm_get_backlight(struct intel_connector *connector)
{
struct intel_panel *panel = &connector->panel;
- int duty_ns;
+ struct pwm_state pstate;
- duty_ns = pwm_get_duty_cycle(panel->backlight.pwm);
- return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
+ pwm_get_state(panel->backlight.pwm, &pstate);
+ return DIV_ROUND_UP(pstate.duty_cycle * 100, CRC_PMIC_PWM_PERIOD_NS);
}
static u32 intel_panel_get_backlight(struct intel_connector *connector)
@@ -630,9 +630,12 @@ static void bxt_set_backlight(struct intel_connector *connector, u32 level)
static void pwm_set_backlight(struct intel_connector *connector, u32 level)
{
struct intel_panel *panel = &connector->panel;
- int duty_ns = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
+ struct pwm_state pstate;
- pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
+ pwm_get_state(panel->backlight.pwm, &pstate);
+ pstate.duty_cycle = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
+ pstate.period = CRC_PMIC_PWM_PERIOD_NS;
+ pwm_apply_state(panel->backlight.pwm, &pstate);
}
static void
@@ -801,11 +804,15 @@ static void bxt_disable_backlight(struct intel_connector *connector)
static void pwm_disable_backlight(struct intel_connector *connector)
{
struct intel_panel *panel = &connector->panel;
+ struct pwm_state pstate;
/* Disable the backlight */
- pwm_config(panel->backlight.pwm, 0, CRC_PMIC_PWM_PERIOD_NS);
+ pwm_get_state(panel->backlight.pwm, &pstate);
+ pstate.duty_cycle = 0;
+ pwm_apply_state(panel->backlight.pwm, &pstate);
usleep_range(2000, 3000);
- pwm_disable(panel->backlight.pwm);
+ pstate.enabled = false;
+ pwm_apply_state(panel->backlight.pwm, &pstate);
}
void intel_panel_disable_backlight(struct intel_connector *connector)
@@ -1068,8 +1075,11 @@ static void bxt_enable_backlight(struct intel_connector *connector)
static void pwm_enable_backlight(struct intel_connector *connector)
{
struct intel_panel *panel = &connector->panel;
+ struct pwm_state pstate;
- pwm_enable(panel->backlight.pwm);
+ pwm_get_state(panel->backlight.pwm, &pstate);
+ pstate.enabled = true;
+ pwm_apply_state(panel->backlight.pwm, &pstate);
intel_panel_actually_set_backlight(connector, panel->backlight.level);
}
@@ -1630,6 +1640,7 @@ static int pwm_setup_backlight(struct intel_connector *connector,
{
struct drm_device *dev = connector->base.dev;
struct intel_panel *panel = &connector->panel;
+ struct pwm_state pstate;
int retval;
/* Get the PWM chip for backlight control */
@@ -1640,8 +1651,10 @@ static int pwm_setup_backlight(struct intel_connector *connector,
return -ENODEV;
}
- retval = pwm_config(panel->backlight.pwm, CRC_PMIC_PWM_PERIOD_NS,
- CRC_PMIC_PWM_PERIOD_NS);
+ pwm_get_state(panel->backlight.pwm, &pstate);
+ pstate.period = CRC_PMIC_PWM_PERIOD_NS;
+ pstate.duty_cycle = CRC_PMIC_PWM_PERIOD_NS;
+ retval = pwm_apply_state(panel->backlight.pwm, &pstate);
if (retval < 0) {
DRM_ERROR("Failed to configure the pwm chip\n");
pwm_put(panel->backlight.pwm);
@@ -1651,9 +1664,9 @@ static int pwm_setup_backlight(struct intel_connector *connector,
panel->backlight.min = 0; /* 0% */
panel->backlight.max = 100; /* 100% */
- panel->backlight.level = DIV_ROUND_UP(
- pwm_get_duty_cycle(panel->backlight.pwm) * 100,
- CRC_PMIC_PWM_PERIOD_NS);
+ pwm_get_state(panel->backlight.pwm, &pstate);
+ panel->backlight.level = DIV_ROUND_UP(pstate.duty_cycle * 100,
+ pstate.period);
panel->backlight.enabled = panel->backlight.level != 0;
return 0;
--
2.5.0
^ permalink raw reply related
* [PATCH v5 44/46] video: ssd1307fb: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/video/fbdev/ssd1307fb.c | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index df9c63a..ed9a115 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -289,6 +289,8 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
struct pwm_args pargs = { };
if (par->device_info->need_pwm) {
+ struct pwm_state pstate;
+
par->pwm = pwm_get(&par->client->dev, NULL);
if (IS_ERR(par->pwm)) {
dev_err(&par->client->dev, "Could not get PWM from device tree!\n");
@@ -296,10 +298,14 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
}
pwm_get_args(par->pwm, &pargs);
+ pwm_get_state(par->pwm, &pstate);
par->pwm_period = pargs.period;
+
/* Enable the PWM */
- pwm_config(par->pwm, par->pwm_period / 2, par->pwm_period);
- pwm_enable(par->pwm);
+ pstate.period = pargs.period;
+ pstate.duty_cycle = pstate.period / 2;
+ pstate.enabled = true;
+ pwm_apply_state(par->pwm, &pstate);
dev_dbg(&par->client->dev, "Using PWM%d with a %dns period.\n",
par->pwm->pwm, par->pwm_period);
@@ -685,8 +691,12 @@ static int ssd1307fb_probe(struct i2c_client *client,
bl_init_error:
unregister_framebuffer(info);
panel_init_error:
- if (par->device_info->need_pwm) {
- pwm_disable(par->pwm);
+ if (par->device_info->need_pwm && par->pwm) {
+ struct pwm_state pstate;
+
+ pwm_get_state(par->pwm, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(par->pwm, &pstate);
pwm_put(par->pwm);
};
reset_oled_error:
@@ -707,7 +717,11 @@ static int ssd1307fb_remove(struct i2c_client *client)
unregister_framebuffer(info);
if (par->device_info->need_pwm) {
- pwm_disable(par->pwm);
+ struct pwm_state pstate;
+
+ pwm_get_state(par->pwm, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(par->pwm, &pstate);
pwm_put(par->pwm);
};
fb_deferred_io_cleanup(info);
--
2.5.0
^ permalink raw reply related
* [PATCH v5 43/46] backlight: pwm_bl: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/video/backlight/pwm_bl.c | 43 ++++++++++++++++++++++------------------
1 file changed, 24 insertions(+), 19 deletions(-)
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
index 2479c11..b069fb2 100644
--- a/drivers/video/backlight/pwm_bl.c
+++ b/drivers/video/backlight/pwm_bl.c
@@ -43,8 +43,22 @@ struct pwm_bl_data {
void (*exit)(struct device *);
};
+static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
+{
+ unsigned int lth = pb->lth_brightness;
+ int duty_cycle;
+
+ if (pb->levels)
+ duty_cycle = pb->levels[brightness];
+ else
+ duty_cycle = brightness;
+
+ return (duty_cycle * (pb->period - lth) / pb->scale) + lth;
+}
+
static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
{
+ struct pwm_state pstate;
int err;
if (pb->enabled)
@@ -57,17 +71,24 @@ static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
if (pb->enable_gpio)
gpiod_set_value(pb->enable_gpio, 1);
- pwm_enable(pb->pwm);
+ pwm_get_state(pb->pwm, &pstate);
+ pstate.duty_cycle = compute_duty_cycle(pb, brightness);
+ pstate.enabled = true;
+ pwm_apply_state(pb->pwm, &pstate);
pb->enabled = true;
}
static void pwm_backlight_power_off(struct pwm_bl_data *pb)
{
+ struct pwm_state pstate;
+
if (!pb->enabled)
return;
- pwm_config(pb->pwm, 0, pb->period);
- pwm_disable(pb->pwm);
+ pwm_get_state(pb->pwm, &pstate);
+ pstate.duty_cycle = 0;
+ pstate.enabled = false;
+ pwm_apply_state(pb->pwm, &pstate);
if (pb->enable_gpio)
gpiod_set_value(pb->enable_gpio, 0);
@@ -76,24 +97,10 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
pb->enabled = false;
}
-static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
-{
- unsigned int lth = pb->lth_brightness;
- int duty_cycle;
-
- if (pb->levels)
- duty_cycle = pb->levels[brightness];
- else
- duty_cycle = brightness;
-
- return (duty_cycle * (pb->period - lth) / pb->scale) + lth;
-}
-
static int pwm_backlight_update_status(struct backlight_device *bl)
{
struct pwm_bl_data *pb = bl_get_data(bl);
int brightness = bl->props.brightness;
- int duty_cycle;
if (bl->props.power != FB_BLANK_UNBLANK ||
bl->props.fb_blank != FB_BLANK_UNBLANK ||
@@ -104,8 +111,6 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
brightness = pb->notify(pb->dev, brightness);
if (brightness > 0) {
- duty_cycle = compute_duty_cycle(pb, brightness);
- pwm_config(pb->pwm, duty_cycle, pb->period);
pwm_backlight_power_on(pb, brightness);
} else
pwm_backlight_power_off(pb);
--
2.5.0
^ permalink raw reply related
* [PATCH v5 42/46] backlight: lp8788: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/video/backlight/lp8788_bl.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c
index 5d583d7..521c730 100644
--- a/drivers/video/backlight/lp8788_bl.c
+++ b/drivers/video/backlight/lp8788_bl.c
@@ -124,16 +124,13 @@ static int lp8788_backlight_configure(struct lp8788_bl *bl)
static void lp8788_pwm_ctrl(struct lp8788_bl *bl, int br, int max_br)
{
- unsigned int period;
- unsigned int duty;
struct device *dev;
+ struct pwm_state pstate;
struct pwm_device *pwm;
if (!bl->pdata)
return;
- period = bl->pdata->period_ns;
- duty = br * period / max_br;
dev = bl->lp->dev;
/* request PWM device with the consumer name */
@@ -147,11 +144,15 @@ static void lp8788_pwm_ctrl(struct lp8788_bl *bl, int br, int max_br)
bl->pwm = pwm;
}
- pwm_config(bl->pwm, duty, period);
- if (duty)
- pwm_enable(bl->pwm);
+ pwm_get_state(bl->pwm, &pstate);
+ pstate.period = bl->pdata->period_ns;
+ pstate.duty_cycle = br * pstate.period / max_br;
+ if (pstate.duty_cycle)
+ pstate.enabled = true;
else
- pwm_disable(bl->pwm);
+ pstate.enabled = false;
+
+ pwm_apply_state(bl->pwm, &pstate);
}
static int lp8788_bl_update_status(struct backlight_device *bl_dev)
--
2.5.0
^ permalink raw reply related
* [PATCH v5 41/46] backlight: lp855x: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm
Cc: Mike Turquette, Stephen Boyd, linux-clk, Mark Brown,
Liam Girdwood, Kamil Debski, lm-sensors, Jean Delvare,
Guenter Roeck, Dmitry Torokhov, linux-input, Bryan Wu,
Richard Purdie, Jacek Anaszewski, linux-leds, Maxime Ripard,
Chen-Yu Tsai, linux-sunxi, Joachim Eastwood, Thomas Petazzoni,
Heiko Stuebner, linux-rockchip, Jingoo Han, Lee Jones, linux-fbd
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon@free-electrons.com>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/video/backlight/lp855x_bl.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c
index daca9e6..5468e7a 100644
--- a/drivers/video/backlight/lp855x_bl.c
+++ b/drivers/video/backlight/lp855x_bl.c
@@ -235,8 +235,7 @@ err:
static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br)
{
- unsigned int period = lp->pdata->period_ns;
- unsigned int duty = br * period / max_br;
+ struct pwm_state pstate;
struct pwm_device *pwm;
/* request pwm device with the consumer name */
@@ -248,11 +247,15 @@ static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br)
lp->pwm = pwm;
}
- pwm_config(lp->pwm, duty, period);
- if (duty)
- pwm_enable(lp->pwm);
+ pwm_get_state(lp->pwm, &pstate);
+ pstate.period = lp->pdata->period_ns;
+ pstate.duty_cycle = br * pstate.period / max_br;
+ if (pstate.duty_cycle)
+ pstate.enabled = true;
else
- pwm_disable(lp->pwm);
+ pstate.enabled = false;
+
+ pwm_apply_state(lp->pwm, &pstate);
}
static int lp855x_bl_update_status(struct backlight_device *bl)
--
2.5.0
^ permalink raw reply related
* [PATCH v5 40/46] backlight: lm3630a: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/video/backlight/lm3630a_bl.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c
index 3d16bd6..fdad23c 100644
--- a/drivers/video/backlight/lm3630a_bl.c
+++ b/drivers/video/backlight/lm3630a_bl.c
@@ -162,14 +162,16 @@ static int lm3630a_intr_config(struct lm3630a_chip *pchip)
static void lm3630a_pwm_ctrl(struct lm3630a_chip *pchip, int br, int br_max)
{
- unsigned int period = pchip->pdata->pwm_period;
- unsigned int duty = br * period / br_max;
+ struct pwm_state pstate;
- pwm_config(pchip->pwmd, duty, period);
- if (duty)
- pwm_enable(pchip->pwmd);
+ pwm_get_state(pchip->pwmd, &pstate);
+ pstate.period = pchip->pdata->pwm_period;
+ pstate.duty_cycle = br * pstate.period / br_max;
+ if (pstate.duty_cycle)
+ pstate.enabled = true;
else
- pwm_disable(pchip->pwmd);
+ pstate.enabled = false;
+ pwm_apply_state(pchip->pwmd, &pstate);
}
/* update and get brightness */
--
2.5.0
^ permalink raw reply related
* [PATCH v5 39/46] leds: pwm: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/leds/leds-pwm.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index b48231c..f69b222 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -40,13 +40,18 @@ struct led_pwm_priv {
static void __led_pwm_set(struct led_pwm_data *led_dat)
{
int new_duty = led_dat->duty;
+ struct pwm_state pstate;
- pwm_config(led_dat->pwm, new_duty, led_dat->period);
+ pwm_get_state(led_dat->pwm, &pstate);
+ pstate.duty_cycle = new_duty;
+ pstate.period = led_dat->period;
if (new_duty = 0)
- pwm_disable(led_dat->pwm);
+ pstate.enabled = false;
else
- pwm_enable(led_dat->pwm);
+ pstate.enabled = true;
+
+ pwm_apply_state(led_dat->pwm, &pstate);
}
static void led_pwm_set(struct led_classdev *led_cdev,
--
2.5.0
^ permalink raw reply related
* [PATCH v5 38/46] input: misc: pwm-beeper: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/input/misc/pwm-beeper.c | 46 +++++++++++++++++++++++++++--------------
1 file changed, 31 insertions(+), 15 deletions(-)
diff --git a/drivers/input/misc/pwm-beeper.c b/drivers/input/misc/pwm-beeper.c
index f2261ab..36c9897 100644
--- a/drivers/input/misc/pwm-beeper.c
+++ b/drivers/input/misc/pwm-beeper.c
@@ -34,7 +34,7 @@ static int pwm_beeper_event(struct input_dev *input,
{
int ret = 0;
struct pwm_beeper *beeper = input_get_drvdata(input);
- unsigned long period;
+ struct pwm_state pstate;
if (type != EV_SND || value < 0)
return -EINVAL;
@@ -49,19 +49,22 @@ static int pwm_beeper_event(struct input_dev *input,
return -EINVAL;
}
+ pwm_get_state(beeper->pwm, &pstate);
+
if (value = 0) {
- pwm_disable(beeper->pwm);
+ pstate.enabled = false;
} else {
- period = HZ_TO_NANOSECONDS(value);
- ret = pwm_config(beeper->pwm, period / 2, period);
- if (ret)
- return ret;
- ret = pwm_enable(beeper->pwm);
- if (ret)
- return ret;
- beeper->period = period;
+ pstate.enabled = false;
+ pstate.period = HZ_TO_NANOSECONDS(value);
+ pstate.duty_cycle = pstate.period / 2;
}
+ ret = pwm_apply_state(beeper->pwm, &pstate);
+ if (ret)
+ return ret;
+
+ beeper->period = value ? pstate.period : 0;
+
return 0;
}
@@ -132,10 +135,13 @@ err_free:
static int pwm_beeper_remove(struct platform_device *pdev)
{
struct pwm_beeper *beeper = platform_get_drvdata(pdev);
+ struct pwm_state pstate;
input_unregister_device(beeper->input);
- pwm_disable(beeper->pwm);
+ pwm_get_state(beeper->pwm, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(beeper->pwm, &pstate);
pwm_free(beeper->pwm);
kfree(beeper);
@@ -147,8 +153,13 @@ static int __maybe_unused pwm_beeper_suspend(struct device *dev)
{
struct pwm_beeper *beeper = dev_get_drvdata(dev);
- if (beeper->period)
- pwm_disable(beeper->pwm);
+ if (beeper->period) {
+ struct pwm_state pstate;
+
+ pwm_get_state(beeper->pwm, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(beeper->pwm, &pstate);
+ }
return 0;
}
@@ -158,8 +169,13 @@ static int __maybe_unused pwm_beeper_resume(struct device *dev)
struct pwm_beeper *beeper = dev_get_drvdata(dev);
if (beeper->period) {
- pwm_config(beeper->pwm, beeper->period / 2, beeper->period);
- pwm_enable(beeper->pwm);
+ struct pwm_state pstate;
+
+ pwm_get_state(beeper->pwm, &pstate);
+ pstate.period = beeper->period;
+ pstate.duty_cycle = beeper->period / 2;
+ pstate.enabled = true;
+ pwm_apply_state(beeper->pwm, &pstate);
}
return 0;
--
2.5.0
^ permalink raw reply related
* [PATCH v5 37/46] input: misc: max8997: switch to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:04 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/input/misc/max8997_haptic.c | 23 ++++++++++++++++++-----
1 file changed, 18 insertions(+), 5 deletions(-)
diff --git a/drivers/input/misc/max8997_haptic.c b/drivers/input/misc/max8997_haptic.c
index a806ba3..fcc0eb7 100644
--- a/drivers/input/misc/max8997_haptic.c
+++ b/drivers/input/misc/max8997_haptic.c
@@ -72,8 +72,12 @@ static int max8997_haptic_set_duty_cycle(struct max8997_haptic *chip)
int ret = 0;
if (chip->mode = MAX8997_EXTERNAL_MODE) {
- unsigned int duty = chip->pwm_period * chip->level / 100;
- ret = pwm_config(chip->pwm, duty, chip->pwm_period);
+ struct pwm_state pstate;
+
+ pwm_get_state(chip->pwm, &pstate);
+ pstate.period = chip->pwm_period;
+ pstate.duty_cycle = chip->pwm_period * chip->level / 100;
+ ret = pwm_apply_state(chip->pwm, &pstate);
} else {
int i;
u8 duty_index = 0;
@@ -188,7 +192,11 @@ static void max8997_haptic_enable(struct max8997_haptic *chip)
}
max8997_haptic_configure(chip);
if (chip->mode = MAX8997_EXTERNAL_MODE) {
- error = pwm_enable(chip->pwm);
+ struct pwm_state pstate;
+
+ pwm_get_state(chip->pwm, &pstate);
+ pstate.enabled = true;
+ error = pwm_apply_state(chip->pwm, &pstate);
if (error) {
dev_err(chip->dev, "Failed to enable PWM\n");
regulator_disable(chip->regulator);
@@ -209,8 +217,13 @@ static void max8997_haptic_disable(struct max8997_haptic *chip)
if (chip->enabled) {
chip->enabled = false;
max8997_haptic_configure(chip);
- if (chip->mode = MAX8997_EXTERNAL_MODE)
- pwm_disable(chip->pwm);
+ if (chip->mode = MAX8997_EXTERNAL_MODE) {
+ struct pwm_state pstate;
+
+ pwm_get_state(chip->pwm, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(chip->pwm, &pstate);
+ }
regulator_disable(chip->regulator);
}
--
2.5.0
^ permalink raw reply related
* [PATCH v5 36/46] input: misc: max77693: switch to the atomic API
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/input/misc/max77693-haptic.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/drivers/input/misc/max77693-haptic.c b/drivers/input/misc/max77693-haptic.c
index cf6aac0..aef7dc4 100644
--- a/drivers/input/misc/max77693-haptic.c
+++ b/drivers/input/misc/max77693-haptic.c
@@ -70,13 +70,16 @@ struct max77693_haptic {
static int max77693_haptic_set_duty_cycle(struct max77693_haptic *haptic)
{
+ struct pwm_state pstate;
struct pwm_args pargs = { };
- int delta;
int error;
pwm_get_args(haptic->pwm_dev, &pargs);
- delta = (pargs.period + haptic->pwm_duty) / 2;
- error = pwm_config(haptic->pwm_dev, delta, pargs.period);
+ pwm_get_state(haptic->pwm_dev, &pstate);
+
+ pstate.period = pargs.period;
+ pstate.duty_cycle = (pargs.period + haptic->pwm_duty) / 2;
+ error = pwm_apply_state(haptic->pwm_dev, &pstate);
if (error) {
dev_err(haptic->dev, "failed to configure pwm: %d\n", error);
return error;
@@ -161,12 +164,16 @@ static int max77693_haptic_lowsys(struct max77693_haptic *haptic, bool enable)
static void max77693_haptic_enable(struct max77693_haptic *haptic)
{
+ struct pwm_state pstate;
int error;
if (haptic->enabled)
return;
- error = pwm_enable(haptic->pwm_dev);
+ pwm_get_state(haptic->pwm_dev, &pstate);
+ pstate.enabled = true;
+
+ error = pwm_apply_state(haptic->pwm_dev, &pstate);
if (error) {
dev_err(haptic->dev,
"failed to enable haptic pwm device: %d\n", error);
@@ -188,11 +195,13 @@ static void max77693_haptic_enable(struct max77693_haptic *haptic)
err_enable_config:
max77693_haptic_lowsys(haptic, false);
err_enable_lowsys:
- pwm_disable(haptic->pwm_dev);
+ pstate.enabled = false;
+ pwm_apply_state(haptic->pwm_dev, &pstate);
}
static void max77693_haptic_disable(struct max77693_haptic *haptic)
{
+ struct pwm_state pstate;
int error;
if (!haptic->enabled)
@@ -206,7 +215,9 @@ static void max77693_haptic_disable(struct max77693_haptic *haptic)
if (error)
goto err_disable_lowsys;
- pwm_disable(haptic->pwm_dev);
+ pwm_get_state(haptic->pwm_dev, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(haptic->pwm_dev, &pstate);
haptic->enabled = false;
return;
--
2.5.0
^ permalink raw reply related
* [PATCH v5 35/46] hwmon: pwm-fan: switch to the atomic API
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/hwmon/pwm-fan.c | 81 ++++++++++++++++++++++++++++---------------------
1 file changed, 46 insertions(+), 35 deletions(-)
diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
index 82c5656..da4e4ab 100644
--- a/drivers/hwmon/pwm-fan.c
+++ b/drivers/hwmon/pwm-fan.c
@@ -40,8 +40,8 @@ struct pwm_fan_ctx {
static int __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
{
+ struct pwm_state pstate;
struct pwm_args pargs = { };
- unsigned long duty;
int ret = 0;
pwm_get_args(ctx->pwm, &pargs);
@@ -50,19 +50,17 @@ static int __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
if (ctx->pwm_value = pwm)
goto exit_set_pwm_err;
- duty = DIV_ROUND_UP(pwm * (pargs.period - 1), MAX_PWM);
- ret = pwm_config(ctx->pwm, duty, pargs.period);
- if (ret)
- goto exit_set_pwm_err;
-
+ pwm_get_state(ctx->pwm, &pstate);
+ pstate.period = pargs.period;
+ pstate.duty_cycle = DIV_ROUND_UP(pwm * (pargs.period - 1), MAX_PWM);
if (pwm = 0)
- pwm_disable(ctx->pwm);
+ pstate.enabled = false;
+ else
+ pstate.enabled = true;
- if (ctx->pwm_value = 0) {
- ret = pwm_enable(ctx->pwm);
- if (ret)
- goto exit_set_pwm_err;
- }
+ ret = pwm_apply_state(ctx->pwm, &pstate);
+ if (ret)
+ goto exit_set_pwm_err;
ctx->pwm_value = pwm;
exit_set_pwm_err:
@@ -217,10 +215,10 @@ static int pwm_fan_of_get_cooling_data(struct device *dev,
static int pwm_fan_probe(struct platform_device *pdev)
{
struct thermal_cooling_device *cdev;
+ struct pwm_state pstate;
struct pwm_args pargs = { };
struct pwm_fan_ctx *ctx;
struct device *hwmon;
- int duty_cycle;
int ret;
ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
@@ -239,27 +237,25 @@ static int pwm_fan_probe(struct platform_device *pdev)
/* Set duty cycle to maximum allowed */
pwm_get_args(ctx->pwm, &pargs);
- duty_cycle = pargs.period - 1;
+ pwm_get_state(ctx->pwm, &pstate);
+
+ pstate.period = pargs.period;
+ pstate.duty_cycle = pargs.period - 1;
+ pstate.enabled = true;
ctx->pwm_value = MAX_PWM;
- ret = pwm_config(ctx->pwm, duty_cycle, pargs.period);
+ ret = pwm_apply_state(ctx->pwm, &pstate);
if (ret) {
dev_err(&pdev->dev, "Failed to configure PWM\n");
return ret;
}
- /* Enbale PWM output */
- ret = pwm_enable(ctx->pwm);
- if (ret) {
- dev_err(&pdev->dev, "Failed to enable PWM\n");
- return ret;
- }
-
hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, "pwmfan",
ctx, pwm_fan_groups);
if (IS_ERR(hwmon)) {
dev_err(&pdev->dev, "Failed to register hwmon device\n");
- pwm_disable(ctx->pwm);
+ pstate.enabled = false;
+ pwm_apply_state(ctx->pwm, &pstate);
return PTR_ERR(hwmon);
}
@@ -275,7 +271,8 @@ static int pwm_fan_probe(struct platform_device *pdev)
if (IS_ERR(cdev)) {
dev_err(&pdev->dev,
"Failed to register pwm-fan as cooling device");
- pwm_disable(ctx->pwm);
+ pstate.enabled = false;
+ pwm_apply_state(ctx->pwm, &pstate);
return PTR_ERR(cdev);
}
ctx->cdev = cdev;
@@ -290,8 +287,14 @@ static int pwm_fan_remove(struct platform_device *pdev)
struct pwm_fan_ctx *ctx = platform_get_drvdata(pdev);
thermal_cooling_device_unregister(ctx->cdev);
- if (ctx->pwm_value)
- pwm_disable(ctx->pwm);
+ if (ctx->pwm_value) {
+ struct pwm_state pstate;
+
+ pwm_get_state(ctx->pwm, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(ctx->pwm, &pstate);
+ }
+
return 0;
}
@@ -300,27 +303,35 @@ static int pwm_fan_suspend(struct device *dev)
{
struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
- if (ctx->pwm_value)
- pwm_disable(ctx->pwm);
+ if (ctx->pwm_value) {
+ struct pwm_state pstate;
+
+ pwm_get_state(ctx->pwm, &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(ctx->pwm, &pstate);
+ }
+
return 0;
}
static int pwm_fan_resume(struct device *dev)
{
struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
+ struct pwm_state pstate;
struct pwm_args pargs = { };
- unsigned long duty;
- int ret;
if (ctx->pwm_value = 0)
return 0;
pwm_get_args(ctx->pwm, &pargs);
- duty = DIV_ROUND_UP(ctx->pwm_value * (pargs.period - 1), MAX_PWM);
- ret = pwm_config(ctx->pwm, duty, pargs.period);
- if (ret)
- return ret;
- return pwm_enable(ctx->pwm);
+ pwm_get_state(ctx->pwm, &pstate);
+
+ pstate.period = pargs.period;
+ pstate.duty_cycle = DIV_ROUND_UP(ctx->pwm_value * (pargs.period - 1),
+ MAX_PWM);
+ pstate.enabled = true;
+
+ return pwm_apply_state(ctx->pwm, &pstate);
}
#endif
--
2.5.0
^ permalink raw reply related
* [PATCH v5 34/46] clk: pwm: switch to the atomic API
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated and should be replaced
by pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/clk/clk-pwm.c | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git a/drivers/clk/clk-pwm.c b/drivers/clk/clk-pwm.c
index ebcd738..49ec5b1 100644
--- a/drivers/clk/clk-pwm.c
+++ b/drivers/clk/clk-pwm.c
@@ -28,15 +28,29 @@ static inline struct clk_pwm *to_clk_pwm(struct clk_hw *hw)
static int clk_pwm_prepare(struct clk_hw *hw)
{
struct clk_pwm *clk_pwm = to_clk_pwm(hw);
+ struct pwm_state pstate;
- return pwm_enable(clk_pwm->pwm);
+ pwm_get_state(clk_pwm->pwm, &pstate);
+ if (pstate.enabled)
+ return 0;
+
+ pstate.enabled = true;
+
+ return pwm_apply_state(clk_pwm->pwm, &pstate);
}
static void clk_pwm_unprepare(struct clk_hw *hw)
{
struct clk_pwm *clk_pwm = to_clk_pwm(hw);
+ struct pwm_state pstate;
+
+ pwm_get_state(clk_pwm->pwm, &pstate);
+ if (!pstate.enabled)
+ return;
- pwm_disable(clk_pwm->pwm);
+ pstate.enabled = false;
+
+ pwm_apply_state(clk_pwm->pwm, &pstate);
}
static unsigned long clk_pwm_recalc_rate(struct clk_hw *hw,
@@ -56,6 +70,7 @@ static const struct clk_ops clk_pwm_ops = {
static int clk_pwm_probe(struct platform_device *pdev)
{
struct device_node *node = pdev->dev.of_node;
+ struct pwm_state pstate;
struct pwm_args pargs = { };
struct clk_init_data init;
struct clk_pwm *clk_pwm;
@@ -88,7 +103,12 @@ static int clk_pwm_probe(struct platform_device *pdev)
return -EINVAL;
}
- ret = pwm_config(pwm, (pargs.period + 1) >> 1, pargs.period);
+ pwm_get_state(pwm, &pstate);
+ pstate.period = pargs.period;
+ pstate.polarity = pargs.polarity;
+ pstate.duty_cycle = (pargs.period + 1) >> 1;
+
+ ret = pwm_apply_state(pwm, &pstate);
if (ret < 0)
return ret;
--
2.5.0
^ permalink raw reply related
* [PATCH v5 33/46] pwm: replace pwm_disable() by pwm_apply_state()
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Some PWM drivers are calling the deprecated pwm_disable() function in
their pwm->free() or pdev->remove() function. Replace those calls by
the pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/pwm/pwm-lpc18xx-sct.c | 7 +++++--
drivers/pwm/pwm-lpc32xx.c | 9 +++++++--
drivers/pwm/pwm-spear.c | 9 +++++++--
drivers/pwm/pwm-sti.c | 9 +++++++--
4 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/drivers/pwm/pwm-lpc18xx-sct.c b/drivers/pwm/pwm-lpc18xx-sct.c
index 19dc64c..c4d7cb1 100644
--- a/drivers/pwm/pwm-lpc18xx-sct.c
+++ b/drivers/pwm/pwm-lpc18xx-sct.c
@@ -305,9 +305,12 @@ static void lpc18xx_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
{
struct lpc18xx_pwm_chip *lpc18xx_pwm = to_lpc18xx_pwm_chip(chip);
struct lpc18xx_pwm_data *lpc18xx_data = pwm_get_chip_data(pwm);
+ struct pwm_state pstate;
- pwm_disable(pwm);
- pwm_set_duty_cycle(pwm, 0);
+ pwm_get_state(pwm, &pstate);
+ pstate.duty_cycle = 0;
+ pstate.enabled = false;
+ pwm_apply_state(pwm, &pstate);
clear_bit(lpc18xx_data->duty_event, &lpc18xx_pwm->event_map);
}
diff --git a/drivers/pwm/pwm-lpc32xx.c b/drivers/pwm/pwm-lpc32xx.c
index 4d470c1..95870e0 100644
--- a/drivers/pwm/pwm-lpc32xx.c
+++ b/drivers/pwm/pwm-lpc32xx.c
@@ -138,8 +138,13 @@ static int lpc32xx_pwm_remove(struct platform_device *pdev)
struct lpc32xx_pwm_chip *lpc32xx = platform_get_drvdata(pdev);
unsigned int i;
- for (i = 0; i < lpc32xx->chip.npwm; i++)
- pwm_disable(&lpc32xx->chip.pwms[i]);
+ for (i = 0; i < lpc32xx->chip.npwm; i++) {
+ struct pwm_state pstate;
+
+ pwm_get_state(&lpc32xx->chip.pwms[i], &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(&lpc32xx->chip.pwms[i], &pstate);
+ }
return pwmchip_remove(&lpc32xx->chip);
}
diff --git a/drivers/pwm/pwm-spear.c b/drivers/pwm/pwm-spear.c
index 6c6b44f..2ee4cd5 100644
--- a/drivers/pwm/pwm-spear.c
+++ b/drivers/pwm/pwm-spear.c
@@ -233,8 +233,13 @@ static int spear_pwm_remove(struct platform_device *pdev)
struct spear_pwm_chip *pc = platform_get_drvdata(pdev);
int i;
- for (i = 0; i < NUM_PWM; i++)
- pwm_disable(&pc->chip.pwms[i]);
+ for (i = 0; i < NUM_PWM; i++) {
+ struct pwm_state pstate;
+
+ pwm_get_state(&pc->chip.pwms[i], &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(&pc->chip.pwms[i], &pstate);
+ }
/* clk was prepared in probe, hence unprepare it here */
clk_unprepare(pc->clk);
diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c
index bea1d17..0ec44a8 100644
--- a/drivers/pwm/pwm-sti.c
+++ b/drivers/pwm/pwm-sti.c
@@ -435,8 +435,13 @@ static int sti_pwm_remove(struct platform_device *pdev)
struct sti_pwm_chip *pc = platform_get_drvdata(pdev);
unsigned int i;
- for (i = 0; i < pc->cdata->num_chan; i++)
- pwm_disable(&pc->chip.pwms[i]);
+ for (i = 0; i < pc->cdata->num_chan; i++) {
+ struct pwm_state pstate;
+
+ pwm_get_state(&pc->chip.pwms[i], &pstate);
+ pstate.enabled = false;
+ pwm_apply_state(&pc->chip.pwms[i], &pstate);
+ }
clk_unprepare(pc->clk);
--
2.5.0
^ permalink raw reply related
* [PATCH v5 32/46] pwm: deprecate pwm_config(), pwm_enable() and pwm_disable()
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Prefix those function as deprecated to encourage all existing users to
switch to pwm_apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
include/linux/pwm.h | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index 4aad4eb..9bac10f 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -225,8 +225,8 @@ int pwm_apply_state(struct pwm_device *pwm, struct pwm_state *state);
*
* Returns: 0 on success or a negative error code on failure.
*/
-static inline int pwm_config(struct pwm_device *pwm, int duty_ns,
- int period_ns)
+static inline int __deprecated pwm_config(struct pwm_device *pwm, int duty_ns,
+ int period_ns)
{
struct pwm_state pstate;
@@ -252,8 +252,8 @@ static inline int pwm_config(struct pwm_device *pwm, int duty_ns,
*
* Returns: 0 on success or a negative error code on failure.
*/
-static inline int pwm_set_polarity(struct pwm_device *pwm,
- enum pwm_polarity polarity)
+static inline int __deprecated pwm_set_polarity(struct pwm_device *pwm,
+ enum pwm_polarity polarity)
{
struct pwm_state pstate;
@@ -284,7 +284,7 @@ static inline int pwm_set_polarity(struct pwm_device *pwm,
*
* Returns: 0 on success or a negative error code on failure.
*/
-static inline int pwm_enable(struct pwm_device *pwm)
+static inline int __deprecated pwm_enable(struct pwm_device *pwm)
{
struct pwm_state pstate;
@@ -303,7 +303,7 @@ static inline int pwm_enable(struct pwm_device *pwm)
* pwm_disable() - stop a PWM output toggling
* @pwm: PWM device
*/
-static inline void pwm_disable(struct pwm_device *pwm)
+static inline void __deprecated pwm_disable(struct pwm_device *pwm)
{
struct pwm_state pstate;
@@ -360,24 +360,24 @@ static inline int pwm_apply_state(struct pwm_device *pwm,
return -ENOTSUPP;
}
-static inline int pwm_config(struct pwm_device *pwm, int duty_ns,
- int period_ns)
+static inline int __deprecated pwm_config(struct pwm_device *pwm, int duty_ns,
+ int period_ns)
{
return -EINVAL;
}
-static inline int pwm_set_polarity(struct pwm_device *pwm,
- enum pwm_polarity polarity)
+static inline int __deprecated pwm_set_polarity(struct pwm_device *pwm,
+ enum pwm_polarity polarity)
{
return -ENOTSUPP;
}
-static inline int pwm_enable(struct pwm_device *pwm)
+static inline int __deprecated pwm_enable(struct pwm_device *pwm)
{
return -EINVAL;
}
-static inline void pwm_disable(struct pwm_device *pwm)
+static inline void __deprecated pwm_disable(struct pwm_device *pwm)
{
}
--
2.5.0
^ permalink raw reply related
* [PATCH v5 31/46] pwm: update documentation
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Update the PWM subsystem documentation to reflect the atomic PWM changes.
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
Documentation/pwm.txt | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/Documentation/pwm.txt b/Documentation/pwm.txt
index ca895fd..cb25fca 100644
--- a/Documentation/pwm.txt
+++ b/Documentation/pwm.txt
@@ -42,9 +42,23 @@ variants of these functions, devm_pwm_get() and devm_pwm_put(), also exist.
After being requested, a PWM has to be configured using:
-int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
+int pwm_apply_state(struct pwm_device *pwm, struct pwm_state *pstate);
-To start/stop toggling the PWM output use pwm_enable()/pwm_disable().
+This API controls both the PWM period/duty_cycle config and the
+enable/disable state.
+
+The legacy pwm_config(), pwm_enable() and pwm_disable() are now deprecated,
+and should be replaced by pwm_apply_state() calls.
+
+The PWM user API also allows one to query the PWM state with pwm_get_state().
+
+In addition to the PWM state, the PWM API also exposes PWM arguments, which
+are the reference PWM config one should use on this PWM.
+PWM arguments are usually platform-specific and allows the PWM user to only
+care about dutycycle relatively to the full period (like, duty = 50% of the
+period). struct pwm_args contains 2 fields (period and polarity) and should
+be used to set the initial PWM config (usually done in the probe function
+of the PWM user). PWM arguments are retrieved with pwm_get_args().
Using PWMs with the sysfs interface
-----------------------------------
@@ -105,6 +119,15 @@ goes low for the remainder of the period. Conversely, a signal with inversed
polarity starts low for the duration of the duty cycle and goes high for the
remainder of the period.
+Drivers are encouraged to implement ->apply() instead of the legacy
+->enable(), ->disable() and ->config() methods. Doing that should provide
+atomicity in the PWM config workflow, which is required when the PWM controls
+a critical device (like a regulator).
+
+The implementation of ->get_state() (a method used to retrieve initial PWM
+state) is also encouraged for the same reason: letting the PWM user know
+about the current PWM state would allow him to avoid glitches.
+
Locking
-------
--
2.5.0
^ permalink raw reply related
* [PATCH v5 30/46] regulator: pwm: retrieve correct voltage
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
The continuous PWM voltage regulator is caching the voltage value in
the ->volt_uV field. While most of the time this value should reflect the
real voltage, sometime it can be sightly different if the PWM device
rounded the set_duty_cycle request.
Moreover, this value is not valid until someone has modified the regulator
output.
Remove the ->volt_uV field and always rely on the PWM state to calculate
the regulator output.
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/regulator/pwm-regulator.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c
index 9374796..77f42d8 100644
--- a/drivers/regulator/pwm-regulator.c
+++ b/drivers/regulator/pwm-regulator.c
@@ -35,9 +35,6 @@ struct pwm_regulator_data {
struct regulator_ops ops;
int state;
-
- /* Continuous voltage */
- int volt_uV;
};
struct pwm_voltages {
@@ -167,11 +164,27 @@ static int pwm_voltage_to_duty_cycle_percentage(struct regulator_dev *rdev, int
return ((req_uV * 100) - (min_uV * 100)) / diff;
}
+static int pwm_duty_cycle_percentage_to_voltage(struct regulator_dev *rdev,
+ int dutycycle)
+{
+ int min_uV = rdev->constraints->min_uV;
+ int max_uV = rdev->constraints->max_uV;
+ int diff = max_uV - min_uV;
+
+ return min_uV + ((diff * dutycycle) / 100);
+}
+
static int pwm_regulator_get_voltage(struct regulator_dev *rdev)
{
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
+ struct pwm_state pstate;
+ u64 dutycycle;
- return drvdata->volt_uV;
+ pwm_get_state(drvdata->pwm, &pstate);
+ dutycycle = pstate.duty_cycle * 100;
+ do_div(dutycycle, pstate.period);
+
+ return pwm_duty_cycle_percentage_to_voltage(rdev, dutycycle);
}
static int pwm_regulator_set_voltage(struct regulator_dev *rdev,
@@ -196,8 +209,6 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev,
return ret;
}
- drvdata->volt_uV = min_uV;
-
/* Delay required by PWM regulator to settle to the new voltage */
usleep_range(ramp_delay, ramp_delay + 1000);
--
2.5.0
^ permalink raw reply related
* [PATCH v5 29/46] regulator: pwm: properly initialize the ->state field
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
The ->state field is currently initialized to 0, thus referencing the
voltage selector at index 0, which might not reflect the current voltage
value.
If possible, retrieve the current voltage selector from the PWM state, else
return -EINVAL.
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Mark Brown <broonie@kernel.org>
---
drivers/regulator/pwm-regulator.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c
index 42cc312..9374796 100644
--- a/drivers/regulator/pwm-regulator.c
+++ b/drivers/regulator/pwm-regulator.c
@@ -48,10 +48,35 @@ struct pwm_voltages {
/**
* Voltage table call-backs
*/
+static void pwm_regulator_init_state(struct regulator_dev *rdev)
+{
+ struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
+ struct pwm_state pwm_state;
+ unsigned int dutycycle;
+ int i;
+
+ pwm_get_state(drvdata->pwm, &pwm_state);
+
+ if (!pwm_state.period)
+ return;
+
+ dutycycle = (pwm_state.duty_cycle * 100) / pwm_state.period;
+
+ for (i = 0; i < rdev->desc->n_voltages; i++) {
+ if (dutycycle = drvdata->duty_cycle_table[i].dutycycle) {
+ drvdata->state = i;
+ return;
+ }
+ }
+}
+
static int pwm_regulator_get_voltage_sel(struct regulator_dev *rdev)
{
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
+ if (drvdata->state < 0)
+ pwm_regulator_init_state(rdev);
+
return drvdata->state;
}
@@ -234,6 +259,7 @@ static int pwm_regulator_init_table(struct platform_device *pdev,
return ret;
}
+ drvdata->state = -EINVAL;
drvdata->duty_cycle_table = duty_cycle_table;
memcpy(&drvdata->ops, &pwm_regulator_voltage_table_ops,
sizeof(drvdata->ops));
--
2.5.0
^ permalink raw reply related
* [PATCH v5 28/46] regulator: pwm: swith to the atomic PWM API
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
pwm_config/enable/disable() have been deprecated in favor of
pwm_apply_state().
Replace all those calls with the equivalent pwm_get/apply_state().
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/regulator/pwm-regulator.c | 54 ++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 20 deletions(-)
diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c
index 9590fb0..42cc312 100644
--- a/drivers/regulator/pwm-regulator.c
+++ b/drivers/regulator/pwm-regulator.c
@@ -59,16 +59,18 @@ static int pwm_regulator_set_voltage_sel(struct regulator_dev *rdev,
unsigned selector)
{
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
- struct pwm_args pargs = { };
- int dutycycle;
+ struct pwm_state pstate = { };
+ u64 dutycycle;
int ret;
- pwm_get_args(drvdata->pwm, &pargs);
+ pwm_get_state(drvdata->pwm, &pstate);
- dutycycle = (pargs.period *
- drvdata->duty_cycle_table[selector].dutycycle) / 100;
+ dutycycle = drvdata->duty_cycle_table[selector].dutycycle;
+ dutycycle *= pstate.period;
+ do_div(dutycycle, 100);
+ pstate.duty_cycle = dutycycle;
- ret = pwm_config(drvdata->pwm, dutycycle, pargs.period);
+ ret = pwm_apply_state(drvdata->pwm, &pstate);
if (ret) {
dev_err(&rdev->dev, "Failed to configure PWM\n");
return ret;
@@ -93,24 +95,39 @@ static int pwm_regulator_list_voltage(struct regulator_dev *rdev,
static int pwm_regulator_enable(struct regulator_dev *dev)
{
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
+ struct pwm_state pstate = { };
+
+ pwm_get_state(drvdata->pwm, &pstate);
+ if (pstate.enabled)
+ return 0;
+
+ pstate.enabled = true;
- return pwm_enable(drvdata->pwm);
+ return pwm_apply_state(drvdata->pwm, &pstate);
}
static int pwm_regulator_disable(struct regulator_dev *dev)
{
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
+ struct pwm_state pstate = { };
- pwm_disable(drvdata->pwm);
+ pwm_get_state(drvdata->pwm, &pstate);
+ if (!pstate.enabled)
+ return 0;
- return 0;
+ pstate.enabled = false;
+
+ return pwm_apply_state(drvdata->pwm, &pstate);
}
static int pwm_regulator_is_enabled(struct regulator_dev *dev)
{
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
+ struct pwm_state pstate = { };
- return pwm_is_enabled(drvdata->pwm);
+ pwm_get_state(drvdata->pwm, &pstate);
+
+ return pstate.enabled;
}
/**
@@ -138,25 +155,22 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev,
{
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
unsigned int ramp_delay = rdev->constraints->ramp_delay;
- struct pwm_args pargs = { };
- int duty_cycle;
+ struct pwm_state pstate = { };
+ u64 duty_cycle;
int ret;
- pwm_get_args(drvdata->pwm, &pargs);
+ pwm_get_state(drvdata->pwm, &pstate);
duty_cycle = pwm_voltage_to_duty_cycle_percentage(rdev, min_uV);
+ duty_cycle *= pstate.period;
+ do_div(duty_cycle, 100);
+ pstate.duty_cycle = duty_cycle;
- ret = pwm_config(drvdata->pwm, (pargs.period / 100) * duty_cycle,
- pargs.period);
+ ret = pwm_apply_state(drvdata->pwm, &pstate);
if (ret) {
dev_err(&rdev->dev, "Failed to configure PWM\n");
return ret;
}
- ret = pwm_enable(drvdata->pwm);
- if (ret) {
- dev_err(&rdev->dev, "Failed to enable PWM\n");
- return ret;
- }
drvdata->volt_uV = min_uV;
/* Delay required by PWM regulator to settle to the new voltage */
--
2.5.0
^ permalink raw reply related
* [PATCH v5 27/46] regulator: pwm: adjust PWM config at probe time
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
The PWM attached to a PWM regulator device might have been previously
configured by the bootloader.
Make sure the bootloader and linux config are in sync, and adjust the PWM
config if that's not the case.
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/regulator/pwm-regulator.c | 50 +++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c
index 9154c47..9590fb0 100644
--- a/drivers/regulator/pwm-regulator.c
+++ b/drivers/regulator/pwm-regulator.c
@@ -240,6 +240,52 @@ static int pwm_regulator_init_continuous(struct platform_device *pdev,
return 0;
}
+static int pwm_regulator_adjust_pwm_config(struct pwm_regulator_data *drvdata)
+{
+ struct pwm_state pstate = { };
+ struct pwm_args pargs = { };
+
+ pwm_get_args(drvdata->pwm, &pargs);
+ pwm_get_state(drvdata->pwm, &pstate);
+
+ /*
+ * if the current period is zero this either means the PWM driver
+ * does not support initial state retrieval or the PWM was not
+ * configured.
+ * In any case, we setup the new period and poloarity, and assign a
+ * duty_cycle of 0.
+ */
+ if (!pstate.period) {
+ pstate.duty_cycle = 0;
+ pstate.period = pargs.period;
+ pstate.polarity = pargs.polarity;
+
+ return pwm_apply_state(drvdata->pwm, &pstate);
+ }
+
+ /*
+ * Adjust the PWM dutycycle/period based on the period value provided
+ * in PWM args.
+ */
+ if (pargs.period != pstate.period) {
+ u64 dutycycle = (u64)pstate.duty_cycle * pargs.period;
+
+ do_div(dutycycle, pstate.period);
+ pstate.duty_cycle = dutycycle;
+ pstate.period = pargs.period;
+ }
+
+ /*
+ * If the polarity changed, we should also change the dutycycle value.
+ */
+ if (pargs.polarity != pstate.polarity) {
+ pstate.polarity = pargs.polarity;
+ pstate.duty_cycle = pstate.period - pstate.duty_cycle;
+ }
+
+ return pwm_apply_state(drvdata->pwm, &pstate);
+}
+
static int pwm_regulator_probe(struct platform_device *pdev)
{
const struct regulator_init_data *init_data;
@@ -283,6 +329,10 @@ static int pwm_regulator_probe(struct platform_device *pdev)
return PTR_ERR(drvdata->pwm);
}
+ ret = pwm_regulator_adjust_pwm_config(drvdata);
+ if (ret)
+ return ret;
+
regulator = devm_regulator_register(&pdev->dev,
&drvdata->desc, &config);
if (IS_ERR(regulator)) {
--
2.5.0
^ permalink raw reply related
* [PATCH v5 26/46] pwm: sun4i: implement hardware readout
From: Boris Brezillon @ 2016-03-30 20:03 UTC (permalink / raw)
To: Thierry Reding, linux-pwm-u79uwXL29TY76Z2rM5mHXA
Cc: Mike Turquette, Stephen Boyd, linux-clk-u79uwXL29TY76Z2rM5mHXA,
Mark Brown, Liam Girdwood, Kamil Debski,
lm-sensors-GZX6beZjE8VD60Wz+7aTrA, Jean Delvare, Guenter Roeck,
Dmitry Torokhov, linux-input-u79uwXL29TY76Z2rM5mHXA, Bryan Wu,
Richard Purdie, Jacek Anaszewski,
linux-leds-u79uwXL29TY76Z2rM5mHXA, Maxime Ripard, Chen-Yu Tsai,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Joachim Eastwood,
Thomas Petazzoni, Heiko Stuebner,
linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jingoo Han,
Lee Jones
In-Reply-To: <1459368249-13241-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
Implement ->get_state() instead of only initializing the polarity in
the probe function.
This implementation also takes care of keeping the PWM clk enabled if at
least one of the PWM exported by the PWM chip is already enabled, which
should prevent glitches.
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
drivers/pwm/pwm-sun4i.c | 74 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 55 insertions(+), 19 deletions(-)
diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c
index 03a99a5..34cb296 100644
--- a/drivers/pwm/pwm-sun4i.c
+++ b/drivers/pwm/pwm-sun4i.c
@@ -252,11 +252,65 @@ static void sun4i_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
clk_disable_unprepare(sun4i_pwm->clk);
}
+static void sun4i_pwm_get_state(struct pwm_chip *chip,
+ struct pwm_device *pwm,
+ struct pwm_state *pstate)
+{
+ struct sun4i_pwm_chip *sun4i_pwm = to_sun4i_pwm_chip(chip);
+ unsigned int clk_rate = clk_get_rate(sun4i_pwm->clk);
+ int prescaler, prescalerid;
+ int ret;
+ u32 val;
+
+ ret = clk_prepare_enable(sun4i_pwm->clk);
+ if (ret) {
+ dev_err(chip->dev, "Failed to enable PWM clock");
+ return;
+ }
+
+ val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
+ if (val & BIT_CH(PWM_ACT_STATE, pwm->hwpwm))
+ pstate->polarity = PWM_POLARITY_INVERSED;
+ else
+ pstate->polarity = PWM_POLARITY_NORMAL;
+
+ if ((val & BIT_CH(PWM_EN, pwm->hwpwm)) &&
+ (val & BIT_CH(PWM_CLK_GATING, pwm->hwpwm)))
+ pstate->enabled = true;
+ else
+ pstate->enabled = false;
+
+ pstate->period = 0;
+ pstate->duty_cycle = 0;
+ prescalerid = (val >> (PWMCH_OFFSET * pwm->hwpwm)) & PWM_PRESCAL_MASK;
+ prescaler = prescaler_table[prescalerid];
+ if (prescaler) {
+ u64 timens;
+
+ clk_rate /= prescaler;
+
+ val = sun4i_pwm_readl(sun4i_pwm, PWM_CH_PRD(pwm->hwpwm));
+
+ timens = ((val >> 16) & PWM_PRD_MASK) + 1;
+ timens *= NSEC_PER_SEC;
+ do_div(timens, clk_rate);
+ pstate->period = timens;
+
+ timens = val & PWM_DTY_MASK;
+ timens *= NSEC_PER_SEC;
+ do_div(timens, clk_rate);
+ pstate->duty_cycle = timens;
+ }
+
+ clk_disable_unprepare(sun4i_pwm->clk);
+}
+
static const struct pwm_ops sun4i_pwm_ops = {
.config = sun4i_pwm_config,
.set_polarity = sun4i_pwm_set_polarity,
.enable = sun4i_pwm_enable,
.disable = sun4i_pwm_disable,
+ .get_state = sun4i_pwm_get_state,
.owner = THIS_MODULE,
};
@@ -307,8 +361,7 @@ static int sun4i_pwm_probe(struct platform_device *pdev)
{
struct sun4i_pwm_chip *pwm;
struct resource *res;
- u32 val;
- int i, ret;
+ int ret;
const struct of_device_id *match;
match = of_match_device(sun4i_pwm_dt_ids, &pdev->dev);
@@ -345,24 +398,7 @@ static int sun4i_pwm_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pwm);
- ret = clk_prepare_enable(pwm->clk);
- if (ret) {
- dev_err(&pdev->dev, "failed to enable PWM clock\n");
- goto clk_error;
- }
-
- val = sun4i_pwm_readl(pwm, PWM_CTRL_REG);
- for (i = 0; i < pwm->chip.npwm; i++)
- if (!(val & BIT_CH(PWM_ACT_STATE, i)))
- pwm_set_polarity(&pwm->chip.pwms[i],
- PWM_POLARITY_INVERSED);
- clk_disable_unprepare(pwm->clk);
-
return 0;
-
-clk_error:
- pwmchip_remove(&pwm->chip);
- return ret;
}
static int sun4i_pwm_remove(struct platform_device *pdev)
--
2.5.0
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox