All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexey Charkov <alchark@gmail.com>
To: Ryan Mallon <ryan@bluewatersys.com>
Cc: "Russell King - ARM Linux" <linux@arm.linux.org.uk>,
	linux-arm-kernel@lists.infradead.org,
	vt8500-wm8505-linux-kernel@googlegroups.com,
	"Eric Miao" <eric.y.miao@gmail.com>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Albin Tonnerre" <albin.tonnerre@free-electrons.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/6 v9] ARM: Add basic architecture support for VIA/WonderMedia 85xx SoC's
Date: Tue, 21 Dec 2010 03:09:55 +0300	[thread overview]
Message-ID: <AANLkTik600vg0otkJVVeWCwYv-0=UNnQDr1mCR9Zvpve@mail.gmail.com> (raw)
In-Reply-To: <AANLkTinyYKrhTcBMMCE4A2oFQHm11cqSZQozytGu+d6o@mail.gmail.com>

2010/12/21 Alexey Charkov <alchark@gmail.com>:
> 2010/12/21 Ryan Mallon <ryan@bluewatersys.com>:
>> On 12/21/2010 12:00 PM, Alexey Charkov wrote:
>>> 2010/12/21 Ryan Mallon <ryan@bluewatersys.com>:
>>>> On 12/21/2010 10:48 AM, Alexey Charkov wrote:
>>>>> 2010/12/20 Ryan Mallon <ryan@bluewatersys.com>:
>>>>>> On 12/21/2010 08:54 AM, Alexey Charkov wrote:
>>>>>>> +}
>>>>>>> +
>>>>>>> +int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
>>>>>>> +{
>>>>>>> +     unsigned long long c;
>>>>>>> +     unsigned long period_cycles, prescale, pv, dc;
>>>>>>> +
>>>>>>> +     if (pwm == NULL || period_ns == 0 || duty_ns > period_ns)
>>>>>>> +             return -EINVAL;
>>>>>>> +
>>>>>>> +     c = 25000000/2; /* wild guess --- need to implement clocks */
>>>>>>> +     c = c * period_ns;
>>>>>>> +     do_div(c, 1000000000);
>>>>>>> +     period_cycles = c;
>>>>>>
>>>>>> This looks like it could be reworked to remove the do_div call.
>>>>>>
>>>>>
>>>>> I just followed PXA implementation in this regard. Are there any
>>>>> specific suggestions? Note that c should not be a complie-time
>>>>> constant eventually, as this is the guessed PWM base frequency (should
>>>>> be read from the hardware, but the code for clocks is not yet in).
>>>>
>>>> I didn't have a particular solution in mind, but often by changing the
>>>> units used and rearranging the math a bit you can often avoid having to
>>>> do horrible multiplies and divides.
>>>>
>>>> For now at least you could avoid the do_div by assigning period_cycles
>>>> directly.
>>>>
>>>
>>> It depends on period_ns, which is passed in as an argument from
>>> whatever uses PWM, so I'm not sure it can be assigned directly.
>>
>> Ah. How big a number is period_ns? Can you do something like this instead?
>>
>>        period_cycles = ((250 / 2) * period_ns) / 10000;
>>
>> and still safely avoid overflows?
>>
>
> The only current in-kernel user of PWM is the backlight, and that
> currently uses period_ns = 250000. At this value it does not overflow.
> However, in a general case the base frequency will also be returned as
> a large number (like 12500000) as per CLK infrastructure conventions
> (once that part is implemented). Further, I can't see any built-in
> reasons for period_ns to be bounded by anything below sizeof(int). The
> hardware will work with up to 4096*1024*1000000000/base_frequency (see
> the code for constraints), so it can in principle overflow with 32 bit
> arithmetics.
>

This discussion led me to look closer at the duty counter calculation:
if period_ns and duty_ns are both large and close to each other (about
0.3 seconds, rare but possible use case for PWM), then (pv * duty_ns)
can overflow in 32 bit multiplication for permissible argument values.
Should I use do_div((u64)pv * (u64)duty_ns, period_ns) here?

Best regards,
Alexey

WARNING: multiple messages have this Message-ID (diff)
From: alchark@gmail.com (Alexey Charkov)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/6 v9] ARM: Add basic architecture support for VIA/WonderMedia 85xx SoC's
Date: Tue, 21 Dec 2010 03:09:55 +0300	[thread overview]
Message-ID: <AANLkTik600vg0otkJVVeWCwYv-0=UNnQDr1mCR9Zvpve@mail.gmail.com> (raw)
In-Reply-To: <AANLkTinyYKrhTcBMMCE4A2oFQHm11cqSZQozytGu+d6o@mail.gmail.com>

2010/12/21 Alexey Charkov <alchark@gmail.com>:
> 2010/12/21 Ryan Mallon <ryan@bluewatersys.com>:
>> On 12/21/2010 12:00 PM, Alexey Charkov wrote:
>>> 2010/12/21 Ryan Mallon <ryan@bluewatersys.com>:
>>>> On 12/21/2010 10:48 AM, Alexey Charkov wrote:
>>>>> 2010/12/20 Ryan Mallon <ryan@bluewatersys.com>:
>>>>>> On 12/21/2010 08:54 AM, Alexey Charkov wrote:
>>>>>>> +}
>>>>>>> +
>>>>>>> +int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
>>>>>>> +{
>>>>>>> + ? ? unsigned long long c;
>>>>>>> + ? ? unsigned long period_cycles, prescale, pv, dc;
>>>>>>> +
>>>>>>> + ? ? if (pwm == NULL || period_ns == 0 || duty_ns > period_ns)
>>>>>>> + ? ? ? ? ? ? return -EINVAL;
>>>>>>> +
>>>>>>> + ? ? c = 25000000/2; /* wild guess --- need to implement clocks */
>>>>>>> + ? ? c = c * period_ns;
>>>>>>> + ? ? do_div(c, 1000000000);
>>>>>>> + ? ? period_cycles = c;
>>>>>>
>>>>>> This looks like it could be reworked to remove the do_div call.
>>>>>>
>>>>>
>>>>> I just followed PXA implementation in this regard. Are there any
>>>>> specific suggestions? Note that c should not be a complie-time
>>>>> constant eventually, as this is the guessed PWM base frequency (should
>>>>> be read from the hardware, but the code for clocks is not yet in).
>>>>
>>>> I didn't have a particular solution in mind, but often by changing the
>>>> units used and rearranging the math a bit you can often avoid having to
>>>> do horrible multiplies and divides.
>>>>
>>>> For now at least you could avoid the do_div by assigning period_cycles
>>>> directly.
>>>>
>>>
>>> It depends on period_ns, which is passed in as an argument from
>>> whatever uses PWM, so I'm not sure it can be assigned directly.
>>
>> Ah. How big a number is period_ns? Can you do something like this instead?
>>
>> ? ? ? ?period_cycles = ((250 / 2) * period_ns) / 10000;
>>
>> and still safely avoid overflows?
>>
>
> The only current in-kernel user of PWM is the backlight, and that
> currently uses period_ns = 250000. At this value it does not overflow.
> However, in a general case the base frequency will also be returned as
> a large number (like 12500000) as per CLK infrastructure conventions
> (once that part is implemented). Further, I can't see any built-in
> reasons for period_ns to be bounded by anything below sizeof(int). The
> hardware will work with up to 4096*1024*1000000000/base_frequency (see
> the code for constraints), so it can in principle overflow with 32 bit
> arithmetics.
>

This discussion led me to look closer at the duty counter calculation:
if period_ns and duty_ns are both large and close to each other (about
0.3 seconds, rare but possible use case for PWM), then (pv * duty_ns)
can overflow in 32 bit multiplication for permissible argument values.
Should I use do_div((u64)pv * (u64)duty_ns, period_ns) here?

Best regards,
Alexey

  reply	other threads:[~2010-12-21  0:09 UTC|newest]

Thread overview: 184+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-07 16:28 [PATCH 1/6 v2] ARM: Add basic architecture support for VIA/WonderMedia 85xx SoC's Alexey Charkov
2010-11-07 16:28 ` Alexey Charkov
2010-11-07 16:28 ` [PATCH 2/6 v2] serial: Add support for UART on VIA VT8500 and compatibles Alexey Charkov
2010-11-07 16:28   ` Alexey Charkov
2010-11-07 23:08   ` Alan Cox
2010-11-07 23:08     ` Alan Cox
2010-11-08  0:58     ` [PATCH 2/6 v3] " Alexey Charkov
2010-11-08  0:58       ` Alexey Charkov
2010-11-08 10:46       ` Alan Cox
2010-11-08 10:46         ` Alan Cox
2010-11-08 17:33         ` [PATCH 2/6 v4] " Alexey Charkov
2010-11-08 17:33           ` Alexey Charkov
2010-11-07 16:28 ` [PATCH 3/6 v2] input: Add support for VIA VT8500 and compatibles in i8042 Alexey Charkov
2010-11-07 16:28   ` Alexey Charkov
2010-11-12 22:54   ` Alexey Charkov
2010-11-12 22:54     ` Alexey Charkov
2010-11-12 22:54     ` Alexey Charkov
2010-11-12 23:30     ` Dmitry Torokhov
2010-11-12 23:30       ` Dmitry Torokhov
2010-11-12 23:30       ` Dmitry Torokhov
2010-11-13  0:00       ` Alexey Charkov
2010-11-13  0:00         ` Alexey Charkov
2010-12-22 21:41       ` [PATCH 3/6 v3] " Alexey Charkov
2010-12-22 21:41         ` Alexey Charkov
2010-11-07 16:28 ` [PATCH 4/6 v2] usb: Add support for VIA VT8500 and compatibles in EHCI HCD Alexey Charkov
2010-11-07 16:28   ` Alexey Charkov
2010-11-07 16:28 ` [PATCH 5/6 v2] rtc: Add support for the RTC in VIA VT8500 and compatibles Alexey Charkov
2010-11-07 16:28   ` Alexey Charkov
2010-11-12 22:53   ` Alexey Charkov
2010-11-12 22:53     ` Alexey Charkov
2010-11-13 12:14   ` Lars-Peter Clausen
2010-11-13 12:14     ` Lars-Peter Clausen
2010-11-13 23:56     ` [PATCH 5/6 v3] " Alexey Charkov
2010-11-13 23:56       ` Alexey Charkov
2010-11-14 15:50       ` Lars-Peter Clausen
2010-11-14 15:50         ` Lars-Peter Clausen
2010-11-14 17:00         ` [PATCH 5/6 v4] " Alexey Charkov
2010-11-14 17:00           ` Alexey Charkov
2010-11-23 19:17           ` Alexey Charkov
2010-11-23 19:17             ` Alexey Charkov
2010-11-24 19:23             ` Lars-Peter Clausen
2010-11-24 19:23               ` Lars-Peter Clausen
2010-11-24 22:47               ` [PATCH 5/6 v5] " Alexey Charkov
2010-11-24 22:47                 ` Alexey Charkov
2010-11-07 16:28 ` [PATCH 6/6 v2] ARM: Add support for the display controllers in VT8500 and WM8505 Alexey Charkov
2010-11-07 16:28   ` Alexey Charkov
2010-11-08  4:17   ` Paul Mundt
2010-11-08  4:17     ` Paul Mundt
2010-11-08 12:56     ` Alexey Charkov
2010-11-08 12:56       ` Alexey Charkov
2010-11-08 14:14     ` [PATCH 6/6 v3] " Alexey Charkov
2010-11-08 14:14       ` Alexey Charkov
2010-11-08 20:43       ` Paul Mundt
2010-11-08 20:43         ` Paul Mundt
2010-11-08 21:15         ` Alexey Charkov
2010-11-08 21:15           ` Alexey Charkov
2010-11-08 21:30           ` Paul Mundt
2010-11-08 21:30             ` Paul Mundt
2010-11-08 23:42             ` [PATCH 6/6 v4] " Alexey Charkov
2010-11-08 23:42               ` Alexey Charkov
2010-11-08 23:54               ` Paul Mundt
2010-11-08 23:54                 ` Paul Mundt
2010-11-09  0:03                 ` Alexey Charkov
2010-11-09  0:03                   ` Alexey Charkov
2010-11-09  7:36                   ` Guennadi Liakhovetski
2010-11-09  7:36                     ` Guennadi Liakhovetski
2010-11-09  9:39                   ` Paul Mundt
2010-11-09  9:39                     ` Paul Mundt
2010-11-09  9:49                     ` Alexey Charkov
2010-11-09  9:49                       ` Alexey Charkov
2010-11-09 10:33         ` [PATCH 6/6 v3] " Russell King - ARM Linux
2010-11-09 10:33           ` Russell King - ARM Linux
2010-11-09 10:51           ` Paul Mundt
2010-11-09 10:51             ` Paul Mundt
2010-11-09 11:04             ` Russell King - ARM Linux
2010-11-09 11:04               ` Russell King - ARM Linux
2010-11-09 13:02               ` Geert Uytterhoeven
2010-11-09 13:02                 ` Geert Uytterhoeven
2010-11-09 13:33                 ` Arnd Bergmann
2010-11-09 13:33                   ` Arnd Bergmann
2010-11-09 16:20                   ` Paul Mundt
2010-11-09 16:20                     ` Paul Mundt
2010-11-08  8:47   ` [PATCH 6/6 v2] " Arnd Bergmann
2010-11-08  8:47     ` Arnd Bergmann
2010-11-09 10:23     ` Alexey Charkov
2010-11-09 10:23       ` Alexey Charkov
2010-11-09 15:03       ` Arnd Bergmann
2010-11-09 15:03         ` Arnd Bergmann
2010-11-07 16:57 ` [PATCH 1/6 v2] ARM: Add basic architecture support for VIA/WonderMedia 85xx SoC's Russell King - ARM Linux
2010-11-07 16:57   ` Russell King - ARM Linux
2010-11-07 17:08   ` Alexey Charkov
2010-11-07 17:08     ` Alexey Charkov
2010-11-07 17:17     ` Russell King - ARM Linux
2010-11-07 17:17       ` Russell King - ARM Linux
2010-11-07 18:25       ` [PATCH 1/6 v3] " Alexey Charkov
2010-11-07 18:25         ` Alexey Charkov
2010-11-08 17:19       ` [PATCH 1/6 v4] " Alexey Charkov
2010-11-08 17:19         ` Alexey Charkov
2010-11-10 15:16         ` saeed bishara
2010-11-10 15:16           ` saeed bishara
2010-11-10 15:18           ` Russell King - ARM Linux
2010-11-10 15:18             ` Russell King - ARM Linux
2010-11-10 15:20             ` saeed bishara
2010-11-10 15:20               ` saeed bishara
2010-11-11 21:23         ` [PATCH 1/6 v5] " Alexey Charkov
2010-11-11 21:23           ` Alexey Charkov
2010-11-11 23:49           ` Russell King - ARM Linux
2010-11-11 23:49             ` Russell King - ARM Linux
2010-11-12 16:54             ` [PATCH 1/6 v6] " Alexey Charkov
2010-11-12 16:54               ` Alexey Charkov
2010-11-12 20:14               ` Alexey Charkov
2010-11-12 20:14                 ` Alexey Charkov
2010-11-23 19:50             ` [PATCH 1/6 v7] " Alexey Charkov
2010-11-23 19:50               ` Alexey Charkov
2010-12-19 17:40             ` [PATCH 1/6 v8] " Alexey Charkov
2010-12-19 17:40               ` Alexey Charkov
2010-12-20 18:15               ` Arnd Bergmann
2010-12-20 18:15                 ` Arnd Bergmann
2010-12-20 19:15               ` Russell King - ARM Linux
2010-12-20 19:15                 ` Russell King - ARM Linux
2010-12-20 19:26                 ` Alexey Charkov
2010-12-20 19:26                   ` Alexey Charkov
2010-12-20 19:54                 ` [PATCH 1/6 v9] " Alexey Charkov
2010-12-20 19:54                   ` Alexey Charkov
2010-12-20 20:50                   ` Ryan Mallon
2010-12-20 20:50                     ` Ryan Mallon
2010-12-20 21:48                     ` Alexey Charkov
2010-12-20 21:48                       ` Alexey Charkov
2010-12-20 22:23                       ` Ryan Mallon
2010-12-20 22:23                         ` Ryan Mallon
2010-12-20 23:00                         ` Alexey Charkov
2010-12-20 23:00                           ` Alexey Charkov
2010-12-20 23:22                           ` Ryan Mallon
2010-12-20 23:22                             ` Ryan Mallon
2010-12-20 23:49                             ` Alexey Charkov
2010-12-20 23:49                               ` Alexey Charkov
2010-12-21  0:09                               ` Alexey Charkov [this message]
2010-12-21  0:09                                 ` Alexey Charkov
2010-12-21  2:32                               ` Ryan Mallon
2010-12-21  2:32                                 ` Ryan Mallon
2010-12-21 10:00                                 ` Alexey Charkov
2010-12-21 10:00                                   ` Alexey Charkov
2010-12-21 12:05                                   ` Arnd Bergmann
2010-12-21 12:05                                     ` Arnd Bergmann
2010-12-21 19:39                                   ` Ryan Mallon
2010-12-21 19:39                                     ` Ryan Mallon
2010-12-22 21:18                                     ` [PATCH 1/6 v10] " Alexey Charkov
2010-12-22 21:18                                       ` Alexey Charkov
2010-12-22 21:52                                       ` Ryan Mallon
2010-12-22 21:52                                         ` Ryan Mallon
2010-12-22 22:02                                         ` Alexey Charkov
2010-12-22 22:02                                           ` Alexey Charkov
2010-12-22 22:32                                           ` Ryan Mallon
2010-12-22 22:32                                             ` Ryan Mallon
2010-12-22 22:25                                         ` [PATCH 1/6 v11] " Alexey Charkov
2010-12-22 22:25                                           ` Alexey Charkov
2010-12-22 22:59                                           ` Ryan Mallon
2010-12-22 22:59                                             ` Ryan Mallon
2010-12-22 23:38                                             ` [PATCH 1/6 v12] " Alexey Charkov
2010-12-22 23:38                                               ` Alexey Charkov
2010-12-28 14:52                                               ` Alexey Charkov
2010-12-28 14:52                                                 ` Alexey Charkov
2011-01-15  0:53                                                 ` Alexey Charkov
2011-01-15  0:53                                                   ` Alexey Charkov
2011-01-15  0:58                                                   ` Russell King - ARM Linux
2011-01-15  0:58                                                     ` Russell King - ARM Linux
2011-01-15  1:13                                                     ` Alexey Charkov
2011-01-15  1:13                                                       ` Alexey Charkov
2011-01-21 10:43                                                       ` Russell King - ARM Linux
2011-01-21 10:43                                                         ` Russell King - ARM Linux
2011-07-06 12:34               ` [PATCH 1/6 v8] " Russell King - ARM Linux
2011-07-06 12:34                 ` Russell King - ARM Linux
2011-07-07  7:13                 ` Alexey Charkov
2011-07-07  7:13                   ` Alexey Charkov
2011-07-07  7:54                   ` Arnd Bergmann
2011-07-07  7:54                     ` Arnd Bergmann
2011-07-07  7:59                     ` Russell King - ARM Linux
2011-07-07  7:59                       ` Russell King - ARM Linux
2011-07-07  8:05                       ` Arnd Bergmann
2011-07-07  8:05                         ` Arnd Bergmann
2010-11-07 17:00 ` [PATCH 1/6 v2] " Russell King - ARM Linux
2010-11-07 17:00   ` Russell King - ARM Linux
2010-11-07 17:16   ` Alexey Charkov
2010-11-07 17:16     ` Alexey Charkov

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='AANLkTik600vg0otkJVVeWCwYv-0=UNnQDr1mCR9Zvpve@mail.gmail.com' \
    --to=alchark@gmail.com \
    --cc=albin.tonnerre@free-electrons.com \
    --cc=eric.y.miao@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=ryan@bluewatersys.com \
    --cc=u.kleine-koenig@pengutronix.de \
    --cc=vt8500-wm8505-linux-kernel@googlegroups.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.