aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2012-08-18 15:17:47 -0400
committerStephen Warren <swarren@nvidia.com>2012-09-13 13:40:30 -0400
commitfd301cc4e5ba839050be135a178031bcd0d363a5 (patch)
tree61ceb2864a9e35eed6ef70400328124944ad4e0c
parent6ad068ed63100f1bb2f65340e2de9b8727526ef8 (diff)
i2c: tegra: dynamically control fast clk
Tegra I2C driver enables the fast clock during initialization and does not disable till driver removed. Enable this clock before transfer and disable after transfer done. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-by: Wolfram Sang <w.sang@pengutronix.de> Signed-off-by: Stephen Warren <swarren@nvidia.com>
-rw-r--r--drivers/i2c/busses/i2c-tegra.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index ce701474626f..f981ac4e6783 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -363,12 +363,36 @@ static void tegra_dvc_init(struct tegra_i2c_dev *i2c_dev)
363 dvc_writel(i2c_dev, val, DVC_CTRL_REG1); 363 dvc_writel(i2c_dev, val, DVC_CTRL_REG1);
364} 364}
365 365
366static inline int tegra_i2c_clock_enable(struct tegra_i2c_dev *i2c_dev)
367{
368 int ret;
369 ret = clk_prepare_enable(i2c_dev->fast_clk);
370 if (ret < 0) {
371 dev_err(i2c_dev->dev,
372 "Enabling fast clk failed, err %d\n", ret);
373 return ret;
374 }
375 ret = clk_prepare_enable(i2c_dev->div_clk);
376 if (ret < 0) {
377 dev_err(i2c_dev->dev,
378 "Enabling div clk failed, err %d\n", ret);
379 clk_disable_unprepare(i2c_dev->fast_clk);
380 }
381 return ret;
382}
383
384static inline void tegra_i2c_clock_disable(struct tegra_i2c_dev *i2c_dev)
385{
386 clk_disable_unprepare(i2c_dev->div_clk);
387 clk_disable_unprepare(i2c_dev->fast_clk);
388}
389
366static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) 390static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
367{ 391{
368 u32 val; 392 u32 val;
369 int err = 0; 393 int err = 0;
370 394
371 clk_prepare_enable(i2c_dev->div_clk); 395 tegra_i2c_clock_enable(i2c_dev);
372 396
373 tegra_periph_reset_assert(i2c_dev->div_clk); 397 tegra_periph_reset_assert(i2c_dev->div_clk);
374 udelay(2); 398 udelay(2);
@@ -399,7 +423,7 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
399 if (tegra_i2c_flush_fifos(i2c_dev)) 423 if (tegra_i2c_flush_fifos(i2c_dev))
400 err = -ETIMEDOUT; 424 err = -ETIMEDOUT;
401 425
402 clk_disable_unprepare(i2c_dev->div_clk); 426 tegra_i2c_clock_disable(i2c_dev);
403 427
404 if (i2c_dev->irq_disabled) { 428 if (i2c_dev->irq_disabled) {
405 i2c_dev->irq_disabled = 0; 429 i2c_dev->irq_disabled = 0;
@@ -575,7 +599,7 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
575 if (i2c_dev->is_suspended) 599 if (i2c_dev->is_suspended)
576 return -EBUSY; 600 return -EBUSY;
577 601
578 clk_prepare_enable(i2c_dev->div_clk); 602 tegra_i2c_clock_enable(i2c_dev);
579 for (i = 0; i < num; i++) { 603 for (i = 0; i < num; i++) {
580 enum msg_end_type end_type = MSG_END_STOP; 604 enum msg_end_type end_type = MSG_END_STOP;
581 if (i < (num - 1)) { 605 if (i < (num - 1)) {
@@ -588,7 +612,7 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
588 if (ret) 612 if (ret)
589 break; 613 break;
590 } 614 }
591 clk_disable_unprepare(i2c_dev->div_clk); 615 tegra_i2c_clock_disable(i2c_dev);
592 return ret ?: i; 616 return ret ?: i;
593} 617}
594 618
@@ -724,8 +748,6 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev)
724 return ret; 748 return ret;
725 } 749 }
726 750
727 clk_prepare_enable(i2c_dev->fast_clk);
728
729 i2c_set_adapdata(&i2c_dev->adapter, i2c_dev); 751 i2c_set_adapdata(&i2c_dev->adapter, i2c_dev);
730 i2c_dev->adapter.owner = THIS_MODULE; 752 i2c_dev->adapter.owner = THIS_MODULE;
731 i2c_dev->adapter.class = I2C_CLASS_HWMON; 753 i2c_dev->adapter.class = I2C_CLASS_HWMON;
@@ -739,7 +761,6 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev)
739 ret = i2c_add_numbered_adapter(&i2c_dev->adapter); 761 ret = i2c_add_numbered_adapter(&i2c_dev->adapter);
740 if (ret) { 762 if (ret) {
741 dev_err(&pdev->dev, "Failed to add I2C adapter\n"); 763 dev_err(&pdev->dev, "Failed to add I2C adapter\n");
742 clk_disable_unprepare(i2c_dev->fast_clk);
743 return ret; 764 return ret;
744 } 765 }
745 766