All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Guru Das Srinagesh <gurus@codeaurora.org>
Cc: "Thierry Reding" <thierry.reding@gmail.com>,
	"Linux PWM List" <linux-pwm@vger.kernel.org>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Subbaraman Narayanamurthy" <subbaram@codeaurora.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	"NXP Linux Team" <linux-imx@nxp.com>,
	"David Collins" <collinsd@codeaurora.org>
Subject: Re: [PATCH v11 06/12] pwm: imx27: Use 64-bit division macro and function
Date: Fri, 3 Apr 2020 21:13:18 +0200	[thread overview]
Message-ID: <CAK8P3a2Ua5v67vLLzQxsLPZfX9z5D7o-sfFpurQVWVykRK8sEQ@mail.gmail.com> (raw)
In-Reply-To: <20200403173719.GA6169@codeaurora.org>

On Fri, Apr 3, 2020 at 7:37 PM Guru Das Srinagesh <gurus@codeaurora.org> wrote:
>
> On Thu, Apr 02, 2020 at 11:16:22PM +0200, Arnd Bergmann wrote:
> > This looks correct, but very expensive, and you don't really have to
> > go this far, given that c1 is guaranteed to be a 32-bit number, and
> > you divide by a constant in the end.
> >
> > Why not do something like
> >
> > #define SHIFT 41 /* arbitrarily picked, not too big, not too small */
> > #define MUL 2199 /* 2^SHIFT / NSEC_PER_SEC */
> > period_cycles = clk_get_rate(imx->clk_per) * ((state->period * MUL) >> SHIFT);
>
> I have two concerns with this:
>
> 1. This actually results in the division by 1000010575.5125057 instead
>    of NSECS_PER_SEC whereas both the existing as well as the proposed logic
>    divide exactly by NSECS_PER_SEC.
> 2. What method shall be used to pick the SHIFT value? How is this to be
>    chosen?

I picked one that would result in a fairly accurate rounding and did not
seem too likely to overflow.

> Also, this seems sort of similar to my initial attempt at this
> problem, where period was being pre-divided prior to the multiplication,
> which was (rightly) NACKed.
>
>         c *= div_u64(state->period, 1000000000);

Ah, right, I did make the same mistake here. What I actually indended
was to do two separate shifts that add up to 41. I suppose there is also still
the fundamental problem that without bounds checking the calculation can
always overflow for large inputs.

       Arnd

  reply	other threads:[~2020-04-03 19:13 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-20  1:41 [PATCH v11 00/12] Convert PWM period and duty cycle to u64 Guru Das Srinagesh
2020-03-20  1:41 ` [Intel-gfx] " Guru Das Srinagesh
2020-03-20  1:41 ` Guru Das Srinagesh
2020-03-20  1:41 ` Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 01/12] drm/i915: Use 64-bit division macro Guru Das Srinagesh
2020-03-20  1:41   ` [Intel-gfx] " Guru Das Srinagesh
2020-03-20  1:41   ` Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 02/12] hwmon: pwm-fan: " Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 03/12] ir-rx51: " Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 04/12] pwm: clps711x: Cast period to u32 before use as divisor Guru Das Srinagesh
2020-03-20 17:11   ` Arnd Bergmann
2020-04-07  0:26     ` Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 05/12] pwm: pwm-imx-tpm: Use 64-bit division macro Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 06/12] pwm: imx27: Use 64-bit division macro and function Guru Das Srinagesh
2020-03-20 17:09   ` Arnd Bergmann
2020-03-30 20:43     ` Guru Das Srinagesh
2020-03-31 15:24       ` Arnd Bergmann
2020-03-31 20:20         ` Guru Das Srinagesh
2020-03-31 20:49           ` Thierry Reding
2020-04-02 20:16             ` Guru Das Srinagesh
2020-04-02 20:55               ` Guru Das Srinagesh
2020-04-02 21:16               ` Arnd Bergmann
2020-04-03 17:37                 ` Guru Das Srinagesh
2020-04-03 19:13                   ` Arnd Bergmann [this message]
2020-03-20  1:41 ` [PATCH v11 07/12] pwm: sifive: Use 64-bit division macro Guru Das Srinagesh
2020-03-20  1:41   ` Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 08/12] pwm: stm32-lp: Use %llu format specifier for period Guru Das Srinagesh
2020-03-20 10:45   ` Joe Perches
2020-03-30 19:30     ` Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 09/12] pwm: sun4i: Use 64-bit division function Guru Das Srinagesh
2020-03-20 17:02   ` Arnd Bergmann
2020-03-20  1:41 ` [PATCH v11 10/12] backlight: pwm_bl: " Guru Das Srinagesh
2020-03-20  1:41   ` Guru Das Srinagesh
2020-03-20  1:41   ` Guru Das Srinagesh
2020-03-20 13:31   ` Lee Jones
2020-03-20 13:31     ` Lee Jones
2020-03-20 13:31     ` Lee Jones
2020-03-24 11:07     ` Lee Jones
2020-03-24 11:07       ` Lee Jones
2020-03-24 11:07       ` Lee Jones
2020-03-24 12:57       ` Uwe Kleine-König
2020-03-24 12:57         ` Uwe Kleine-König
2020-03-24 12:57         ` Uwe Kleine-König
2020-03-24 13:04         ` Daniel Thompson
2020-03-24 13:04           ` Daniel Thompson
2020-03-24 13:04           ` Daniel Thompson
2020-03-24 14:24           ` Lee Jones
2020-03-24 14:24             ` Lee Jones
2020-03-24 14:24             ` Lee Jones
2020-03-24 14:43             ` Uwe Kleine-König
2020-03-24 14:43               ` Uwe Kleine-König
2020-03-24 14:43               ` Uwe Kleine-König
2020-04-15  9:26               ` Lee Jones
2020-04-15  9:26                 ` Lee Jones
2020-04-15  9:26                 ` Lee Jones
2020-03-20  1:41 ` [PATCH v11 11/12] clk: pwm: Assign u64 divisor to unsigned int before use Guru Das Srinagesh
2020-03-20 17:00   ` Arnd Bergmann
2020-03-20 18:42     ` David Laight
2020-04-07  2:40       ` Guru Das Srinagesh
2020-03-20  1:41 ` [PATCH v11 12/12] pwm: core: Convert period and duty cycle to u64 Guru Das Srinagesh

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=CAK8P3a2Ua5v67vLLzQxsLPZfX9z5D7o-sfFpurQVWVykRK8sEQ@mail.gmail.com \
    --to=arnd@arndb.de \
    --cc=collinsd@codeaurora.org \
    --cc=festevam@gmail.com \
    --cc=gurus@codeaurora.org \
    --cc=kernel@pengutronix.de \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=subbaram@codeaurora.org \
    --cc=thierry.reding@gmail.com \
    --cc=u.kleine-koenig@pengutronix.de \
    /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.