From: Uwe Kleine-König Date: Wed, 23 Apr 2025 09:57:15 +0000 (+0200) Subject: pwm: rzg2l-gpt: Accept requests for too high period length X-Git-Tag: v6.16-rc1~171^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e373991eb9ff0a9617634017c7f19fd36ec4f208;p=thirdparty%2Fkernel%2Flinux.git pwm: rzg2l-gpt: Accept requests for too high period length The period setting is shared for each pair of PWM channels. So if the twin channel is in use, the period must not be changed. According to the usual practise to pick the next smaller possible period, accept a request for a period that is bigger than the unchangable value. Signed-off-by: Uwe Kleine-König Tested-by: Biju Das Link: https://lore.kernel.org/r/20250423095715.2952692-2-u.kleine-koenig@baylibre.com Signed-off-by: Uwe Kleine-König --- diff --git a/drivers/pwm/pwm-rzg2l-gpt.c b/drivers/pwm/pwm-rzg2l-gpt.c index 2ddbb13f50aa4..360c8bf3b1903 100644 --- a/drivers/pwm/pwm-rzg2l-gpt.c +++ b/drivers/pwm/pwm-rzg2l-gpt.c @@ -270,15 +270,19 @@ static int rzg2l_gpt_config(struct pwm_chip *chip, struct pwm_device *pwm, * prescale and period can NOT be modified when there are multiple IOs * in use with different settings. */ - if (rzg2l_gpt->channel_request_count[ch] > 1 && period_ticks != rzg2l_gpt->period_ticks[ch]) - return -EBUSY; + if (rzg2l_gpt->channel_request_count[ch] > 1) { + if (period_ticks < rzg2l_gpt->period_ticks[ch]) + return -EBUSY; + else + period_ticks = rzg2l_gpt->period_ticks[ch]; + } prescale = rzg2l_gpt_calculate_prescale(rzg2l_gpt, period_ticks); pv = rzg2l_gpt_calculate_pv_or_dc(period_ticks, prescale); duty_ticks = mul_u64_u64_div_u64(state->duty_cycle, rzg2l_gpt->rate_khz, USEC_PER_SEC); - if (duty_ticks > RZG2L_MAX_TICKS) - duty_ticks = RZG2L_MAX_TICKS; + if (duty_ticks > period_ticks) + duty_ticks = period_ticks; dc = rzg2l_gpt_calculate_pv_or_dc(duty_ticks, prescale); /*