summaryrefslogtreecommitdiff
path: root/drivers/mfd/mcp-sa11x0.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2012-01-20 22:51:07 (GMT)
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-02-03 17:37:48 (GMT)
commit30816ac0495cb4f33fc8d748f64ac3cc880cb3c1 (patch)
tree689f82c11f0a1097bbd0e715178f94aa345fcebf /drivers/mfd/mcp-sa11x0.c
parent0af5e4c36e70cfd4ae96d3704a425c414f530f2a (diff)
downloadlinux-fsl-qoriq-30816ac0495cb4f33fc8d748f64ac3cc880cb3c1.tar.xz
MFD: mcp-core: sanitize host creation/removal
host_unregister() gives us no chance between removing the device and the mcp data structure being freed to access the data inbetween, which drivers may need to do if they need to iounmap() pointers in their private data structures. Therefore, re-jig the interfaces, which are now, on creation: mcp = mcp_host_alloc() if (mcp) { ret = mcp_host_add(mcp, data); if (!ret) mcp_host_free(mcp); } and on removal: mcp_host_del(mcp); ... access mcp ... mcp_host_free(mcp); The free does the final put_device() on the struct device as one would expect. Acked-by: Jochen Friedrich <jochen@scram.de> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/mfd/mcp-sa11x0.c')
-rw-r--r--drivers/mfd/mcp-sa11x0.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/mfd/mcp-sa11x0.c b/drivers/mfd/mcp-sa11x0.c
index 02c53a0..33cadc0 100644
--- a/drivers/mfd/mcp-sa11x0.c
+++ b/drivers/mfd/mcp-sa11x0.c
@@ -195,10 +195,11 @@ static int mcp_sa11x0_probe(struct platform_device *pdev)
mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) /
mcp->sclk_rate;
- ret = mcp_host_register(mcp);
+ ret = mcp_host_add(mcp);
if (ret == 0)
goto out;
+ mcp_host_free(mcp);
release:
release_mem_region(0x80060000, 0x60);
platform_set_drvdata(pdev, NULL);
@@ -212,7 +213,8 @@ static int mcp_sa11x0_remove(struct platform_device *dev)
struct mcp *mcp = platform_get_drvdata(dev);
platform_set_drvdata(dev, NULL);
- mcp_host_unregister(mcp);
+ mcp_host_del(mcp);
+ mcp_host_free(mcp);
release_mem_region(0x80060000, 0x60);
return 0;