ASoC: cs35l56: Log tuning unique identifiers during firmware load
authorSimon Trimmer <simont@opensource.cirrus.com>
Tue, 13 May 2025 13:39:23 +0000 (13:39 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 14 May 2025 08:57:40 +0000 (10:57 +0200)
The cs35l56 smart amplifier has some informational firmware controls
that are populated by a tuning bin file to unique values - logging these
during firmware load identifies the specific configuration being used on
that device instance.

Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com>
Link: https://patch.msgid.link/47762a5f1ce2b178ad863c6698296aea09b72e10.1747142267.git.simont@opensource.cirrus.com
Acked-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/cs35l56.h
sound/soc/codecs/cs35l56-shared.c
sound/soc/codecs/cs35l56.c

index 5d653a3491d07377d052190d08bd912384c9c981..bbc1cba40cd930c7bff6b887a9c7765cf8fcabf9 100644 (file)
@@ -332,6 +332,7 @@ void cs35l56_init_cs_dsp(struct cs35l56_base *cs35l56_base, struct cs_dsp *cs_ds
 int cs35l56_get_calibration(struct cs35l56_base *cs35l56_base);
 int cs35l56_read_prot_status(struct cs35l56_base *cs35l56_base,
                             bool *fw_missing, unsigned int *fw_version);
+void cs35l56_log_tuning(struct cs35l56_base *cs35l56_base, struct cs_dsp *cs_dsp);
 int cs35l56_hw_init(struct cs35l56_base *cs35l56_base);
 int cs35l56_get_speaker_id(struct cs35l56_base *cs35l56_base);
 int cs35l56_get_bclk_freq_id(unsigned int freq);
index e28bfefa72f33effe9d634b63aee0579d82ae349..e246345da4c26e522a83fdb088085221b4f44619 100644 (file)
@@ -770,6 +770,33 @@ int cs35l56_read_prot_status(struct cs35l56_base *cs35l56_base,
 }
 EXPORT_SYMBOL_NS_GPL(cs35l56_read_prot_status, "SND_SOC_CS35L56_SHARED");
 
+void cs35l56_log_tuning(struct cs35l56_base *cs35l56_base, struct cs_dsp *cs_dsp)
+{
+       __be32 pid, sid, tid;
+       int ret;
+
+       scoped_guard(mutex, &cs_dsp->pwr_lock) {
+               ret = cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(cs_dsp, "AS_PRJCT_ID",
+                                                           WMFW_ADSP2_XM, 0x9f212),
+                                            0, &pid, sizeof(pid));
+               if (!ret)
+                       ret = cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(cs_dsp, "AS_CHNNL_ID",
+                                                                   WMFW_ADSP2_XM, 0x9f212),
+                                                    0, &sid, sizeof(sid));
+               if (!ret)
+                       ret = cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(cs_dsp, "AS_SNPSHT_ID",
+                                                                   WMFW_ADSP2_XM, 0x9f212),
+                                                    0, &tid, sizeof(tid));
+       }
+
+       if (ret)
+               dev_warn(cs35l56_base->dev, "Can't read tuning IDs");
+       else
+               dev_info(cs35l56_base->dev, "Tuning PID: %#x, SID: %#x, TID: %#x\n",
+                        be32_to_cpu(pid), be32_to_cpu(sid), be32_to_cpu(tid));
+}
+EXPORT_SYMBOL_NS_GPL(cs35l56_log_tuning, "SND_SOC_CS35L56_SHARED");
+
 int cs35l56_hw_init(struct cs35l56_base *cs35l56_base)
 {
        int ret;
@@ -1050,3 +1077,4 @@ MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>");
 MODULE_AUTHOR("Simon Trimmer <simont@opensource.cirrus.com>");
 MODULE_LICENSE("GPL");
 MODULE_IMPORT_NS("SND_SOC_CS_AMP_LIB");
+MODULE_IMPORT_NS("FW_CS_DSP");
index b3158a84b87afec87ab528e90cde84f44d3278cb..3dc41f73ef879857718dc854176f89b57ee3fd82 100644 (file)
@@ -827,6 +827,7 @@ static void cs35l56_dsp_work(struct work_struct *work)
        else
                cs35l56_patch(cs35l56, firmware_missing);
 
+       cs35l56_log_tuning(&cs35l56->base, &cs35l56->dsp.cs_dsp);
 err:
        pm_runtime_mark_last_busy(cs35l56->base.dev);
        pm_runtime_put_autosuspend(cs35l56->base.dev);