Message ID | 20231207-topic-sm8650-upstream-wcd939x-codec-v3-0-6df9585ec7c8@linaro.org |
---|---|
Headers | show |
Series | ASoC: codecs: add support for WCD939x Codec | expand |
On Thu, Dec 07, 2023 at 11:28:08AM +0100, Neil Armstrong wrote: > +static int wcd939x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *ucontrol) > +{ > + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); > + struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component); > + u32 mode_val; > + > + mode_val = ucontrol->value.enumerated.item[0]; > + > + if (wcd939x->variant == WCD9390) { > + if (mode_val == CLS_H_HIFI || mode_val == CLS_AB_HIFI) { > + dev_dbg(component->dev, "%s: Invalid HPH Mode\n", __func__); > + return -EINVAL; > + } > + } > + if (mode_val == CLS_H_NORMAL) { > + dev_dbg(component->dev, "%s: Unsupported HPH Mode\n", __func__); > + return -EINVAL; > + } > + > + wcd939x->hph_mode = mode_val; This seems strange - the code will accept any value other than a small number of specifically enumerated ones? I would have expected us to check a defined list of modes and reject anything that isn't in that list. This also means that the get() function can return out of bounds values which is buggy. Please use the mixer-test selftest on a card with this driver running, it should identify at least that issue. > + > + return 1; > +} This will also unconditionally report that the value of the mux changed, the function should return 0 if the value written is the control value hasn't changed.
On 13/12/2023 20:20, Mark Brown wrote: > On Thu, Dec 07, 2023 at 11:28:08AM +0100, Neil Armstrong wrote: > >> +static int wcd939x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, >> + struct snd_ctl_elem_value *ucontrol) >> +{ >> + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); >> + struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component); >> + u32 mode_val; >> + >> + mode_val = ucontrol->value.enumerated.item[0]; >> + >> + if (wcd939x->variant == WCD9390) { >> + if (mode_val == CLS_H_HIFI || mode_val == CLS_AB_HIFI) { >> + dev_dbg(component->dev, "%s: Invalid HPH Mode\n", __func__); >> + return -EINVAL; >> + } >> + } >> + if (mode_val == CLS_H_NORMAL) { >> + dev_dbg(component->dev, "%s: Unsupported HPH Mode\n", __func__); >> + return -EINVAL; >> + } >> + >> + wcd939x->hph_mode = mode_val; > > This seems strange - the code will accept any value other than a small > number of specifically enumerated ones? I would have expected us to > check a defined list of modes and reject anything that isn't in that > list. This also means that the get() function can return out of bounds > values which is buggy. Please use the mixer-test selftest on a card > with this driver running, it should identify at least that issue. > >> + >> + return 1; >> +} > > This will also unconditionally report that the value of the mux changed, > the function should return 0 if the value written is the control value > hasn't changed. Ack, I'll fix this, I wasn't happy anyway with the design Neil
Add the main WCD9390/WCD9395 Audio Codec driver to support: - 4 ADC inputs for up to 5 Analog Microphones - 4 DMIC inputs for up to 8 Digital Microphones - 4 Microphone BIAS - Stereo Headphone output - Mono EAR output - MBHC engine for Headset Detection This adds: - bindings - MBHC changes to support Type-C muc - Soundwire Slave driver - Code driver The USB Mux subsystem support will be submitted separalety since it's a functionally separate subsystem connected over I2C with it's own reset signal. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- Changes in v3: - Fixed W=1 and smatch warnings reported by lkp & Dan Carpenter - Fixed dependency on CONFIG_TYPEC and added guards to not build type-c related code when disabled - Collected review on second bindings patch - Link to v2: https://lore.kernel.org/r/20231201-topic-sm8650-upstream-wcd939x-codec-v2-0-94ed814b25aa@linaro.org Changes in v2: - Bindings: - Dropped all references to "Slave" or "Host" terminology when possible - Collected review for first patch - Added wcd9395 as fallback of wcd9390 - Fixes typos errors - MBHC: - Dropped all references to "Slave" or "Host" terminology when possible - Fixed EXPORT_SYMBOL into EXPORT_SYMBOL_GPL - Fixed typo in commit message - Soundwire Devices driver - Dropped all references to "Slave" or "Host" terminology when possible - Dropped comments and unused code - Reworked wcd939x_swr_get_current_bank() - Added comments to wcd9390_interrupt_callback() - Reworked regmap's wcd939x_readonly/volatile_register checks - Added comments explaining while bind/unbind are empty - Added comment on SDW_SLAVE_ENTRY meaning - Added more register fields defines - Style fixes - Codec driver - Dropped all references to "Slave" or "Host" terminology when possible - Added MICB_BIAS_ values enum and used them in the code - Moved zdet_param to the top - Added TLV data for ear_pa_gain and used it - Defined as much as possible every bit field used on/from register - Replaced 1/0 to true/false when writing to single bit fields - Replaced for loop on all bits with ffs(), simplified code - Simplified MICB fields handling code - Reworked and simplified wcd939x_get/set_compander and other kcontrol get/setters - Reworked and simplified MHGC impedance/zdet/qval code, dropped dead code - Added comments on wcd939x_wd_handle_irq() utility - Added comment on the interrupt handling architecture - I've not moved common code yet, I'll probably do later since it would alter wcd939x code - Link to v1: https://lore.kernel.org/r/20231123-topic-sm8650-upstream-wcd939x-codec-v1-0-21d4ad9276de@linaro.org --- Neil Armstrong (5): ASoC: dt-bindings: qcom,wcd938x: move out common properties ASoC: dt-bindings: document WCD939x Audio Codec ASoC: codec: wcd-mbhc-v2: add support when connected behind an USB-C audio mux ASoC: codecs: Add WCD939x Soundwire devices driver ASoC: codecs: Add WCD939x Codec driver .../devicetree/bindings/sound/qcom,wcd938x.yaml | 81 +- .../bindings/sound/qcom,wcd939x-sdw.yaml | 69 + .../devicetree/bindings/sound/qcom,wcd939x.yaml | 96 + .../bindings/sound/qcom,wcd93xx-common.yaml | 95 + sound/soc/codecs/Kconfig | 19 + sound/soc/codecs/Makefile | 7 + sound/soc/codecs/wcd-clsh-v2.h | 1 + sound/soc/codecs/wcd-mbhc-v2.c | 95 +- sound/soc/codecs/wcd-mbhc-v2.h | 3 + sound/soc/codecs/wcd939x-sdw.c | 1584 +++++++++ sound/soc/codecs/wcd939x.c | 3666 ++++++++++++++++++++ sound/soc/codecs/wcd939x.h | 983 ++++++ 12 files changed, 6604 insertions(+), 95 deletions(-) --- base-commit: 07b677953b9dca02928be323e2db853511305fa9 change-id: 20231123-topic-sm8650-upstream-wcd939x-codec-c46f621b55d4 Best regards,