ASoC: cs42l43: Add support for the B variant

Introducing CS42L43B codec, a variant of CS42L43 which can be driven by
the same driver.

Changes in CS42L43 driver specific for CS42L43B:
- Decimator 1 and 2 are dedicated to ADC, can't be selected for PDM
- Decimators 3 and 4 are connected to PDM1
- Added Decimator 5 and 6 for PDM2
- Supports SoundWire Clock Gearing
- Updated ROM requiring no patching
- Reduced RAM space
- Each ISRC has 4 decimators now

Signed-off-by: Maciej Strozek <mstrozek@opensource.cirrus.com>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20260306152829.3130530-5-mstrozek@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Maciej Strozek 2026-03-06 15:28:11 +00:00 committed by Mark Brown
parent a6fe20d67d
commit 0a208adefe
2 changed files with 625 additions and 135 deletions

View File

@ -45,12 +45,25 @@ static SOC_VALUE_ENUM_SINGLE_DECL(cs42l43_##name##_enum, reg, \
static const struct snd_kcontrol_new cs42l43_##name##_mux = \
SOC_DAPM_ENUM("Route", cs42l43_##name##_enum)
#define CS42L43B_DECL_MUX(name, reg) \
static SOC_VALUE_ENUM_SINGLE_DECL(cs42l43_##name##_enum, reg, \
0, CS42L43_MIXER_SRC_MASK, \
cs42l43b_mixer_texts, cs42l43b_mixer_values); \
static const struct snd_kcontrol_new cs42l43_##name##_mux = \
SOC_DAPM_ENUM("Route", cs42l43_##name##_enum)
#define CS42L43_DECL_MIXER(name, reg) \
CS42L43_DECL_MUX(name##_in1, reg); \
CS42L43_DECL_MUX(name##_in2, reg + 0x4); \
CS42L43_DECL_MUX(name##_in3, reg + 0x8); \
CS42L43_DECL_MUX(name##_in4, reg + 0xC)
#define CS42L43B_DECL_MIXER(name, reg) \
CS42L43B_DECL_MUX(name##_in1, reg); \
CS42L43B_DECL_MUX(name##_in2, reg + 0x4); \
CS42L43B_DECL_MUX(name##_in3, reg + 0x8); \
CS42L43B_DECL_MUX(name##_in4, reg + 0xC)
#define CS42L43_DAPM_MUX(name_str, name) \
SND_SOC_DAPM_MUX(name_str " Input", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_mux)
@ -99,11 +112,23 @@ static const struct snd_kcontrol_new cs42l43_##name##_mux = \
{ name_str, "EQ1", "EQ" }, \
{ name_str, "EQ2", "EQ" }
#define CS42L43B_BASE_ROUTES(name_str) \
{ name_str, "Decimator 5", "Decimator 5" }, \
{ name_str, "Decimator 6", "Decimator 6" }, \
{ name_str, "ISRC1 DEC3", "ISRC1DEC3" }, \
{ name_str, "ISRC1 DEC4", "ISRC1DEC4" }, \
{ name_str, "ISRC2 DEC3", "ISRC2DEC3" }, \
{ name_str, "ISRC2 DEC4", "ISRC2DEC4" }
#define CS42L43_MUX_ROUTES(name_str, widget) \
{ widget, NULL, name_str " Input" }, \
{ name_str " Input", NULL, "Mixer Core" }, \
CS42L43_BASE_ROUTES(name_str " Input")
#define CS42L43B_MUX_ROUTES(name_str, widget) \
CS42L43_MUX_ROUTES(name_str, widget), \
CS42L43B_BASE_ROUTES(name_str " Input")
#define CS42L43_MIXER_ROUTES(name_str, widget) \
{ name_str " Mixer", NULL, name_str " Input 1" }, \
{ name_str " Mixer", NULL, name_str " Input 2" }, \
@ -116,6 +141,13 @@ static const struct snd_kcontrol_new cs42l43_##name##_mux = \
CS42L43_BASE_ROUTES(name_str " Input 3"), \
CS42L43_BASE_ROUTES(name_str " Input 4")
#define CS42L43B_MIXER_ROUTES(name_str, widget) \
CS42L43_MIXER_ROUTES(name_str, widget), \
CS42L43B_BASE_ROUTES(name_str " Input 1"), \
CS42L43B_BASE_ROUTES(name_str " Input 2"), \
CS42L43B_BASE_ROUTES(name_str " Input 3"), \
CS42L43B_BASE_ROUTES(name_str " Input 4")
#define CS42L43_MIXER_VOLUMES(name_str, base) \
SOC_SINGLE_RANGE_TLV(name_str " Input 1 Volume", base, \
CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
@ -300,6 +332,7 @@ static int cs42l43_startup(struct snd_pcm_substream *substream, struct snd_soc_d
struct snd_soc_component *component = dai->component;
struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
struct cs42l43 *cs42l43 = priv->core;
int ret;
int provider = !dai->id || !!regmap_test_bits(cs42l43->regmap,
CS42L43_ASP_CLK_CONFIG2,
CS42L43_ASP_MASTER_MODE_MASK);
@ -309,6 +342,14 @@ static int cs42l43_startup(struct snd_pcm_substream *substream, struct snd_soc_d
else
priv->constraint.mask = CS42L43_CONSUMER_RATE_MASK;
if (cs42l43->variant_id == CS42L43_DEVID_VAL && (dai->id == 3 || dai->id == 4)) {
ret = snd_pcm_hw_constraint_minmax(substream->runtime,
SNDRV_PCM_HW_PARAM_CHANNELS,
1, 2);
if (ret < 0)
return ret;
}
return snd_pcm_hw_constraint_list(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_RATE,
&priv->constraint);
@ -590,12 +631,25 @@ static int cs42l43_dai_probe(struct snd_soc_dai *dai)
"Decimator 2 Switch",
"Decimator 3 Switch",
"Decimator 4 Switch",
"Decimator 5 Switch",
"Decimator 6 Switch",
};
int i;
int control_size, i;
static_assert(ARRAY_SIZE(controls) == ARRAY_SIZE(priv->kctl));
for (i = 0; i < ARRAY_SIZE(controls); i++) {
switch (priv->core->variant_id) {
case CS42L43_DEVID_VAL:
control_size = ARRAY_SIZE(controls) - 2; // ignore Decimator 5 and 6
break;
case CS42L43B_DEVID_VAL:
control_size = ARRAY_SIZE(controls);
break;
default:
return -EINVAL;
}
for (i = 0; i < control_size; i++) {
if (priv->kctl[i])
continue;
@ -703,7 +757,7 @@ static struct snd_soc_dai_driver cs42l43_dais[] = {
.capture = {
.stream_name = "DP3 Capture",
.channels_min = 1,
.channels_max = 2,
.channels_max = 4,
.rates = SNDRV_PCM_RATE_KNOT,
.formats = CS42L43_SDW_FORMATS,
},
@ -715,7 +769,7 @@ static struct snd_soc_dai_driver cs42l43_dais[] = {
.capture = {
.stream_name = "DP4 Capture",
.channels_min = 1,
.channels_max = 2,
.channels_max = 4,
.rates = SNDRV_PCM_RATE_KNOT,
.formats = CS42L43_SDW_FORMATS,
},
@ -808,6 +862,10 @@ static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL3
CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL4,
CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec5_wnf_corner, CS42L43B_DECIM_HPF_WNF_CTRL5,
CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec6_wnf_corner, CS42L43B_DECIM_HPF_WNF_CTRL6,
CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
static const char * const cs42l43_hpf_corner_text[] = {
"3Hz", "12Hz", "48Hz", "96Hz",
@ -821,6 +879,10 @@ static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL3
CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL4,
CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec5_hpf_corner, CS42L43B_DECIM_HPF_WNF_CTRL5,
CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec6_hpf_corner, CS42L43B_DECIM_HPF_WNF_CTRL6,
CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_ramp_up, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_VI_RAMP_SHIFT, cs42l43_ramp_text);
@ -839,6 +901,31 @@ static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_ramp_up, CS42L43_DECIM_VOL_CTRL_CH3_CH4
static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_ramp_down, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_VD_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec1_ramp_up, CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_VI_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec1_ramp_down, CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_VD_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec2_ramp_up, CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_VI_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec2_ramp_down, CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_VD_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec3_ramp_up, CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_VI_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec3_ramp_down, CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_VD_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec4_ramp_up, CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_VI_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec4_ramp_down, CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_VD_RAMP_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec5_ramp_up, CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM5_PATH1_VOL_RISE_RATE_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec5_ramp_down, CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM5_PATH1_VOL_FALL_RATE_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec6_ramp_up, CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM6_PATH1_VOL_RISE_RATE_SHIFT, cs42l43_ramp_text);
static SOC_ENUM_SINGLE_DECL(cs42l43b_dec6_ramp_down, CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM6_PATH1_VOL_FALL_RATE_SHIFT, cs42l43_ramp_text);
static DECLARE_TLV_DB_SCALE(cs42l43_speaker_tlv, -6400, 50, 0);
static SOC_ENUM_SINGLE_DECL(cs42l43_speaker_ramp_up, CS42L43_AMP1_2_VOL_RAMP,
@ -898,6 +985,37 @@ static const unsigned int cs42l43_mixer_values[] = {
0x58, 0x59, // EQ1, 2
};
static const char * const cs42l43b_mixer_texts[] = {
"None",
"Tone Generator 1", "Tone Generator 2",
"Decimator 1", "Decimator 2", "Decimator 3", "Decimator 4", "Decimator 5", "Decimator 6",
"ASPRX1", "ASPRX2", "ASPRX3", "ASPRX4", "ASPRX5", "ASPRX6",
"DP5RX1", "DP5RX2", "DP6RX1", "DP6RX2", "DP7RX1", "DP7RX2",
"ASRC INT1", "ASRC INT2", "ASRC INT3", "ASRC INT4",
"ASRC DEC1", "ASRC DEC2", "ASRC DEC3", "ASRC DEC4",
"ISRC1 INT1", "ISRC1 INT2",
"ISRC1 DEC1", "ISRC1 DEC2", "ISRC1 DEC3", "ISRC1 DEC4",
"ISRC2 INT1", "ISRC2 INT2",
"ISRC2 DEC1", "ISRC2 DEC2", "ISRC2 DEC3", "ISRC2 DEC4",
"EQ1", "EQ2",
};
static const unsigned int cs42l43b_mixer_values[] = {
0x00, // None
0x04, 0x05, // Tone Generator 1, 2
0x10, 0x11, 0x80, 0x81, 0x12, 0x13, // Decimator 1, 2, 3, 4, 5, 6
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, // ASPRX1,2,3,4,5,6
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, // DP5, 6, 7RX1, 2
0x40, 0x41, 0x42, 0x43, // ASRC INT1, 2, 3, 4
0x44, 0x45, 0x46, 0x47, // ASRC DEC1, 2, 3, 4
0x50, 0x51, // ISRC1 INT1, 2
0x52, 0x53, 0x78, 0x79, // ISRC1 DEC1, 2, 3, 4
0x54, 0x55, // ISRC2 INT1, 2
0x56, 0x57, 0x7A, 0x7B, // ISRC2 DEC1, 2, 3, 4
0x58, 0x59, // EQ1, 2
};
/* A variant */
CS42L43_DECL_MUX(asptx1, CS42L43_ASPTX1_INPUT);
CS42L43_DECL_MUX(asptx2, CS42L43_ASPTX2_INPUT);
CS42L43_DECL_MUX(asptx3, CS42L43_ASPTX3_INPUT);
@ -946,6 +1064,63 @@ CS42L43_DECL_MIXER(amp2, CS42L43_AMP2MIX_INPUT1);
CS42L43_DECL_MIXER(amp3, CS42L43_AMP3MIX_INPUT1);
CS42L43_DECL_MIXER(amp4, CS42L43_AMP4MIX_INPUT1);
/* B variant */
CS42L43B_DECL_MUX(b_asptx1, CS42L43_ASPTX1_INPUT);
CS42L43B_DECL_MUX(b_asptx2, CS42L43_ASPTX2_INPUT);
CS42L43B_DECL_MUX(b_asptx3, CS42L43_ASPTX3_INPUT);
CS42L43B_DECL_MUX(b_asptx4, CS42L43_ASPTX4_INPUT);
CS42L43B_DECL_MUX(b_asptx5, CS42L43_ASPTX5_INPUT);
CS42L43B_DECL_MUX(b_asptx6, CS42L43_ASPTX6_INPUT);
CS42L43B_DECL_MUX(b_dp1tx1, CS42L43_SWIRE_DP1_CH1_INPUT);
CS42L43B_DECL_MUX(b_dp1tx2, CS42L43_SWIRE_DP1_CH2_INPUT);
CS42L43B_DECL_MUX(b_dp1tx3, CS42L43_SWIRE_DP1_CH3_INPUT);
CS42L43B_DECL_MUX(b_dp1tx4, CS42L43_SWIRE_DP1_CH4_INPUT);
CS42L43B_DECL_MUX(b_dp2tx1, CS42L43_SWIRE_DP2_CH1_INPUT);
CS42L43B_DECL_MUX(b_dp2tx2, CS42L43_SWIRE_DP2_CH2_INPUT);
CS42L43B_DECL_MUX(b_dp3tx1, CS42L43_SWIRE_DP3_CH1_INPUT);
CS42L43B_DECL_MUX(b_dp3tx2, CS42L43_SWIRE_DP3_CH2_INPUT);
CS42L43B_DECL_MUX(b_dp3tx3, CS42L43B_SWIRE_DP3_CH3_INPUT);
CS42L43B_DECL_MUX(b_dp3tx4, CS42L43B_SWIRE_DP3_CH4_INPUT);
CS42L43B_DECL_MUX(b_dp4tx1, CS42L43_SWIRE_DP4_CH1_INPUT);
CS42L43B_DECL_MUX(b_dp4tx2, CS42L43_SWIRE_DP4_CH2_INPUT);
CS42L43B_DECL_MUX(b_dp4tx3, CS42L43B_SWIRE_DP4_CH3_INPUT);
CS42L43B_DECL_MUX(b_dp4tx4, CS42L43B_SWIRE_DP4_CH4_INPUT);
CS42L43B_DECL_MUX(b_asrcint1, CS42L43_ASRC_INT1_INPUT1);
CS42L43B_DECL_MUX(b_asrcint2, CS42L43_ASRC_INT2_INPUT1);
CS42L43B_DECL_MUX(b_asrcint3, CS42L43_ASRC_INT3_INPUT1);
CS42L43B_DECL_MUX(b_asrcint4, CS42L43_ASRC_INT4_INPUT1);
CS42L43B_DECL_MUX(b_asrcdec1, CS42L43_ASRC_DEC1_INPUT1);
CS42L43B_DECL_MUX(b_asrcdec2, CS42L43_ASRC_DEC2_INPUT1);
CS42L43B_DECL_MUX(b_asrcdec3, CS42L43_ASRC_DEC3_INPUT1);
CS42L43B_DECL_MUX(b_asrcdec4, CS42L43_ASRC_DEC4_INPUT1);
CS42L43B_DECL_MUX(b_isrc1int1, CS42L43_ISRC1INT1_INPUT1);
CS42L43B_DECL_MUX(b_isrc1int2, CS42L43_ISRC1INT2_INPUT1);
CS42L43B_DECL_MUX(b_isrc1dec1, CS42L43_ISRC1DEC1_INPUT1);
CS42L43B_DECL_MUX(b_isrc1dec2, CS42L43_ISRC1DEC2_INPUT1);
CS42L43B_DECL_MUX(b_isrc1dec3, CS42L43B_ISRC1DEC3_INPUT1);
CS42L43B_DECL_MUX(b_isrc1dec4, CS42L43B_ISRC1DEC4_INPUT1);
CS42L43B_DECL_MUX(b_isrc2int1, CS42L43_ISRC2INT1_INPUT1);
CS42L43B_DECL_MUX(b_isrc2int2, CS42L43_ISRC2INT2_INPUT1);
CS42L43B_DECL_MUX(b_isrc2dec1, CS42L43_ISRC2DEC1_INPUT1);
CS42L43B_DECL_MUX(b_isrc2dec2, CS42L43_ISRC2DEC2_INPUT1);
CS42L43B_DECL_MUX(b_isrc2dec3, CS42L43B_ISRC2DEC3_INPUT1);
CS42L43B_DECL_MUX(b_isrc2dec4, CS42L43B_ISRC2DEC4_INPUT1);
CS42L43B_DECL_MUX(b_spdif1, CS42L43_SPDIF1_INPUT1);
CS42L43B_DECL_MUX(b_spdif2, CS42L43_SPDIF2_INPUT1);
CS42L43B_DECL_MIXER(b_eq1, CS42L43_EQ1MIX_INPUT1);
CS42L43B_DECL_MIXER(b_eq2, CS42L43_EQ2MIX_INPUT1);
CS42L43B_DECL_MIXER(b_amp1, CS42L43_AMP1MIX_INPUT1);
CS42L43B_DECL_MIXER(b_amp2, CS42L43_AMP2MIX_INPUT1);
CS42L43B_DECL_MIXER(b_amp3, CS42L43_AMP3MIX_INPUT1);
CS42L43B_DECL_MIXER(b_amp4, CS42L43_AMP4MIX_INPUT1);
static int cs42l43_dapm_get_volsw(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@ -1174,44 +1349,6 @@ static const struct snd_kcontrol_new cs42l43_controls[] = {
SOC_ENUM("Decimator 3 HPF Corner Frequency", cs42l43_dec3_hpf_corner),
SOC_ENUM("Decimator 4 HPF Corner Frequency", cs42l43_dec4_hpf_corner),
SOC_SINGLE_TLV("Decimator 1 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 1 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 2 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 2 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 3 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 3 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 4 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 4 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_ENUM_EXT("Decimator 1 Ramp Up", cs42l43_dec1_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 1 Ramp Down", cs42l43_dec1_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 2 Ramp Up", cs42l43_dec2_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 2 Ramp Down", cs42l43_dec2_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 3 Ramp Up", cs42l43_dec3_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 3 Ramp Down", cs42l43_dec3_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 4 Ramp Up", cs42l43_dec4_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 4 Ramp Down", cs42l43_dec4_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_DOUBLE_R_EXT("Speaker Digital Switch",
CS42L43_INTP_VOLUME_CTRL1, CS42L43_INTP_VOLUME_CTRL2,
CS42L43_AMP_MUTE_SHIFT, 1, 1,
@ -1601,35 +1738,81 @@ static int cs42l43_mic_ev(struct snd_soc_dapm_widget *w,
unsigned int *val;
int ret;
switch (w->shift) {
case CS42L43_ADC1_EN_SHIFT:
case CS42L43_PDM1_DIN_L_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
ramp = CS42L43_DECIM1_VD_RAMP_MASK;
mute = CS42L43_DECIM1_MUTE_MASK;
val = &priv->decim_cache[0];
break;
case CS42L43_ADC2_EN_SHIFT:
case CS42L43_PDM1_DIN_R_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
ramp = CS42L43_DECIM2_VD_RAMP_MASK;
mute = CS42L43_DECIM2_MUTE_MASK;
val = &priv->decim_cache[1];
break;
case CS42L43_PDM2_DIN_L_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
ramp = CS42L43_DECIM3_VD_RAMP_MASK;
mute = CS42L43_DECIM3_MUTE_MASK;
val = &priv->decim_cache[2];
break;
case CS42L43_PDM2_DIN_R_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
ramp = CS42L43_DECIM4_VD_RAMP_MASK;
mute = CS42L43_DECIM4_MUTE_MASK;
val = &priv->decim_cache[3];
break;
default:
dev_err(priv->dev, "Invalid microphone shift: %d\n", w->shift);
if (cs42l43->variant_id == CS42L43_DEVID_VAL) {
switch (w->shift) {
case CS42L43_ADC1_EN_SHIFT:
case CS42L43_PDM1_DIN_L_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
ramp = CS42L43_DECIM1_VD_RAMP_MASK;
mute = CS42L43_DECIM1_MUTE_MASK;
val = &priv->decim_cache[0];
break;
case CS42L43_ADC2_EN_SHIFT:
case CS42L43_PDM1_DIN_R_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
ramp = CS42L43_DECIM2_VD_RAMP_MASK;
mute = CS42L43_DECIM2_MUTE_MASK;
val = &priv->decim_cache[1];
break;
case CS42L43_PDM2_DIN_L_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
ramp = CS42L43_DECIM3_VD_RAMP_MASK;
mute = CS42L43_DECIM3_MUTE_MASK;
val = &priv->decim_cache[2];
break;
case CS42L43_PDM2_DIN_R_EN_SHIFT:
reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
ramp = CS42L43_DECIM4_VD_RAMP_MASK;
mute = CS42L43_DECIM4_MUTE_MASK;
val = &priv->decim_cache[3];
break;
default:
dev_err(priv->dev, "Invalid microphone shift: %d\n", w->shift);
return -EINVAL;
}
} else if (cs42l43->variant_id == CS42L43B_DEVID_VAL) {
switch (w->shift) {
case CS42L43_ADC1_EN_SHIFT:
reg = CS42L43B_DECIM_VOL_CTRL_CH1_CH2;
ramp = CS42L43_DECIM1_VD_RAMP_MASK;
mute = CS42L43_DECIM1_MUTE_MASK;
val = &priv->decim_cache[0];
break;
case CS42L43_ADC2_EN_SHIFT:
reg = CS42L43B_DECIM_VOL_CTRL_CH1_CH2;
ramp = CS42L43_DECIM2_VD_RAMP_MASK;
mute = CS42L43_DECIM2_MUTE_MASK;
val = &priv->decim_cache[1];
break;
case CS42L43_PDM1_DIN_L_EN_SHIFT:
reg = CS42L43B_DECIM_VOL_CTRL_CH3_CH4;
ramp = CS42L43_DECIM3_VD_RAMP_MASK;
mute = CS42L43_DECIM3_MUTE_MASK;
val = &priv->decim_cache[2];
break;
case CS42L43_PDM1_DIN_R_EN_SHIFT:
reg = CS42L43B_DECIM_VOL_CTRL_CH3_CH4;
ramp = CS42L43_DECIM4_VD_RAMP_MASK;
mute = CS42L43_DECIM4_MUTE_MASK;
val = &priv->decim_cache[3];
break;
case CS42L43_PDM2_DIN_L_EN_SHIFT:
reg = CS42L43B_DECIM_VOL_CTRL_CH5_CH6;
ramp = CS42L43B_DECIM5_PATH1_VOL_FALL_RATE_MASK;
mute = CS42L43B_DECIM5_MUTE_MASK;
val = &priv->decim_cache[4];
break;
case CS42L43_PDM2_DIN_R_EN_SHIFT:
reg = CS42L43B_DECIM_VOL_CTRL_CH5_CH6;
ramp = CS42L43B_DECIM6_PATH1_VOL_FALL_RATE_MASK;
mute = CS42L43B_DECIM6_MUTE_MASK;
val = &priv->decim_cache[5];
break;
default:
dev_err(priv->dev, "Invalid microphone shift: %d\n", w->shift);
return -EINVAL;
}
} else {
return -EINVAL;
}
@ -1722,11 +1905,6 @@ static const struct snd_soc_dapm_widget cs42l43_widgets[] = {
0, NULL, 0, cs42l43_mic_ev,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_MUX("Decimator 1 Mode", SND_SOC_NOPM, 0, 0,
&cs42l43_dec_mode_ctl[0]),
SND_SOC_DAPM_MUX("Decimator 2 Mode", SND_SOC_NOPM, 0, 0,
&cs42l43_dec_mode_ctl[1]),
SND_SOC_DAPM_PGA("Decimator 1", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_PGA("Decimator 2", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_PGA("Decimator 3", SND_SOC_NOPM, 0, 0, NULL, 0),
@ -1871,53 +2049,6 @@ static const struct snd_soc_dapm_widget cs42l43_widgets[] = {
SND_SOC_DAPM_SUPPLY("Mixer Core", CS42L43_BLOCK_EN6, CS42L43_MIXER_EN_SHIFT,
0, NULL, 0),
CS42L43_DAPM_MUX("ASPTX1", asptx1),
CS42L43_DAPM_MUX("ASPTX2", asptx2),
CS42L43_DAPM_MUX("ASPTX3", asptx3),
CS42L43_DAPM_MUX("ASPTX4", asptx4),
CS42L43_DAPM_MUX("ASPTX5", asptx5),
CS42L43_DAPM_MUX("ASPTX6", asptx6),
CS42L43_DAPM_MUX("DP1TX1", dp1tx1),
CS42L43_DAPM_MUX("DP1TX2", dp1tx2),
CS42L43_DAPM_MUX("DP1TX3", dp1tx3),
CS42L43_DAPM_MUX("DP1TX4", dp1tx4),
CS42L43_DAPM_MUX("DP2TX1", dp2tx1),
CS42L43_DAPM_MUX("DP2TX2", dp2tx2),
CS42L43_DAPM_MUX("DP3TX1", dp3tx1),
CS42L43_DAPM_MUX("DP3TX2", dp3tx2),
CS42L43_DAPM_MUX("DP4TX1", dp4tx1),
CS42L43_DAPM_MUX("DP4TX2", dp4tx2),
CS42L43_DAPM_MUX("ASRC INT1", asrcint1),
CS42L43_DAPM_MUX("ASRC INT2", asrcint2),
CS42L43_DAPM_MUX("ASRC INT3", asrcint3),
CS42L43_DAPM_MUX("ASRC INT4", asrcint4),
CS42L43_DAPM_MUX("ASRC DEC1", asrcdec1),
CS42L43_DAPM_MUX("ASRC DEC2", asrcdec2),
CS42L43_DAPM_MUX("ASRC DEC3", asrcdec3),
CS42L43_DAPM_MUX("ASRC DEC4", asrcdec4),
CS42L43_DAPM_MUX("ISRC1INT1", isrc1int1),
CS42L43_DAPM_MUX("ISRC1INT2", isrc1int2),
CS42L43_DAPM_MUX("ISRC1DEC1", isrc1dec1),
CS42L43_DAPM_MUX("ISRC1DEC2", isrc1dec2),
CS42L43_DAPM_MUX("ISRC2INT1", isrc2int1),
CS42L43_DAPM_MUX("ISRC2INT2", isrc2int2),
CS42L43_DAPM_MUX("ISRC2DEC1", isrc2dec1),
CS42L43_DAPM_MUX("ISRC2DEC2", isrc2dec2),
CS42L43_DAPM_MUX("SPDIF1", spdif1),
CS42L43_DAPM_MUX("SPDIF2", spdif2),
CS42L43_DAPM_MIXER("EQ1", eq1),
CS42L43_DAPM_MIXER("EQ2", eq2),
CS42L43_DAPM_MIXER("Speaker L", amp1),
CS42L43_DAPM_MIXER("Speaker R", amp2),
CS42L43_DAPM_MIXER("Headphone L", amp3),
CS42L43_DAPM_MIXER("Headphone R", amp4),
};
static const struct snd_soc_dapm_route cs42l43_routes[] = {
@ -1963,16 +2094,6 @@ static const struct snd_soc_dapm_route cs42l43_routes[] = {
{ "PDM2L", NULL, "PDM2_DIN" },
{ "PDM2R", NULL, "PDM2_DIN" },
{ "Decimator 1 Mode", "PDM", "PDM1L" },
{ "Decimator 1 Mode", "ADC", "ADC1" },
{ "Decimator 2 Mode", "PDM", "PDM1R" },
{ "Decimator 2 Mode", "ADC", "ADC2" },
{ "Decimator 1", NULL, "Decimator 1 Mode" },
{ "Decimator 2", NULL, "Decimator 2 Mode" },
{ "Decimator 3", NULL, "PDM2L" },
{ "Decimator 4", NULL, "PDM2R" },
{ "ASP Capture", NULL, "ASPTX1" },
{ "ASP Capture", NULL, "ASPTX2" },
{ "ASP Capture", NULL, "ASPTX3" },
@ -2060,6 +2181,261 @@ static const struct snd_soc_dapm_route cs42l43_routes[] = {
{ "ASRC_DEC4", NULL, "ASRC_DEC" },
{ "EQ", NULL, "EQ Clock" },
};
static const struct snd_kcontrol_new cs42l43_a_controls[] = {
SOC_ENUM_EXT("Decimator 1 Ramp Up", cs42l43_dec1_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 1 Ramp Down", cs42l43_dec1_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 2 Ramp Up", cs42l43_dec2_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 2 Ramp Down", cs42l43_dec2_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 3 Ramp Up", cs42l43_dec3_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 3 Ramp Down", cs42l43_dec3_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 4 Ramp Up", cs42l43_dec4_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 4 Ramp Down", cs42l43_dec4_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_SINGLE_TLV("Decimator 1 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 1 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 2 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 2 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 3 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 3 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 4 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 4 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
};
static const struct snd_kcontrol_new cs42l43_b_controls[] = {
SOC_SINGLE_TLV("Decimator 1 Volume", CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 1 Switch", CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM1_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 2 Volume", CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 2 Switch", CS42L43B_DECIM_VOL_CTRL_CH1_CH2,
CS42L43_DECIM2_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 3 Volume", CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 3 Switch", CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM3_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 4 Volume", CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 4 Switch", CS42L43B_DECIM_VOL_CTRL_CH3_CH4,
CS42L43_DECIM4_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 5 Volume", CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM5_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 5 Switch", CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM5_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_SINGLE_TLV("Decimator 6 Volume", CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM6_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
SOC_SINGLE_EXT("Decimator 6 Switch", CS42L43B_DECIM_VOL_CTRL_CH5_CH6,
CS42L43B_DECIM6_MUTE_SHIFT, 1, 1,
cs42l43_decim_get, cs42l43_dapm_put_volsw),
SOC_ENUM_EXT("Decimator 1 Ramp Up", cs42l43b_dec1_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 1 Ramp Down", cs42l43b_dec1_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 2 Ramp Up", cs42l43b_dec2_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 2 Ramp Down", cs42l43b_dec2_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 3 Ramp Up", cs42l43b_dec3_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 3 Ramp Down", cs42l43b_dec3_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 4 Ramp Up", cs42l43b_dec4_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 4 Ramp Down", cs42l43b_dec4_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 5 Ramp Up", cs42l43b_dec5_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 5 Ramp Down", cs42l43b_dec5_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 6 Ramp Up", cs42l43b_dec6_ramp_up,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_ENUM_EXT("Decimator 6 Ramp Down", cs42l43b_dec6_ramp_down,
cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
SOC_SINGLE("Decimator 5 WNF Switch", CS42L43B_DECIM_HPF_WNF_CTRL5,
CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
SOC_SINGLE("Decimator 6 WNF Switch", CS42L43B_DECIM_HPF_WNF_CTRL6,
CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
SOC_ENUM("Decimator 5 WNF Corner Frequency", cs42l43b_dec5_wnf_corner),
SOC_ENUM("Decimator 6 WNF Corner Frequency", cs42l43b_dec6_wnf_corner),
SOC_SINGLE("Decimator 5 HPF Switch", CS42L43B_DECIM_HPF_WNF_CTRL5,
CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
SOC_SINGLE("Decimator 6 HPF Switch", CS42L43B_DECIM_HPF_WNF_CTRL6,
CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
SOC_ENUM("Decimator 5 HPF Corner Frequency", cs42l43b_dec5_hpf_corner),
SOC_ENUM("Decimator 6 HPF Corner Frequency", cs42l43b_dec6_hpf_corner),
};
static const struct snd_soc_dapm_widget cs42l43_a_widgets[] = {
SND_SOC_DAPM_MUX("Decimator 1 Mode", SND_SOC_NOPM, 0, 0,
&cs42l43_dec_mode_ctl[0]),
SND_SOC_DAPM_MUX("Decimator 2 Mode", SND_SOC_NOPM, 0, 0,
&cs42l43_dec_mode_ctl[1]),
CS42L43_DAPM_MUX("ASPTX1", asptx1),
CS42L43_DAPM_MUX("ASPTX2", asptx2),
CS42L43_DAPM_MUX("ASPTX3", asptx3),
CS42L43_DAPM_MUX("ASPTX4", asptx4),
CS42L43_DAPM_MUX("ASPTX5", asptx5),
CS42L43_DAPM_MUX("ASPTX6", asptx6),
CS42L43_DAPM_MUX("DP1TX1", dp1tx1),
CS42L43_DAPM_MUX("DP1TX2", dp1tx2),
CS42L43_DAPM_MUX("DP1TX3", dp1tx3),
CS42L43_DAPM_MUX("DP1TX4", dp1tx4),
CS42L43_DAPM_MUX("DP2TX1", dp2tx1),
CS42L43_DAPM_MUX("DP2TX2", dp2tx2),
CS42L43_DAPM_MUX("DP3TX1", dp3tx1),
CS42L43_DAPM_MUX("DP3TX2", dp3tx2),
CS42L43_DAPM_MUX("DP4TX1", dp4tx1),
CS42L43_DAPM_MUX("DP4TX2", dp4tx2),
CS42L43_DAPM_MUX("ASRC INT1", asrcint1),
CS42L43_DAPM_MUX("ASRC INT2", asrcint2),
CS42L43_DAPM_MUX("ASRC INT3", asrcint3),
CS42L43_DAPM_MUX("ASRC INT4", asrcint4),
CS42L43_DAPM_MUX("ASRC DEC1", asrcdec1),
CS42L43_DAPM_MUX("ASRC DEC2", asrcdec2),
CS42L43_DAPM_MUX("ASRC DEC3", asrcdec3),
CS42L43_DAPM_MUX("ASRC DEC4", asrcdec4),
CS42L43_DAPM_MUX("ISRC1INT1", isrc1int1),
CS42L43_DAPM_MUX("ISRC1INT2", isrc1int2),
CS42L43_DAPM_MUX("ISRC1DEC1", isrc1dec1),
CS42L43_DAPM_MUX("ISRC1DEC2", isrc1dec2),
CS42L43_DAPM_MUX("ISRC2INT1", isrc2int1),
CS42L43_DAPM_MUX("ISRC2INT2", isrc2int2),
CS42L43_DAPM_MUX("ISRC2DEC1", isrc2dec1),
CS42L43_DAPM_MUX("ISRC2DEC2", isrc2dec2),
CS42L43_DAPM_MUX("SPDIF1", spdif1),
CS42L43_DAPM_MUX("SPDIF2", spdif2),
CS42L43_DAPM_MIXER("EQ1", eq1),
CS42L43_DAPM_MIXER("EQ2", eq2),
CS42L43_DAPM_MIXER("Speaker L", amp1),
CS42L43_DAPM_MIXER("Speaker R", amp2),
CS42L43_DAPM_MIXER("Headphone L", amp3),
CS42L43_DAPM_MIXER("Headphone R", amp4),
};
static const struct snd_soc_dapm_widget cs42l43_b_widgets[] = {
SND_SOC_DAPM_AIF_OUT("DP3TX3", NULL, 2, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("DP3TX4", NULL, 3, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("DP4TX3", NULL, 2, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("DP4TX4", NULL, 3, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_PGA("Decimator 5", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_PGA("Decimator 6", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_PGA("ISRC1DEC3", CS42L43_ISRC1_CTRL,
CS42L43B_ISRC_DEC3_EN_SHIFT, 0, NULL, 0),
SND_SOC_DAPM_PGA("ISRC1DEC4", CS42L43_ISRC1_CTRL,
CS42L43B_ISRC_DEC4_EN_SHIFT, 0, NULL, 0),
SND_SOC_DAPM_PGA("ISRC2DEC3", CS42L43_ISRC2_CTRL,
CS42L43B_ISRC_DEC3_EN_SHIFT, 0, NULL, 0),
SND_SOC_DAPM_PGA("ISRC2DEC4", CS42L43_ISRC2_CTRL,
CS42L43B_ISRC_DEC4_EN_SHIFT, 0, NULL, 0),
CS42L43_DAPM_MUX("ASPTX1", b_asptx1),
CS42L43_DAPM_MUX("ASPTX2", b_asptx2),
CS42L43_DAPM_MUX("ASPTX3", b_asptx3),
CS42L43_DAPM_MUX("ASPTX4", b_asptx4),
CS42L43_DAPM_MUX("ASPTX5", b_asptx5),
CS42L43_DAPM_MUX("ASPTX6", b_asptx6),
CS42L43_DAPM_MUX("DP1TX1", b_dp1tx1),
CS42L43_DAPM_MUX("DP1TX2", b_dp1tx2),
CS42L43_DAPM_MUX("DP1TX3", b_dp1tx3),
CS42L43_DAPM_MUX("DP1TX4", b_dp1tx4),
CS42L43_DAPM_MUX("DP2TX1", b_dp2tx1),
CS42L43_DAPM_MUX("DP2TX2", b_dp2tx2),
CS42L43_DAPM_MUX("DP3TX1", b_dp3tx1),
CS42L43_DAPM_MUX("DP3TX2", b_dp3tx2),
CS42L43_DAPM_MUX("DP3TX3", b_dp3tx3),
CS42L43_DAPM_MUX("DP3TX4", b_dp3tx4),
CS42L43_DAPM_MUX("DP4TX1", b_dp4tx1),
CS42L43_DAPM_MUX("DP4TX2", b_dp4tx2),
CS42L43_DAPM_MUX("DP4TX3", b_dp4tx3),
CS42L43_DAPM_MUX("DP4TX4", b_dp4tx4),
CS42L43_DAPM_MUX("ASRC INT1", b_asrcint1),
CS42L43_DAPM_MUX("ASRC INT2", b_asrcint2),
CS42L43_DAPM_MUX("ASRC INT3", b_asrcint3),
CS42L43_DAPM_MUX("ASRC INT4", b_asrcint4),
CS42L43_DAPM_MUX("ASRC DEC1", b_asrcdec1),
CS42L43_DAPM_MUX("ASRC DEC2", b_asrcdec2),
CS42L43_DAPM_MUX("ASRC DEC3", b_asrcdec3),
CS42L43_DAPM_MUX("ASRC DEC4", b_asrcdec4),
CS42L43_DAPM_MUX("ISRC1INT1", b_isrc1int1),
CS42L43_DAPM_MUX("ISRC1INT2", b_isrc1int2),
CS42L43_DAPM_MUX("ISRC1DEC1", b_isrc1dec1),
CS42L43_DAPM_MUX("ISRC1DEC2", b_isrc1dec2),
CS42L43_DAPM_MUX("ISRC1DEC3", b_isrc1dec3),
CS42L43_DAPM_MUX("ISRC1DEC4", b_isrc1dec4),
CS42L43_DAPM_MUX("ISRC2INT1", b_isrc2int1),
CS42L43_DAPM_MUX("ISRC2INT2", b_isrc2int2),
CS42L43_DAPM_MUX("ISRC2DEC1", b_isrc2dec1),
CS42L43_DAPM_MUX("ISRC2DEC2", b_isrc2dec2),
CS42L43_DAPM_MUX("ISRC2DEC3", b_isrc2dec3),
CS42L43_DAPM_MUX("ISRC2DEC4", b_isrc2dec4),
CS42L43_DAPM_MUX("SPDIF1", b_spdif1),
CS42L43_DAPM_MUX("SPDIF2", b_spdif2),
CS42L43_DAPM_MIXER("EQ1", b_eq1),
CS42L43_DAPM_MIXER("EQ2", b_eq2),
CS42L43_DAPM_MIXER("Speaker L", b_amp1),
CS42L43_DAPM_MIXER("Speaker R", b_amp2),
CS42L43_DAPM_MIXER("Headphone L", b_amp3),
CS42L43_DAPM_MIXER("Headphone R", b_amp4),
};
static const struct snd_soc_dapm_route cs42l43_a_routes[] = {
{ "Decimator 1 Mode", "PDM", "PDM1L" },
{ "Decimator 1 Mode", "ADC", "ADC1" },
{ "Decimator 2 Mode", "PDM", "PDM1R" },
{ "Decimator 2 Mode", "ADC", "ADC2" },
{ "Decimator 1", NULL, "Decimator 1 Mode" },
{ "Decimator 2", NULL, "Decimator 2 Mode" },
{ "Decimator 3", NULL, "PDM2L" },
{ "Decimator 4", NULL, "PDM2R" },
CS42L43_MUX_ROUTES("ASPTX1", "ASPTX1"),
CS42L43_MUX_ROUTES("ASPTX2", "ASPTX2"),
@ -2110,6 +2486,81 @@ static const struct snd_soc_dapm_route cs42l43_routes[] = {
CS42L43_MIXER_ROUTES("Headphone R", "HP"),
};
static const struct snd_soc_dapm_route cs42l43_b_routes[] = {
{ "Decimator 1", NULL, "ADC1" },
{ "Decimator 2", NULL, "ADC2" },
{ "Decimator 3", NULL, "PDM1L" },
{ "Decimator 4", NULL, "PDM1R" },
{ "Decimator 5", NULL, "PDM2L" },
{ "Decimator 6", NULL, "PDM2R" },
{ "DP3 Capture", NULL, "DP3TX3" },
{ "DP3 Capture", NULL, "DP3TX4" },
{ "DP4 Capture", NULL, "DP4TX3" },
{ "DP4 Capture", NULL, "DP4TX4" },
{ "ISRC1DEC3", NULL, "ISRC1" },
{ "ISRC1DEC4", NULL, "ISRC1" },
{ "ISRC2DEC3", NULL, "ISRC2" },
{ "ISRC2DEC4", NULL, "ISRC2" },
CS42L43B_MUX_ROUTES("ASPTX1", "ASPTX1"),
CS42L43B_MUX_ROUTES("ASPTX2", "ASPTX2"),
CS42L43B_MUX_ROUTES("ASPTX3", "ASPTX3"),
CS42L43B_MUX_ROUTES("ASPTX4", "ASPTX4"),
CS42L43B_MUX_ROUTES("ASPTX5", "ASPTX5"),
CS42L43B_MUX_ROUTES("ASPTX6", "ASPTX6"),
CS42L43B_MUX_ROUTES("DP1TX1", "DP1TX1"),
CS42L43B_MUX_ROUTES("DP1TX2", "DP1TX2"),
CS42L43B_MUX_ROUTES("DP1TX3", "DP1TX3"),
CS42L43B_MUX_ROUTES("DP1TX4", "DP1TX4"),
CS42L43B_MUX_ROUTES("DP2TX1", "DP2TX1"),
CS42L43B_MUX_ROUTES("DP2TX2", "DP2TX2"),
CS42L43B_MUX_ROUTES("DP3TX1", "DP3TX1"),
CS42L43B_MUX_ROUTES("DP3TX2", "DP3TX2"),
CS42L43B_MUX_ROUTES("DP3TX3", "DP3TX3"),
CS42L43B_MUX_ROUTES("DP3TX4", "DP3TX4"),
CS42L43B_MUX_ROUTES("DP4TX1", "DP4TX1"),
CS42L43B_MUX_ROUTES("DP4TX2", "DP4TX2"),
CS42L43B_MUX_ROUTES("DP4TX3", "DP4TX3"),
CS42L43B_MUX_ROUTES("DP4TX4", "DP4TX4"),
CS42L43B_MUX_ROUTES("ASRC INT1", "ASRC_INT1"),
CS42L43B_MUX_ROUTES("ASRC INT2", "ASRC_INT2"),
CS42L43B_MUX_ROUTES("ASRC INT3", "ASRC_INT3"),
CS42L43B_MUX_ROUTES("ASRC INT4", "ASRC_INT4"),
CS42L43B_MUX_ROUTES("ASRC DEC1", "ASRC_DEC1"),
CS42L43B_MUX_ROUTES("ASRC DEC2", "ASRC_DEC2"),
CS42L43B_MUX_ROUTES("ASRC DEC3", "ASRC_DEC3"),
CS42L43B_MUX_ROUTES("ASRC DEC4", "ASRC_DEC4"),
CS42L43B_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
CS42L43B_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
CS42L43B_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
CS42L43B_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
CS42L43B_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"),
CS42L43B_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"),
CS42L43B_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
CS42L43B_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
CS42L43B_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
CS42L43B_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
CS42L43B_MUX_ROUTES("ISRC2DEC3", "ISRC2DEC3"),
CS42L43B_MUX_ROUTES("ISRC2DEC4", "ISRC2DEC4"),
CS42L43B_MUX_ROUTES("SPDIF1", "SPDIF"),
CS42L43B_MUX_ROUTES("SPDIF2", "SPDIF"),
CS42L43B_MIXER_ROUTES("EQ1", "EQ"),
CS42L43B_MIXER_ROUTES("EQ2", "EQ"),
CS42L43B_MIXER_ROUTES("Speaker L", "AMP1"),
CS42L43B_MIXER_ROUTES("Speaker R", "AMP2"),
CS42L43B_MIXER_ROUTES("Headphone L", "HP"),
CS42L43B_MIXER_ROUTES("Headphone R", "HP"),
};
static int cs42l43_set_sysclk(struct snd_soc_component *component, int clk_id,
int src, unsigned int freq, int dir)
{
@ -2126,8 +2577,14 @@ static int cs42l43_set_sysclk(struct snd_soc_component *component, int clk_id,
static int cs42l43_component_probe(struct snd_soc_component *component)
{
struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
unsigned int num_controls, num_widgets, num_routes;
const struct snd_soc_dapm_widget *widgets;
const struct snd_kcontrol_new *controls;
const struct snd_soc_dapm_route *routes;
struct cs42l43 *cs42l43 = priv->core;
int ret;
snd_soc_component_init_regmap(component, cs42l43->regmap);
@ -2139,6 +2596,39 @@ static int cs42l43_component_probe(struct snd_soc_component *component)
priv->component = component;
priv->constraint = cs42l43_constraint;
switch (cs42l43->variant_id) {
case CS42L43_DEVID_VAL:
controls = cs42l43_a_controls;
num_controls = ARRAY_SIZE(cs42l43_a_controls);
widgets = cs42l43_a_widgets;
num_widgets = ARRAY_SIZE(cs42l43_a_widgets);
routes = cs42l43_a_routes;
num_routes = ARRAY_SIZE(cs42l43_a_routes);
break;
case CS42L43B_DEVID_VAL:
controls = cs42l43_b_controls;
num_controls = ARRAY_SIZE(cs42l43_b_controls);
widgets = cs42l43_b_widgets;
num_widgets = ARRAY_SIZE(cs42l43_b_widgets);
routes = cs42l43_b_routes;
num_routes = ARRAY_SIZE(cs42l43_b_routes);
break;
default:
return -EINVAL;
}
ret = snd_soc_add_component_controls(component, controls, num_controls);
if (ret)
return ret;
ret = snd_soc_dapm_new_controls(dapm, widgets, num_widgets);
if (ret)
return ret;
ret = snd_soc_dapm_add_routes(dapm, routes, num_routes);
if (ret)
return ret;
return 0;
}

View File

@ -61,7 +61,7 @@ struct cs42l43_codec {
unsigned int refclk_freq;
struct completion pll_ready;
unsigned int decim_cache[4];
unsigned int decim_cache[6];
unsigned int adc_ena;
unsigned int hp_ena;
@ -103,7 +103,7 @@ struct cs42l43_codec {
bool hp_ilimited;
int hp_ilimit_count;
struct snd_kcontrol *kctl[5];
struct snd_kcontrol *kctl[7];
};
#if IS_REACHABLE(CONFIG_SND_SOC_CS42L43_SDW)