ASoC: cs35l56: Add support for CS35L62

Richard Fitzgerald <rf@opensource.cirrus.com> says:

The Cirrus Logic CS35L62 amp is similar to the CS35L63 and can be
supported by adding the chip IDs into the cs35l56 driver. It must
also be added to the codec table in sdw_utils.

Link: https://patch.msgid.link/20260715120135.939280-1-rf@opensource.cirrus.com
This commit is contained in:
Mark Brown 2026-07-15 18:49:39 +01:00
commit 567a5c8664
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
4 changed files with 36 additions and 0 deletions

View File

@ -457,6 +457,7 @@ static int cs35l56_sdw_probe(struct sdw_slave *peripheral, const struct sdw_devi
regmap_config = &cs35l56_regmap_sdw;
break;
case 0x3563:
case 0x3562:
regmap_config = &cs35l63_regmap_sdw;
break;
default:
@ -510,6 +511,7 @@ static const struct sdw_device_id cs35l56_sdw_id[] = {
SDW_SLAVE_ENTRY(0x01FA, 0x3556, 0x3556),
SDW_SLAVE_ENTRY(0x01FA, 0x3557, 0x3557),
SDW_SLAVE_ENTRY(0x01FA, 0x3563, 0x3563),
SDW_SLAVE_ENTRY(0x01FA, 0x3562, 0x3562),
{},
};
MODULE_DEVICE_TABLE(sdw, cs35l56_sdw_id);

View File

@ -96,6 +96,7 @@ int cs35l56_set_patch(struct cs35l56_base *cs35l56_base)
ARRAY_SIZE(cs35l56_patch_fw));
break;
case 0x63:
case 0x62:
ret = regmap_register_patch(cs35l56_base->regmap, cs35l63_patch_fw,
ARRAY_SIZE(cs35l63_patch_fw));
break;
@ -389,6 +390,7 @@ static void cs35l56_set_fw_reg_table(struct cs35l56_base *cs35l56_base)
}
break;
case 0x63:
case 0x62:
cs35l56_base->fw_reg = &cs35l63_fw_reg;
break;
}
@ -595,6 +597,7 @@ void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
}
break;
case 0x63:
case 0x62:
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
cs35l63_system_reset_seq,
ARRAY_SIZE(cs35l63_system_reset_seq));
@ -1462,6 +1465,7 @@ int cs35l56_hw_init(struct cs35l56_base *cs35l56_base)
cs35l56_base->calibration_controls = &cs35l56_calibration_controls;
break;
case 0x35A630:
case 0x35A620:
cs35l56_base->calibration_controls = &cs35l63_calibration_controls;
devid = devid >> 4;
break;

View File

@ -1402,6 +1402,7 @@ static int _cs35l56_component_probe(struct snd_soc_component *component)
ARRAY_SIZE(cs35l56_controls));
break;
case 0x63:
case 0x62:
ret = snd_soc_add_component_controls(component, cs35l63_controls,
ARRAY_SIZE(cs35l63_controls));
break;

View File

@ -834,6 +834,35 @@ struct asoc_sdw_codec_info codec_info_list[] = {
},
.dai_num = 2,
},
{
.vendor_id = 0x01fa,
.part_id = 0x3562,
.name_prefix = "AMP",
.is_amp = true,
.dais = {
{
.direction = {true, false},
.dai_name = "cs35l56-sdw1",
.component_name = "cs35l56",
.dai_type = SOC_SDW_DAI_TYPE_AMP,
.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
.init = asoc_sdw_cs_amp_init,
.rtd_init = asoc_sdw_cs_spk_rtd_init,
.controls = generic_spk_controls,
.num_controls = ARRAY_SIZE(generic_spk_controls),
.widgets = generic_spk_widgets,
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
},
{
.direction = {false, true},
.dai_name = "cs35l56-sdw1c",
.dai_type = SOC_SDW_DAI_TYPE_AMP,
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_AMP_IN_DAI_ID},
.rtd_init = asoc_sdw_cs_spk_feedback_rtd_init,
},
},
.dai_num = 2,
},
{
.vendor_id = 0x01fa,
.part_id = 0x3563,