diff options
author | Bard Liao <bardliao@realtek.com> | 2015-03-27 08:19:06 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-03-27 12:48:56 -0400 |
commit | 57bf27365c56b547097253004768904419df6c69 (patch) | |
tree | 0b5728dc674fae94dd68606c27b56efd389dd7b3 | |
parent | b52551e0d0e659db43f5cfa813ae09d4c3744761 (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.c | 39 |
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: |