On Thu, Mar 20, 2025 at 11:56:32AM +0000, srinivas.kandagatla@xxxxxxxxxx wrote: > From: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx> > > On some platforms to minimise pop and click during switching between > CTIA and OMTP headset an additional HiFi mux is used. Most common > case is that this switch is switched on by default, but on some > platforms this needs a regulator enable. > > move to using mux control to enable both regulator and handle gpios, > deprecate the usage of gpio. > > Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx> > --- > sound/soc/codecs/Kconfig | 2 ++ > sound/soc/codecs/wcd938x.c | 38 ++++++++++++++++++++++++++++++-------- > 2 files changed, 32 insertions(+), 8 deletions(-) > > diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig > index ee35f3aa5521..b04076282c8b 100644 > --- a/sound/soc/codecs/Kconfig > +++ b/sound/soc/codecs/Kconfig > @@ -2226,6 +2226,8 @@ config SND_SOC_WCD938X > tristate > depends on SOUNDWIRE || !SOUNDWIRE > select SND_SOC_WCD_CLASSH > + select MULTIPLEXER > + imply MUX_GPIO Why? This is true for a particular platform, isn't it? > > config SND_SOC_WCD938X_SDW > tristate "WCD9380/WCD9385 Codec - SDW" > diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c > index f2a4f3262bdb..b7a235eef6ba 100644 > --- a/sound/soc/codecs/wcd938x.c > +++ b/sound/soc/codecs/wcd938x.c > @@ -19,6 +19,7 @@ > #include <linux/regmap.h> > #include <sound/soc.h> > #include <sound/soc-dapm.h> > +#include <linux/mux/consumer.h> > #include <linux/regulator/consumer.h> > > #include "wcd-clsh-v2.h" > @@ -178,6 +179,8 @@ struct wcd938x_priv { > int variant; > int reset_gpio; > struct gpio_desc *us_euro_gpio; > + struct mux_control *us_euro_mux; > + u32 mux_state; > u32 micb1_mv; > u32 micb2_mv; > u32 micb3_mv; > @@ -3243,9 +3246,16 @@ static bool wcd938x_swap_gnd_mic(struct snd_soc_component *component, bool activ > > wcd938x = snd_soc_component_get_drvdata(component); > > - value = gpiod_get_value(wcd938x->us_euro_gpio); > + if (!wcd938x->us_euro_mux) { > + value = gpiod_get_value(wcd938x->us_euro_gpio); > > - gpiod_set_value(wcd938x->us_euro_gpio, !value); > + gpiod_set_value(wcd938x->us_euro_gpio, !value); This looks like a separate topic, but why is 'active' being ignored? > + } else { > + mux_control_deselect(wcd938x->us_euro_mux); > + wcd938x->mux_state = !wcd938x->mux_state; > + if (mux_control_select(wcd938x->us_euro_mux, wcd938x->mux_state)) Can't it just be 'mux_control_select(wcd938x->us_euro_mux, active)' ? > + dev_err(component->dev, "Unable to select us/euro mux state\n"); > + } > > return true; > } -- With best wishes Dmitry