If the flag PWM_STAGGERING_ALLOWED is set on a channel, the PWM driver may (if supported by the HW) delay the ON time of the channel relative to the channel number. This does not alter the duty cycle ratio and is only relevant for PWM chips with less prescalers than channels, which would otherwise assert multiple or even all enabled channels at the same time.
If this feature is supported by the driver and the flag is set on multiple channels, their ON times are spread out to improve EMI and reduce current spikes. Signed-off-by: Clemens Gruber <clemens.gru...@pqgruber.com> --- drivers/pwm/core.c | 9 +++++++-- include/linux/pwm.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index a8eff4b3ee36..f58aad754741 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -153,9 +153,14 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args) pwm->args.period = args->args[1]; pwm->args.polarity = PWM_POLARITY_NORMAL; + pwm->args.staggering_allowed = false; - if (args->args_count > 2 && args->args[2] & PWM_POLARITY_INVERTED) - pwm->args.polarity = PWM_POLARITY_INVERSED; + if (args->args_count > 2) { + if (args->args[2] & PWM_POLARITY_INVERTED) + pwm->args.polarity = PWM_POLARITY_INVERSED; + if (args->args[2] & PWM_STAGGERING_ALLOWED) + pwm->args.staggering_allowed = true; + } return pwm; } diff --git a/include/linux/pwm.h b/include/linux/pwm.h index e4d84d4db293..3d5dee8c564f 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -41,6 +41,7 @@ enum pwm_polarity { struct pwm_args { u64 period; enum pwm_polarity polarity; + bool staggering_allowed; }; enum { -- 2.31.1