Commit 154390dcf826dc97b9d338305db14582c32cb58a

Authored by Guenter Roeck
Committed by Mark Brown
1 parent 58ed90de3e

spi/stmp: Fix device remove function

The call sequence spi_alloc_master/spi_register_master/spi_unregister_master
is complete; it reduces the device reference count to zero, which results in
device memory being freed. The remove function accesses the freed memory after
the call to spi_unregister_master(), _and_ it calls spi_master_put on the freed
memory.

Acquire a reference to the SPI master device and release it after cleanup is
complete (with the existing spi_master_put) to solve the problem.

Also, the device subsystem ensures that the remove function is only called once,
and resets device driver data to NULL. Remove the respective check and drop the
unnecessaary call to platform_set_drvdata().

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

Showing 1 changed file with 1 additions and 5 deletions Side-by-side Diff

drivers/spi/spi-stmp.c
... ... @@ -594,9 +594,7 @@
594 594 struct stmp_spi *ss;
595 595 struct spi_master *master;
596 596  
597   - master = platform_get_drvdata(dev);
598   - if (master == NULL)
599   - goto out0;
  597 + master = spi_master_get(platform_get_drvdata(dev));
600 598 ss = spi_master_get_devdata(master);
601 599  
602 600 spi_unregister_master(master);
... ... @@ -609,8 +607,6 @@
609 607 destroy_workqueue(ss->workqueue);
610 608 iounmap(ss->regs);
611 609 spi_master_put(master);
612   - platform_set_drvdata(dev, NULL);
613   -out0:
614 610 return 0;
615 611 }
616 612