* [PATCH v7 08/13] pwm: sifive: Use 64-bit division macros for period and duty cycle [not found] <cover.1583782035.git.gurus@codeaurora.org> @ 2020-03-09 19:35 ` Guru Das Srinagesh 2020-03-26 16:37 ` Palmer Dabbelt 0 siblings, 1 reply; 2+ messages in thread From: Guru Das Srinagesh @ 2020-03-09 19:35 UTC (permalink / raw) To: linux-pwm Cc: Guru Das Srinagesh, Uwe Kleine-König, linux-kernel, Atish Patra, Yash Shah, Thierry Reding, Palmer Dabbelt, Paul Walmsley, Subbaraman Narayanamurthy, linux-riscv Because period and duty cycle are defined in the PWM framework structs as ints with units of nanoseconds, the maximum time duration that can be set is limited to ~2.147 seconds. Redefining them as u64 values will enable larger time durations to be set. As a first step, prepare drivers to handle the switch to u64 period and duty_cycle by replacing division operations involving pwm period and duty cycle with their 64-bit equivalents as appropriate. The actual switch to u64 period and duty_cycle follows as a separate patch. Where the dividend is 64-bit but the divisor is 32-bit, use *_ULL macros: - DIV_ROUND_UP_ULL - DIV_ROUND_CLOSEST_ULL - div_u64 Where the divisor is 64-bit (dividend may be 32-bit or 64-bit), use DIV64_* macros: - DIV64_U64_ROUND_CLOSEST - div64_u64 Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <paul.walmsley@sifive.com> Cc: linux-riscv@lists.infradead.org Cc: Yash Shah <yash.shah@sifive.com> Cc: Atish Patra <atish.patra@wdc.com> Signed-off-by: Guru Das Srinagesh <gurus@codeaurora.org> --- drivers/pwm/pwm-sifive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pwm/pwm-sifive.c b/drivers/pwm/pwm-sifive.c index cc63f9b..62de0bb 100644 --- a/drivers/pwm/pwm-sifive.c +++ b/drivers/pwm/pwm-sifive.c @@ -181,7 +181,7 @@ static int pwm_sifive_apply(struct pwm_chip *chip, struct pwm_device *pwm, * consecutively */ num = (u64)duty_cycle * (1U << PWM_SIFIVE_CMPWIDTH); - frac = DIV_ROUND_CLOSEST_ULL(num, state->period); + frac = DIV64_U64_ROUND_CLOSEST(num, state->period); /* The hardware cannot generate a 100% duty cycle */ frac = min(frac, (1U << PWM_SIFIVE_CMPWIDTH) - 1); -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project ^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v7 08/13] pwm: sifive: Use 64-bit division macros for period and duty cycle 2020-03-09 19:35 ` [PATCH v7 08/13] pwm: sifive: Use 64-bit division macros for period and duty cycle Guru Das Srinagesh @ 2020-03-26 16:37 ` Palmer Dabbelt 0 siblings, 0 replies; 2+ messages in thread From: Palmer Dabbelt @ 2020-03-26 16:37 UTC (permalink / raw) To: gurus Cc: gurus, uwe, linux-pwm, linux-kernel, Atish Patra, yash.shah, thierry.reding, Paul Walmsley, subbaram, linux-riscv On Mon, 09 Mar 2020 12:35:11 PDT (-0700), gurus@codeaurora.org wrote: > Because period and duty cycle are defined in the PWM framework structs > as ints with units of nanoseconds, the maximum time duration that can be > set is limited to ~2.147 seconds. Redefining them as u64 values will > enable larger time durations to be set. > > As a first step, prepare drivers to handle the switch to u64 period and > duty_cycle by replacing division operations involving pwm period and duty cycle > with their 64-bit equivalents as appropriate. The actual switch to u64 period > and duty_cycle follows as a separate patch. > > Where the dividend is 64-bit but the divisor is 32-bit, use *_ULL > macros: > - DIV_ROUND_UP_ULL > - DIV_ROUND_CLOSEST_ULL > - div_u64 > > Where the divisor is 64-bit (dividend may be 32-bit or 64-bit), use > DIV64_* macros: > - DIV64_U64_ROUND_CLOSEST > - div64_u64 > > Cc: Palmer Dabbelt <palmer@dabbelt.com> > Cc: Paul Walmsley <paul.walmsley@sifive.com> > Cc: linux-riscv@lists.infradead.org > Cc: Yash Shah <yash.shah@sifive.com> > Cc: Atish Patra <atish.patra@wdc.com> > > Signed-off-by: Guru Das Srinagesh <gurus@codeaurora.org> > --- > drivers/pwm/pwm-sifive.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/pwm/pwm-sifive.c b/drivers/pwm/pwm-sifive.c > index cc63f9b..62de0bb 100644 > --- a/drivers/pwm/pwm-sifive.c > +++ b/drivers/pwm/pwm-sifive.c > @@ -181,7 +181,7 @@ static int pwm_sifive_apply(struct pwm_chip *chip, struct pwm_device *pwm, > * consecutively > */ > num = (u64)duty_cycle * (1U << PWM_SIFIVE_CMPWIDTH); > - frac = DIV_ROUND_CLOSEST_ULL(num, state->period); > + frac = DIV64_U64_ROUND_CLOSEST(num, state->period); > /* The hardware cannot generate a 100% duty cycle */ > frac = min(frac, (1U << PWM_SIFIVE_CMPWIDTH) - 1); Acked-by: Palmer Dabbelt <palmerdabbelt@google.com> ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-03-26 16:37 UTC | newest] Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <cover.1583782035.git.gurus@codeaurora.org> 2020-03-09 19:35 ` [PATCH v7 08/13] pwm: sifive: Use 64-bit division macros for period and duty cycle Guru Das Srinagesh 2020-03-26 16:37 ` Palmer Dabbelt
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).