diff options
-rw-r--r-- | sound/soc/codecs/rt5645.c | 90 | ||||
-rw-r--r-- | sound/soc/codecs/rt5645.h | 2 |
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 | ||
1730 | static const struct snd_soc_dapm_route rt5645_dapm_routes[] = { | 1730 | static 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 = { | |||
2598 | static const struct regmap_config rt5645_regmap = { | 2636 | static 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) |