linux/drivers/pwm
Uwe Kleine-König 1cc2e1faaf pwm: Add more locking
This ensures that a pwm_chip that has no corresponding driver isn't used
and that a driver doesn't go away while a callback is still running.

In the presence of device links this isn't necessary yet (so this is no
fix) but for pwm character device support this is needed.

To not serialize all pwm_apply_state() calls, this introduces a per chip
lock. An additional complication is that for atomic chips a mutex cannot
be used (as pwm_apply_atomic() must not sleep) and a spinlock cannot be
held while calling an operation for a sleeping chip. So depending on the
chip being atomic or not a spinlock or a mutex is used.

An additional change implemented here is that on driver remove the
.free() callback is called for each requested pwm_device. This is the
right time because later (e.g. when the consumer calls pwm_put()) the
free function is (maybe) not available any more.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/026aa891c8270a11723a1ba7e4256f456f7e1e86.1726819463.git.u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
2024-09-27 17:03:15 +02:00
..
core.c pwm: Add more locking 2024-09-27 17:03:15 +02:00
Kconfig pwm: adp5585: Add Analog Devices ADP5585 support 2024-08-01 14:09:28 +01:00
Makefile pwm: adp5585: Add Analog Devices ADP5585 support 2024-08-01 14:09:28 +01:00
pwm-ab8500.c pwm: ab8500: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:19 +01:00
pwm-adp5585.c pwm: adp5585: Set OSC_EN bit to 1 when PWM state is enabled 2024-09-16 15:24:58 +02:00
pwm-apple.c pwm: apple: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:19 +01:00
pwm-atmel-hlcdc.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-atmel-tcb.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-atmel.c pwm: atmel: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:19 +01:00
pwm-axi-pwmgen.c pwm: axi-pwmgen: use shared macro for version reg 2024-09-16 15:24:58 +02:00
pwm-bcm2835.c pwm: bcm2835: Drop open coded variant of devm_clk_rate_exclusive_get() 2024-04-30 18:57:08 +02:00
pwm-bcm-iproc.c pwm: bcm-iproc: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:20 +01:00
pwm-bcm-kona.c pwm: bcm-kona: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:20 +01:00
pwm-berlin.c pwm: berlin: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:20 +01:00
pwm-brcmstb.c pwm: brcmstb: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:20 +01:00
pwm-clk.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-clps711x.c pwm: clps711x: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:21 +01:00
pwm-crc.c pwm: crc: Make use of devm_pwmchip_alloc() function 2024-02-15 12:59:21 +01:00
pwm-cros-ec.c pwm: cros-ec: Simplify device tree xlation 2024-07-10 17:52:47 +02:00
pwm-dwc-core.c pwm: dwc: allow suspend/resume for 16 channels 2024-04-15 17:28:13 +02:00
pwm-dwc.c pwm: dwc: allow suspend/resume for 16 channels 2024-04-15 17:28:13 +02:00
pwm-dwc.h pwm: dwc: allow suspend/resume for 16 channels 2024-04-15 17:28:13 +02:00
pwm-ep93xx.c pwm: ep93xx: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:08 +01:00
pwm-fsl-ftm.c pwm: fsl-ftm: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:09 +01:00
pwm-gpio.c pwm: Add GPIO PWM driver 2024-07-10 17:52:47 +02:00
pwm-hibvt.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-img.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-imx1.c pwm: add missing MODULE_DESCRIPTION() macros 2024-07-10 17:52:46 +02:00
pwm-imx27.c pwm: add missing MODULE_DESCRIPTION() macros 2024-07-10 17:52:46 +02:00
pwm-imx-tpm.c pwm: imx-tpm: Enable pinctrl setting for sleep state 2024-07-10 17:53:51 +02:00
pwm-intel-lgm.c pwm: add missing MODULE_DESCRIPTION() macros 2024-07-10 17:52:46 +02:00
pwm-iqs620a.c pwm: iqs620a: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:10 +01:00
pwm-jz4740.c pwm: jz4740: Another few conversions to regmap_{set,clear}_bits() 2024-07-10 17:52:46 +02:00
pwm-keembay.c pwm: keembay: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:10 +01:00
pwm-lp3943.c pwm: lp3943: Fix an incorrect type in lp3943_pwm_parse_dt() 2024-09-16 15:23:36 +02:00
pwm-lpc18xx-sct.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-lpc32xx.c pwm: lpc32xx: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:11 +01:00
pwm-lpss-pci.c pwm: lpss: drop redundant runtime PM handles 2024-07-10 17:53:51 +02:00
pwm-lpss-platform.c pwm: lpss: use devm_pm_runtime_enable() helper 2024-07-10 17:53:51 +02:00
pwm-lpss.c pwm: lpss-*: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:11 +01:00
pwm-lpss.h pwm: lpss-*: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:11 +01:00
pwm-mediatek.c pwm: add missing MODULE_DESCRIPTION() macros 2024-07-10 17:52:46 +02:00
pwm-meson.c pwm: meson: Add support for Amlogic S4 PWM 2024-07-10 17:52:47 +02:00
pwm-microchip-core.c pwm: microchip-core: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:12 +01:00
pwm-mtk-disp.c pwm: mtk-disp: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:12 +01:00
pwm-mxs.c pwm: mxs: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:12 +01:00
pwm-ntxec.c pwm: ntxec: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:12 +01:00
pwm-omap-dmtimer.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-pca9685.c pwm: pca9685: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-05-10 07:30:27 +02:00
pwm-pxa.c pwm: add missing MODULE_DESCRIPTION() macros 2024-07-10 17:52:46 +02:00
pwm-raspberrypi-poe.c pwm: raspberrypi-poe: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:13 +01:00
pwm-rcar.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-renesas-tpu.c pwm: renesas-tpu: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:13 +01:00
pwm-rockchip.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-rz-mtu3.c pwm: rz-mtu3: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:14 +01:00
pwm-samsung.c of: remove internal arguments from of_property_for_each_u32() 2024-07-25 06:53:47 -05:00
pwm-sifive.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-sl28cpld.c pwm: sl28cpld: Make use of devm_pwmchip_alloc() function 2024-02-19 11:04:15 +01:00
pwm-spear.c pwm: add missing MODULE_DESCRIPTION() macros 2024-07-10 17:52:46 +02:00
pwm-sprd.c pwm: sprd: Make use of devm_pwmchip_alloc() function 2024-02-22 14:39:10 +01:00
pwm-sti.c pwm: sti: Prefer local variable over pointer dereference 2024-04-26 21:29:17 +02:00
pwm-stm32-lp.c pwm: stm32-lp: Make use of devm_pwmchip_alloc() function 2024-02-22 14:39:25 +01:00
pwm-stm32.c pwm: stm32: Fix a typo 2024-09-16 15:24:59 +02:00
pwm-stmpe.c pwm: stmpe: Make use of devm_pwmchip_alloc() function 2024-02-22 14:39:25 +01:00
pwm-sun4i.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-sunplus.c pwm: sunplus: Make use of devm_pwmchip_alloc() function 2024-02-22 14:39:25 +01:00
pwm-tegra.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-tiecap.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-tiehrpwm.c pwm: Switch back to struct platform_driver::remove() 2024-09-16 15:24:59 +02:00
pwm-twl-led.c pwm: twl-led: Make use of devm_pwmchip_alloc() function 2024-02-22 14:39:27 +01:00
pwm-twl.c pwm: twl: Make use of devm_pwmchip_alloc() function 2024-02-22 14:39:27 +01:00
pwm-visconti.c pwm: add missing MODULE_DESCRIPTION() macros 2024-07-10 17:52:46 +02:00
pwm-vt8500.c pwm: vt8500: Make use of devm_pwmchip_alloc() function 2024-02-22 14:39:27 +01:00
pwm-xilinx.c pwm: xilinx: Simplify using devm_ functions 2024-07-10 17:53:52 +02:00