aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBard Liao <bardliao@realtek.com>2015-03-27 08:19:06 -0400
committerMark Brown <broonie@kernel.org>2015-03-27 12:48:56 -0400
commit57bf27365c56b547097253004768904419df6c69 (patch)
tree0b5728dc674fae94dd68606c27b56efd389dd7b3
parentb52551e0d0e659db43f5cfa813ae09d4c3744761 (diff)
ASoC: rt5645: Redefine format config for rt5650
rt5650 and rt5645 use different register bits for format configuration. This patch modifies rt5645_hw_params and rt5645_set_dai_fmt to support both codecs. Signed-off-by: Bard Liao <bardliao@realtek.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/rt5645.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index 4c384a14de1d..0133c8c58592 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -2049,7 +2049,7 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2049{ 2049{
2050 struct snd_soc_codec *codec = dai->codec; 2050 struct snd_soc_codec *codec = dai->codec;
2051 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); 2051 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
2052 unsigned int val_len = 0, val_clk, mask_clk; 2052 unsigned int val_len = 0, val_clk, mask_clk, dl_sft;
2053 int pre_div, bclk_ms, frame_size; 2053 int pre_div, bclk_ms, frame_size;
2054 2054
2055 rt5645->lrck[dai->id] = params_rate(params); 2055 rt5645->lrck[dai->id] = params_rate(params);
@@ -2063,6 +2063,16 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2063 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); 2063 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
2064 return -EINVAL; 2064 return -EINVAL;
2065 } 2065 }
2066
2067 switch (rt5645->codec_type) {
2068 case CODEC_TYPE_RT5650:
2069 dl_sft = 4;
2070 break;
2071 default:
2072 dl_sft = 2;
2073 break;
2074 }
2075
2066 bclk_ms = frame_size > 32; 2076 bclk_ms = frame_size > 32;
2067 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms); 2077 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms);
2068 2078
@@ -2075,13 +2085,13 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2075 case 16: 2085 case 16:
2076 break; 2086 break;
2077 case 20: 2087 case 20:
2078 val_len |= RT5645_I2S_DL_20; 2088 val_len = 0x1;
2079 break; 2089 break;
2080 case 24: 2090 case 24:
2081 val_len |= RT5645_I2S_DL_24; 2091 val_len = 0x2;
2082 break; 2092 break;
2083 case 8: 2093 case 8:
2084 val_len |= RT5645_I2S_DL_8; 2094 val_len = 0x3;
2085 break; 2095 break;
2086 default: 2096 default:
2087 return -EINVAL; 2097 return -EINVAL;
@@ -2093,7 +2103,7 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2093 val_clk = bclk_ms << RT5645_I2S_BCLK_MS1_SFT | 2103 val_clk = bclk_ms << RT5645_I2S_BCLK_MS1_SFT |
2094 pre_div << RT5645_I2S_PD1_SFT; 2104 pre_div << RT5645_I2S_PD1_SFT;
2095 snd_soc_update_bits(codec, RT5645_I2S1_SDP, 2105 snd_soc_update_bits(codec, RT5645_I2S1_SDP,
2096 RT5645_I2S_DL_MASK, val_len); 2106 (0x3 << dl_sft), (val_len << dl_sft));
2097 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); 2107 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk);
2098 break; 2108 break;
2099 case RT5645_AIF2: 2109 case RT5645_AIF2:
@@ -2101,7 +2111,7 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream,
2101 val_clk = bclk_ms << RT5645_I2S_BCLK_MS2_SFT | 2111 val_clk = bclk_ms << RT5645_I2S_BCLK_MS2_SFT |
2102 pre_div << RT5645_I2S_PD2_SFT; 2112 pre_div << RT5645_I2S_PD2_SFT;
2103 snd_soc_update_bits(codec, RT5645_I2S2_SDP, 2113 snd_soc_update_bits(codec, RT5645_I2S2_SDP,
2104 RT5645_I2S_DL_MASK, val_len); 2114 (0x3 << dl_sft), (val_len << dl_sft));
2105 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); 2115 snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk);
2106 break; 2116 break;
2107 default: 2117 default:
@@ -2116,7 +2126,16 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2116{ 2126{
2117 struct snd_soc_codec *codec = dai->codec; 2127 struct snd_soc_codec *codec = dai->codec;
2118 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); 2128 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
2119 unsigned int reg_val = 0; 2129 unsigned int reg_val = 0, pol_sft;
2130
2131 switch (rt5645->codec_type) {
2132 case CODEC_TYPE_RT5650:
2133 pol_sft = 8;
2134 break;
2135 default:
2136 pol_sft = 7;
2137 break;
2138 }
2120 2139
2121 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 2140 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
2122 case SND_SOC_DAIFMT_CBM_CFM: 2141 case SND_SOC_DAIFMT_CBM_CFM:
@@ -2134,7 +2153,7 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2134 case SND_SOC_DAIFMT_NB_NF: 2153 case SND_SOC_DAIFMT_NB_NF:
2135 break; 2154 break;
2136 case SND_SOC_DAIFMT_IB_NF: 2155 case SND_SOC_DAIFMT_IB_NF:
2137 reg_val |= RT5645_I2S_BP_INV; 2156 reg_val |= (1 << pol_sft);
2138 break; 2157 break;
2139 default: 2158 default:
2140 return -EINVAL; 2159 return -EINVAL;
@@ -2158,12 +2177,12 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2158 switch (dai->id) { 2177 switch (dai->id) {
2159 case RT5645_AIF1: 2178 case RT5645_AIF1:
2160 snd_soc_update_bits(codec, RT5645_I2S1_SDP, 2179 snd_soc_update_bits(codec, RT5645_I2S1_SDP,
2161 RT5645_I2S_MS_MASK | RT5645_I2S_BP_MASK | 2180 RT5645_I2S_MS_MASK | (1 << pol_sft) |
2162 RT5645_I2S_DF_MASK, reg_val); 2181 RT5645_I2S_DF_MASK, reg_val);
2163 break; 2182 break;
2164 case RT5645_AIF2: 2183 case RT5645_AIF2:
2165 snd_soc_update_bits(codec, RT5645_I2S2_SDP, 2184 snd_soc_update_bits(codec, RT5645_I2S2_SDP,
2166 RT5645_I2S_MS_MASK | RT5645_I2S_BP_MASK | 2185 RT5645_I2S_MS_MASK | (1 << pol_sft) |
2167 RT5645_I2S_DF_MASK, reg_val); 2186 RT5645_I2S_DF_MASK, reg_val);
2168 break; 2187 break;
2169 default: 2188 default: