ASoC: SOF: update dsp core power status in common APIs
authorBard Liao <yung-chuan.liao@linux.intel.com>
Thu, 28 Jan 2021 09:38:48 +0000 (11:38 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 28 Jan 2021 17:11:36 +0000 (17:11 +0000)
Only manage enabled_cores_mask in common snd_sof_dsp_core_power_up/down
APIs to ensure it stays in sync with actual DSP core state.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20210128093850.1041387-4-kai.vehmanen@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/loader.c
sound/soc/sof/ops.h
sound/soc/sof/pm.c
sound/soc/sof/topology.c

index 08a17ab..4ade55b 100644 (file)
@@ -811,7 +811,6 @@ EXPORT_SYMBOL(snd_sof_load_firmware);
 int snd_sof_run_firmware(struct snd_sof_dev *sdev)
 {
        int ret;
-       int init_core_mask;
 
        init_waitqueue_head(&sdev->boot_wait);
 
@@ -843,8 +842,6 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
                return ret;
        }
 
-       init_core_mask = ret;
-
        /*
         * now wait for the DSP to boot. There are 3 possible outcomes:
         * 1. Boot wait times out indicating FW boot failure.
@@ -874,9 +871,6 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
                return ret;
        }
 
-       /* fw boot is complete. Update the active cores mask */
-       sdev->enabled_cores_mask = init_core_mask;
-
        return 0;
 }
 EXPORT_SYMBOL(snd_sof_run_firmware);
index f0c9ca8..2e9a8da 100644 (file)
@@ -76,19 +76,29 @@ static inline int snd_sof_dsp_reset(struct snd_sof_dev *sdev)
 static inline int snd_sof_dsp_core_power_up(struct snd_sof_dev *sdev,
                                            unsigned int core_mask)
 {
-       if (sof_ops(sdev)->core_power_up)
-               return sof_ops(sdev)->core_power_up(sdev, core_mask);
+       int ret = 0;
 
-       return 0;
+       if (sof_ops(sdev)->core_power_up) {
+               ret = sof_ops(sdev)->core_power_up(sdev, core_mask);
+               if (!ret)
+                       sdev->enabled_cores_mask |= core_mask;
+       }
+
+       return ret;
 }
 
 static inline int snd_sof_dsp_core_power_down(struct snd_sof_dev *sdev,
                                              unsigned int core_mask)
 {
-       if (sof_ops(sdev)->core_power_down)
-               return sof_ops(sdev)->core_power_down(sdev, core_mask);
+       int ret = 0;
 
-       return 0;
+       if (sof_ops(sdev)->core_power_down) {
+               ret = sof_ops(sdev)->core_power_down(sdev, core_mask);
+               if (!ret)
+                       sdev->enabled_cores_mask &= ~core_mask;
+       }
+
+       return ret;
 }
 
 /* pre/post fw load */
index c83fb62..fd26580 100644 (file)
@@ -256,7 +256,6 @@ suspend:
 
        /* reset FW state */
        sdev->fw_state = SOF_FW_BOOT_NOT_STARTED;
-       sdev->enabled_cores_mask = 0;
 
        return ret;
 }
index b6b32a7..b69f493 100644 (file)
@@ -1352,10 +1352,6 @@ static int sof_core_enable(struct snd_sof_dev *sdev, int core)
                        core, ret);
                goto err;
        }
-
-       /* update enabled cores mask */
-       sdev->enabled_cores_mask |= BIT(core);
-
        return ret;
 err:
        /* power down core if it is host managed and return the original error if this fails too */
@@ -2603,10 +2599,6 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
                if (ret < 0)
                        dev_err(scomp->dev, "error: powering down pipeline schedule core %d\n",
                                pipeline->core);
-
-               /* update enabled cores mask */
-               sdev->enabled_cores_mask &= ~(1 << pipeline->core);
-
                break;
        default:
                break;