FAILED: patch "[PATCH] pwm: meson: fix handling of period/duty if greater than" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 87a2cbf02d7701255f9fcca7e5bd864a7bb397cf
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023072131-widely-ploy-5798@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
87a2cbf02d77 ("pwm: meson: fix handling of period/duty if greater than UINT_MAX") 5f97f18feac9 ("pwm: meson: Simplify duplicated per-channel tracking")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 87a2cbf02d7701255f9fcca7e5bd864a7bb397cf Mon Sep 17 00:00:00 2001
From: Heiner Kallweit <[email protected]>
Date: Wed, 24 May 2023 21:48:36 +0200
Subject: [PATCH] pwm: meson: fix handling of period/duty if greater than
UINT_MAX
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
state->period/duty are of type u64, and if their value is greater than UINT_MAX, then the cast to uint will cause problems. Fix this by changing the type of the respective local variables to u64.
drivers/pwm/pwm-meson.c +7 -7
@@ -156,8 +156,9 @@ static int meson_pwm_calc(struct meson_pwm *meson, struct pwm_device *pwm, const struct pwm_state *state) {struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; -unsigned int duty, period, pre_div, cnt, duty_cnt; +unsigned int pre_div, cnt, duty_cnt;unsigned long fin_freq; +u64 duty, period; duty = state->duty_cycle; period = state->period;
@@ -179,19 +180,19 @@ static int meson_pwm_calc(struct meson_pwm *meson, struct pwm_device *pwm,dev_dbg (meson->chip.dev,"fin_freq: %lu Hz\n" , fin_freq); - pre_div =div64_u64 (fin_freq * (u64 )period,NSEC_PER_SEC *0xffffLL ); + pre_div =div64_u64 (fin_freq * period,NSEC_PER_SEC *0xffffLL );if (pre_div >MISC_CLK_DIV_MASK ) {dev_err (meson->chip.dev,"unable to get period pre_div\n" );return -EINVAL ; } - cnt =div64_u64 (fin_freq * (u64 )period,NSEC_PER_SEC * (pre_div +1 )); + cnt =div64_u64 (fin_freq * period,NSEC_PER_SEC * (pre_div +1 ));if (cnt >0xffff ) {dev_err (meson->chip.dev,"unable to get period cnt\n" );return -EINVAL ; } -dev_dbg (meson->chip.dev,"period=%u pre_div=%u cnt=%u\n" , period, +dev_dbg (meson->chip.dev,"period=%llu pre_div=%u cnt=%u\n" , period, pre_div, cnt);if (duty == period) {
@@ -204,14 +205,13 @@ static int meson_pwm_calc(struct meson_pwm *meson, struct pwm_device *pwm, channel->lo = cnt; }else {/* Then check is we can have the duty with the same pre_div */ - duty_cnt =div64_u64 (fin_freq * (u64 )duty, -NSEC_PER_SEC * (pre_div +1 )); + duty_cnt =div64_u64 (fin_freq * duty,NSEC_PER_SEC * (pre_div +1 ));if (duty_cnt >0xffff ) {dev_err (meson->chip.dev,"unable to get duty cycle\n" );return -EINVAL ; } -dev_dbg (meson->chip.dev,"duty=%u pre_div=%u duty_cnt=%u\n" , +dev_dbg (meson->chip.dev,"duty=%llu pre_div=%u duty_cnt=%u\n" , duty, pre_div, duty_cnt); channel->pre_div = pre_div;