Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b92894e authored by Stephen Warren's avatar Stephen Warren Committed by Mark Brown
Browse files

spi: core: invert success test in devm_spi_register_master



devres_add() should be called when the action to be undone succeeded,
not when it failed. Fix the inverted test in devm_spi_register_master()
which was doing the opposite.

The user-visible issue without this fix is:
insmod spi-tegra114.ko
  Assume there's an MTD device on that SPI bus, which creates /dev/mtd0.
rmmod spi-tegra114
  Doesn't remove devices on the SPI bus.
insmod spi-tegra114.ko
  Creates a duplicate SPI device which creates /dev/mtd1.
hexdump -C /dev/mtd0
  That's the old device, which uses an SPI bus hosted by a non-existent
  module, which causes the oops below.

Unable to handle kernel paging request at virtual address bf0017c0
pgd = c0004000
[bf0017c0] *pgd=ad51b811, *pte=00000000, *ppte=00000000
Internal error: Oops: 80000007 [#1] PREEMPT SMP ARM
...
PC is at 0xbf0017c0
LR is at spi_pump_messages+0x15c/0x204
pc : [<bf0017c0>] lr : [<c02f0af8>] psr: 60000113
...

Fixes: 666d5b4c ("spi: core: Add devm_spi_register_master()")
Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 82f85cf9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1390,7 +1390,7 @@ int devm_spi_register_master(struct device *dev, struct spi_master *master)
		return -ENOMEM;

	ret = spi_register_master(master);
	if (ret != 0) {
	if (!ret) {
		*ptr = master;
		devres_add(dev, ptr);
	} else {