spi: tegra: Add stub runtime power management
Laxman Dewangan [Wed, 29 Aug 2012 11:42:05 +0000 (16:42 +0530)]
Add stub runtime_pm calls which go through the flow of enabling and
disabling but don't actually do anything with the device itself as
there's nothing useful we can do. This provides the core PM framework
with information about when the device is idle, enabling chip wide
power savings.

Change-Id: Ie795c16840ccbe07e1a8bfac1a1c5a87281e6849
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/128184
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-by: Pavan Kunapuli <pkunapuli@nvidia.com>
GVS: Gerrit_Virtual_Submit

drivers/spi/spi-tegra.c

index 836b95e..5fca5e6 100644 (file)
@@ -42,8 +42,6 @@
 #include <mach/dma.h>
 #include <mach/clk.h>
 
-#define SPI_PM_RUNTIME_ENABLE 0
-
 #define SLINK_COMMAND          0x000
 #define   SLINK_BIT_LENGTH(x)          (((x) & 0x1f) << 0)
 #define   SLINK_WORD_SIZE(x)           (((x) & 0x1f) << 5)
@@ -249,9 +247,6 @@ struct spi_tegra_data {
        struct work_struct spi_transfer_work;
 };
 
-static int tegra_spi_runtime_idle(struct device *dev);
-static int tegra_spi_runtime_resume(struct device *dev);
-
 static inline unsigned long spi_tegra_readl(struct spi_tegra_data *tspi,
                    unsigned long reg)
 {
@@ -308,22 +303,6 @@ static int tegra_spi_clk_enable(struct spi_tegra_data *tspi)
        return 0;
 }
 
-#if SPI_PM_RUNTIME_ENABLE
-#define spi_pm_runtime_get_sync(dev) pm_runtime_get_sync(dev)
-#define spi_pm_runtime_put_sync(dev) pm_runtime_put_sync(dev)
-#define spi_pm_runtime_enable(dev) pm_runtime_enable(dev)
-#define spi_pm_runtime_disable(dev) pm_runtime_disable(dev)
-#define spi_pm_runtime_enabled(dev) pm_runtime_enabled(dev)
-#define spi_pm_runtime_status_suspended(dev) pm_runtime_status_suspended(dev)
-#else
-#define spi_pm_runtime_get_sync(dev) tegra_spi_runtime_resume(dev)
-#define spi_pm_runtime_put_sync(dev) tegra_spi_runtime_idle(dev)
-#define spi_pm_runtime_enable(dev) do { } while(0)
-#define spi_pm_runtime_disable(dev) do { } while(0)
-#define spi_pm_runtime_enabled(dev) true
-#define spi_pm_runtime_status_suspended(dev) true
-#endif
-
 static void cancel_dma(struct tegra_dma_channel *dma_chan,
        struct tegra_dma_req *req)
 {
@@ -794,12 +773,8 @@ static void spi_tegra_start_transfer(struct spi_device *spi,
 
        command2 = tspi->def_command2_reg;
        if (is_first_of_msg) {
-               if ((ret = spi_pm_runtime_get_sync(&tspi->pdev->dev)) < 0) {
-                       dev_err(&tspi->pdev->dev,
-                               "%s: spi_pm_runtime_get_sync() returns %d\n",
-                               __func__, ret);
-                       return;
-               }
+               pm_runtime_get_sync(&tspi->pdev->dev);
+               tegra_spi_clk_enable(tspi);
 
                spi_tegra_clear_status(tspi);
 
@@ -911,7 +886,8 @@ static int spi_tegra_setup(struct spi_device *spi)
                return -EINVAL;
        }
 
-       spi_pm_runtime_get_sync(&tspi->pdev->dev);
+       pm_runtime_get_sync(&tspi->pdev->dev);
+       tegra_spi_clk_enable(tspi);
 
        spin_lock_irqsave(&tspi->lock, flags);
        val = tspi->def_command_reg;
@@ -923,7 +899,8 @@ static int spi_tegra_setup(struct spi_device *spi)
        spi_tegra_writel(tspi, tspi->def_command_reg, SLINK_COMMAND);
        spin_unlock_irqrestore(&tspi->lock, flags);
 
-       spi_pm_runtime_put_sync(&tspi->pdev->dev);
+       tegra_spi_clk_disable(tspi);
+       pm_runtime_put_sync(&tspi->pdev->dev);
        return 0;
 }
 
@@ -1073,7 +1050,8 @@ static void spi_tegra_curr_transfer_complete(struct spi_tegra_data *tspi,
                        /* Provide delay to stablize the signal state */
                        spin_unlock_irqrestore(&tspi->lock, *irq_flags);
                        udelay(10);
-                       spi_pm_runtime_put_sync(&tspi->pdev->dev);
+                       tegra_spi_clk_disable(tspi);
+                       pm_runtime_put_sync(&tspi->pdev->dev);
                        spin_lock_irqsave(&tspi->lock, *irq_flags);
                        tspi->is_transfer_in_progress = false;
                        /* Check if any new request has come between
@@ -1479,18 +1457,11 @@ static int __init spi_tegra_probe(struct platform_device *pdev)
        tspi->def_command2_reg = SLINK_CS_ACTIVE_BETWEEN;
 
 skip_dma_alloc:
-       spi_pm_runtime_enable(&pdev->dev);
-       if (!spi_pm_runtime_enabled(&pdev->dev)) {
-               ret = tegra_spi_runtime_resume(&pdev->dev);
-               if (ret) {
-                       dev_err(&pdev->dev, "runtime resume failed %d", ret);
-                       goto exit_pm_disable;
-               }
-       }
+       pm_runtime_enable(&pdev->dev);
 
        /* Enable clock if it is require to be enable always */
        if (tspi->is_clkon_always)
-               spi_pm_runtime_get_sync(&pdev->dev);
+               tegra_spi_clk_enable(tspi);
 
        /* create the workqueue for the spi transfer */
        snprintf(spi_wq_name, sizeof(spi_wq_name), "spi_tegra-%d", pdev->id);
@@ -1517,13 +1488,9 @@ exit_destry_wq:
 
 exit_fail_wq:
        if (tspi->is_clkon_always)
-               spi_pm_runtime_put_sync(&pdev->dev);
-
-       if (!spi_pm_runtime_status_suspended(&pdev->dev))
-               tegra_spi_runtime_idle(&pdev->dev);
+               tegra_spi_clk_disable(tspi);
 
-exit_pm_disable:
-       spi_pm_runtime_disable(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
 
        spi_tegra_deinit_dma_param(tspi, false);
 
@@ -1553,11 +1520,9 @@ static int __devexit spi_tegra_remove(struct platform_device *pdev)
 
        /* Disable clock if it is always enabled */
        if (tspi->is_clkon_always)
-               spi_pm_runtime_put_sync(&pdev->dev);
+               tegra_spi_clk_disable(tspi);
 
-       spi_pm_runtime_disable(&pdev->dev);
-       if (!spi_pm_runtime_status_suspended(&pdev->dev))
-               tegra_spi_runtime_idle(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
 
        destroy_workqueue(tspi->spi_workqueue);
 
@@ -1612,7 +1577,7 @@ static int spi_tegra_suspend(struct device *dev)
 
        /* Disable clock if it is always enabled */
        if (tspi->is_clkon_always)
-               spi_pm_runtime_put_sync(dev);
+               tegra_spi_clk_disable(tspi);
 
        return 0;
 }
@@ -1629,11 +1594,13 @@ static int spi_tegra_resume(struct device *dev)
 
        /* Enable clock if it is always enabled */
        if (tspi->is_clkon_always)
-               spi_pm_runtime_get_sync(dev);
+               tegra_spi_clk_enable(tspi);
 
-       spi_pm_runtime_get_sync(dev);
+       pm_runtime_get_sync(dev);
+       tegra_spi_clk_enable(tspi);
        spi_tegra_writel(tspi, tspi->command_reg, SLINK_COMMAND);
-       spi_pm_runtime_put_sync(dev);
+       tegra_spi_clk_disable(tspi);
+       pm_runtime_put_sync(dev);
 
        spin_lock_irqsave(&tspi->lock, flags);
 
@@ -1656,27 +1623,7 @@ static int spi_tegra_resume(struct device *dev)
 }
 #endif
 
-static int tegra_spi_runtime_idle(struct device *dev)
-{
-       struct spi_master *master = dev_get_drvdata(dev);
-       struct spi_tegra_data *tspi = spi_master_get_devdata(master);
-
-       return tegra_spi_clk_disable(tspi);
-}
-
-static int tegra_spi_runtime_resume(struct device *dev)
-{
-       struct spi_master *master = dev_get_drvdata(dev);
-       struct spi_tegra_data *tspi = spi_master_get_devdata(master);
-
-       return tegra_spi_clk_enable(tspi);
-}
-
 static const struct dev_pm_ops tegra_spi_dev_pm_ops = {
-#if defined(CONFIG_PM_RUNTIME)
-       .runtime_idle = tegra_spi_runtime_idle,
-       .runtime_resume = tegra_spi_runtime_resume,
-#endif
 #ifdef CONFIG_PM
        .suspend = spi_tegra_suspend,
        .resume = spi_tegra_resume,