2121#include <sound/soc-dapm.h>
2222#include <sound/tlv.h>
2323#include "wcd-clsh-v2.h"
24+ #include "wcd-common.h"
2425#include "wcd-mbhc-v2.h"
2526
2627#include <dt-bindings/sound/qcom,wcd934x.h>
116117#define WCD934X_DEC_PWR_LVL_DF 0x00
117118#define WCD934X_DEC_PWR_LVL_HYBRID WCD934X_DEC_PWR_LVL_DF
118119
119- #define WCD934X_DEF_MICBIAS_MV 1800
120- #define WCD934X_MAX_MICBIAS_MV 2850
121-
122120#define WCD_IIR_FILTER_SIZE (sizeof(u32) * BAND_MAX)
123121
124122#define WCD_IIR_FILTER_CTL (xname , iidx , bidx ) \
@@ -530,6 +528,7 @@ struct wcd934x_codec {
530528 struct slim_device * sdev ;
531529 struct slim_device * sidev ;
532530 struct wcd_clsh_ctrl * clsh_ctrl ;
531+ struct wcd_common common ;
533532 struct snd_soc_component * component ;
534533 struct wcd934x_slim_ch rx_chs [WCD934X_RX_MAX ];
535534 struct wcd934x_slim_ch tx_chs [WCD934X_TX_MAX ];
@@ -555,7 +554,6 @@ struct wcd934x_codec {
555554 struct mutex micb_lock ;
556555 u32 micb_ref [WCD934X_MAX_MICBIAS ];
557556 u32 pullup_ref [WCD934X_MAX_MICBIAS ];
558- u32 micb2_mv ;
559557};
560558
561559#define to_wcd934x_codec (_hw ) container_of(_hw, struct wcd934x_codec, hw)
@@ -2168,55 +2166,24 @@ static struct clk *wcd934x_register_mclk_output(struct wcd934x_codec *wcd)
21682166 return NULL ;
21692167}
21702168
2171- static int wcd934x_get_micbias_val (struct device * dev , const char * micbias ,
2172- u32 * micb_mv )
2173- {
2174- int mv ;
2175-
2176- if (of_property_read_u32 (dev -> parent -> of_node , micbias , & mv )) {
2177- dev_err (dev , "%s value not found, using default\n" , micbias );
2178- mv = WCD934X_DEF_MICBIAS_MV ;
2179- } else {
2180- /* convert it to milli volts */
2181- mv = mv /1000 ;
2182- }
2183-
2184- if (mv < 1000 || mv > 2850 ) {
2185- dev_err (dev , "%s value not in valid range, using default\n" ,
2186- micbias );
2187- mv = WCD934X_DEF_MICBIAS_MV ;
2188- }
2189-
2190- if (micb_mv )
2191- * micb_mv = mv ;
2192-
2193- return (mv - 1000 ) / 50 ;
2194- }
2195-
21962169static int wcd934x_init_dmic (struct snd_soc_component * comp )
21972170{
2198- int vout_ctl_1 , vout_ctl_2 , vout_ctl_3 , vout_ctl_4 ;
21992171 struct wcd934x_codec * wcd = dev_get_drvdata (comp -> dev );
22002172 u32 def_dmic_rate , dmic_clk_drv ;
2173+ int ret ;
22012174
2202- vout_ctl_1 = wcd934x_get_micbias_val (comp -> dev ,
2203- "qcom,micbias1-microvolt" , NULL );
2204- vout_ctl_2 = wcd934x_get_micbias_val (comp -> dev ,
2205- "qcom,micbias2-microvolt" ,
2206- & wcd -> micb2_mv );
2207- vout_ctl_3 = wcd934x_get_micbias_val (comp -> dev ,
2208- "qcom,micbias3-microvolt" , NULL );
2209- vout_ctl_4 = wcd934x_get_micbias_val (comp -> dev ,
2210- "qcom,micbias4-microvolt" , NULL );
2175+ ret = wcd_dt_parse_mbhc_data (comp -> dev , & wcd -> mbhc_cfg );
2176+ if (ret )
2177+ return ret ;
22112178
22122179 snd_soc_component_update_bits (comp , WCD934X_ANA_MICB1 ,
2213- WCD934X_MICB_VAL_MASK , vout_ctl_1 );
2180+ WCD934X_MICB_VAL_MASK , wcd -> common . micb_vout [ 0 ] );
22142181 snd_soc_component_update_bits (comp , WCD934X_ANA_MICB2 ,
2215- WCD934X_MICB_VAL_MASK , vout_ctl_2 );
2182+ WCD934X_MICB_VAL_MASK , wcd -> common . micb_vout [ 1 ] );
22162183 snd_soc_component_update_bits (comp , WCD934X_ANA_MICB3 ,
2217- WCD934X_MICB_VAL_MASK , vout_ctl_3 );
2184+ WCD934X_MICB_VAL_MASK , wcd -> common . micb_vout [ 2 ] );
22182185 snd_soc_component_update_bits (comp , WCD934X_ANA_MICB4 ,
2219- WCD934X_MICB_VAL_MASK , vout_ctl_4 );
2186+ WCD934X_MICB_VAL_MASK , wcd -> common . micb_vout [ 3 ] );
22202187
22212188 if (wcd -> rate == WCD934X_MCLK_CLK_9P6MHZ )
22222189 def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ ;
@@ -2517,15 +2484,6 @@ static void wcd934x_mbhc_micb_ramp_control(struct snd_soc_component *component,
25172484 }
25182485}
25192486
2520- static int wcd934x_get_micb_vout_ctl_val (u32 micb_mv )
2521- {
2522- /* min micbias voltage is 1V and maximum is 2.85V */
2523- if (micb_mv < 1000 || micb_mv > 2850 )
2524- return - EINVAL ;
2525-
2526- return (micb_mv - 1000 ) / 50 ;
2527- }
2528-
25292487static int wcd934x_mbhc_micb_adjust_voltage (struct snd_soc_component * component ,
25302488 int req_volt , int micb_num )
25312489{
@@ -2562,7 +2520,7 @@ static int wcd934x_mbhc_micb_adjust_voltage(struct snd_soc_component *component,
25622520 cur_vout_ctl = snd_soc_component_read_field (component , micb_reg ,
25632521 WCD934X_MICB_VAL_MASK );
25642522
2565- req_vout_ctl = wcd934x_get_micb_vout_ctl_val ( req_volt );
2523+ req_vout_ctl = wcd_get_micb_vout_ctl_val ( component -> dev , req_volt );
25662524 if (req_vout_ctl < 0 ) {
25672525 ret = - EINVAL ;
25682526 goto exit ;
@@ -2610,10 +2568,10 @@ static int wcd934x_mbhc_micb_ctrl_threshold_mic(struct snd_soc_component *compon
26102568 * voltage needed to detect threshold microphone, then do
26112569 * not change the micbias, just return.
26122570 */
2613- if (wcd934x -> micb2_mv >= WCD_MBHC_THR_HS_MICB_MV )
2571+ if (wcd934x -> common . micb_mv [ 1 ] >= WCD_MBHC_THR_HS_MICB_MV )
26142572 return 0 ;
26152573
2616- micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd934x -> micb2_mv ;
2574+ micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd934x -> common . micb_mv [ 1 ] ;
26172575
26182576 rc = wcd934x_mbhc_micb_adjust_voltage (component , micb_mv , MIC_BIAS_2 );
26192577
@@ -3036,7 +2994,7 @@ static void wcd934x_mbhc_deinit(struct snd_soc_component *component)
30362994static int wcd934x_comp_probe (struct snd_soc_component * component )
30372995{
30382996 struct wcd934x_codec * wcd = dev_get_drvdata (component -> dev );
3039- int i ;
2997+ int i , ret ;
30402998
30412999 snd_soc_component_init_regmap (component , wcd -> regmap );
30423000 wcd -> component = component ;
@@ -3054,7 +3012,12 @@ static int wcd934x_comp_probe(struct snd_soc_component *component)
30543012 for (i = 0 ; i < NUM_CODEC_DAIS ; i ++ )
30553013 INIT_LIST_HEAD (& wcd -> dai [i ].slim_ch_list );
30563014
3057- wcd934x_init_dmic (component );
3015+
3016+ ret = wcd934x_init_dmic (component );
3017+ if (ret ) {
3018+ dev_err (component -> dev , "Failed to Initialize micbias\n" );
3019+ return ret ;
3020+ }
30583021
30593022 if (wcd934x_mbhc_init (component ))
30603023 dev_err (component -> dev , "Failed to Initialize MBHC\n" );
@@ -5860,14 +5823,13 @@ static int wcd934x_codec_parse_data(struct wcd934x_codec *wcd)
58605823 cfg -> anc_micbias = MIC_BIAS_2 ;
58615824 cfg -> v_hs_max = WCD_MBHC_HS_V_MAX ;
58625825 cfg -> num_btn = WCD934X_MBHC_MAX_BUTTONS ;
5863- cfg -> micb_mv = wcd -> micb2_mv ;
5826+ cfg -> micb_mv = wcd -> common . micb_mv [ 1 ] ;
58645827 cfg -> linein_th = 5000 ;
58655828 cfg -> hs_thr = 1700 ;
58665829 cfg -> hph_thr = 50 ;
58675830
58685831 wcd_dt_parse_mbhc_data (dev , cfg );
58695832
5870-
58715833 return 0 ;
58725834}
58735835
@@ -5888,6 +5850,8 @@ static int wcd934x_codec_probe(struct platform_device *pdev)
58885850 wcd -> sdev = to_slim_device (data -> dev );
58895851 mutex_init (& wcd -> sysclk_mutex );
58905852 mutex_init (& wcd -> micb_lock );
5853+ wcd -> common .dev = dev -> parent ;
5854+ wcd -> common .max_bias = 4 ;
58915855
58925856 ret = wcd934x_codec_parse_data (wcd );
58935857 if (ret )
0 commit comments