All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tomasz Figa <t.figa@samsung.com>
To: Sachin Kamat <sachin.kamat@linaro.org>
Cc: linux-pwm@vger.kernel.org, thierry.reding@gmail.com,
	linux-samsung-soc@vger.kernel.org, tomasz.figa@gmail.com,
	Andrew Bresticker <abrestic@chromium.org>
Subject: Re: [PATCH 1/1] pwm: samsung: avoid setting manual update bit unnecessarily
Date: Thu, 28 Nov 2013 15:05:20 +0100	[thread overview]
Message-ID: <2248800.7gDdjlWdkv@amdc1227> (raw)
In-Reply-To: <1383108704-3297-1-git-send-email-sachin.kamat@linaro.org>

Hi Sachin, Andrew,

On Wednesday 30 of October 2013 10:21:44 Sachin Kamat wrote:
> From: Andrew Bresticker <abrestic@chromium.org>
> 
> When possible, avoid setting the manual update bit and starting/stopping
> the PWM when adjusting the PWM as it causes noticable flickering when
> setting the backlight brightness.

Hmm, I have tested the driver with a PWM-driven backlight and have not
observed any flickering, but you are right, a sudden manual update could
cause an instant transition of the TOUTn pin from 1 to 0, depending on
time of reconfiguration, so it's not a good behavior.

Please see my further comments inline, though.

> 
> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
> ---
>  drivers/pwm/pwm-samsung.c |   23 +++++++++++++++++++----
>  1 file changed, 19 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/pwm/pwm-samsung.c b/drivers/pwm/pwm-samsung.c
> index b59639e..6d23eb3 100644
> --- a/drivers/pwm/pwm-samsung.c
> +++ b/drivers/pwm/pwm-samsung.c
> @@ -34,6 +34,7 @@
>  
>  #define REG_TCNTB(chan)			(0x0c + ((chan) * 0xc))
>  #define REG_TCMPB(chan)			(0x10 + ((chan) * 0xc))
> +#define REG_TCNTO(chan)			(0x14 + ((chan) * 0xc))
>  
>  #define TCFG0_PRESCALER_MASK		0xff
>  #define TCFG0_PRESCALER1_SHIFT		8
> @@ -234,15 +235,29 @@ static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm)
>  	struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip);
>  	unsigned int tcon_chan = to_tcon_channel(pwm->hwpwm);
>  	unsigned long flags;
> -	u32 tcon;
> +	u32 tcon, tcnt, tcnt_o;
>  
>  	spin_lock_irqsave(&samsung_pwm_lock, flags);
>  
>  	tcon = readl(our_chip->base + REG_TCON);
> +	tcnt = readl(our_chip->base + REG_TCNTB(pwm->hwpwm));
> +	tcnt_o = readl(our_chip->base + REG_TCNTO(pwm->hwpwm));
>  
> -	tcon &= ~TCON_START(tcon_chan);
> -	tcon |= TCON_MANUALUPDATE(tcon_chan);
> -	writel(tcon, our_chip->base + REG_TCON);
> +	/*
> +	 * If we've got a big value stuck in the PWM we need to adjust it using
> +	 * manualupdate.  The start bit needs to be off for that to work
> +	 * properly so we only do this if strictly necessary since it can cause
> +	 * the PWM to blink.
> +	 *
> +	 * We will also use manualupdate if we find that the autoreload bit
> +	 * wasn't set previously since the very first time the timer is
> +	 * configured we seem to need to kickstart the PWM.
> +	 */
> +	if ((tcnt_o > tcnt) || !(tcon & TCON_AUTORELOAD(tcon_chan))) {

Hmm, how is it possible to have a bigger value in TCNTO than in TCNTB?
When you start a timer the first time, you load it manually with a value
from TCNTB. Then, subsequent overflows (underflows?) will cause it to
reload the value of TCNTB automatically. So the value can be at most
equal to TCNTB.

Same for the autoreload bit. This driver allows only continuous operation
of the channel, where autoreload bit is always set, if the channel is
under operation.

> +		tcon &= ~TCON_START(tcon_chan);
> +		tcon |= TCON_MANUALUPDATE(tcon_chan);
> +		writel(tcon, our_chip->base + REG_TCON);
> +	}

In general, I believe that it would be enough to simply skip the manual
update when the channel is already running, by simply removing the call
to pwm_samsung_enable() from pwm_samsung_config(). I really can't
remember why I added it.

In fact, the most appropriate solution would be to stop the channel, write
new TCTNB and TCMPB values and restart it from where it stopped, as this
is the only method to assure that both TCTNB and TCMPB are loaded to TCNT
and TCMP atomically on next reload.

Best regards,
Tomasz


      parent reply	other threads:[~2013-11-28 14:05 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-30  4:51 [PATCH 1/1] pwm: samsung: avoid setting manual update bit unnecessarily Sachin Kamat
2013-11-28 13:26 ` Thierry Reding
2013-11-28 13:44   ` Tomasz Figa
2013-11-28 14:05 ` Tomasz Figa [this message]

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=2248800.7gDdjlWdkv@amdc1227 \
    --to=t.figa@samsung.com \
    --cc=abrestic@chromium.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=sachin.kamat@linaro.org \
    --cc=thierry.reding@gmail.com \
    --cc=tomasz.figa@gmail.com \
    /path/to/YOUR_REPLY

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

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