mirror of
https://github.com/torvalds/linux
synced 2024-10-22 11:19:17 +00:00
f173747fff
Holding the spin-lock for all of the code in meson_pwm_apply() can
result in a "BUG: scheduling while atomic". This can happen because
clk_get_rate() (which is called from meson_pwm_calc()) may sleep.
Only hold the spin-lock when modifying registers to solve this.
The reason why we need a spin-lock in the driver is because the
REG_MISC_AB register is shared between the two channels provided by one
PWM controller. The only functions where REG_MISC_AB is modified are
meson_pwm_enable() and meson_pwm_disable() so the register reads/writes
in there need to be protected by the spin-lock.
The original code also used the spin-lock to protect the values in
struct meson_pwm_channel. This could be necessary if two consumers can
use the same PWM channel. However, PWM core doesn't allow this so we
don't need to protect the values in struct meson_pwm_channel with a
lock.
Fixes:
|
||
---|---|---|
.. | ||
core.c | ||
Kconfig | ||
Makefile | ||
pwm-ab8500.c | ||
pwm-atmel-hlcdc.c | ||
pwm-atmel-tcb.c | ||
pwm-atmel.c | ||
pwm-bcm-iproc.c | ||
pwm-bcm-kona.c | ||
pwm-bcm2835.c | ||
pwm-berlin.c | ||
pwm-brcmstb.c | ||
pwm-clps711x.c | ||
pwm-crc.c | ||
pwm-cros-ec.c | ||
pwm-ep93xx.c | ||
pwm-fsl-ftm.c | ||
pwm-hibvt.c | ||
pwm-img.c | ||
pwm-imx1.c | ||
pwm-imx27.c | ||
pwm-jz4740.c | ||
pwm-lp3943.c | ||
pwm-lpc18xx-sct.c | ||
pwm-lpc32xx.c | ||
pwm-lpss-pci.c | ||
pwm-lpss-platform.c | ||
pwm-lpss.c | ||
pwm-lpss.h | ||
pwm-mediatek.c | ||
pwm-meson.c | ||
pwm-mtk-disp.c | ||
pwm-mxs.c | ||
pwm-omap-dmtimer.c | ||
pwm-pca9685.c | ||
pwm-puv3.c | ||
pwm-pxa.c | ||
pwm-rcar.c | ||
pwm-renesas-tpu.c | ||
pwm-rockchip.c | ||
pwm-samsung.c | ||
pwm-spear.c | ||
pwm-sti.c | ||
pwm-stm32-lp.c | ||
pwm-stm32.c | ||
pwm-stmpe.c | ||
pwm-sun4i.c | ||
pwm-tegra.c | ||
pwm-tiecap.c | ||
pwm-tiehrpwm.c | ||
pwm-tipwmss.c | ||
pwm-twl-led.c | ||
pwm-twl.c | ||
pwm-vt8500.c | ||
pwm-zx.c | ||
sysfs.c |