diff options
author | Guenter Roeck <linux@roeck-us.net> | 2012-08-23 23:08:48 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-08-27 12:37:52 -0400 |
commit | c68025bf0363a7b44be2de512a88a57d57e63d81 (patch) | |
tree | 8dce4ffe6cdfdecb596242eafb64d1a93670f476 /drivers/spi/spi-tegra.c | |
parent | 154390dcf826dc97b9d338305db14582c32cb58a (diff) |
spi/tegra: Fix device remove function
The call to spi_unregister_master() in the device remove function frees device
memory, and with it any device local data. However, device local data is still
accessed after the call to spi_unregister_master().
Acquire a reference to the SPI master device and release it after cleanup is
complete to solve the problem.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/spi/spi-tegra.c')
-rw-r--r-- | drivers/spi/spi-tegra.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/spi/spi-tegra.c b/drivers/spi/spi-tegra.c index ef52c1c6f5c..e28445d8d27 100644 --- a/drivers/spi/spi-tegra.c +++ b/drivers/spi/spi-tegra.c | |||
@@ -652,7 +652,7 @@ static int __devexit spi_tegra_remove(struct platform_device *pdev) | |||
652 | struct spi_tegra_data *tspi; | 652 | struct spi_tegra_data *tspi; |
653 | struct resource *r; | 653 | struct resource *r; |
654 | 654 | ||
655 | master = dev_get_drvdata(&pdev->dev); | 655 | master = spi_master_get(dev_get_drvdata(&pdev->dev)); |
656 | tspi = spi_master_get_devdata(master); | 656 | tspi = spi_master_get_devdata(master); |
657 | 657 | ||
658 | spi_unregister_master(master); | 658 | spi_unregister_master(master); |
@@ -668,6 +668,8 @@ static int __devexit spi_tegra_remove(struct platform_device *pdev) | |||
668 | clk_put(tspi->clk); | 668 | clk_put(tspi->clk); |
669 | iounmap(tspi->base); | 669 | iounmap(tspi->base); |
670 | 670 | ||
671 | spi_master_put(master); | ||
672 | |||
671 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 673 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
672 | release_mem_region(r->start, resource_size(r)); | 674 | release_mem_region(r->start, resource_size(r)); |
673 | 675 | ||