diff options
Diffstat (limited to 'sound/soc/codecs/rt1011.c')
| -rw-r--r-- | sound/soc/codecs/rt1011.c | 56 | 
1 files changed, 42 insertions, 14 deletions
diff --git a/sound/soc/codecs/rt1011.c b/sound/soc/codecs/rt1011.c index 0a6ff13d76e1..be1e276e3631 100644 --- a/sound/soc/codecs/rt1011.c +++ b/sound/soc/codecs/rt1011.c @@ -978,9 +978,6 @@ static bool rt1011_readable_register(struct device *dev, unsigned int reg)  	}  } -static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -9435, 37, 0); -static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1739, 37, 0); -  static const char * const rt1011_din_source_select[] = {  	"Left",  	"Right", @@ -1029,6 +1026,8 @@ static const char * const rt1011_tdm_adc_swap_select[] = {  static SOC_ENUM_SINGLE_DECL(rt1011_tdm_adc1_1_enum,	RT1011_TDM1_SET_3, 6,  	rt1011_tdm_adc_swap_select); +static SOC_ENUM_SINGLE_DECL(rt1011_tdm_adc2_1_enum,	RT1011_TDM1_SET_3, 4, +	rt1011_tdm_adc_swap_select);  static void rt1011_reset(struct regmap *regmap)  { @@ -1223,7 +1222,10 @@ static int rt1011_bq_drc_info(struct snd_kcontrol *kcontrol,  static int rt1011_r0_cali_get(struct snd_kcontrol *kcontrol,  		struct snd_ctl_elem_value *ucontrol)  { -	ucontrol->value.integer.value[0] = 0; +	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); +	struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); + +	ucontrol->value.integer.value[0] = rt1011->cali_done;  	return 0;  } @@ -1237,6 +1239,7 @@ static int rt1011_r0_cali_put(struct snd_kcontrol *kcontrol,  	if (!component->card->instantiated)  		return 0; +	rt1011->cali_done = 0;  	if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF &&  		ucontrol->value.integer.value[0])  		rt1011_calibrate(rt1011, 1); @@ -1333,7 +1336,8 @@ static const struct snd_kcontrol_new rt1011_snd_controls[] = {  	/* TDM1 Data Out Selection */  	SOC_ENUM("TDM1 DOUT Source", rt1011_tdm1_adc1_dat_enum),  	SOC_ENUM("TDM1 DOUT Location", rt1011_tdm1_adc1_loc_enum), -	SOC_ENUM("TDM1 ADCDAT Swap Select", rt1011_tdm_adc1_1_enum), +	SOC_ENUM("TDM1 ADC1DAT Swap Select", rt1011_tdm_adc1_1_enum), +	SOC_ENUM("TDM1 ADC2DAT Swap Select", rt1011_tdm_adc2_1_enum),  	/* Data Out Mode */  	SOC_ENUM("I2S ADC DOUT Mode", rt1011_adc_dout_mode_enum), @@ -1355,6 +1359,10 @@ static const struct snd_kcontrol_new rt1011_snd_controls[] = {  	SOC_SINGLE_EXT("R0 Calibration", SND_SOC_NOPM, 0, 1, 0,  		rt1011_r0_cali_get, rt1011_r0_cali_put),  	RT1011_R0_LOAD("R0 Load Mode"), + +	/* R0 temperature */ +	SOC_SINGLE("R0 Temperature", RT1011_STP_INITIAL_RESISTANCE_TEMP, +		2, 255, 0),  };  static int rt1011_is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, @@ -1511,7 +1519,8 @@ static const struct snd_soc_dapm_route rt1011_dapm_routes[] = {  static int rt1011_get_clk_info(int sclk, int rate)  { -	int i, pd[] = {1, 2, 3, 4, 6, 8, 12, 16}; +	int i; +	static const int pd[] = {1, 2, 3, 4, 6, 8, 12, 16};  	if (sclk <= 0 || rate <= 0)  		return -EINVAL; @@ -1619,14 +1628,18 @@ static int rt1011_hw_params(struct snd_pcm_substream *substream,  static int rt1011_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)  {  	struct snd_soc_component *component = dai->component; +	struct snd_soc_dapm_context *dapm = +		snd_soc_component_get_dapm(component);  	unsigned int reg_val = 0, reg_bclk_inv = 0; +	int ret = 0; +	snd_soc_dapm_mutex_lock(dapm);  	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {  	case SND_SOC_DAIFMT_CBS_CFS:  		reg_val |= RT1011_I2S_TDM_MS_S;  		break;  	default: -		return -EINVAL; +		ret = -EINVAL;  	}  	switch (fmt & SND_SOC_DAIFMT_INV_MASK) { @@ -1636,7 +1649,7 @@ static int rt1011_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)  		reg_bclk_inv |= RT1011_TDM_INV_BCLK;  		break;  	default: -		return -EINVAL; +		ret = -EINVAL;  	}  	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -1652,7 +1665,7 @@ static int rt1011_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)  		reg_val |= RT1011_I2S_TDM_DF_PCM_B;  		break;  	default: -		return -EINVAL; +		ret = -EINVAL;  	}  	switch (dai->id) { @@ -1667,9 +1680,11 @@ static int rt1011_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)  		break;  	default:  		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); -		return -EINVAL; +		ret = -EINVAL;  	} -	return 0; + +	snd_soc_dapm_mutex_unlock(dapm); +	return ret;  }  static int rt1011_set_component_sysclk(struct snd_soc_component *component, @@ -1788,8 +1803,12 @@ static int rt1011_set_tdm_slot(struct snd_soc_dai *dai,  	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)  {  	struct snd_soc_component *component = dai->component; +	struct snd_soc_dapm_context *dapm = +		snd_soc_component_get_dapm(component);  	unsigned int val = 0, tdm_en = 0; +	int ret = 0; +	snd_soc_dapm_mutex_lock(dapm);  	if (rx_mask || tx_mask)  		tdm_en = RT1011_TDM_I2S_DOCK_EN_1; @@ -1809,7 +1828,7 @@ static int rt1011_set_tdm_slot(struct snd_soc_dai *dai,  	case 2:  		break;  	default: -		return -EINVAL; +		ret = -EINVAL;  	}  	switch (slot_width) { @@ -1828,7 +1847,7 @@ static int rt1011_set_tdm_slot(struct snd_soc_dai *dai,  	case 16:  		break;  	default: -		return -EINVAL; +		ret = -EINVAL;  	}  	snd_soc_component_update_bits(component, RT1011_TDM1_SET_1, @@ -1845,7 +1864,8 @@ static int rt1011_set_tdm_slot(struct snd_soc_dai *dai,  		RT1011_ADCDAT1_PIN_CONFIG | RT1011_ADCDAT2_PIN_CONFIG,  		RT1011_ADCDAT1_OUTPUT | RT1011_ADCDAT2_OUTPUT); -	return 0; +	snd_soc_dapm_mutex_unlock(dapm); +	return ret;  }  static int rt1011_probe(struct snd_soc_component *component) @@ -2128,6 +2148,7 @@ static int rt1011_calibrate(struct rt1011_priv *rt1011, unsigned char cali_flag)  			r0_factor = ((format / r0[0] * 100) / 128)  							- (r0_integer * 100);  			rt1011->r0_reg = r0[0]; +			rt1011->cali_done = 1;  			dev_info(dev,	"r0 resistance about %d.%02d ohm, reg=0x%X\n",  				r0_integer, r0_factor, r0[0]);  		} @@ -2178,6 +2199,13 @@ static void rt1011_calibration_work(struct work_struct *work)  	rt1011_calibrate(rt1011, 1); +	/* +	 * This flag should reset after booting. +	 * The factory test will do calibration again and use this flag to check +	 * whether the calibration completed +	 */ +	rt1011->cali_done = 0; +  	/* initial */  	rt1011_reg_init(component);  }  |