]> www.infradead.org Git - users/hch/misc.git/commitdiff
ASoC: cs35l56: Set fw_regs table after getting REVID
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Tue, 23 Sep 2025 13:03:25 +0000 (14:03 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sun, 28 Sep 2025 06:27:15 +0000 (08:27 +0200)
Defer setting the cs35l56_base.fw_regs pointer until after the REVID has
been read in cs35l56_hw_init(). Also make the corresponding change to the
cs35l56_hda drivers to prevent a build break.

This is preparing for firmware registers that change address between
revisions of the same device.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/cs35l56.h
sound/hda/codecs/side-codecs/cs35l56_hda.c
sound/hda/codecs/side-codecs/cs35l56_hda_i2c.c
sound/hda/codecs/side-codecs/cs35l56_hda_spi.c
sound/soc/codecs/cs35l56-i2c.c
sound/soc/codecs/cs35l56-sdw.c
sound/soc/codecs/cs35l56-shared.c
sound/soc/codecs/cs35l56-spi.c

index 7c8bbe8ad1e2dee76391e4e0cad151e44a74a975..20dc3ee6378da19bd389120909d80b6b442392a4 100644 (file)
@@ -337,9 +337,6 @@ extern const struct regmap_config cs35l56_regmap_sdw;
 extern const struct regmap_config cs35l63_regmap_i2c;
 extern const struct regmap_config cs35l63_regmap_sdw;
 
-extern const struct cs35l56_fw_reg cs35l56_fw_reg;
-extern const struct cs35l56_fw_reg cs35l63_fw_reg;
-
 extern const struct cirrus_amp_cal_controls cs35l56_calibration_controls;
 
 extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC];
index 36fa62a41984b982fb87013f34251057eae904ec..5bb1c4ebeaf3cb88d2e4da7e07a8ac114270d607 100644 (file)
@@ -1049,6 +1049,7 @@ int cs35l56_hda_common_probe(struct cs35l56_hda *cs35l56, int hid, int id)
                goto err;
        }
 
+       cs35l56->base.type = hid & 0xff;
        cs35l56->base.cal_index = -1;
 
        cs35l56_init_cs_dsp(&cs35l56->base, &cs35l56->cs_dsp);
index d10209e4eddd5bddc97c2da8e239e0f4e9247bf5..1072f17385ac5222df66016543058247eabec8bf 100644 (file)
@@ -27,8 +27,6 @@ static int cs35l56_hda_i2c_probe(struct i2c_client *clt)
        cs35l56->base.can_hibernate = true;
 #endif
 
-       cs35l56->base.fw_reg = &cs35l56_fw_reg;
-
        cs35l56->base.regmap = devm_regmap_init_i2c(clt, &cs35l56_regmap_i2c);
        if (IS_ERR(cs35l56->base.regmap)) {
                ret = PTR_ERR(cs35l56->base.regmap);
index f57533d3d728f5c31296e2d8a30da862d647ea7f..f802c83c57b4ef64c656d5a41091c604efe46dcb 100644 (file)
@@ -30,8 +30,6 @@ static int cs35l56_hda_spi_probe(struct spi_device *spi)
        cs35l56->base.can_hibernate = true;
 #endif
 
-       cs35l56->base.fw_reg = &cs35l56_fw_reg;
-
        cs35l56->base.regmap = devm_regmap_init_spi(spi, &cs35l56_regmap_spi);
        if (IS_ERR(cs35l56->base.regmap)) {
                ret = PTR_ERR(cs35l56->base.regmap);
index 073f1796ae29104f42ac7f600d6bb3a302178f31..0492ddc4102d80e38577fb7a6afb8570a56d4549 100644 (file)
@@ -35,11 +35,11 @@ static int cs35l56_i2c_probe(struct i2c_client *client)
        switch (id) {
        case 0x3556:
                regmap_config = &cs35l56_regmap_i2c;
-               cs35l56->base.fw_reg = &cs35l56_fw_reg;
+               cs35l56->base.type = 0x56;
                break;
        case 0x3563:
                regmap_config = &cs35l63_regmap_i2c;
-               cs35l56->base.fw_reg = &cs35l63_fw_reg;
+               cs35l56->base.type = 0x63;
                break;
        default:
                return -ENODEV;
index 3905c9cb188a8cf94b3e21ea1dc78b1a24f70e6c..42d24ac2977fc8f5b814c3e0e41a3507b4758337 100644 (file)
@@ -527,16 +527,16 @@ static int cs35l56_sdw_probe(struct sdw_slave *peripheral, const struct sdw_devi
        case 0x3556:
        case 0x3557:
                regmap_config = &cs35l56_regmap_sdw;
-               cs35l56->base.fw_reg = &cs35l56_fw_reg;
                break;
        case 0x3563:
                regmap_config = &cs35l63_regmap_sdw;
-               cs35l56->base.fw_reg = &cs35l63_fw_reg;
                break;
        default:
                return -ENODEV;
        }
 
+       cs35l56->base.type = ((unsigned int)id->driver_data) & 0xff;
+
        cs35l56->base.regmap = devm_regmap_init(dev, &cs35l56_regmap_bus_sdw,
                                           peripheral, regmap_config);
        if (IS_ERR(cs35l56->base.regmap)) {
index 95d018ecb9538609c7e0daf0fb70491cd039bbd9..03ea66f08787eef3050856826c3dd90b77cc6db3 100644 (file)
@@ -309,6 +309,40 @@ static bool cs35l63_volatile_reg(struct device *dev, unsigned int reg)
        }
 }
 
+static const struct cs35l56_fw_reg cs35l56_fw_reg = {
+       .fw_ver = CS35L56_DSP1_FW_VER,
+       .halo_state = CS35L56_DSP1_HALO_STATE,
+       .pm_cur_stat = CS35L56_DSP1_PM_CUR_STATE,
+       .prot_sts = CS35L56_PROTECTION_STATUS,
+       .transducer_actual_ps = CS35L56_TRANSDUCER_ACTUAL_PS,
+       .user_mute = CS35L56_MAIN_RENDER_USER_MUTE,
+       .user_volume = CS35L56_MAIN_RENDER_USER_VOLUME,
+       .posture_number = CS35L56_MAIN_POSTURE_NUMBER,
+};
+
+static const struct cs35l56_fw_reg cs35l63_fw_reg = {
+       .fw_ver = CS35L63_DSP1_FW_VER,
+       .halo_state = CS35L63_DSP1_HALO_STATE,
+       .pm_cur_stat = CS35L63_DSP1_PM_CUR_STATE,
+       .prot_sts = CS35L63_PROTECTION_STATUS,
+       .transducer_actual_ps = CS35L63_TRANSDUCER_ACTUAL_PS,
+       .user_mute = CS35L63_MAIN_RENDER_USER_MUTE,
+       .user_volume = CS35L63_MAIN_RENDER_USER_VOLUME,
+       .posture_number = CS35L63_MAIN_POSTURE_NUMBER,
+};
+
+static void cs35l56_set_fw_reg_table(struct cs35l56_base *cs35l56_base)
+{
+       switch (cs35l56_base->type) {
+       default:
+               cs35l56_base->fw_reg = &cs35l56_fw_reg;
+               break;
+       case 0x63:
+               cs35l56_base->fw_reg = &cs35l63_fw_reg;
+               break;
+       }
+}
+
 int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command)
 {
        unsigned int val;
@@ -979,6 +1013,7 @@ int cs35l56_hw_init(struct cs35l56_base *cs35l56_base)
                return ret;
        }
        cs35l56_base->rev = revid & (CS35L56_AREVID_MASK | CS35L56_MTLREVID_MASK);
+       cs35l56_set_fw_reg_table(cs35l56_base);
 
        ret = cs35l56_wait_for_firmware_boot(cs35l56_base);
        if (ret)
@@ -1280,30 +1315,6 @@ const struct regmap_config cs35l63_regmap_sdw = {
 };
 EXPORT_SYMBOL_NS_GPL(cs35l63_regmap_sdw, "SND_SOC_CS35L56_SHARED");
 
-const struct cs35l56_fw_reg cs35l56_fw_reg = {
-       .fw_ver = CS35L56_DSP1_FW_VER,
-       .halo_state = CS35L56_DSP1_HALO_STATE,
-       .pm_cur_stat = CS35L56_DSP1_PM_CUR_STATE,
-       .prot_sts = CS35L56_PROTECTION_STATUS,
-       .transducer_actual_ps = CS35L56_TRANSDUCER_ACTUAL_PS,
-       .user_mute = CS35L56_MAIN_RENDER_USER_MUTE,
-       .user_volume = CS35L56_MAIN_RENDER_USER_VOLUME,
-       .posture_number = CS35L56_MAIN_POSTURE_NUMBER,
-};
-EXPORT_SYMBOL_NS_GPL(cs35l56_fw_reg, "SND_SOC_CS35L56_SHARED");
-
-const struct cs35l56_fw_reg cs35l63_fw_reg = {
-       .fw_ver = CS35L63_DSP1_FW_VER,
-       .halo_state = CS35L63_DSP1_HALO_STATE,
-       .pm_cur_stat = CS35L63_DSP1_PM_CUR_STATE,
-       .prot_sts = CS35L63_PROTECTION_STATUS,
-       .transducer_actual_ps = CS35L63_TRANSDUCER_ACTUAL_PS,
-       .user_mute = CS35L63_MAIN_RENDER_USER_MUTE,
-       .user_volume = CS35L63_MAIN_RENDER_USER_VOLUME,
-       .posture_number = CS35L63_MAIN_POSTURE_NUMBER,
-};
-EXPORT_SYMBOL_NS_GPL(cs35l63_fw_reg, "SND_SOC_CS35L56_SHARED");
-
 MODULE_DESCRIPTION("ASoC CS35L56 Shared");
 MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>");
 MODULE_AUTHOR("Simon Trimmer <simont@opensource.cirrus.com>");
index c2ddee22cd231ba5099b7f5276d2199a5a98e5ac..9bc9b7c98390dc43210cfb8ed209afa4b64ecbe1 100644 (file)
@@ -26,7 +26,7 @@ static int cs35l56_spi_probe(struct spi_device *spi)
 
        spi_set_drvdata(spi, cs35l56);
 
-       cs35l56->base.fw_reg = &cs35l56_fw_reg;
+       cs35l56->base.type = 0x56;
 
        cs35l56->base.regmap = devm_regmap_init_spi(spi, regmap_config);
        if (IS_ERR(cs35l56->base.regmap)) {