* [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for B2 silicon
@ 2025-09-23 13:03 Richard Fitzgerald
2025-09-23 13:03 ` [PATCH 1/2] ASoC: cs35l56: Set fw_regs table after getting REVID Richard Fitzgerald
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Richard Fitzgerald @ 2025-09-23 13:03 UTC (permalink / raw)
To: broonie, tiwai; +Cc: linux-sound, linux-kernel, patches
This series adds support for the latest (B2) revision of cs35l56.
Most of the code is in ASoC, but there are some trivial changes
needed to the HDA drivers. They are to prevent build breaks so
they have been included in the ASoC patch.
Richard Fitzgerald (2):
ASoC: cs35l56: Set fw_regs table after getting REVID
ASoC: cs35l56: Add support for CS35L56 B2 silicon
include/sound/cs35l56.h | 5 +-
sound/hda/codecs/side-codecs/cs35l56_hda.c | 1 +
.../hda/codecs/side-codecs/cs35l56_hda_i2c.c | 2 -
.../hda/codecs/side-codecs/cs35l56_hda_spi.c | 2 -
sound/soc/codecs/cs35l56-i2c.c | 4 +-
sound/soc/codecs/cs35l56-sdw.c | 4 +-
sound/soc/codecs/cs35l56-shared.c | 97 +++++++++++++------
sound/soc/codecs/cs35l56-spi.c | 2 +-
8 files changed, 78 insertions(+), 39 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] ASoC: cs35l56: Set fw_regs table after getting REVID
2025-09-23 13:03 [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for B2 silicon Richard Fitzgerald
@ 2025-09-23 13:03 ` Richard Fitzgerald
2025-09-23 13:03 ` [PATCH 2/2] ASoC: cs35l56: Add support for CS35L56 B2 silicon Richard Fitzgerald
2025-09-27 7:58 ` [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for " Takashi Iwai
2 siblings, 0 replies; 5+ messages in thread
From: Richard Fitzgerald @ 2025-09-23 13:03 UTC (permalink / raw)
To: broonie, tiwai; +Cc: linux-sound, linux-kernel, patches
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>
---
include/sound/cs35l56.h | 3 -
sound/hda/codecs/side-codecs/cs35l56_hda.c | 1 +
.../hda/codecs/side-codecs/cs35l56_hda_i2c.c | 2 -
.../hda/codecs/side-codecs/cs35l56_hda_spi.c | 2 -
sound/soc/codecs/cs35l56-i2c.c | 4 +-
sound/soc/codecs/cs35l56-sdw.c | 4 +-
sound/soc/codecs/cs35l56-shared.c | 59 +++++++++++--------
sound/soc/codecs/cs35l56-spi.c | 2 +-
8 files changed, 41 insertions(+), 36 deletions(-)
diff --git a/include/sound/cs35l56.h b/include/sound/cs35l56.h
index 7c8bbe8ad1e2..20dc3ee6378d 100644
--- a/include/sound/cs35l56.h
+++ b/include/sound/cs35l56.h
@@ -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];
diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda.c b/sound/hda/codecs/side-codecs/cs35l56_hda.c
index 36fa62a41984..5bb1c4ebeaf3 100644
--- a/sound/hda/codecs/side-codecs/cs35l56_hda.c
+++ b/sound/hda/codecs/side-codecs/cs35l56_hda.c
@@ -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);
diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda_i2c.c b/sound/hda/codecs/side-codecs/cs35l56_hda_i2c.c
index d10209e4eddd..1072f17385ac 100644
--- a/sound/hda/codecs/side-codecs/cs35l56_hda_i2c.c
+++ b/sound/hda/codecs/side-codecs/cs35l56_hda_i2c.c
@@ -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);
diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda_spi.c b/sound/hda/codecs/side-codecs/cs35l56_hda_spi.c
index f57533d3d728..f802c83c57b4 100644
--- a/sound/hda/codecs/side-codecs/cs35l56_hda_spi.c
+++ b/sound/hda/codecs/side-codecs/cs35l56_hda_spi.c
@@ -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);
diff --git a/sound/soc/codecs/cs35l56-i2c.c b/sound/soc/codecs/cs35l56-i2c.c
index 073f1796ae29..0492ddc4102d 100644
--- a/sound/soc/codecs/cs35l56-i2c.c
+++ b/sound/soc/codecs/cs35l56-i2c.c
@@ -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;
diff --git a/sound/soc/codecs/cs35l56-sdw.c b/sound/soc/codecs/cs35l56-sdw.c
index 3905c9cb188a..42d24ac2977f 100644
--- a/sound/soc/codecs/cs35l56-sdw.c
+++ b/sound/soc/codecs/cs35l56-sdw.c
@@ -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)) {
diff --git a/sound/soc/codecs/cs35l56-shared.c b/sound/soc/codecs/cs35l56-shared.c
index 95d018ecb953..03ea66f08787 100644
--- a/sound/soc/codecs/cs35l56-shared.c
+++ b/sound/soc/codecs/cs35l56-shared.c
@@ -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>");
diff --git a/sound/soc/codecs/cs35l56-spi.c b/sound/soc/codecs/cs35l56-spi.c
index c2ddee22cd23..9bc9b7c98390 100644
--- a/sound/soc/codecs/cs35l56-spi.c
+++ b/sound/soc/codecs/cs35l56-spi.c
@@ -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)) {
--
2.39.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] ASoC: cs35l56: Add support for CS35L56 B2 silicon
2025-09-23 13:03 [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for B2 silicon Richard Fitzgerald
2025-09-23 13:03 ` [PATCH 1/2] ASoC: cs35l56: Set fw_regs table after getting REVID Richard Fitzgerald
@ 2025-09-23 13:03 ` Richard Fitzgerald
2025-09-27 7:58 ` [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for " Takashi Iwai
2 siblings, 0 replies; 5+ messages in thread
From: Richard Fitzgerald @ 2025-09-23 13:03 UTC (permalink / raw)
To: broonie, tiwai; +Cc: linux-sound, linux-kernel, patches
This adds support for changed firmware addresses on the B2 revision of
CS35L56 silicon.
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
---
include/sound/cs35l56.h | 2 ++
sound/soc/codecs/cs35l56-shared.c | 40 +++++++++++++++++++++++++++----
2 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/include/sound/cs35l56.h b/include/sound/cs35l56.h
index 20dc3ee6378d..ab044ce2aa8b 100644
--- a/include/sound/cs35l56.h
+++ b/include/sound/cs35l56.h
@@ -85,7 +85,9 @@
#define CS35L56_DSP1_XMEM_UNPACKED24_0 0x2800000
#define CS35L56_DSP1_FW_VER 0x2800010
#define CS35L56_DSP1_HALO_STATE 0x28021E0
+#define CS35L56_B2_DSP1_HALO_STATE 0x2803D20
#define CS35L56_DSP1_PM_CUR_STATE 0x2804308
+#define CS35L56_B2_DSP1_PM_CUR_STATE 0x2804678
#define CS35L56_DSP1_XMEM_UNPACKED24_8191 0x2807FFC
#define CS35L56_DSP1_CORE_BASE 0x2B80000
#define CS35L56_DSP1_SCRATCH1 0x2B805C0
diff --git a/sound/soc/codecs/cs35l56-shared.c b/sound/soc/codecs/cs35l56-shared.c
index 03ea66f08787..9e6b9ca2f354 100644
--- a/sound/soc/codecs/cs35l56-shared.c
+++ b/sound/soc/codecs/cs35l56-shared.c
@@ -320,6 +320,17 @@ static const struct cs35l56_fw_reg cs35l56_fw_reg = {
.posture_number = CS35L56_MAIN_POSTURE_NUMBER,
};
+static const struct cs35l56_fw_reg cs35l56_b2_fw_reg = {
+ .fw_ver = CS35L56_DSP1_FW_VER,
+ .halo_state = CS35L56_B2_DSP1_HALO_STATE,
+ .pm_cur_stat = CS35L56_B2_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,
@@ -335,7 +346,14 @@ static void cs35l56_set_fw_reg_table(struct cs35l56_base *cs35l56_base)
{
switch (cs35l56_base->type) {
default:
- cs35l56_base->fw_reg = &cs35l56_fw_reg;
+ switch (cs35l56_base->rev) {
+ case 0xb0:
+ cs35l56_base->fw_reg = &cs35l56_fw_reg;
+ break;
+ default:
+ cs35l56_base->fw_reg = &cs35l56_b2_fw_reg;
+ break;
+ }
break;
case 0x63:
cs35l56_base->fw_reg = &cs35l63_fw_reg;
@@ -502,6 +520,11 @@ static const struct reg_sequence cs35l56_system_reset_seq[] = {
REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET),
};
+static const struct reg_sequence cs35l56_b2_system_reset_seq[] = {
+ REG_SEQ0(CS35L56_B2_DSP1_HALO_STATE, 0),
+ REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET),
+};
+
static const struct reg_sequence cs35l63_system_reset_seq[] = {
REG_SEQ0(CS35L63_DSP1_HALO_STATE, 0),
REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET),
@@ -524,9 +547,18 @@ void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
case 0x54:
case 0x56:
case 0x57:
- regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
- cs35l56_system_reset_seq,
- ARRAY_SIZE(cs35l56_system_reset_seq));
+ switch (cs35l56_base->rev) {
+ case 0xb0:
+ regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
+ cs35l56_system_reset_seq,
+ ARRAY_SIZE(cs35l56_system_reset_seq));
+ break;
+ default:
+ regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
+ cs35l56_b2_system_reset_seq,
+ ARRAY_SIZE(cs35l56_b2_system_reset_seq));
+ break;
+ }
break;
case 0x63:
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
--
2.39.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for B2 silicon
2025-09-23 13:03 [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for B2 silicon Richard Fitzgerald
2025-09-23 13:03 ` [PATCH 1/2] ASoC: cs35l56: Set fw_regs table after getting REVID Richard Fitzgerald
2025-09-23 13:03 ` [PATCH 2/2] ASoC: cs35l56: Add support for CS35L56 B2 silicon Richard Fitzgerald
@ 2025-09-27 7:58 ` Takashi Iwai
2025-09-28 6:28 ` Takashi Iwai
2 siblings, 1 reply; 5+ messages in thread
From: Takashi Iwai @ 2025-09-27 7:58 UTC (permalink / raw)
To: Richard Fitzgerald; +Cc: broonie, tiwai, linux-sound, linux-kernel, patches
On Tue, 23 Sep 2025 15:03:24 +0200,
Richard Fitzgerald wrote:
>
> This series adds support for the latest (B2) revision of cs35l56.
>
> Most of the code is in ASoC, but there are some trivial changes
> needed to the HDA drivers. They are to prevent build breaks so
> they have been included in the ASoC patch.
>
> Richard Fitzgerald (2):
> ASoC: cs35l56: Set fw_regs table after getting REVID
> ASoC: cs35l56: Add support for CS35L56 B2 silicon
Mark, shall I apply those patches to my tree?
They seem cleanly applicable.
thanks,
Takashi
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for B2 silicon
2025-09-27 7:58 ` [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for " Takashi Iwai
@ 2025-09-28 6:28 ` Takashi Iwai
0 siblings, 0 replies; 5+ messages in thread
From: Takashi Iwai @ 2025-09-28 6:28 UTC (permalink / raw)
To: broonie; +Cc: Richard Fitzgerald, tiwai, linux-sound, linux-kernel, patches
On Sat, 27 Sep 2025 09:58:45 +0200,
Takashi Iwai wrote:
>
> On Tue, 23 Sep 2025 15:03:24 +0200,
> Richard Fitzgerald wrote:
> >
> > This series adds support for the latest (B2) revision of cs35l56.
> >
> > Most of the code is in ASoC, but there are some trivial changes
> > needed to the HDA drivers. They are to prevent build breaks so
> > they have been included in the ASoC patch.
> >
> > Richard Fitzgerald (2):
> > ASoC: cs35l56: Set fw_regs table after getting REVID
> > ASoC: cs35l56: Add support for CS35L56 B2 silicon
>
> Mark, shall I apply those patches to my tree?
> They seem cleanly applicable.
Assuming that they didn't get merged in ASoC tree, I picked up them
now. Both applied to for-next branch.
thanks,
Takashi
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-09-28 6:28 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-23 13:03 [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for B2 silicon Richard Fitzgerald
2025-09-23 13:03 ` [PATCH 1/2] ASoC: cs35l56: Set fw_regs table after getting REVID Richard Fitzgerald
2025-09-23 13:03 ` [PATCH 2/2] ASoC: cs35l56: Add support for CS35L56 B2 silicon Richard Fitzgerald
2025-09-27 7:58 ` [PATCH 0/2] ALSA ASoC/HDA: cs35l56: Add support for " Takashi Iwai
2025-09-28 6:28 ` Takashi Iwai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox