spi/stmp: Fix device remove function
authorGuenter Roeck <linux@roeck-us.net>
Fri, 24 Aug 2012 03:08:47 +0000 (20:08 -0700)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 27 Aug 2012 16:37:52 +0000 (09:37 -0700)
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>
drivers/spi/spi-stmp.c

index 58e38528532393f89c0b8688469ad3af8a982b21..911e904b3c84db0052eb9d4f028e99d3f5f8c017 100644 (file)
@@ -594,9 +594,7 @@ static int __devexit stmp_spi_remove(struct platform_device *dev)
        struct stmp_spi *ss;
        struct spi_master *master;
 
-       master = platform_get_drvdata(dev);
-       if (master == NULL)
-               goto out0;
+       master = spi_master_get(platform_get_drvdata(dev));
        ss = spi_master_get_devdata(master);
 
        spi_unregister_master(master);
@@ -609,8 +607,6 @@ static int __devexit stmp_spi_remove(struct platform_device *dev)
        destroy_workqueue(ss->workqueue);
        iounmap(ss->regs);
        spi_master_put(master);
-       platform_set_drvdata(dev, NULL);
-out0:
        return 0;
 }
 
This page took 0.024845 seconds and 5 git commands to generate.