i2c-nomadik: dynamic clocking

This makes sure the Nomadik I2C bus driver silicon is only clocked
when really needed, saving some microamps here and there when
there is no I2C traffic.

Acked-by: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
Signed-off-by: Sundar R Iyer <sundar.iyer@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
Linus Walleij 2010-09-23 09:03:55 +02:00 committed by Ben Dooks
parent 1804edd15c
commit 8ef4f4e4af
1 changed files with 9 additions and 4 deletions

View File

@ -250,6 +250,8 @@ static int init_hw(struct nmk_i2c_dev *dev)
{
int stat;
clk_enable(dev->clk);
stat = flush_i2c_fifo(dev);
if (stat)
return stat;
@ -263,6 +265,8 @@ static int init_hw(struct nmk_i2c_dev *dev)
dev->cli.operation = I2C_NO_OPERATION;
clk_disable(dev->clk);
return 0;
}
@ -558,6 +562,8 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap,
if (status)
return status;
clk_enable(dev->clk);
/* setup the i2c controller */
setup_i2c_controller(dev);
@ -590,10 +596,13 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap,
dev_err(&dev->pdev->dev, "%s\n",
cause >= ARRAY_SIZE(abort_causes)
? "unknown reason" : abort_causes[cause]);
clk_disable(dev->clk);
return status;
}
mdelay(1);
}
clk_disable(dev->clk);
/* return the no. messages processed */
if (status)
return status;
@ -857,8 +866,6 @@ static int __devinit nmk_i2c_probe(struct platform_device *pdev)
goto err_no_clk;
}
clk_enable(dev->clk);
adap = &dev->adap;
adap->dev.parent = &pdev->dev;
adap->owner = THIS_MODULE;
@ -895,7 +902,6 @@ static int __devinit nmk_i2c_probe(struct platform_device *pdev)
return 0;
err_init_hw:
clk_disable(dev->clk);
err_add_adap:
clk_put(dev->clk);
err_no_clk:
@ -928,7 +934,6 @@ static int __devexit nmk_i2c_remove(struct platform_device *pdev)
iounmap(dev->virtbase);
if (res)
release_mem_region(res->start, resource_size(res));
clk_disable(dev->clk);
clk_put(dev->clk);
platform_set_drvdata(pdev, NULL);
kfree(dev);