]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: hda/tas2781: Update tas2781 hda SPI driver
authorBaojun Xu <baojun.xu@ti.com>
Tue, 11 Feb 2025 08:39:41 +0000 (16:39 +0800)
committerTakashi Iwai <tiwai@suse.de>
Tue, 11 Feb 2025 13:34:31 +0000 (14:34 +0100)
Because firmware issue of platform, found spi device is not stable,
so add status check before firmware download, and remove some
operations which is not must in current stage.

Signed-off-by: Baojun Xu <baojun.xu@ti.com>
Fixes: bb5f86ea50ff ("ALSA: hda/tas2781: Add tas2781 hda SPI driver")
Link: https://patch.msgid.link/20250211083941.5574-1-baojun.xu@ti.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/tas2781_hda_spi.c

index a42fa990e7b9e7c956140255b5a1a8525ce0c84b..04db80af53c08aa8755f117c191d3ba634322059 100644 (file)
@@ -912,7 +912,7 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
        struct tasdevice_priv *tas_priv = context;
        struct tas2781_hda *tas_hda = dev_get_drvdata(tas_priv->dev);
        struct hda_codec *codec = tas_priv->codec;
-       int i, j, ret;
+       int i, j, ret, val;
 
        pm_runtime_get_sync(tas_priv->dev);
        guard(mutex)(&tas_priv->codec_lock);
@@ -981,13 +981,16 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
 
        /* Perform AMP reset before firmware download. */
        tas_priv->rcabin.profile_cfg_id = TAS2781_PRE_POST_RESET_CFG;
-       tasdevice_spi_tuning_switch(tas_priv, 0);
        tas2781_spi_reset(tas_priv);
        tas_priv->rcabin.profile_cfg_id = 0;
-       tasdevice_spi_tuning_switch(tas_priv, 1);
 
        tas_priv->fw_state = TASDEVICE_DSP_FW_ALL_OK;
-       ret = tasdevice_spi_prmg_load(tas_priv, 0);
+       ret = tasdevice_spi_dev_read(tas_priv, TAS2781_REG_CLK_CONFIG, &val);
+       if (ret < 0)
+               goto out;
+
+       if (val == TAS2781_REG_CLK_CONFIG_RESET)
+               ret = tasdevice_spi_prmg_load(tas_priv, 0);
        if (ret < 0) {
                dev_err(tas_priv->dev, "FW download failed = %d\n", ret);
                goto out;
@@ -1001,7 +1004,6 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
         * If calibrated data occurs error, dsp will still works with default
         * calibrated data inside algo.
         */
-       tas_priv->save_calibration(tas_priv);
 
 out:
        if (fmw)
@@ -1160,7 +1162,8 @@ static int tas2781_runtime_suspend(struct device *dev)
 
        guard(mutex)(&tas_hda->priv->codec_lock);
 
-       tasdevice_spi_tuning_switch(tas_hda->priv, 1);
+       if (tas_hda->priv->playback_started)
+               tasdevice_spi_tuning_switch(tas_hda->priv, 1);
 
        tas_hda->priv->cur_book = -1;
        tas_hda->priv->cur_conf = -1;
@@ -1174,7 +1177,8 @@ static int tas2781_runtime_resume(struct device *dev)
 
        guard(mutex)(&tas_hda->priv->codec_lock);
 
-       tasdevice_spi_tuning_switch(tas_hda->priv, 0);
+       if (tas_hda->priv->playback_started)
+               tasdevice_spi_tuning_switch(tas_hda->priv, 0);
 
        return 0;
 }
@@ -1189,12 +1193,9 @@ static int tas2781_system_suspend(struct device *dev)
                return ret;
 
        /* Shutdown chip before system suspend */
-       tasdevice_spi_tuning_switch(tas_hda->priv, 1);
-       tas2781_spi_reset(tas_hda->priv);
-       /*
-        * Reset GPIO may be shared, so cannot reset here.
-        * However beyond this point, amps may be powered down.
-        */
+       if (tas_hda->priv->playback_started)
+               tasdevice_spi_tuning_switch(tas_hda->priv, 1);
+
        return 0;
 }