ASoC: SOF: Intel: hda: do not leave clock gating off upon error
authorKai Vehmanen <kai.vehmanen@linux.intel.com>
Wed, 25 Mar 2020 21:12:32 +0000 (16:12 -0500)
committerMark Brown <broonie@kernel.org>
Thu, 26 Mar 2020 18:31:15 +0000 (18:31 +0000)
The misc clock gating (MISCBDCGE) is disabled for controller reset and
reenabled once reset is complete.

Fix the case when error happens during reset, and clock gating is
left disabled. The clock gating should be reenabled also in this case.

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20200325211233.27394-5-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-ctrl.c

index 871b71a15a6331f1a46e106e626151ce0869dc0e..93be6fc51ccd7c0b7f02d1a8146fa44331a33d3e 100644 (file)
@@ -183,7 +183,7 @@ int hda_dsp_ctrl_init_chip(struct snd_sof_dev *sdev, bool full_reset)
                ret = hda_dsp_ctrl_link_reset(sdev, true);
                if (ret < 0) {
                        dev_err(sdev->dev, "error: failed to reset HDA controller\n");
-                       return ret;
+                       goto err;
                }
 
                usleep_range(500, 1000);
@@ -192,7 +192,7 @@ int hda_dsp_ctrl_init_chip(struct snd_sof_dev *sdev, bool full_reset)
                ret = hda_dsp_ctrl_link_reset(sdev, false);
                if (ret < 0) {
                        dev_err(sdev->dev, "error: failed to exit HDA controller reset\n");
-                       return ret;
+                       goto err;
                }
 
                usleep_range(1000, 1200);
@@ -202,7 +202,8 @@ int hda_dsp_ctrl_init_chip(struct snd_sof_dev *sdev, bool full_reset)
        /* check to see if controller is ready */
        if (!snd_hdac_chip_readb(bus, GCTL)) {
                dev_dbg(bus->dev, "controller not ready!\n");
-               return -EBUSY;
+               ret = -EBUSY;
+               goto err;
        }
 
        /* Accept unsolicited responses */
@@ -268,6 +269,7 @@ int hda_dsp_ctrl_init_chip(struct snd_sof_dev *sdev, bool full_reset)
 
        bus->chip_init = true;
 
+err:
        hda_dsp_ctrl_misc_clock_gating(sdev, true);
 
        return ret;