diff options
| -rw-r--r-- | sound/soc/codecs/wm_hubs.c | 65 | 
1 files changed, 43 insertions, 22 deletions
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index 728a18010a4..6ab69f32f24 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c @@ -199,6 +199,47 @@ static void wm_hubs_dcs_cache_set(struct snd_soc_codec *codec, u16 dcs_cfg)  	list_add_tail(&cache->list, &hubs->dcs_cache);  } +static void wm_hubs_read_dc_servo(struct snd_soc_codec *codec, +				  u16 *reg_l, u16 *reg_r) +{ +	struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec); +	u16 dcs_reg, reg; + +	switch (hubs->dcs_readback_mode) { +	case 2: +		dcs_reg = WM8994_DC_SERVO_4E; +		break; +	case 1: +		dcs_reg = WM8994_DC_SERVO_READBACK; +		break; +	default: +		dcs_reg = WM8993_DC_SERVO_3; +		break; +	} + +	/* Different chips in the family support different readback +	 * methods. +	 */ +	switch (hubs->dcs_readback_mode) { +	case 0: +		*reg_l = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1) +			& WM8993_DCS_INTEG_CHAN_0_MASK; +		*reg_r = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2) +			& WM8993_DCS_INTEG_CHAN_1_MASK; +		break; +	case 2: +	case 1: +		reg = snd_soc_read(codec, dcs_reg); +		*reg_r = (reg & WM8993_DCS_DAC_WR_VAL_1_MASK) +			>> WM8993_DCS_DAC_WR_VAL_1_SHIFT; +		*reg_l = reg & WM8993_DCS_DAC_WR_VAL_0_MASK; +		break; +	default: +		WARN(1, "Unknown DCS readback method\n"); +		return; +	} +} +  /*   * Startup calibration of the DC servo   */ @@ -207,7 +248,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)  	struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);  	struct wm_hubs_dcs_cache *cache;  	s8 offset; -	u16 reg, reg_l, reg_r, dcs_cfg, dcs_reg; +	u16 reg_l, reg_r, dcs_cfg, dcs_reg;  	switch (hubs->dcs_readback_mode) {  	case 2: @@ -245,27 +286,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)  				  WM8993_DCS_TRIG_STARTUP_1);  	} -	/* Different chips in the family support different readback -	 * methods. -	 */ -	switch (hubs->dcs_readback_mode) { -	case 0: -		reg_l = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1) -			& WM8993_DCS_INTEG_CHAN_0_MASK; -		reg_r = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2) -			& WM8993_DCS_INTEG_CHAN_1_MASK; -		break; -	case 2: -	case 1: -		reg = snd_soc_read(codec, dcs_reg); -		reg_r = (reg & WM8993_DCS_DAC_WR_VAL_1_MASK) -			>> WM8993_DCS_DAC_WR_VAL_1_SHIFT; -		reg_l = reg & WM8993_DCS_DAC_WR_VAL_0_MASK; -		break; -	default: -		WARN(1, "Unknown DCS readback method\n"); -		return; -	} +	wm_hubs_read_dc_servo(codec, ®_l, ®_r);  	dev_dbg(codec->dev, "DCS input: %x %x\n", reg_l, reg_r);  |