pwm: rzg2l-gpt: Accept requests for too high period length
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Wed, 23 Apr 2025 09:57:15 +0000 (11:57 +0200)
committerUwe Kleine-König <ukleinek@kernel.org>
Wed, 30 Apr 2025 07:01:03 +0000 (09:01 +0200)
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 <u.kleine-koenig@baylibre.com>
Tested-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://lore.kernel.org/r/20250423095715.2952692-2-u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/pwm-rzg2l-gpt.c

index 2ddbb13f50aa48e363adeb048c945af88d2c7672..360c8bf3b190377a1b1455b13ea3e40d12984924 100644 (file)
@@ -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);
 
        /*