summaryrefslogtreecommitdiff
path: root/drivers/pwm
diff options
context:
space:
mode:
authorBiju Das <biju.das.jz@bp.renesas.com>2025-11-26 10:42:48 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-01-02 12:57:29 +0100
commit17be376bb250718e466eb33d3538b478781823af (patch)
tree9ddd946713294aa8e448af4d30798390c8fb729c /drivers/pwm
parentf80e4e91b010ee7d6c52f24d069975ac955ac6b2 (diff)
downloadlinux-17be376bb250718e466eb33d3538b478781823af.tar.gz
linux-17be376bb250718e466eb33d3538b478781823af.tar.bz2
linux-17be376bb250718e466eb33d3538b478781823af.zip
pwm: rzg2l-gpt: Allow checking period_tick cache value only if sibling channel is enabled
commit fae00ea9f00367771003ace78f29549dead58fc7 upstream. The rzg2l_gpt_config() tests the rzg2l_gpt->period_tick variable when both channels of a hardware channel are in use. This check is not valid if rzg2l_gpt_config() is called after disabling all the channels, as it tests against the cached value. Hence, allow checking and setting the cached value only if the sibling channel is enabled. While at it, drop else after return statement to fix the check patch warning. Cc: stable@kernel.org Fixes: 061f087f5d0b ("pwm: Add support for RZ/G2L GPT") Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Link: https://patch.msgid.link/20251126104308.142302-1-biju.das.jz@bp.renesas.com Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/pwm')
-rw-r--r--drivers/pwm/pwm-rzg2l-gpt.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/pwm/pwm-rzg2l-gpt.c b/drivers/pwm/pwm-rzg2l-gpt.c
index 360c8bf3b190..4856af080e8e 100644
--- a/drivers/pwm/pwm-rzg2l-gpt.c
+++ b/drivers/pwm/pwm-rzg2l-gpt.c
@@ -96,6 +96,11 @@ static inline unsigned int rzg2l_gpt_subchannel(unsigned int hwpwm)
return hwpwm & 0x1;
}
+static inline unsigned int rzg2l_gpt_sibling(unsigned int hwpwm)
+{
+ return hwpwm ^ 0x1;
+}
+
static void rzg2l_gpt_write(struct rzg2l_gpt_chip *rzg2l_gpt, u32 reg, u32 data)
{
writel(data, rzg2l_gpt->mmio + reg);
@@ -271,10 +276,14 @@ static int rzg2l_gpt_config(struct pwm_chip *chip, struct pwm_device *pwm,
* in use with different settings.
*/
if (rzg2l_gpt->channel_request_count[ch] > 1) {
- if (period_ticks < rzg2l_gpt->period_ticks[ch])
- return -EBUSY;
- else
+ u8 sibling_ch = rzg2l_gpt_sibling(pwm->hwpwm);
+
+ if (rzg2l_gpt_is_ch_enabled(rzg2l_gpt, sibling_ch)) {
+ if (period_ticks < rzg2l_gpt->period_ticks[ch])
+ return -EBUSY;
+
period_ticks = rzg2l_gpt->period_ticks[ch];
+ }
}
prescale = rzg2l_gpt_calculate_prescale(rzg2l_gpt, period_ticks);