linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] pwm: pwm-mxs: Apply configuration before disabling PWM.
@ 2013-06-19 11:51 Robin van der Gracht
  2013-06-21 10:02 ` Thierry Reding
  0 siblings, 1 reply; 3+ messages in thread
From: Robin van der Gracht @ 2013-06-19 11:51 UTC (permalink / raw)
  To: thierry.reding; +Cc: linux-kernel, shawn.guo, Robin van der Gracht

When disabling the pwm, the output state locks at its current state.
We have to be sure the last configuration applied. Which in most
cases sets duty cycle to 0%. To prevent the pwm from taking on
100% duty cycle when disabled during a high state.

Configuration applies at the beginning of a new output period.

Signed-off-by: Robin van der Gracht <robin@protonic.nl>
---
 drivers/pwm/pwm-mxs.c |    8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/pwm/pwm-mxs.c b/drivers/pwm/pwm-mxs.c
index 3febddd..4ddc063 100644
--- a/drivers/pwm/pwm-mxs.c
+++ b/drivers/pwm/pwm-mxs.c
@@ -21,6 +21,7 @@
 #include <linux/pwm.h>
 #include <linux/slab.h>
 #include <linux/stmp_device.h>
+#include <linux/delay.h>
 
 #define SET	0x4
 #define CLR	0x8
@@ -40,6 +41,7 @@ struct mxs_pwm_chip {
 	struct pwm_chip chip;
 	struct clk *clk;
 	void __iomem *base;
+	unsigned long period_ns;
 };
 
 #define to_mxs_pwm_chip(_chip) container_of(_chip, struct mxs_pwm_chip, chip)
@@ -92,6 +94,7 @@ static int mxs_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
 	if (!test_bit(PWMF_ENABLED, &pwm->flags))
 		clk_disable_unprepare(mxs->clk);
 
+	mxs->period_ns = period_ns;
 	return 0;
 }
 
@@ -113,6 +116,11 @@ static void mxs_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
 {
 	struct mxs_pwm_chip *mxs = to_mxs_pwm_chip(chip);
 
+	/*
+	 * Ensure latest configuration applied.
+	 */
+	ndelay(mxs->period_ns);
+
 	writel(1 << pwm->hwpwm, mxs->base + PWM_CTRL + CLR);
 
 	clk_disable_unprepare(mxs->clk);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] pwm: pwm-mxs: Apply configuration before disabling PWM.
  2013-06-19 11:51 [PATCH] pwm: pwm-mxs: Apply configuration before disabling PWM Robin van der Gracht
@ 2013-06-21 10:02 ` Thierry Reding
  2013-06-26  6:52   ` Robin van der Gracht
  0 siblings, 1 reply; 3+ messages in thread
From: Thierry Reding @ 2013-06-21 10:02 UTC (permalink / raw)
  To: Robin van der Gracht; +Cc: linux-pwm, linux-kernel, shawn.guo

[-- Attachment #1: Type: text/plain, Size: 2503 bytes --]

Please use my new email address and Cc the linux-pwm mailing list.

The subject implies some active procedure is used to make sure the
configuration is applied, but you really only wait for some amount of
time. Perhaps something like:

	pwm: pwm-mxs: Wait for configuration to apply before disabling PWM

is more accurate?

On Wed, Jun 19, 2013 at 01:51:26PM +0200, Robin van der Gracht wrote:
> When disabling the pwm, the output state locks at its current state.

Please use the proper spelling "PWM" in prose.

> We have to be sure the last configuration applied. Which in most
> cases sets duty cycle to 0%. To prevent the pwm from taking on
> 100% duty cycle when disabled during a high state.
> 
> Configuration applies at the beginning of a new output period.

I have some trouble understanding this, but I think you mean:

We have to be sure that the last configuration has been applied. In most
cases drivers will have set the duty-cycle to 0%. To prevent the PWM
from locking at a 100% duty-cycle for example, we delay disabling the
PWM for a whole period to make sure any new configuration has been
latched.

> diff --git a/drivers/pwm/pwm-mxs.c b/drivers/pwm/pwm-mxs.c
> index 3febddd..4ddc063 100644
> --- a/drivers/pwm/pwm-mxs.c
> +++ b/drivers/pwm/pwm-mxs.c
> @@ -21,6 +21,7 @@
>  #include <linux/pwm.h>
>  #include <linux/slab.h>
>  #include <linux/stmp_device.h>
> +#include <linux/delay.h>

Please keep the includes sorted alphabetically.

>  
>  #define SET	0x4
>  #define CLR	0x8
> @@ -40,6 +41,7 @@ struct mxs_pwm_chip {
>  	struct pwm_chip chip;
>  	struct clk *clk;
>  	void __iomem *base;
> +	unsigned long period_ns;

This is not the proper place to put it. The period can be different for
each PWM channel. But you also don't need to store this separately as in
latest linux-next this is already done by the core. You can use the
pwm_get_period() function to obtain the current period from a PWM
device.

> @@ -113,6 +116,11 @@ static void mxs_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
>  {
>  	struct mxs_pwm_chip *mxs = to_mxs_pwm_chip(chip);
>  
> +	/*
> +	 * Ensure latest configuration applied.
> +	 */

This comment can go on a single line.

> +	ndelay(mxs->period_ns);

This introduces a potentially long delay. How about changing this to
something like:

	period = pwm_get_period(pwm);
	period = DIV_ROUND_UP(period, 1000);
	usleep_range(period, period + 1000);

?

Thierry

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] pwm: pwm-mxs: Apply configuration before disabling PWM.
  2013-06-21 10:02 ` Thierry Reding
@ 2013-06-26  6:52   ` Robin van der Gracht
  0 siblings, 0 replies; 3+ messages in thread
From: Robin van der Gracht @ 2013-06-26  6:52 UTC (permalink / raw)
  To: Thierry Reding; +Cc: linux-pwm, linux-kernel, shawn.guo

Hello Thierry,


On 06/21/2013 12:02 PM, Thierry Reding wrote:
> Please use my new email address and Cc the linux-pwm mailing list.
>
> The subject implies some active procedure is used to make sure the
> configuration is applied, but you really only wait for some amount of
> time. Perhaps something like:
>
> 	pwm: pwm-mxs: Wait for configuration to apply before disabling PWM
>
> is more accurate?
Agreed
>
> On Wed, Jun 19, 2013 at 01:51:26PM +0200, Robin van der Gracht wrote:
>> When disabling the pwm, the output state locks at its current state.
> Please use the proper spelling "PWM" in prose.
Ok
>
>> We have to be sure the last configuration applied. Which in most
>> cases sets duty cycle to 0%. To prevent the pwm from taking on
>> 100% duty cycle when disabled during a high state.
>>
>> Configuration applies at the beginning of a new output period.
> I have some trouble understanding this, but I think you mean:
>
> We have to be sure that the last configuration has been applied. In most
> cases drivers will have set the duty-cycle to 0%. To prevent the PWM
> from locking at a 100% duty-cycle for example, we delay disabling the
> PWM for a whole period to make sure any new configuration has been
> latched.
Yes that is correct.
>
>> diff --git a/drivers/pwm/pwm-mxs.c b/drivers/pwm/pwm-mxs.c
>> index 3febddd..4ddc063 100644
>> --- a/drivers/pwm/pwm-mxs.c
>> +++ b/drivers/pwm/pwm-mxs.c
>> @@ -21,6 +21,7 @@
>>   #include <linux/pwm.h>
>>   #include <linux/slab.h>
>>   #include <linux/stmp_device.h>
>> +#include <linux/delay.h>
> Please keep the includes sorted alphabetically.
I'll update that.
>
>>   
>>   #define SET	0x4
>>   #define CLR	0x8
>> @@ -40,6 +41,7 @@ struct mxs_pwm_chip {
>>   	struct pwm_chip chip;
>>   	struct clk *clk;
>>   	void __iomem *base;
>> +	unsigned long period_ns;
> This is not the proper place to put it. The period can be different for
> each PWM channel. But you also don't need to store this separately as in
> latest linux-next this is already done by the core. You can use the
> pwm_get_period() function to obtain the current period from a PWM
> device.
>
>> @@ -113,6 +116,11 @@ static void mxs_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
>>   {
>>   	struct mxs_pwm_chip *mxs = to_mxs_pwm_chip(chip);
>>   
>> +	/*
>> +	 * Ensure latest configuration applied.
>> +	 */
> This comment can go on a single line.
>
>> +	ndelay(mxs->period_ns);
> This introduces a potentially long delay. How about changing this to
> something like:
>
> 	period = pwm_get_period(pwm);
> 	period = DIV_ROUND_UP(period, 1000);
> 	usleep_range(period, period + 1000);
Thanks for the input, I agree on your comment. I'll resubmit the patch.
>
> ?
>
> Thierry


-- 
Robin van der Gracht
Protonic Holland.
tel.: +31 (0) 229 212928
fax.: +31 (0) 229 210930
Factorij 36 / 1689 AL Zwaag


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-06-26  6:53 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-19 11:51 [PATCH] pwm: pwm-mxs: Apply configuration before disabling PWM Robin van der Gracht
2013-06-21 10:02 ` Thierry Reding
2013-06-26  6:52   ` Robin van der Gracht

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).