Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pwm: stm32: Enforce settings for PWM capture

The PWM capture assumes that the input selector is set to default
input and that the slave mode is disabled. Force reset state for
TISEL and SMCR registers to match this requirement.

Note that slave mode disabling is not a pre-requisite by itself
for capture mode, as hardware supports it for PWM capture.
However, the current implementation of the driver does not
allow slave mode for PWM capture. Setting slave mode for PWM
capture results in wrong capture values.

Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com>
Acked-by: Lee Jones <lee@kernel.org>
Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>

authored by

Olivier Moysan and committed by
Thierry Reding
d0a4564b de614ac3

+5
+4
drivers/pwm/pwm-stm32.c
··· 207 207 regmap_write(priv->regmap, TIM_ARR, priv->max_arr); 208 208 regmap_write(priv->regmap, TIM_PSC, psc); 209 209 210 + /* Reset input selector to its default input and disable slave mode */ 211 + regmap_write(priv->regmap, TIM_TISEL, 0x0); 212 + regmap_write(priv->regmap, TIM_SMCR, 0x0); 213 + 210 214 /* Map TI1 or TI2 PWM input to IC1 & IC2 (or TI3/4 to IC3 & IC4) */ 211 215 regmap_update_bits(priv->regmap, 212 216 pwm->hwpwm < 2 ? TIM_CCMR1 : TIM_CCMR2,
+1
include/linux/mfd/stm32-timers.h
··· 31 31 #define TIM_BDTR 0x44 /* Break and Dead-Time Reg */ 32 32 #define TIM_DCR 0x48 /* DMA control register */ 33 33 #define TIM_DMAR 0x4C /* DMA register for transfer */ 34 + #define TIM_TISEL 0x68 /* Input Selection */ 34 35 35 36 #define TIM_CR1_CEN BIT(0) /* Counter Enable */ 36 37 #define TIM_CR1_DIR BIT(4) /* Counter Direction */