linux/drivers/spi
Lukas Wunner 30872ac7db spi: Prevent adding devices below an unregistering controller
[ Upstream commit ddf75be47c ]

CONFIG_OF_DYNAMIC and CONFIG_ACPI allow adding SPI devices at runtime
using a DeviceTree overlay or DSDT patch.  CONFIG_SPI_SLAVE allows the
same via sysfs.

But there are no precautions to prevent adding a device below a
controller that's being removed.  Such a device is unusable and may not
even be able to unbind cleanly as it becomes inaccessible once the
controller has been torn down.  E.g. it is then impossible to quiesce
the device's interrupt.

of_spi_notify() and acpi_spi_notify() do hold a ref on the controller,
but otherwise run lockless against spi_unregister_controller().

Fix by holding the spi_add_lock in spi_unregister_controller() and
bailing out of spi_add_device() if the controller has been unregistered
concurrently.

Fixes: ce79d54ae4 ("spi/of: Add OF notifier handler")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v3.19+
Cc: Geert Uytterhoeven <geert+renesas@glider.be>
Cc: Octavian Purdila <octavian.purdila@intel.com>
Cc: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Link: https://lore.kernel.org/r/a8c3205088a969dc8410eec1eba9aface60f36af.1596451035.git.lukas@wunner.de
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-08-26 10:31:00 +02:00
..
internals.h spi: Add an helper to flush the message queue 2018-04-23 15:48:18 +01:00
Kconfig spi: Prevent adding devices below an unregistering controller 2020-08-26 10:31:00 +02:00
Makefile spi: add SPI controller driver for UniPhier SoC 2018-08-01 11:22:37 +01:00
spi-altera.c
spi-armada-3700.c
spi-ath79.c spi: add flags parameter to txrx_word function pointers 2018-08-01 14:50:24 +01:00
spi-atmel.c spi: atmel: fix handling of cs_change set on non-last xfer 2020-01-17 19:47:12 +01:00
spi-au1550.c
spi-axi-spi-engine.c
spi-bcm-qspi.c spi: bcm-qspi: when tx/rx buffer is NULL set to 0 2020-06-22 09:05:03 +02:00
spi-bcm-qspi.h
spi-bcm63xx-hsspi.c spi: bcm63xx-hsspi: Really keep pll clk enabled 2020-03-11 14:15:06 +01:00
spi-bcm63xx.c
spi-bcm2835.c spi: bcm2835: Fix controller unregister order 2020-06-22 09:05:05 +02:00
spi-bcm2835aux.c spi: bcm2835aux: Fix controller unregister order 2020-06-22 09:05:03 +02:00
spi-bitbang-txrx.h
spi-bitbang.c spi: bitbang: Fix NULL pointer dereference in spi_unregister_master 2019-07-10 09:53:32 +02:00
spi-brcmstb-qspi.c
spi-butterfly.c spi: add flags parameter to txrx_word function pointers 2018-08-01 14:50:24 +01:00
spi-cadence.c spi: cadence: Correct initialisation of runtime PM 2020-01-27 14:50:12 +01:00
spi-cavium-octeon.c
spi-cavium-thunderx.c spi: spi-cavium-thunderx: Add missing pci_release_regions() 2020-01-12 12:17:11 +01:00
spi-cavium.c
spi-cavium.h
spi-clps711x.c
spi-coldfire-qspi.c
spi-davinci.c Merge branch 'spi-4.18' into spi-linus 2018-08-10 17:51:50 +01:00
spi-dln2.c
spi-dw-mid.c spi: dw: Return any value retrieved from the dma_transfer callback 2020-06-22 09:05:20 +02:00
spi-dw-mmio.c spi: dw-mmio: add MSCC Ocelot support 2018-07-30 12:02:08 +01:00
spi-dw-pci.c
spi-dw.c spi: dw: Return any value retrieved from the dma_transfer callback 2020-06-22 09:05:20 +02:00
spi-dw.h spi: spi-dw: Add lock protect dw_spi rx/tx to prevent concurrent calls 2020-02-01 09:37:08 +00:00
spi-efm32.c
spi-ep93xx.c spi: spi-ep93xx: Use dma_data_direction for ep93xx_spi_dma_{finish,prepare} 2018-11-13 11:08:22 -08:00
spi-falcon.c
spi-fsl-cpm.c
spi-fsl-cpm.h
spi-fsl-dspi.c spi: spi-fsl-dspi: Exit the ISR with IRQ_NONE when it's not ours 2020-07-29 10:16:46 +02:00
spi-fsl-espi.c spi: spi-fsl-espi: Log fifo counters on error 2018-07-26 15:43:09 +01:00
spi-fsl-lib.c
spi-fsl-lib.h
spi-fsl-lpspi.c spi: fsl-lpspi: Prevent FIFO under/overrun by default 2019-11-24 08:20:55 +01:00
spi-fsl-spi.c spi: spi-fsl-spi: call spi_finalize_current_message() at the end 2020-01-27 14:50:50 +01:00
spi-fsl-spi.h
spi-gpio.c spi: spi-gpio: fix SPI_CS_HIGH capability 2019-09-16 08:22:07 +02:00
spi-img-spfi.c spi: img-spfi: fix potential double release 2019-12-31 16:35:39 +01:00
spi-imx.c spi: imx: stop buffer overflow in RX FIFO flush 2019-05-31 06:46:34 -07:00
spi-iproc-qspi.c
spi-jcore.c
spi-lantiq-ssc.c spi: lantiq: fix: Rx overflow error in full duplex mode 2020-08-19 08:14:50 +02:00
spi-lm70llp.c spi: add flags parameter to txrx_word function pointers 2018-08-01 14:50:24 +01:00
spi-loopback-test.c
spi-lp8841-rtc.c
spi-mem.c spi: spi-mem: Fix inverted logic in op sanity check 2020-02-14 16:33:24 -05:00
spi-meson-spicc.c spi: meson-spicc: Fix error handling in meson_spicc_probe() 2018-05-02 05:59:21 +09:00
spi-meson-spifc.c
spi-mpc52xx-psc.c
spi-mpc52xx.c spi: mpc52xx: Use gpio_is_valid() 2018-04-27 12:05:39 +01:00
spi-mpc512x-psc.c
spi-mt65xx.c spi: mediatek: use correct SPI_CFG2_REG MACRO 2020-07-29 10:16:52 +02:00
spi-mxs.c spi: mxs: Switch to SPDX identifier 2018-05-03 10:27:43 +09:00
spi-nuc900.c
spi-oc-tiny.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
spi-omap-100k.c
spi-omap-uwire.c
spi-omap2-mcspi.c spi: omap2-mcspi: Fix DMA and FIFO event trigger size mismatch 2019-12-01 09:17:33 +01:00
spi-orion.c spi: orion: fix CS GPIO handling again 2018-06-19 13:06:51 +01:00
spi-pic32-sqi.c
spi-pic32.c spi: pic32: Use proper enum in dmaengine_prep_slave_rg 2019-11-20 18:47:11 +01:00
spi-pl022.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
spi-ppc4xx.c
spi-pxa2xx-dma.c spi: pxa2xx: Use core message processing loop 2018-04-17 17:11:30 +01:00
spi-pxa2xx-pci.c
spi-pxa2xx.c spi: pxa2xx: Apply CS clk quirk to BXT 2020-06-22 09:05:10 +02:00
spi-pxa2xx.h spi: pxa2xx: Allow 64-bit DMA 2018-04-24 16:10:12 +01:00
spi-qup.c spi: qup: call spi_qup_pm_resume_runtime before suspending 2020-03-25 08:06:05 +01:00
spi-rb4xx.c
spi-rockchip.c spi: rockchip: initialize dma_slave_config properly 2019-11-24 08:21:05 +01:00
spi-rspi.c spi: rspi: Fix sequencer reset during initialization 2019-05-31 06:46:34 -07:00
spi-s3c24xx-fiq.h
spi-s3c24xx-fiq.S
spi-s3c24xx.c
spi-s3c64xx.c spi: spi-s3c64xx: Fix system resume support 2018-05-17 13:27:08 +09:00
spi-sc18is602.c
spi-sh-hspi.c
spi-sh-msiof.c spi: sh-msiof: fix deferred probing 2019-12-01 09:16:20 +01:00
spi-sh-sci.c spi: add flags parameter to txrx_word function pointers 2018-08-01 14:50:24 +01:00
spi-sh.c
spi-sirf.c
spi-slave-system-control.c
spi-slave-time.c
spi-sprd-adi.c spi: sprd: switch the sequence of setting WDG_LOAD_LOW and _HIGH 2020-07-22 09:32:13 +02:00
spi-st-ssc4.c spi: st-ssc4: add missed pm_runtime_disable 2019-12-31 16:36:06 +01:00
spi-stm32.c spi: stm32: Fix error handling in stm32_spi_probe() 2018-04-17 11:46:23 +01:00
spi-sun4i.c
spi-sun6i.c spi: spi-sun6i: sun6i_spi_transfer_one(): fix setting of clock rate 2020-07-22 09:32:05 +02:00
spi-tegra20-sflash.c
spi-tegra20-slink.c spi: tegra20-slink: add missed clk_unprepare 2019-12-31 16:36:03 +01:00
spi-tegra114.c spi: tegra114: configure dma burst size to fifo trig level 2020-01-27 14:50:36 +01:00
spi-test.h
spi-ti-qspi.c spi: spi-ti-qspi: Fix a bug when accessing non default CS 2020-01-12 12:17:12 +01:00
spi-tle62x0.c
spi-topcliff-pch.c PCI: Move Rohm Vendor ID to generic list 2020-06-22 09:05:23 +02:00
spi-txx9.c
spi-uniphier.c spi: uniphier: remove unnecessary include headers 2018-08-02 11:08:06 +01:00
spi-xcomm.c
spi-xilinx.c
spi-xlp.c
spi-xtensa-xtfpga.c spi: add flags parameter to txrx_word function pointers 2018-08-01 14:50:24 +01:00
spi-zynqmp-gqspi.c spi/zynqmp: remove entry that causes a cs glitch 2020-03-25 08:06:06 +01:00
spi.c spi: Prevent adding devices below an unregistering controller 2020-08-26 10:31:00 +02:00
spidev.c spi: spidev: Align buffers for DMA 2020-08-19 08:15:06 +02:00