[U-Boot] [PATCH 5/9] Exynos: Tidy up the pwm_config function in the exynos pwm driver

Simon Glass sjg at chromium.org
Thu Feb 28 02:30:36 CET 2013


On Wed, Feb 27, 2013 at 2:02 AM, Akshay Saraswat <akshay.s at samsung.com> wrote:
> Some small fixes in the exynos pwm driver:
>
> 1. NS_IN_HZ is non-sensical since these are not compatible units. This
> constant actually describes the number of nanoseconds in a second. Renamed it
> to NS_IN_SEC. Also dropped the unnecessary parenthesis.
> 2. The variable "period" is not used to hold a period, it's used to hold a
> frequency. Renamed it to "frequency".
> 3. tcmp is an unsigned value, so (tcmp < 0) will never be true and the if
> which checks that condition will never execute. Also, there should be no
> problem if the pwm never switches, so there's no reason to subtract one from
> tcmp and therefore no reason to compare it against zero. Removed both ifs. If
> they weren't removed, tcmp should be a signed value.
> 4. Add a check for a 0 period.
>
> TEST=sf probe 1:0; time sf read 40008000 0 1000
> Try with different numbers of bytes and see that sane values are obtained
> Build and boot U-boot with this patch, backlight works properly.
>
> Signed-off-by: Gabe Black <gabeblack at google.com>
> Signed-off-by: Akshay Saraswat <akshay.s at samsung.com>

Acked-by: Simon Glass <sjg at chromium.org>

> ---
>  arch/arm/cpu/armv7/s5p-common/pwm.c | 22 ++++++----------------
>  1 file changed, 6 insertions(+), 16 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/s5p-common/pwm.c b/arch/arm/cpu/armv7/s5p-common/pwm.c
> index 02156d1..6f401b8 100644
> --- a/arch/arm/cpu/armv7/s5p-common/pwm.c
> +++ b/arch/arm/cpu/armv7/s5p-common/pwm.c
> @@ -70,7 +70,7 @@ static unsigned long pwm_calc_tin(int pwm_id, unsigned long freq)
>         return tin_parent_rate / 16;
>  }
>
> -#define NS_IN_HZ (1000000000UL)
> +#define NS_IN_SEC 1000000000UL
>
>  int pwm_config(int pwm_id, int duty_ns, int period_ns)
>  {
> @@ -79,7 +79,7 @@ int pwm_config(int pwm_id, int duty_ns, int period_ns)
>         unsigned int offset;
>         unsigned long tin_rate;
>         unsigned long tin_ns;
> -       unsigned long period;
> +       unsigned long frequency;
>         unsigned long tcon;
>         unsigned long tcnt;
>         unsigned long tcmp;
> @@ -89,34 +89,24 @@ int pwm_config(int pwm_id, int duty_ns, int period_ns)
>          * fact that anything faster than 1GHz is easily representable
>          * by 32bits.
>          */
> -       if (period_ns > NS_IN_HZ || duty_ns > NS_IN_HZ)
> +       if (period_ns > NS_IN_SEC || duty_ns > NS_IN_SEC || period_ns == 0)
>                 return -ERANGE;
>
>         if (duty_ns > period_ns)
>                 return -EINVAL;
>
> -       period = NS_IN_HZ / period_ns;
> +       frequency = NS_IN_SEC / period_ns;
>
>         /* Check to see if we are changing the clock rate of the PWM */
> -       tin_rate = pwm_calc_tin(pwm_id, period);
> +       tin_rate = pwm_calc_tin(pwm_id, frequency);
>
> -       tin_ns = NS_IN_HZ / tin_rate;
> +       tin_ns = NS_IN_SEC / tin_rate;
>         tcnt = period_ns / tin_ns;
>
>         /* Note, counters count down */
>         tcmp = duty_ns / tin_ns;
>         tcmp = tcnt - tcmp;
>
> -       /*
> -        * the pwm hw only checks the compare register after a decrement,
> -        * so the pin never toggles if tcmp = tcnt
> -        */
> -       if (tcmp == tcnt)
> -               tcmp--;
> -
> -       if (tcmp < 0)
> -               tcmp = 0;
> -
>         /* Update the PWM register block. */
>         offset = pwm_id * 3;
>         if (pwm_id < 4) {
> --
> 1.8.0
>


More information about the U-Boot mailing list