crypto: tegra-se: put device into runtime suspend state when suspending
Eric Miao [Wed, 6 Mar 2013 11:30:26 +0000 (19:30 +0800)]
To prevent the device being accidentally put into runtime suspend state
during the whole system suspend process, pm_runtime_get_noresume() is
called upon _every_ device to increase the usage count (please refer to
drivers/base/power/main.c).

Since we don't explicitly disable the clock, pm_runtime_put_sync() in
each operation in tegra_se_suspend() will not actually call the runtime
suspend function, thus leaving the clock still enabled.

To fix this issue in a simple way, we call pm_runtime_put_sync() in the
end of tegra_se_suspend() to decrease the usage count to "0" and thus
call tegra_se_runtime_suspend() in turn to disable the clock. To pair
the usage count, we do a pm_runtime_get_noresume() in tegra_se_resume()
as we don't actually need to runtime resume the device there.

Bug 1246029

Change-Id: I64520b022b896f2867934255a55b852fafac4b63
Signed-off-by: Eric Miao <emiao@nvidia.com>
Reviewed-on: http://git-master/r/206658
(cherry picked from commit 762c897f0ccd4bf3282cd8f97c869b07f3feba45)
Reviewed-on: http://git-master/r/214949
Reviewed-by: Hunk Lin <hulin@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>

drivers/crypto/tegra-se.c

index 3193573..7cfd770 100644 (file)
@@ -2747,11 +2747,6 @@ static int tegra_se_remove(struct platform_device *pdev)
 }
 
 #if defined(CONFIG_PM)
-static int tegra_se_resume(struct device *dev)
-{
-       return 0;
-}
-
 static int tegra_se_generate_rng_key(struct tegra_se_dev *se_dev)
 {
        int ret = 0;
@@ -3244,8 +3239,17 @@ static int tegra_se_suspend(struct device *dev)
        }
 
 out:
+       /* put the device into runtime suspend state - disable clock */
+       pm_runtime_put_sync(dev);
        return err;
 }
+
+static int tegra_se_resume(struct device *dev)
+{
+       /* pair with tegra_se_suspend, no need to actually enable clock */
+       pm_runtime_get_noresume(dev);
+       return 0;
+}
 #endif
 
 #if defined(CONFIG_PM_RUNTIME)