ASoC: mediatek: mt6358: Add "Dmic Mode Switch" kcontrol for switch DMIC mode.
There are two hardware connection methods for DMICs on the MT6358. In cases where more than two DMICs are used, we need to time-multiplex these DMICs. Therefore, we need to dynamically switch the modes of these DMICs based on the actual usage scenarios. ---- DMIC1 AU_VIN0 --- ---- DMIC2 AU_VIN2 --- ----DMIC3 When we want to use DMIC1/2, configure it to one-wire mode. When we want to use DMIC1/3, configure it to two-wire mode. Signed-off-by: Jiaxin Yu <jiaxin.yu@mediatek.com> Link: https://patch.msgid.link/20240613020725.27874-1-jiaxin.yu@mediatek.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
2604faa7b7
commit
4ae814dabc
@ -96,7 +96,7 @@ struct mt6358_priv {
|
||||
|
||||
int wov_enabled;
|
||||
|
||||
unsigned int dmic_one_wire_mode;
|
||||
int dmic_one_wire_mode;
|
||||
};
|
||||
|
||||
int mt6358_set_mtkaif_protocol(struct snd_soc_component *cmpnt,
|
||||
@ -577,6 +577,39 @@ static int mt6358_put_wov(struct snd_kcontrol *kcontrol,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt6358_dmic_mode_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol);
|
||||
struct mt6358_priv *priv = snd_soc_component_get_drvdata(c);
|
||||
|
||||
ucontrol->value.integer.value[0] = priv->dmic_one_wire_mode;
|
||||
dev_dbg(priv->dev, "%s() dmic_mode = %d", __func__, priv->dmic_one_wire_mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt6358_dmic_mode_set(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol);
|
||||
struct mt6358_priv *priv = snd_soc_component_get_drvdata(c);
|
||||
int enabled = ucontrol->value.integer.value[0];
|
||||
|
||||
if (enabled < 0 || enabled > 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (priv->dmic_one_wire_mode != enabled) {
|
||||
priv->dmic_one_wire_mode = enabled;
|
||||
dev_dbg(priv->dev, "%s() dmic_mode = %d", __func__, priv->dmic_one_wire_mode);
|
||||
|
||||
return 1;
|
||||
}
|
||||
dev_dbg(priv->dev, "%s() dmic_mode = %d", __func__, priv->dmic_one_wire_mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(pga_tlv, 0, 600, 0);
|
||||
|
||||
@ -599,6 +632,9 @@ static const struct snd_kcontrol_new mt6358_snd_controls[] = {
|
||||
|
||||
SOC_SINGLE_BOOL_EXT("Wake-on-Voice Phase2 Switch", 0,
|
||||
mt6358_get_wov, mt6358_put_wov),
|
||||
|
||||
SOC_SINGLE_BOOL_EXT("Dmic Mode Switch", 0,
|
||||
mt6358_dmic_mode_get, mt6358_dmic_mode_set),
|
||||
};
|
||||
|
||||
/* MUX */
|
||||
|
Loading…
x
Reference in New Issue
Block a user