aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/rt5645.c90
-rw-r--r--sound/soc/codecs/rt5645.h2
2 files changed, 64 insertions, 28 deletions
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index c9a4c5be083b..69528ae5410c 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -1270,6 +1270,8 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
1270 snd_soc_update_bits(codec, RT5645_PWR_ANLG1, 1270 snd_soc_update_bits(codec, RT5645_PWR_ANLG1,
1271 RT5645_PWR_HP_L | RT5645_PWR_HP_R | 1271 RT5645_PWR_HP_L | RT5645_PWR_HP_R |
1272 RT5645_PWR_HA, 0); 1272 RT5645_PWR_HA, 0);
1273 snd_soc_update_bits(codec, RT5645_DEPOP_M2,
1274 RT5645_DEPOP_MASK, 0);
1273 } 1275 }
1274 } 1276 }
1275} 1277}
@@ -1538,8 +1540,6 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
1538 1540
1539 SND_SOC_DAPM_SUPPLY_S("adc stereo1 filter", 1, RT5645_PWR_DIG2, 1541 SND_SOC_DAPM_SUPPLY_S("adc stereo1 filter", 1, RT5645_PWR_DIG2,
1540 RT5645_PWR_ADC_S1F_BIT, 0, NULL, 0), 1542 RT5645_PWR_ADC_S1F_BIT, 0, NULL, 0),
1541 SND_SOC_DAPM_SUPPLY_S("adc stereo2 filter", 1, RT5645_PWR_DIG2,
1542 RT5645_PWR_ADC_S2F_BIT, 0, NULL, 0),
1543 SND_SOC_DAPM_MIXER_E("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0, 1543 SND_SOC_DAPM_MIXER_E("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0,
1544 rt5645_sto1_adc_l_mix, ARRAY_SIZE(rt5645_sto1_adc_l_mix), 1544 rt5645_sto1_adc_l_mix, ARRAY_SIZE(rt5645_sto1_adc_l_mix),
1545 NULL, 0), 1545 NULL, 0),
@@ -1729,7 +1729,6 @@ static const struct snd_soc_dapm_widget rt5650_specific_dapm_widgets[] = {
1729 1729
1730static const struct snd_soc_dapm_route rt5645_dapm_routes[] = { 1730static const struct snd_soc_dapm_route rt5645_dapm_routes[] = {
1731 { "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc }, 1731 { "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc },
1732 { "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc },
1733 { "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc }, 1732 { "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc },
1734 { "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc }, 1733 { "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc },
1735 { "dac mono left filter", NULL, "DAC MONO L ASRC", is_using_asrc }, 1734 { "dac mono left filter", NULL, "DAC MONO L ASRC", is_using_asrc },
@@ -2052,7 +2051,7 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2052{ 2051{
2053 struct snd_soc_codec *codec = dai->codec; 2052 struct snd_soc_codec *codec = dai->codec;
2054 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); 2053 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
2055 unsigned int val_len = 0, val_clk, mask_clk; 2054 unsigned int val_len = 0, val_clk, mask_clk, dl_sft;
2056 int pre_div, bclk_ms, frame_size; 2055 int pre_div, bclk_ms, frame_size;
2057 2056
2058 rt5645->lrck[dai->id] = params_rate(params); 2057 rt5645->lrck[dai->id] = params_rate(params);
@@ -2066,6 +2065,16 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2066 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); 2065 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
2067 return -EINVAL; 2066 return -EINVAL;
2068 } 2067 }
2068
2069 switch (rt5645->codec_type) {
2070 case CODEC_TYPE_RT5650:
2071 dl_sft = 4;
2072 break;
2073 default:
2074 dl_sft = 2;
2075 break;
2076 }
2077
2069 bclk_ms = frame_size > 32; 2078 bclk_ms = frame_size > 32;
2070 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms); 2079 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms);
2071 2080
@@ -2078,13 +2087,13 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2078 case 16: 2087 case 16:
2079 break; 2088 break;
2080 case 20: 2089 case 20:
2081 val_len |= RT5645_I2S_DL_20; 2090 val_len = 0x1;
2082 break; 2091 break;
2083 case 24: 2092 case 24:
2084 val_len |= RT5645_I2S_DL_24; 2093 val_len = 0x2;
2085 break; 2094 break;
2086 case 8: 2095 case 8:
2087 val_len |= RT5645_I2S_DL_8; 2096 val_len = 0x3;
2088 break; 2097 break;
2089 default: 2098 default:
2090 return -EINVAL; 2099 return -EINVAL;
@@ -2096,7 +2105,7 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2096 val_clk = bclk_ms << RT5645_I2S_BCLK_MS1_SFT | 2105 val_clk = bclk_ms << RT5645_I2S_BCLK_MS1_SFT |
2097 pre_div << RT5645_I2S_PD1_SFT; 2106 pre_div << RT5645_I2S_PD1_SFT;
2098 snd_soc_update_bits(codec, RT5645_I2S1_SDP, 2107 snd_soc_update_bits(codec, RT5645_I2S1_SDP,
2099 RT5645_I2S_DL_MASK, val_len); 2108 (0x3 << dl_sft), (val_len << dl_sft));
2100 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); 2109 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk);
2101 break; 2110 break;
2102 case RT5645_AIF2: 2111 case RT5645_AIF2:
@@ -2104,7 +2113,7 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2104 val_clk = bclk_ms << RT5645_I2S_BCLK_MS2_SFT | 2113 val_clk = bclk_ms << RT5645_I2S_BCLK_MS2_SFT |
2105 pre_div << RT5645_I2S_PD2_SFT; 2114 pre_div << RT5645_I2S_PD2_SFT;
2106 snd_soc_update_bits(codec, RT5645_I2S2_SDP, 2115 snd_soc_update_bits(codec, RT5645_I2S2_SDP,
2107 RT5645_I2S_DL_MASK, val_len); 2116 (0x3 << dl_sft), (val_len << dl_sft));
2108 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); 2117 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk);
2109 break; 2118 break;
2110 default: 2119 default:
@@ -2119,7 +2128,16 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2119{ 2128{
2120 struct snd_soc_codec *codec = dai->codec; 2129 struct snd_soc_codec *codec = dai->codec;
2121 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); 2130 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
2122 unsigned int reg_val = 0; 2131 unsigned int reg_val = 0, pol_sft;
2132
2133 switch (rt5645->codec_type) {
2134 case CODEC_TYPE_RT5650:
2135 pol_sft = 8;
2136 break;
2137 default:
2138 pol_sft = 7;
2139 break;
2140 }
2123 2141
2124 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 2142 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
2125 case SND_SOC_DAIFMT_CBM_CFM: 2143 case SND_SOC_DAIFMT_CBM_CFM:
@@ -2137,7 +2155,7 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2137 case SND_SOC_DAIFMT_NB_NF: 2155 case SND_SOC_DAIFMT_NB_NF:
2138 break; 2156 break;
2139 case SND_SOC_DAIFMT_IB_NF: 2157 case SND_SOC_DAIFMT_IB_NF:
2140 reg_val |= RT5645_I2S_BP_INV; 2158 reg_val |= (1 << pol_sft);
2141 break; 2159 break;
2142 default: 2160 default:
2143 return -EINVAL; 2161 return -EINVAL;
@@ -2161,12 +2179,12 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2161 switch (dai->id) { 2179 switch (dai->id) {
2162 case RT5645_AIF1: 2180 case RT5645_AIF1:
2163 snd_soc_update_bits(codec, RT5645_I2S1_SDP, 2181 snd_soc_update_bits(codec, RT5645_I2S1_SDP,
2164 RT5645_I2S_MS_MASK | RT5645_I2S_BP_MASK | 2182 RT5645_I2S_MS_MASK | (1 << pol_sft) |
2165 RT5645_I2S_DF_MASK, reg_val); 2183 RT5645_I2S_DF_MASK, reg_val);
2166 break; 2184 break;
2167 case RT5645_AIF2: 2185 case RT5645_AIF2:
2168 snd_soc_update_bits(codec, RT5645_I2S2_SDP, 2186 snd_soc_update_bits(codec, RT5645_I2S2_SDP,
2169 RT5645_I2S_MS_MASK | RT5645_I2S_BP_MASK | 2187 RT5645_I2S_MS_MASK | (1 << pol_sft) |
2170 RT5645_I2S_DF_MASK, reg_val); 2188 RT5645_I2S_DF_MASK, reg_val);
2171 break; 2189 break;
2172 default: 2190 default:
@@ -2285,23 +2303,42 @@ static int rt5645_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
2285 unsigned int rx_mask, int slots, int slot_width) 2303 unsigned int rx_mask, int slots, int slot_width)
2286{ 2304{
2287 struct snd_soc_codec *codec = dai->codec; 2305 struct snd_soc_codec *codec = dai->codec;
2288 unsigned int val = 0; 2306 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
2307 unsigned int i_slot_sft, o_slot_sft, i_width_sht, o_width_sht, en_sft;
2308 unsigned int mask, val = 0;
2289 2309
2310 switch (rt5645->codec_type) {
2311 case CODEC_TYPE_RT5650:
2312 en_sft = 15;
2313 i_slot_sft = 10;
2314 o_slot_sft = 8;
2315 i_width_sht = 6;
2316 o_width_sht = 4;
2317 mask = 0x8ff0;
2318 break;
2319 default:
2320 en_sft = 14;
2321 i_slot_sft = o_slot_sft = 12;
2322 i_width_sht = o_width_sht = 10;
2323 mask = 0x7c00;
2324 break;
2325 }
2290 if (rx_mask || tx_mask) { 2326 if (rx_mask || tx_mask) {
2291 val |= (1 << 14); 2327 val |= (1 << en_sft);
2292 snd_soc_update_bits(codec, RT5645_BASS_BACK, 2328 if (rt5645->codec_type == CODEC_TYPE_RT5645)
2293 RT5645_G_BB_BST_MASK, RT5645_G_BB_BST_25DB); 2329 snd_soc_update_bits(codec, RT5645_BASS_BACK,
2330 RT5645_G_BB_BST_MASK, RT5645_G_BB_BST_25DB);
2294 } 2331 }
2295 2332
2296 switch (slots) { 2333 switch (slots) {
2297 case 4: 2334 case 4:
2298 val |= (1 << 12); 2335 val |= (1 << i_slot_sft) | (1 << o_slot_sft);
2299 break; 2336 break;
2300 case 6: 2337 case 6:
2301 val |= (2 << 12); 2338 val |= (2 << i_slot_sft) | (2 << o_slot_sft);
2302 break; 2339 break;
2303 case 8: 2340 case 8:
2304 val |= (3 << 12); 2341 val |= (3 << i_slot_sft) | (3 << o_slot_sft);
2305 break; 2342 break;
2306 case 2: 2343 case 2:
2307 default: 2344 default:
@@ -2310,20 +2347,20 @@ static int rt5645_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
2310 2347
2311 switch (slot_width) { 2348 switch (slot_width) {
2312 case 20: 2349 case 20:
2313 val |= (1 << 10); 2350 val |= (1 << i_width_sht) | (1 << o_width_sht);
2314 break; 2351 break;
2315 case 24: 2352 case 24:
2316 val |= (2 << 10); 2353 val |= (2 << i_width_sht) | (2 << o_width_sht);
2317 break; 2354 break;
2318 case 32: 2355 case 32:
2319 val |= (3 << 10); 2356 val |= (3 << i_width_sht) | (3 << o_width_sht);
2320 break; 2357 break;
2321 case 16: 2358 case 16:
2322 default: 2359 default:
2323 break; 2360 break;
2324 } 2361 }
2325 2362
2326 snd_soc_update_bits(codec, RT5645_TDM_CTRL_1, 0x7c00, val); 2363 snd_soc_update_bits(codec, RT5645_TDM_CTRL_1, mask, val);
2327 2364
2328 return 0; 2365 return 0;
2329} 2366}
@@ -2361,7 +2398,8 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
2361 2398
2362 case SND_SOC_BIAS_OFF: 2399 case SND_SOC_BIAS_OFF:
2363 snd_soc_write(codec, RT5645_DEPOP_M2, 0x1100); 2400 snd_soc_write(codec, RT5645_DEPOP_M2, 0x1100);
2364 snd_soc_write(codec, RT5645_GEN_CTRL1, 0x0128); 2401 snd_soc_update_bits(codec, RT5645_GEN_CTRL1,
2402 RT5645_DIG_GATE_CTRL, 0);
2365 snd_soc_update_bits(codec, RT5645_PWR_ANLG1, 2403 snd_soc_update_bits(codec, RT5645_PWR_ANLG1,
2366 RT5645_PWR_VREF1 | RT5645_PWR_MB | 2404 RT5645_PWR_VREF1 | RT5645_PWR_MB |
2367 RT5645_PWR_BG | RT5645_PWR_VREF2 | 2405 RT5645_PWR_BG | RT5645_PWR_VREF2 |
@@ -2598,7 +2636,7 @@ static struct snd_soc_codec_driver soc_codec_dev_rt5645 = {
2598static const struct regmap_config rt5645_regmap = { 2636static const struct regmap_config rt5645_regmap = {
2599 .reg_bits = 8, 2637 .reg_bits = 8,
2600 .val_bits = 16, 2638 .val_bits = 16,
2601 2639 .use_single_rw = true,
2602 .max_register = RT5645_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5645_ranges) * 2640 .max_register = RT5645_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5645_ranges) *
2603 RT5645_PR_SPACING), 2641 RT5645_PR_SPACING),
2604 .volatile_reg = rt5645_volatile_register, 2642 .volatile_reg = rt5645_volatile_register,
diff --git a/sound/soc/codecs/rt5645.h b/sound/soc/codecs/rt5645.h
index dbfd98c22f4d..db78e9462876 100644
--- a/sound/soc/codecs/rt5645.h
+++ b/sound/soc/codecs/rt5645.h
@@ -804,8 +804,6 @@
804#define RT5645_PWR_DAC_MF_L_BIT 10 804#define RT5645_PWR_DAC_MF_L_BIT 10
805#define RT5645_PWR_DAC_MF_R (0x1 << 9) 805#define RT5645_PWR_DAC_MF_R (0x1 << 9)
806#define RT5645_PWR_DAC_MF_R_BIT 9 806#define RT5645_PWR_DAC_MF_R_BIT 9
807#define RT5645_PWR_ADC_S2F (0x1 << 8)
808#define RT5645_PWR_ADC_S2F_BIT 8
809#define RT5645_PWR_PDM1 (0x1 << 7) 807#define RT5645_PWR_PDM1 (0x1 << 7)
810#define RT5645_PWR_PDM1_BIT 7 808#define RT5645_PWR_PDM1_BIT 7
811#define RT5645_PWR_PDM2 (0x1 << 6) 809#define RT5645_PWR_PDM2 (0x1 << 6)