aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorShubhrajyoti D <shubhrajyoti@ti.com>2012-05-29 06:56:16 -0400
committerWolfram Sang <w.sang@pengutronix.de>2012-07-08 06:49:13 -0400
commit62ff2c2b1a36de9dd98e9b8a575da6e6b2365740 (patch)
tree2906cd9374c664eca6853fdb95b6bdc364e4164e /drivers/i2c
parentbd16c82f67a267b533e747c74c2fcd23578d4601 (diff)
I2C: OMAP: Prevent the register access after pm_runtime_put in probe
Currently in probe pm_runtime_put(dev->dev); ... /* i2c device drivers may be active on return from add_adapter() */ adap->nr = pdev->id; r = i2c_add_numbered_adapter(adap); if (r) { dev_err(dev->dev, "failure adding adapter\n"); goto err_free_irq; } ... return 0; err_free_irq: free_irq(dev->irq, dev); err_unuse_clocks: omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); pm_runtime_put(dev->dev); This may access the i2c registers without the clocks in the error cases. Fix the same by moving the pm_runtime_put after the error check. Reviewed-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-omap.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index bf07ffd83c1..1777d799ee9 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -1061,8 +1061,6 @@ omap_i2c_probe(struct platform_device *pdev)
1061 dev_info(dev->dev, "bus %d rev%d.%d.%d at %d kHz\n", pdev->id, 1061 dev_info(dev->dev, "bus %d rev%d.%d.%d at %d kHz\n", pdev->id,
1062 dev->dtrev, dev->rev >> 4, dev->rev & 0xf, dev->speed); 1062 dev->dtrev, dev->rev >> 4, dev->rev & 0xf, dev->speed);
1063 1063
1064 pm_runtime_put(dev->dev);
1065
1066 adap = &dev->adapter; 1064 adap = &dev->adapter;
1067 i2c_set_adapdata(adap, dev); 1065 i2c_set_adapdata(adap, dev);
1068 adap->owner = THIS_MODULE; 1066 adap->owner = THIS_MODULE;
@@ -1082,6 +1080,8 @@ omap_i2c_probe(struct platform_device *pdev)
1082 1080
1083 of_i2c_register_devices(adap); 1081 of_i2c_register_devices(adap);
1084 1082
1083 pm_runtime_put(dev->dev);
1084
1085 return 0; 1085 return 0;
1086 1086
1087err_free_irq: 1087err_free_irq: