Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: codecs: wcd: add common helper for wcd codecs

All the Qualcomm WCD codecs have most of its code duplicated across all
these 3/4 drivers. This is an attempt to remove those duplicate
parts by adding a common helper library for these codecs.

To start with move all the micbias parsing and voltage settings these
are identical in WCD934x, WCD937x, WCD938x and WCD939x codec driver.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Link: https://patch.msgid.link/20250909121954.225833-8-srinivas.kandagatla@oss.qualcomm.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Srinivas Kandagatla and committed by
Mark Brown
4f16b635 45a3295a

+182 -265
+7
sound/soc/codecs/Kconfig
··· 2233 2233 config SND_SOC_WCD_CLASSH 2234 2234 tristate 2235 2235 2236 + config SND_SOC_WCD_COMMON 2237 + tristate 2238 + 2236 2239 config SND_SOC_WCD9335 2237 2240 tristate "WCD9335 Codec" 2238 2241 depends on SLIMBUS ··· 2257 2254 select REGMAP_IRQ 2258 2255 select REGMAP_SLIMBUS 2259 2256 select SND_SOC_WCD_CLASSH 2257 + select SND_SOC_WCD_COMMON 2260 2258 select SND_SOC_WCD_MBHC 2261 2259 depends on MFD_WCD934X || COMPILE_TEST 2262 2260 help ··· 2269 2265 tristate 2270 2266 depends on SOUNDWIRE || !SOUNDWIRE 2271 2267 select SND_SOC_WCD_CLASSH 2268 + select SND_SOC_WCD_COMMON 2272 2269 2273 2270 config SND_SOC_WCD937X_SDW 2274 2271 tristate "WCD9370/WCD9375 Codec - SDW" ··· 2289 2284 tristate 2290 2285 depends on SOUNDWIRE || !SOUNDWIRE 2291 2286 select SND_SOC_WCD_CLASSH 2287 + select SND_SOC_WCD_COMMON 2292 2288 select MULTIPLEXER 2293 2289 2294 2290 config SND_SOC_WCD938X_SDW ··· 2309 2303 depends on SOUNDWIRE || !SOUNDWIRE 2310 2304 depends on TYPEC || !TYPEC 2311 2305 select SND_SOC_WCD_CLASSH 2306 + select SND_SOC_WCD_COMMON 2312 2307 2313 2308 config SND_SOC_WCD939X_SDW 2314 2309 tristate "WCD9390/WCD9395 Codec - SDW"
+2
sound/soc/codecs/Makefile
··· 339 339 snd-soc-uda1342-y := uda1342.o 340 340 snd-soc-uda1380-y := uda1380.o 341 341 snd-soc-wcd-classh-y := wcd-clsh-v2.o 342 + snd-soc-wcd-common-y := wcd-common.o 342 343 snd-soc-wcd-mbhc-y := wcd-mbhc-v2.o 343 344 snd-soc-wcd9335-y := wcd9335.o 344 345 snd-soc-wcd934x-y := wcd934x.o ··· 762 761 obj-$(CONFIG_SND_SOC_UDA1342) += snd-soc-uda1342.o 763 762 obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o 764 763 obj-$(CONFIG_SND_SOC_WCD_CLASSH) += snd-soc-wcd-classh.o 764 + obj-$(CONFIG_SND_SOC_WCD_COMMON) += snd-soc-wcd-common.o 765 765 obj-$(CONFIG_SND_SOC_WCD_MBHC) += snd-soc-wcd-mbhc.o 766 766 obj-$(CONFIG_SND_SOC_WCD9335) += snd-soc-wcd9335.o 767 767 obj-$(CONFIG_SND_SOC_WCD934X) += snd-soc-wcd934x.o
+70
sound/soc/codecs/wcd-common.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + // Copyright (c) 2025, Qualcomm Technologies, Inc. and/or its subsidiaries. 3 + 4 + #include <linux/export.h> 5 + #include <linux/module.h> 6 + #include <linux/init.h> 7 + #include <linux/device.h> 8 + #include <linux/of.h> 9 + #include <linux/printk.h> 10 + 11 + #include "wcd-common.h" 12 + 13 + #define WCD_MIN_MICBIAS_MV 1000 14 + #define WCD_DEF_MICBIAS_MV 1800 15 + #define WCD_MAX_MICBIAS_MV 2850 16 + 17 + int wcd_get_micb_vout_ctl_val(struct device *dev, u32 micb_mv) 18 + { 19 + /* min micbias voltage is 1V and maximum is 2.85V */ 20 + if (micb_mv < WCD_MIN_MICBIAS_MV || micb_mv > WCD_MAX_MICBIAS_MV) { 21 + dev_err(dev, "Unsupported micbias voltage (%u mV)\n", micb_mv); 22 + return -EINVAL; 23 + } 24 + 25 + return (micb_mv - WCD_MIN_MICBIAS_MV) / 50; 26 + } 27 + EXPORT_SYMBOL_GPL(wcd_get_micb_vout_ctl_val); 28 + 29 + static int wcd_get_micbias_val(struct device *dev, int micb_num, u32 *micb_mv) 30 + { 31 + char micbias[64]; 32 + int mv; 33 + 34 + sprintf(micbias, "qcom,micbias%d-microvolt", micb_num); 35 + 36 + if (of_property_read_u32(dev->of_node, micbias, &mv)) { 37 + dev_err(dev, "%s value not found, using default\n", micbias); 38 + mv = WCD_DEF_MICBIAS_MV; 39 + } else { 40 + /* convert it to milli volts */ 41 + mv = mv/1000; 42 + } 43 + if (micb_mv) 44 + *micb_mv = mv; 45 + 46 + mv = wcd_get_micb_vout_ctl_val(dev, mv); 47 + if (mv < 0) { 48 + dev_err(dev, "Unsupported %s voltage (%d mV), falling back to default (%d mV)\n", 49 + micbias, mv, WCD_DEF_MICBIAS_MV); 50 + return wcd_get_micb_vout_ctl_val(dev, WCD_DEF_MICBIAS_MV); 51 + } 52 + 53 + return mv; 54 + } 55 + 56 + int wcd_dt_parse_micbias_info(struct wcd_common *common) 57 + { 58 + int i; 59 + 60 + for (i = 0; i < common->max_bias; i++) { 61 + common->micb_vout[i] = wcd_get_micbias_val(common->dev, i + 1, &common->micb_mv[i]); 62 + if (common->micb_vout[i] < 0) 63 + return -EINVAL; 64 + } 65 + 66 + return 0; 67 + } 68 + EXPORT_SYMBOL_GPL(wcd_dt_parse_micbias_info); 69 + MODULE_DESCRIPTION("Common Qualcomm WCD Codec helpers driver"); 70 + MODULE_LICENSE("GPL");
+27
sound/soc/codecs/wcd-common.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2025, Qualcomm Technologies, Inc. and/or its subsidiaries. 4 + */ 5 + 6 + #ifndef __WCD_COMMON_H__ 7 + #define __WCD_COMMON_H__ 8 + 9 + struct device; 10 + struct sdw_slave; 11 + struct sdw_bus_params; 12 + struct irq_domain; 13 + enum sdw_slave_status; 14 + 15 + #define WCD_MAX_MICBIAS 4 16 + 17 + struct wcd_common { 18 + struct device *dev; 19 + int max_bias; 20 + u32 micb_mv[WCD_MAX_MICBIAS]; 21 + u32 micb_vout[WCD_MAX_MICBIAS]; 22 + }; 23 + 24 + int wcd_get_micb_vout_ctl_val(struct device *dev, u32 micb_mv); 25 + int wcd_dt_parse_micbias_info(struct wcd_common *common); 26 + 27 + #endif /* __WCD_COMMON_H__ */
+23 -59
sound/soc/codecs/wcd934x.c
··· 21 21 #include <sound/soc-dapm.h> 22 22 #include <sound/tlv.h> 23 23 #include "wcd-clsh-v2.h" 24 + #include "wcd-common.h" 24 25 #include "wcd-mbhc-v2.h" 25 26 26 27 #include <dt-bindings/sound/qcom,wcd934x.h> ··· 116 115 #define WCD934X_DEC_PWR_LVL_HP 0x04 117 116 #define WCD934X_DEC_PWR_LVL_DF 0x00 118 117 #define WCD934X_DEC_PWR_LVL_HYBRID WCD934X_DEC_PWR_LVL_DF 119 - 120 - #define WCD934X_DEF_MICBIAS_MV 1800 121 - #define WCD934X_MAX_MICBIAS_MV 2850 122 118 123 119 #define WCD_IIR_FILTER_SIZE (sizeof(u32) * BAND_MAX) 124 120 ··· 528 530 struct slim_device *sdev; 529 531 struct slim_device *sidev; 530 532 struct wcd_clsh_ctrl *clsh_ctrl; 533 + struct wcd_common common; 531 534 struct snd_soc_component *component; 532 535 struct wcd934x_slim_ch rx_chs[WCD934X_RX_MAX]; 533 536 struct wcd934x_slim_ch tx_chs[WCD934X_TX_MAX]; ··· 554 555 struct mutex micb_lock; 555 556 u32 micb_ref[WCD934X_MAX_MICBIAS]; 556 557 u32 pullup_ref[WCD934X_MAX_MICBIAS]; 557 - u32 micb2_mv; 558 558 }; 559 559 560 560 #define to_wcd934x_codec(_hw) container_of(_hw, struct wcd934x_codec, hw) ··· 2166 2168 return NULL; 2167 2169 } 2168 2170 2169 - static int wcd934x_get_micbias_val(struct device *dev, const char *micbias, 2170 - u32 *micb_mv) 2171 - { 2172 - int mv; 2173 - 2174 - if (of_property_read_u32(dev->parent->of_node, micbias, &mv)) { 2175 - dev_err(dev, "%s value not found, using default\n", micbias); 2176 - mv = WCD934X_DEF_MICBIAS_MV; 2177 - } else { 2178 - /* convert it to milli volts */ 2179 - mv = mv/1000; 2180 - } 2181 - 2182 - if (mv < 1000 || mv > 2850) { 2183 - dev_err(dev, "%s value not in valid range, using default\n", 2184 - micbias); 2185 - mv = WCD934X_DEF_MICBIAS_MV; 2186 - } 2187 - 2188 - if (micb_mv) 2189 - *micb_mv = mv; 2190 - 2191 - return (mv - 1000) / 50; 2192 - } 2193 - 2194 2171 static int wcd934x_init_dmic(struct snd_soc_component *comp) 2195 2172 { 2196 - int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; 2197 2173 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); 2198 2174 u32 def_dmic_rate, dmic_clk_drv; 2175 + int ret; 2199 2176 2200 - vout_ctl_1 = wcd934x_get_micbias_val(comp->dev, 2201 - "qcom,micbias1-microvolt", NULL); 2202 - vout_ctl_2 = wcd934x_get_micbias_val(comp->dev, 2203 - "qcom,micbias2-microvolt", 2204 - &wcd->micb2_mv); 2205 - vout_ctl_3 = wcd934x_get_micbias_val(comp->dev, 2206 - "qcom,micbias3-microvolt", NULL); 2207 - vout_ctl_4 = wcd934x_get_micbias_val(comp->dev, 2208 - "qcom,micbias4-microvolt", NULL); 2177 + ret = wcd_dt_parse_mbhc_data(comp->dev, &wcd->mbhc_cfg); 2178 + if (ret) 2179 + return ret; 2209 2180 2210 2181 snd_soc_component_update_bits(comp, WCD934X_ANA_MICB1, 2211 - WCD934X_MICB_VAL_MASK, vout_ctl_1); 2182 + WCD934X_MICB_VAL_MASK, wcd->common.micb_vout[0]); 2212 2183 snd_soc_component_update_bits(comp, WCD934X_ANA_MICB2, 2213 - WCD934X_MICB_VAL_MASK, vout_ctl_2); 2184 + WCD934X_MICB_VAL_MASK, wcd->common.micb_vout[1]); 2214 2185 snd_soc_component_update_bits(comp, WCD934X_ANA_MICB3, 2215 - WCD934X_MICB_VAL_MASK, vout_ctl_3); 2186 + WCD934X_MICB_VAL_MASK, wcd->common.micb_vout[2]); 2216 2187 snd_soc_component_update_bits(comp, WCD934X_ANA_MICB4, 2217 - WCD934X_MICB_VAL_MASK, vout_ctl_4); 2188 + WCD934X_MICB_VAL_MASK, wcd->common.micb_vout[3]); 2218 2189 2219 2190 if (wcd->rate == WCD934X_MCLK_CLK_9P6MHZ) 2220 2191 def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ; ··· 2484 2517 } 2485 2518 } 2486 2519 2487 - static int wcd934x_get_micb_vout_ctl_val(u32 micb_mv) 2488 - { 2489 - /* min micbias voltage is 1V and maximum is 2.85V */ 2490 - if (micb_mv < 1000 || micb_mv > 2850) 2491 - return -EINVAL; 2492 - 2493 - return (micb_mv - 1000) / 50; 2494 - } 2495 - 2496 2520 static int wcd934x_mbhc_micb_adjust_voltage(struct snd_soc_component *component, 2497 2521 int req_volt, int micb_num) 2498 2522 { ··· 2520 2562 cur_vout_ctl = snd_soc_component_read_field(component, micb_reg, 2521 2563 WCD934X_MICB_VAL_MASK); 2522 2564 2523 - req_vout_ctl = wcd934x_get_micb_vout_ctl_val(req_volt); 2565 + req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt); 2524 2566 if (req_vout_ctl < 0) { 2525 2567 ret = -EINVAL; 2526 2568 goto exit; ··· 2568 2610 * voltage needed to detect threshold microphone, then do 2569 2611 * not change the micbias, just return. 2570 2612 */ 2571 - if (wcd934x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) 2613 + if (wcd934x->common.micb_mv[1] >= WCD_MBHC_THR_HS_MICB_MV) 2572 2614 return 0; 2573 2615 2574 - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd934x->micb2_mv; 2616 + micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd934x->common.micb_mv[1]; 2575 2617 2576 2618 rc = wcd934x_mbhc_micb_adjust_voltage(component, micb_mv, MIC_BIAS_2); 2577 2619 ··· 2994 3036 static int wcd934x_comp_probe(struct snd_soc_component *component) 2995 3037 { 2996 3038 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); 2997 - int i; 3039 + int i, ret; 2998 3040 2999 3041 snd_soc_component_init_regmap(component, wcd->regmap); 3000 3042 wcd->component = component; ··· 3012 3054 for (i = 0; i < NUM_CODEC_DAIS; i++) 3013 3055 INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list); 3014 3056 3015 - wcd934x_init_dmic(component); 3057 + 3058 + ret = wcd934x_init_dmic(component); 3059 + if (ret) { 3060 + dev_err(component->dev, "Failed to Initialize micbias\n"); 3061 + return ret; 3062 + } 3016 3063 3017 3064 if (wcd934x_mbhc_init(component)) 3018 3065 dev_err(component->dev, "Failed to Initialize MBHC\n"); ··· 5823 5860 cfg->anc_micbias = MIC_BIAS_2; 5824 5861 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; 5825 5862 cfg->num_btn = WCD934X_MBHC_MAX_BUTTONS; 5826 - cfg->micb_mv = wcd->micb2_mv; 5863 + cfg->micb_mv = wcd->common.micb_mv[1]; 5827 5864 cfg->linein_th = 5000; 5828 5865 cfg->hs_thr = 1700; 5829 5866 cfg->hph_thr = 50; 5830 5867 5831 5868 wcd_dt_parse_mbhc_data(dev, cfg); 5832 - 5833 5869 5834 5870 return 0; 5835 5871 } ··· 5850 5888 wcd->sdev = to_slim_device(data->dev); 5851 5889 mutex_init(&wcd->sysclk_mutex); 5852 5890 mutex_init(&wcd->micb_lock); 5891 + wcd->common.dev = dev->parent; 5892 + wcd->common.max_bias = 4; 5853 5893 5854 5894 ret = wcd934x_codec_parse_data(wcd); 5855 5895 if (ret)
+19 -62
sound/soc/codecs/wcd937x.c
··· 21 21 #include <sound/tlv.h> 22 22 23 23 #include "wcd-clsh-v2.h" 24 + #include "wcd-common.h" 24 25 #include "wcd-mbhc-v2.h" 25 26 #include "wcd937x.h" 26 27 ··· 86 85 struct wcd_mbhc_config mbhc_cfg; 87 86 struct wcd_mbhc_intr intr_ids; 88 87 struct wcd_clsh_ctrl *clsh_info; 88 + struct wcd_common common; 89 89 struct irq_domain *virq; 90 90 struct regmap_irq_chip_data *irq_chip; 91 91 struct snd_soc_jack *jack; ··· 95 93 s32 pullup_ref[WCD937X_MAX_MICBIAS]; 96 94 u32 hph_mode; 97 95 int ear_rx_path; 98 - u32 micb1_mv; 99 - u32 micb2_mv; 100 - u32 micb3_mv; 101 96 int hphr_pdm_wd_int; 102 97 int hphl_pdm_wd_int; 103 98 int aux_pdm_wd_int; ··· 871 872 return 0; 872 873 } 873 874 874 - static int wcd937x_get_micb_vout_ctl_val(u32 micb_mv) 875 - { 876 - if (micb_mv < 1000 || micb_mv > 2850) { 877 - pr_err("Unsupported micbias voltage (%u mV)\n", micb_mv); 878 - return -EINVAL; 879 - } 880 - 881 - return (micb_mv - 1000) / 50; 882 - } 883 875 884 876 static int wcd937x_tx_swr_ctrl(struct snd_soc_dapm_widget *w, 885 877 struct snd_kcontrol *kcontrol, int event) ··· 1471 1481 cur_vout_ctl = snd_soc_component_read_field(component, micb_reg, 1472 1482 WCD937X_MICB_VOUT_MASK); 1473 1483 1474 - req_vout_ctl = wcd937x_get_micb_vout_ctl_val(req_volt); 1484 + req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt); 1475 1485 if (req_vout_ctl < 0) { 1476 1486 ret = -EINVAL; 1477 1487 goto exit; ··· 1519 1529 * voltage needed to detect threshold microphone, then do 1520 1530 * not change the micbias, just return. 1521 1531 */ 1522 - if (wcd937x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) 1532 + if (wcd937x->common.micb_mv[2] >= WCD_MBHC_THR_HS_MICB_MV) 1523 1533 return 0; 1524 1534 1525 - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd937x->micb2_mv; 1535 + micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd937x->common.micb_mv[2]; 1526 1536 1527 1537 return wcd937x_mbhc_micb_adjust_voltage(component, micb_mv, MIC_BIAS_2); 1528 1538 } ··· 2426 2436 { "DMIC6_MIXER", "Switch", "DMIC6" }, 2427 2437 }; 2428 2438 2429 - static int wcd937x_set_micbias_data(struct wcd937x_priv *wcd937x) 2439 + static void wcd937x_set_micbias_data(struct device *dev, struct wcd937x_priv *wcd937x) 2430 2440 { 2431 - int vout_ctl[3]; 2432 - 2433 - /* Set micbias voltage */ 2434 - vout_ctl[0] = wcd937x_get_micb_vout_ctl_val(wcd937x->micb1_mv); 2435 - vout_ctl[1] = wcd937x_get_micb_vout_ctl_val(wcd937x->micb2_mv); 2436 - vout_ctl[2] = wcd937x_get_micb_vout_ctl_val(wcd937x->micb3_mv); 2437 - if ((vout_ctl[0] | vout_ctl[1] | vout_ctl[2]) < 0) 2438 - return -EINVAL; 2439 - 2440 - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB1, WCD937X_ANA_MICB_VOUT, vout_ctl[0]); 2441 - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB2, WCD937X_ANA_MICB_VOUT, vout_ctl[1]); 2442 - regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB3, WCD937X_ANA_MICB_VOUT, vout_ctl[2]); 2443 - 2444 - return 0; 2441 + regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB1, WCD937X_ANA_MICB_VOUT, 2442 + wcd937x->common.micb_vout[0]); 2443 + regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB2, WCD937X_ANA_MICB_VOUT, 2444 + wcd937x->common.micb_vout[1]); 2445 + regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB3, WCD937X_ANA_MICB_VOUT, 2446 + wcd937x->common.micb_vout[2]); 2445 2447 } 2446 2448 2447 2449 static irqreturn_t wcd937x_wd_handle_irq(int irq, void *data) ··· 2611 2629 .set_jack = wcd937x_codec_set_jack, 2612 2630 .endianness = 1, 2613 2631 }; 2614 - 2615 - static void wcd937x_dt_parse_micbias_info(struct device *dev, struct wcd937x_priv *wcd) 2616 - { 2617 - struct device_node *np = dev->of_node; 2618 - u32 prop_val = 0; 2619 - int ret = 0; 2620 - 2621 - ret = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); 2622 - if (!ret) 2623 - wcd->micb1_mv = prop_val / 1000; 2624 - else 2625 - dev_warn(dev, "Micbias1 DT property not found\n"); 2626 - 2627 - ret = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); 2628 - if (!ret) 2629 - wcd->micb2_mv = prop_val / 1000; 2630 - else 2631 - dev_warn(dev, "Micbias2 DT property not found\n"); 2632 - 2633 - ret = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); 2634 - if (!ret) 2635 - wcd->micb3_mv = prop_val / 1000; 2636 - else 2637 - dev_warn(dev, "Micbias3 DT property not found\n"); 2638 - } 2639 2632 2640 2633 static bool wcd937x_swap_gnd_mic(struct snd_soc_component *component) 2641 2634 { ··· 2805 2848 wcd937x->sdw_priv[AIF1_PB]->slave_irq = wcd937x->virq; 2806 2849 wcd937x->sdw_priv[AIF1_CAP]->slave_irq = wcd937x->virq; 2807 2850 2808 - ret = wcd937x_set_micbias_data(wcd937x); 2809 - if (ret < 0) { 2810 - dev_err(dev, "Bad micbias pdata\n"); 2811 - return ret; 2812 - } 2851 + wcd937x_set_micbias_data(dev, wcd937x); 2813 2852 2814 2853 ret = snd_soc_register_component(dev, &soc_codec_dev_wcd937x, 2815 2854 wcd937x_dais, ARRAY_SIZE(wcd937x_dais)); ··· 2873 2920 2874 2921 dev_set_drvdata(dev, wcd937x); 2875 2922 mutex_init(&wcd937x->micb_lock); 2923 + wcd937x->common.dev = dev; 2924 + wcd937x->common.max_bias = 3; 2876 2925 2877 2926 wcd937x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); 2878 2927 if (IS_ERR(wcd937x->reset_gpio)) ··· 2894 2939 if (ret) 2895 2940 return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); 2896 2941 2897 - wcd937x_dt_parse_micbias_info(dev, wcd937x); 2942 + ret = wcd_dt_parse_micbias_info(&wcd937x->common); 2943 + if (ret) 2944 + return dev_err_probe(dev, ret, "Failed to get micbias\n"); 2898 2945 2899 2946 cfg->mbhc_micbias = MIC_BIAS_2; 2900 2947 cfg->anc_micbias = MIC_BIAS_2; 2901 2948 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; 2902 2949 cfg->num_btn = WCD937X_MBHC_MAX_BUTTONS; 2903 - cfg->micb_mv = wcd937x->micb2_mv; 2950 + cfg->micb_mv = wcd937x->common.micb_mv[2]; 2904 2951 cfg->linein_th = 5000; 2905 2952 cfg->hs_thr = 1700; 2906 2953 cfg->hph_thr = 50;
+17 -71
sound/soc/codecs/wcd938x.c
··· 22 22 #include <linux/regulator/consumer.h> 23 23 24 24 #include "wcd-clsh-v2.h" 25 + #include "wcd-common.h" 25 26 #include "wcd-mbhc-v2.h" 26 27 #include "wcd938x.h" 27 28 ··· 156 155 struct wcd_mbhc_config mbhc_cfg; 157 156 struct wcd_mbhc_intr intr_ids; 158 157 struct wcd_clsh_ctrl *clsh_info; 158 + struct wcd_common common; 159 159 struct irq_domain *virq; 160 160 struct regmap_irq_chip_data *irq_chip; 161 161 struct snd_soc_jack *jack; ··· 171 169 struct gpio_desc *us_euro_gpio; 172 170 struct mux_control *us_euro_mux; 173 171 unsigned int mux_state; 174 - u32 micb1_mv; 175 - u32 micb2_mv; 176 - u32 micb3_mv; 177 - u32 micb4_mv; 178 172 int hphr_pdm_wd_int; 179 173 int hphl_pdm_wd_int; 180 174 int aux_pdm_wd_int; ··· 1972 1974 } 1973 1975 } 1974 1976 1975 - static int wcd938x_get_micb_vout_ctl_val(u32 micb_mv) 1976 - { 1977 - /* min micbias voltage is 1V and maximum is 2.85V */ 1978 - if (micb_mv < 1000 || micb_mv > 2850) 1979 - return -EINVAL; 1980 - 1981 - return (micb_mv - 1000) / 50; 1982 - } 1983 - 1984 1977 static int wcd938x_mbhc_micb_adjust_voltage(struct snd_soc_component *component, 1985 1978 int req_volt, int micb_num) 1986 1979 { ··· 2008 2019 cur_vout_ctl = snd_soc_component_read_field(component, micb_reg, 2009 2020 WCD938X_MICB_VOUT_MASK); 2010 2021 2011 - req_vout_ctl = wcd938x_get_micb_vout_ctl_val(req_volt); 2022 + req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt); 2012 2023 if (req_vout_ctl < 0) { 2013 2024 ret = -EINVAL; 2014 2025 goto exit; ··· 2056 2067 * voltage needed to detect threshold microphone, then do 2057 2068 * not change the micbias, just return. 2058 2069 */ 2059 - if (wcd938x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) 2070 + if (wcd938x->common.micb_mv[2] >= WCD_MBHC_THR_HS_MICB_MV) 2060 2071 return 0; 2061 2072 2062 - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd938x->micb2_mv; 2073 + micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd938x->common.micb_mv[2]; 2063 2074 2064 2075 return wcd938x_mbhc_micb_adjust_voltage(component, micb_mv, MIC_BIAS_2); 2065 2076 } ··· 2964 2975 {"EAR", NULL, "EAR PGA"}, 2965 2976 }; 2966 2977 2967 - static int wcd938x_set_micbias_data(struct wcd938x_priv *wcd938x) 2978 + static void wcd938x_set_micbias_data(struct device *dev, struct wcd938x_priv *wcd938x) 2968 2979 { 2969 - int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; 2970 - 2971 - /* set micbias voltage */ 2972 - vout_ctl_1 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb1_mv); 2973 - vout_ctl_2 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb2_mv); 2974 - vout_ctl_3 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb3_mv); 2975 - vout_ctl_4 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb4_mv); 2976 - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0 || vout_ctl_4 < 0) 2977 - return -EINVAL; 2978 - 2979 2980 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, 2980 - WCD938X_MICB_VOUT_MASK, vout_ctl_1); 2981 + WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[0]); 2981 2982 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, 2982 - WCD938X_MICB_VOUT_MASK, vout_ctl_2); 2983 + WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[1]); 2983 2984 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, 2984 - WCD938X_MICB_VOUT_MASK, vout_ctl_3); 2985 + WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[2]); 2985 2986 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, 2986 - WCD938X_MICB_VOUT_MASK, vout_ctl_4); 2987 - 2988 - return 0; 2987 + WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[3]); 2989 2988 } 2990 2989 2991 2990 static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) ··· 3177 3200 .endianness = 1, 3178 3201 }; 3179 3202 3180 - static void wcd938x_dt_parse_micbias_info(struct device *dev, struct wcd938x_priv *wcd) 3181 - { 3182 - struct device_node *np = dev->of_node; 3183 - u32 prop_val = 0; 3184 - int rc = 0; 3185 - 3186 - rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); 3187 - if (!rc) 3188 - wcd->micb1_mv = prop_val/1000; 3189 - else 3190 - dev_info(dev, "%s: Micbias1 DT property not found\n", __func__); 3191 - 3192 - rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); 3193 - if (!rc) 3194 - wcd->micb2_mv = prop_val/1000; 3195 - else 3196 - dev_info(dev, "%s: Micbias2 DT property not found\n", __func__); 3197 - 3198 - rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); 3199 - if (!rc) 3200 - wcd->micb3_mv = prop_val/1000; 3201 - else 3202 - dev_info(dev, "%s: Micbias3 DT property not found\n", __func__); 3203 - 3204 - rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); 3205 - if (!rc) 3206 - wcd->micb4_mv = prop_val/1000; 3207 - else 3208 - dev_info(dev, "%s: Micbias4 DT property not found\n", __func__); 3209 - } 3210 - 3211 3203 static bool wcd938x_swap_gnd_mic(struct snd_soc_component *component) 3212 3204 { 3213 3205 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); ··· 3241 3295 if (ret) 3242 3296 return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); 3243 3297 3244 - wcd938x_dt_parse_micbias_info(dev, wcd938x); 3298 + ret = wcd_dt_parse_micbias_info(&wcd938x->common); 3299 + if (ret) 3300 + return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); 3245 3301 3246 3302 cfg->mbhc_micbias = MIC_BIAS_2; 3247 3303 cfg->anc_micbias = MIC_BIAS_2; 3248 3304 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; 3249 3305 cfg->num_btn = WCD938X_MBHC_MAX_BUTTONS; 3250 - cfg->micb_mv = wcd938x->micb2_mv; 3306 + cfg->micb_mv = wcd938x->common.micb_mv[2]; 3251 3307 cfg->linein_th = 5000; 3252 3308 cfg->hs_thr = 1700; 3253 3309 cfg->hph_thr = 50; ··· 3405 3457 wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq; 3406 3458 wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq; 3407 3459 3408 - ret = wcd938x_set_micbias_data(wcd938x); 3409 - if (ret < 0) { 3410 - dev_err(dev, "%s: bad micbias pdata\n", __func__); 3411 - goto err_remove_rx_link; 3412 - } 3460 + wcd938x_set_micbias_data(dev, wcd938x); 3413 3461 3414 3462 ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, 3415 3463 wcd938x_dais, ARRAY_SIZE(wcd938x_dais)); ··· 3494 3550 3495 3551 dev_set_drvdata(dev, wcd938x); 3496 3552 mutex_init(&wcd938x->micb_lock); 3553 + wcd938x->common.dev = dev; 3554 + wcd938x->common.max_bias = 4; 3497 3555 3498 3556 ret = wcd938x_populate_dt_data(wcd938x, dev); 3499 3557 if (ret)
+17 -73
sound/soc/codecs/wcd939x.c
··· 28 28 #include <linux/usb/typec_altmode.h> 29 29 30 30 #include "wcd-clsh-v2.h" 31 + #include "wcd-common.h" 31 32 #include "wcd-mbhc-v2.h" 32 33 #include "wcd939x.h" 33 34 ··· 192 191 struct wcd_mbhc_config mbhc_cfg; 193 192 struct wcd_mbhc_intr intr_ids; 194 193 struct wcd_clsh_ctrl *clsh_info; 194 + struct wcd_common common; 195 195 struct irq_domain *virq; 196 196 struct regmap_irq_chip_data *irq_chip; 197 197 struct snd_soc_jack *jack; ··· 203 201 u32 tx_mode[TX_ADC_MAX]; 204 202 int variant; 205 203 struct gpio_desc *reset_gpio; 206 - u32 micb1_mv; 207 - u32 micb2_mv; 208 - u32 micb3_mv; 209 - u32 micb4_mv; 210 204 int hphr_pdm_wd_int; 211 205 int hphl_pdm_wd_int; 212 206 int ear_pdm_wd_int; ··· 1917 1919 } 1918 1920 } 1919 1921 1920 - static int wcd939x_get_micb_vout_ctl_val(u32 micb_mv) 1921 - { 1922 - /* min micbias voltage is 1V and maximum is 2.85V */ 1923 - if (micb_mv < 1000 || micb_mv > 2850) { 1924 - pr_err("%s: unsupported micbias voltage\n", __func__); 1925 - return -EINVAL; 1926 - } 1927 - 1928 - return (micb_mv - 1000) / 50; 1929 - } 1930 - 1931 1922 static int wcd939x_mbhc_micb_adjust_voltage(struct snd_soc_component *component, 1932 1923 int req_volt, int micb_num) 1933 1924 { ··· 1956 1969 cur_vout_ctl = snd_soc_component_read_field(component, micb_reg, 1957 1970 WCD939X_MICB_VOUT_CTL); 1958 1971 1959 - req_vout_ctl = wcd939x_get_micb_vout_ctl_val(req_volt); 1972 + req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt); 1960 1973 if (req_vout_ctl < 0) { 1961 1974 ret = req_vout_ctl; 1962 1975 goto exit; ··· 2008 2021 * voltage needed to detect threshold microphone, then do 2009 2022 * not change the micbias, just return. 2010 2023 */ 2011 - if (wcd939x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) 2024 + if (wcd939x->common.micb_mv[1] >= WCD_MBHC_THR_HS_MICB_MV) 2012 2025 return 0; 2013 2026 2014 - micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd939x->micb2_mv; 2027 + micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd939x->common.micb_mv[1]; 2015 2028 2016 2029 return wcd939x_mbhc_micb_adjust_voltage(component, micb_mv, MIC_BIAS_2); 2017 2030 } ··· 2882 2895 {"EAR", NULL, "EAR PGA"}, 2883 2896 }; 2884 2897 2885 - static int wcd939x_set_micbias_data(struct wcd939x_priv *wcd939x) 2898 + static void wcd939x_set_micbias_data(struct device *dev, struct wcd939x_priv *wcd939x) 2886 2899 { 2887 - int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; 2888 - 2889 - /* set micbias voltage */ 2890 - vout_ctl_1 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb1_mv); 2891 - vout_ctl_2 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb2_mv); 2892 - vout_ctl_3 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb3_mv); 2893 - vout_ctl_4 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb4_mv); 2894 - if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0 || vout_ctl_4 < 0) 2895 - return -EINVAL; 2896 - 2897 2900 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB1, 2898 - WCD939X_MICB_VOUT_CTL, vout_ctl_1); 2901 + WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[0]); 2899 2902 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB2, 2900 - WCD939X_MICB_VOUT_CTL, vout_ctl_2); 2903 + WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[1]); 2901 2904 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB3, 2902 - WCD939X_MICB_VOUT_CTL, vout_ctl_3); 2905 + WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[2]); 2903 2906 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB4, 2904 - WCD939X_MICB_VOUT_CTL, vout_ctl_4); 2905 - 2906 - return 0; 2907 + WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[3]); 2907 2908 } 2908 2909 2909 2910 static irqreturn_t wcd939x_wd_handle_irq(int irq, void *data) ··· 3161 3186 } 3162 3187 #endif /* CONFIG_TYPEC */ 3163 3188 3164 - static void wcd939x_dt_parse_micbias_info(struct device *dev, struct wcd939x_priv *wcd) 3165 - { 3166 - struct device_node *np = dev->of_node; 3167 - u32 prop_val = 0; 3168 - int rc = 0; 3169 - 3170 - rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); 3171 - if (!rc) 3172 - wcd->micb1_mv = prop_val / 1000; 3173 - else 3174 - dev_info(dev, "%s: Micbias1 DT property not found\n", __func__); 3175 - 3176 - rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); 3177 - if (!rc) 3178 - wcd->micb2_mv = prop_val / 1000; 3179 - else 3180 - dev_info(dev, "%s: Micbias2 DT property not found\n", __func__); 3181 - 3182 - rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); 3183 - if (!rc) 3184 - wcd->micb3_mv = prop_val / 1000; 3185 - else 3186 - dev_info(dev, "%s: Micbias3 DT property not found\n", __func__); 3187 - 3188 - rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); 3189 - if (!rc) 3190 - wcd->micb4_mv = prop_val / 1000; 3191 - else 3192 - dev_info(dev, "%s: Micbias4 DT property not found\n", __func__); 3193 - } 3194 - 3195 3189 #if IS_ENABLED(CONFIG_TYPEC) 3196 3190 static bool wcd939x_swap_gnd_mic(struct snd_soc_component *component) 3197 3191 { ··· 3196 3252 if (ret) 3197 3253 return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); 3198 3254 3199 - wcd939x_dt_parse_micbias_info(dev, wcd939x); 3255 + ret = wcd_dt_parse_micbias_info(&wcd939x->common); 3256 + if (ret) 3257 + return dev_err_probe(dev, ret, "Failed to get micbias\n"); 3200 3258 3201 3259 cfg->mbhc_micbias = MIC_BIAS_2; 3202 3260 cfg->anc_micbias = MIC_BIAS_2; 3203 3261 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; 3204 3262 cfg->num_btn = WCD939X_MBHC_MAX_BUTTONS; 3205 - cfg->micb_mv = wcd939x->micb2_mv; 3263 + cfg->micb_mv = wcd939x->common.micb_mv[1]; 3206 3264 cfg->linein_th = 5000; 3207 3265 cfg->hs_thr = 1700; 3208 3266 cfg->hph_thr = 50; ··· 3390 3444 wcd939x->sdw_priv[AIF1_PB]->slave_irq = wcd939x->virq; 3391 3445 wcd939x->sdw_priv[AIF1_CAP]->slave_irq = wcd939x->virq; 3392 3446 3393 - ret = wcd939x_set_micbias_data(wcd939x); 3394 - if (ret < 0) { 3395 - dev_err(dev, "%s: bad micbias pdata\n", __func__); 3396 - goto err_remove_rx_link; 3397 - } 3447 + wcd939x_set_micbias_data(dev, wcd939x); 3398 3448 3399 3449 /* Check WCD9395 version */ 3400 3450 regmap_read(wcd939x->regmap, WCD939X_DIGITAL_CHIP_ID1, &id1); ··· 3555 3613 3556 3614 dev_set_drvdata(dev, wcd939x); 3557 3615 mutex_init(&wcd939x->micb_lock); 3616 + wcd939x->common.dev = dev; 3617 + wcd939x->common.max_bias = 4; 3558 3618 3559 3619 ret = wcd939x_populate_dt_data(wcd939x, dev); 3560 3620 if (ret) {