]> www.infradead.org Git - users/hch/misc.git/commitdiff
ASoC: tas2781: Add keyword "init" in profile section
authorShenghao Ding <shenghao-ding@ti.com>
Sun, 3 Aug 2025 13:11:10 +0000 (21:11 +0800)
committerMark Brown <broonie@kernel.org>
Sun, 10 Aug 2025 20:09:13 +0000 (21:09 +0100)
Since version 0x105, the keyword 'init' was introduced into the profile,
which is used for chip initialization, particularly to store common
settings for other non-initialization profiles.

Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>
Link: https://patch.msgid.link/20250803131110.1443-1-shenghao-ding@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/tas2781-dsp.h
sound/soc/codecs/tas2781-fmwlib.c
sound/soc/codecs/tas2781-i2c.c

index c3a9efa73d5d0578e4a09b8737133c7456c7fb20..a21f34c0266ea45ff7b076d83f817f59df07eff2 100644 (file)
@@ -198,6 +198,14 @@ struct tasdevice_rca {
        int ncfgs;
        struct tasdevice_config_info **cfg_info;
        int profile_cfg_id;
+       /*
+        * Since version 0x105, the keyword 'init' was introduced into the
+        * profile, which is used for chip initialization, particularly to
+        * store common settings for other non-initialization profiles.
+        * if (init_profile_id < 0)
+        *         No init profile inside the RCA firmware.
+        */
+       int init_profile_id;
 };
 
 void tasdevice_select_cfg_blk(void *context, int conf_no,
index c9c1e608ddb757d52aad08b6d35be104eac81af3..8baf56237624a9b1f07dceb21e46ca8074ba68d1 100644 (file)
@@ -180,6 +180,16 @@ static struct tasdevice_config_info *tasdevice_add_config(
                        dev_err(tas_priv->dev, "add conf: Out of boundary\n");
                        goto out;
                }
+               /* If in the RCA bin file are several profiles with the
+                * keyword "init", init_profile_id only store the last
+                * init profile id.
+                */
+               if (strnstr(&config_data[config_offset], "init", 64)) {
+                       tas_priv->rcabin.init_profile_id =
+                               tas_priv->rcabin.ncfgs - 1;
+                       dev_dbg(tas_priv->dev, "%s: init profile id = %d\n",
+                               __func__, tas_priv->rcabin.init_profile_id);
+               }
                config_offset += 64;
        }
 
@@ -283,6 +293,8 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
        int i;
 
        rca = &(tas_priv->rcabin);
+       /* Initialize to none */
+       rca->init_profile_id = -1;
        fw_hdr = &(rca->fw_hdr);
        if (!fmw || !fmw->data) {
                dev_err(tas_priv->dev, "Failed to read %s\n",
index 9f4d965a1335117fe8946d2ec8beee4fe96836c3..f8faeffd983d37f1b1c7765f686d8802aa9c802e 100644 (file)
@@ -1641,6 +1641,12 @@ static void tasdevice_fw_ready(const struct firmware *fmw,
        tasdevice_prmg_load(tas_priv, 0);
        tas_priv->cur_prog = 0;
 
+       /* Init common setting for different audio profiles */
+       if (tas_priv->rcabin.init_profile_id >= 0)
+               tasdevice_select_cfg_blk(tas_priv,
+                       tas_priv->rcabin.init_profile_id,
+                       TASDEVICE_BIN_BLK_PRE_POWER_UP);
+
 #ifdef CONFIG_SND_SOC_TAS2781_ACOUST_I2C
        if (tas_priv->name_prefix)
                acoustic_debugfs_node = devm_kasprintf(tas_priv->dev,