diff options
author | Varun Wadekar <vwadekar@nvidia.com> | 2011-12-26 17:53:03 +0530 |
---|---|---|
committer | Varun Wadekar <vwadekar@nvidia.com> | 2011-12-26 17:54:47 +0530 |
commit | c6085f690afb698aac83531baa76b7c4e4a2ac3d (patch) | |
tree | 819a34496a0cf9952bfb8cc433b9a0f4ef596fb4 /drivers/i2c/busses | |
parent | b943e4ab294ed55b8d87140d101f10d8d64e9953 (diff) |
Revert "i2c: tegra: use PM runtime framework"
This reverts commit fc56d07f59a3cafa33c31bf90a50af04a0235cf8.
Diffstat (limited to 'drivers/i2c/busses')
-rw-r--r-- | drivers/i2c/busses/i2c-tegra.c | 72 |
1 files changed, 25 insertions, 47 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 2d058369a6fd..2cbee05c3897 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -33,7 +33,6 @@ #include <linux/i2c-tegra.h> #include <linux/of_i2c.h> #include <linux/spinlock.h> -#include <linux/pm_runtime.h> #include <asm/unaligned.h> @@ -113,6 +112,8 @@ #define SL_ADDR1(addr) (addr & 0xff) #define SL_ADDR2(addr) ((addr >> 8) & 0xff) + + struct tegra_i2c_dev; struct tegra_i2c_bus { @@ -395,7 +396,8 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) u32 val; int err = 0; - pm_runtime_get_sync(i2c_dev->dev); + if (!i2c_dev->is_clkon_always) + clk_enable(i2c_dev->clk); /* Interrupt generated before sending stop signal so * wait for some time so that stop signal can be send proerly */ @@ -433,7 +435,8 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) if (tegra_i2c_flush_fifos(i2c_dev)) err = -ETIMEDOUT; - pm_runtime_put_sync(i2c_dev->dev); + if (!i2c_dev->is_clkon_always) + clk_disable(i2c_dev->clk); if (i2c_dev->irq_disabled) { i2c_dev->irq_disabled = 0; @@ -690,10 +693,8 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int ret = 0; unsigned long flags; - if (i2c_dev->is_suspended) { - tegra_i2c_init(i2c_dev); - i2c_dev->is_suspended = false; - } + if (i2c_dev->is_suspended) + return -EBUSY; rt_mutex_lock(&i2c_dev->dev_lock); @@ -714,7 +715,8 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], i2c_dev->msgs = msgs; i2c_dev->msgs_num = num; - pm_runtime_get_sync(i2c_dev->dev); + if (!i2c_dev->is_clkon_always) + clk_enable(i2c_dev->clk); spin_lock_irqsave(&i2c_dev->clk_lock, flags); i2c_dev->controller_enabled = true; @@ -731,7 +733,8 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], i2c_dev->controller_enabled = false; spin_unlock_irqrestore(&i2c_dev->clk_lock, flags); - pm_runtime_put_sync(i2c_dev->dev); + if (!i2c_dev->is_clkon_always) + clk_disable(i2c_dev->clk); rt_mutex_unlock(&i2c_dev->dev_lock); @@ -853,8 +856,8 @@ static int tegra_i2c_probe(struct platform_device *pdev) platform_set_drvdata(pdev, i2c_dev); - pm_runtime_enable(i2c_dev->dev); - pm_runtime_irq_safe(i2c_dev->dev); + if (i2c_dev->is_clkon_always) + clk_enable(i2c_dev->clk); ret = tegra_i2c_init(i2c_dev); if (ret) { @@ -862,9 +865,6 @@ static int tegra_i2c_probe(struct platform_device *pdev) goto err_free; } - if (i2c_dev->is_clkon_always) - pm_runtime_forbid(i2c_dev->dev); - ret = request_irq(i2c_dev->irq, tegra_i2c_isr, 0, pdev->name, i2c_dev); if (ret) { dev_err(&pdev->dev, "Failed to request irq %i\n", i2c_dev->irq); @@ -935,9 +935,7 @@ static int tegra_i2c_remove(struct platform_device *pdev) i2c_del_adapter(&i2c_dev->busses[i2c_dev->bus_count].adapter); if (i2c_dev->is_clkon_always) - pm_runtime_allow(i2c_dev->dev); - - pm_runtime_disable(i2c_dev->dev); + clk_disable(i2c_dev->clk); free_irq(i2c_dev->irq, i2c_dev); clk_put(i2c_dev->clk); @@ -958,7 +956,7 @@ static int tegra_i2c_suspend_noirq(struct device *dev) i2c_dev->is_suspended = true; if (i2c_dev->is_clkon_always) - pm_runtime_allow(i2c_dev->dev); + clk_disable(i2c_dev->clk); rt_mutex_unlock(&i2c_dev->dev_lock); @@ -973,36 +971,19 @@ static int tegra_i2c_resume_noirq(struct device *dev) rt_mutex_lock(&i2c_dev->dev_lock); - if (i2c_dev->is_clkon_always) { - pm_runtime_forbid(i2c_dev->dev); - ret = tegra_i2c_init(i2c_dev); - if (ret) { - rt_mutex_unlock(&i2c_dev->dev_lock); - return ret; - } - i2c_dev->is_suspended = false; - } - rt_mutex_unlock(&i2c_dev->dev_lock); - - return 0; -} - -static int tegra_i2c_runtime_idle(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev); + if (i2c_dev->is_clkon_always) + clk_enable(i2c_dev->clk); - clk_disable(i2c_dev->clk); + ret = tegra_i2c_init(i2c_dev); - return 0; -} + if (ret) { + rt_mutex_unlock(&i2c_dev->dev_lock); + return ret; + } -static int tegra_i2c_runtime_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev); + i2c_dev->is_suspended = false; - clk_enable(i2c_dev->clk); + rt_mutex_unlock(&i2c_dev->dev_lock); return 0; } @@ -1010,10 +991,7 @@ static int tegra_i2c_runtime_resume(struct device *dev) static const struct dev_pm_ops tegra_i2c_dev_pm_ops = { .suspend_noirq = tegra_i2c_suspend_noirq, .resume_noirq = tegra_i2c_resume_noirq, - .runtime_idle = tegra_i2c_runtime_idle, - .runtime_resume = tegra_i2c_runtime_resume, }; - #define TEGRA_I2C_DEV_PM_OPS (&tegra_i2c_dev_pm_ops) #else #define TEGRA_I2C_DEV_PM_OPS NULL |