linux/drivers/pwm
Sven Van Asbroeck 9cc5f232a4 pwm: pca9685: Fix PWM/GPIO inter-operation
This driver allows pwms to be requested as gpios via gpiolib. Obviously,
it should not be allowed to request a GPIO when its corresponding PWM is
already requested (and vice versa). So it requires some exclusion code.

Given that the PWMm and GPIO cores are not synchronized with respect to
each other, this exclusion code will also require proper
synchronization.

Such a mechanism was in place, but was inadvertently removed by Uwe's
clean-up in commit e926b12c61 ("pwm: Clear chip_data in pwm_put()").

Upon revisiting the synchronization mechanism, we found that
theoretically, it could allow two threads to successfully request
conflicting PWMs/GPIOs.

Replace with a bitmap which tracks PWMs in-use, plus a mutex. As long as
PWM and GPIO's respective request/free functions modify the in-use
bitmap while holding the mutex, proper synchronization will be
guaranteed.

Reported-by: YueHaibing <yuehaibing@huawei.com>
Fixes: e926b12c61 ("pwm: Clear chip_data in pwm_put()")
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Cc: YueHaibing <yuehaibing@huawei.com>
Link: https://lkml.org/lkml/2019/5/31/963
Signed-off-by: Sven Van Asbroeck <TheSven73@gmail.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
[cg: Tested on an i.MX6Q board with two NXP PCA9685 chips]
Tested-by: Clemens Gruber <clemens.gruber@pqgruber.com>
Reviewed-by: Sven Van Asbroeck <TheSven73@gmail.com> # cg's rebase
Link: https://lore.kernel.org/lkml/20200330160238.GD2817345@ulmo/
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2020-04-03 21:41:42 +02:00
..
Kconfig pwm: jz4740: Obtain regmap from parent node 2020-03-30 18:03:09 +02:00
Makefile
core.c pwm: Make pwm_apply_state_debug() static 2020-04-03 21:41:09 +02:00
pwm-ab8500.c
pwm-atmel-hlcdc.c
pwm-atmel-tcb.c
pwm-atmel.c pwm: atmel: Implement .get_state() 2020-01-08 13:47:46 +01:00
pwm-bcm-iproc.c
pwm-bcm-kona.c
pwm-bcm2835.c pwm: bcm2835: Dynamically allocate base 2020-03-30 16:55:25 +02:00
pwm-berlin.c
pwm-brcmstb.c
pwm-clps711x.c
pwm-crc.c
pwm-cros-ec.c pwm: cros-ec: Cache duty cycle value 2019-12-09 10:05:42 +01:00
pwm-ep93xx.c
pwm-fsl-ftm.c
pwm-hibvt.c
pwm-img.c
pwm-imx-tpm.c pwm: imx-tpm: Remove unused includes 2020-03-30 16:55:26 +02:00
pwm-imx1.c
pwm-imx27.c pwm: imx27: Remove unused include of of_device.h 2020-03-30 16:55:26 +02:00
pwm-jz4740.c pwm: jz4740: Allow selection of PWM channels 0 and 1 2020-03-30 18:03:10 +02:00
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: meson: Remove redundant assignment to variable fin_freq 2020-04-03 21:40:56 +02:00
pwm-mtk-disp.c
pwm-mxs.c pwm: mxs: Remove unused include of of_address.h 2020-03-30 16:55:27 +02:00
pwm-omap-dmtimer.c pwm: omap-dmtimer: Implement .apply callback 2020-03-30 18:03:08 +02:00
pwm-pca9685.c pwm: pca9685: Fix PWM/GPIO inter-operation 2020-04-03 21:41:42 +02:00
pwm-puv3.c
pwm-pxa.c
pwm-rcar.c pwm: rcar: Fix late Runtime PM enablement 2020-03-30 18:03:05 +02:00
pwm-renesas-tpu.c pwm: renesas-tpu: Drop confusing registered message 2020-03-30 18:03:06 +02:00
pwm-rockchip.c
pwm-samsung.c
pwm-sifive.c
pwm-spear.c
pwm-sprd.c
pwm-sti.c
pwm-stm32-lp.c
pwm-stm32.c pwm: stm32: Remove automatic output enable 2020-01-20 13:47:36 +01:00
pwm-stmpe.c
pwm-sun4i.c pwm: sun4i: Remove redundant needs_delay 2020-03-30 18:03:08 +02:00
pwm-tegra.c pwm: tegra: Add support for Tegra194 2020-03-30 18:03:04 +02:00
pwm-tiecap.c
pwm-tiehrpwm.c
pwm-twl-led.c
pwm-twl.c
pwm-vt8500.c
pwm-zx.c
sysfs.c