ASoC: Intel: Move the fw download to power_control
authorVinod Koul <vinod.koul@intel.com>
Tue, 24 Feb 2015 06:09:45 +0000 (11:39 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 24 Feb 2015 08:00:35 +0000 (17:00 +0900)
Thus removing the runtime_resume handler.

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/sst/sst.c
sound/soc/intel/sst/sst_drv_interface.c

index 8f938112a01fc49a440c22beb5063bb95d914850..4d8f73ac5dd95f0bcdd360c3c7185f642ec889c7 100644 (file)
@@ -492,21 +492,6 @@ iram:
        return ret;
 }
 
-static int intel_sst_runtime_resume(struct device *dev)
-{
-       int ret = 0;
-       struct intel_sst_drv *ctx = dev_get_drvdata(dev);
-
-       if (ctx->sst_state == SST_RESET) {
-               ret = sst_load_fw(ctx);
-               if (ret) {
-                       dev_err(dev, "FW download fail %d\n", ret);
-                       sst_set_fw_state_locked(ctx, SST_RESET);
-               }
-       }
-       return ret;
-}
-
 static int intel_sst_resume(struct device *dev)
 {
        struct intel_sst_drv *ctx = dev_get_drvdata(dev);
@@ -515,7 +500,7 @@ static int intel_sst_resume(struct device *dev)
        struct sst_block *block;
 
        if (!fw_save)
-               return intel_sst_runtime_resume(dev);
+               return 0;
 
        sst_set_fw_state_locked(ctx, SST_FW_LOADING);
 
@@ -560,6 +545,5 @@ const struct dev_pm_ops intel_sst_pm = {
        .suspend = intel_sst_suspend,
        .resume = intel_sst_resume,
        .runtime_suspend = intel_sst_runtime_suspend,
-       .runtime_resume = intel_sst_runtime_resume,
 };
 EXPORT_SYMBOL_GPL(intel_sst_pm);
index 5d56fcdd58d882188a52aa6f576ee779e16678af..549af7d7f6d0705d345054851661bd7decdc94e1 100644 (file)
@@ -138,12 +138,31 @@ int sst_get_stream(struct intel_sst_drv *ctx,
 static int sst_power_control(struct device *dev, bool state)
 {
        struct intel_sst_drv *ctx = dev_get_drvdata(dev);
+       int ret = 0;
 
-       dev_dbg(ctx->dev, "state:%d", state);
-       if (state == true)
-               return pm_runtime_get_sync(dev);
-       else
+       if (state == true) {
+               ret = pm_runtime_get_sync(dev);
+               dev_dbg(ctx->dev, "Enable: pm usage count: %d\n",
+                               atomic_read(&dev->power.usage_count));
+               if (ret < 0) {
+                       dev_err(ctx->dev, "Runtime get failed with err: %d\n", ret);
+                       return ret;
+               }
+               if ((ctx->sst_state == SST_RESET) &&
+                       (atomic_read(&dev->power.usage_count) == 1)) {
+                       ret = sst_load_fw(ctx);
+                       if (ret) {
+                               dev_err(dev, "FW download fail %d\n", ret);
+                               sst_set_fw_state_locked(ctx, SST_RESET);
+                               ret = sst_pm_runtime_put(ctx);
+                       }
+               }
+       } else {
+               dev_dbg(ctx->dev, "Disable: pm usage count: %d\n",
+                               atomic_read(&dev->power.usage_count));
                return sst_pm_runtime_put(ctx);
+       }
+       return ret;
 }
 
 /*