Re: [PATCH v6 5/6] ASoC: codecs: wcd938x: add mux control support for hp audio mux

From: Srinivas Kandagatla
Date: Thu Apr 03 2025 - 08:20:11 EST




On 02/04/2025 10:12, Johan Hovold wrote:
On Thu, Mar 27, 2025 at 10:06:32AM +0000, Srinivas Kandagatla 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>
Tested-by: Christopher Obbard <christopher.obbard@xxxxxxxxxx>

@@ -3261,11 +3276,26 @@ static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device
return dev_err_probe(dev, wcd938x->reset_gpio,
"Failed to get reset gpio\n");
- wcd938x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro",
- GPIOD_OUT_LOW);
- if (IS_ERR(wcd938x->us_euro_gpio))
- return dev_err_probe(dev, PTR_ERR(wcd938x->us_euro_gpio),
- "us-euro swap Control GPIO not found\n");
+ wcd938x->us_euro_mux = devm_mux_control_get(dev, NULL);

Thanks Johan,
Running with this patch on the CRD I noticed that this now prints an
error as there is no optional mux (or gpio) defined:

wcd938x_codec audio-codec: /audio-codec: failed to get mux-control (0)

This is not from codec driver, mux control is throwing up this.


You need to suppress that error in mux_get() to allow for optional muxes
to be looked up like this.
I have a plan for this,

I proposed some changes to mux api for exclusive apis at https://lkml.org/lkml/2025/3/26/955

This should also allow us to easily add an optional api, which I plan to do once i get some feedback on this patch.

--srini


+ if (IS_ERR(wcd938x->us_euro_mux)) {
+ if (PTR_ERR(wcd938x->us_euro_mux) == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
+
+ /* mux is optional and now fallback to using gpio */
+ wcd938x->us_euro_mux = NULL;
+ wcd938x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", GPIOD_OUT_LOW);
+ if (IS_ERR(wcd938x->us_euro_gpio))
+ return dev_err_probe(dev, PTR_ERR(wcd938x->us_euro_gpio),
+ "us-euro swap Control GPIO not found\n");
+ } else {
+ ret = mux_control_try_select(wcd938x->us_euro_mux, wcd938x->mux_state);
+ if (ret) {
+ dev_err(dev, "Error (%d) Unable to select us/euro mux state\n", ret);
+ wcd938x->mux_setup_done = false;
+ return ret;
+ }
+ wcd938x->mux_setup_done = true;
+ }

Johan