aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/codecs/wm8523.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c
index b1cc94f5fc4b..f9dffd2d5eea 100644
--- a/sound/soc/codecs/wm8523.c
+++ b/sound/soc/codecs/wm8523.c
@@ -113,6 +113,15 @@ static struct {
113 { 7, 1152 }, 113 { 7, 1152 },
114}; 114};
115 115
116static struct {
117 int value;
118 int ratio;
119} bclk_ratios[WM8523_NUM_RATES] = {
120 { 2, 32 },
121 { 3, 64 },
122 { 4, 128 },
123};
124
116static int wm8523_startup(struct snd_pcm_substream *substream, 125static int wm8523_startup(struct snd_pcm_substream *substream,
117 struct snd_soc_dai *dai) 126 struct snd_soc_dai *dai)
118{ 127{
@@ -162,6 +171,23 @@ static int wm8523_hw_params(struct snd_pcm_substream *substream,
162 aifctrl2 &= ~WM8523_SR_MASK; 171 aifctrl2 &= ~WM8523_SR_MASK;
163 aifctrl2 |= lrclk_ratios[i].value; 172 aifctrl2 |= lrclk_ratios[i].value;
164 173
174 if (aifctrl1 & WM8523_AIF_MSTR) {
175 /* Find a fs->bclk ratio */
176 for (i = 0; i < ARRAY_SIZE(bclk_ratios); i++)
177 if (params_width(params) * 2 <= bclk_ratios[i].ratio)
178 break;
179
180 if (i == ARRAY_SIZE(bclk_ratios)) {
181 dev_err(codec->dev,
182 "No matching BCLK/fs ratio for word length %d\n",
183 params_width(params));
184 return -EINVAL;
185 }
186
187 aifctrl2 &= ~WM8523_BCLKDIV_MASK;
188 aifctrl2 |= bclk_ratios[i].value << WM8523_BCLKDIV_SHIFT;
189 }
190
165 aifctrl1 &= ~WM8523_WL_MASK; 191 aifctrl1 &= ~WM8523_WL_MASK;
166 switch (params_width(params)) { 192 switch (params_width(params)) {
167 case 16: 193 case 16: