aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/fsl
diff options
context:
space:
mode:
authorXiubo Li <Li.Xiubo@freescale.com>2014-02-08 01:38:28 -0500
committerMark Brown <broonie@linaro.org>2014-02-10 08:25:53 -0500
commit78957fc349bcf29d415a649601581a993ff25e4d (patch)
treee0f9c4b768c1a5d4dfb3515de089c65b68c08ef7 /sound/soc/fsl
parent38dbfb59d1175ef458d006556061adeaa8751b72 (diff)
ASoC: fsl-sai: convert to use regmap API for Freeacale SAI
Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/fsl')
-rw-r--r--sound/soc/fsl/fsl_sai.c255
-rw-r--r--sound/soc/fsl/fsl_sai.h47
2 files changed, 166 insertions, 136 deletions
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index cdd3fa830704..faa65afb6951 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -15,6 +15,7 @@
15#include <linux/dmaengine.h> 15#include <linux/dmaengine.h>
16#include <linux/module.h> 16#include <linux/module.h>
17#include <linux/of_address.h> 17#include <linux/of_address.h>
18#include <linux/regmap.h>
18#include <linux/slab.h> 19#include <linux/slab.h>
19#include <sound/core.h> 20#include <sound/core.h>
20#include <sound/dmaengine_pcm.h> 21#include <sound/dmaengine_pcm.h>
@@ -22,34 +23,6 @@
22 23
23#include "fsl_sai.h" 24#include "fsl_sai.h"
24 25
25static inline u32 sai_readl(struct fsl_sai *sai,
26 const void __iomem *addr)
27{
28 u32 val;
29
30 val = __raw_readl(addr);
31
32 if (likely(sai->big_endian_regs))
33 val = be32_to_cpu(val);
34 else
35 val = le32_to_cpu(val);
36 rmb();
37
38 return val;
39}
40
41static inline void sai_writel(struct fsl_sai *sai,
42 u32 val, void __iomem *addr)
43{
44 wmb();
45 if (likely(sai->big_endian_regs))
46 val = cpu_to_be32(val);
47 else
48 val = cpu_to_le32(val);
49
50 __raw_writel(val, addr);
51}
52
53static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai, 26static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai,
54 int clk_id, unsigned int freq, int fsl_dir) 27 int clk_id, unsigned int freq, int fsl_dir)
55{ 28{
@@ -61,7 +34,8 @@ static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai,
61 else 34 else
62 reg_cr2 = FSL_SAI_RCR2; 35 reg_cr2 = FSL_SAI_RCR2;
63 36
64 val_cr2 = sai_readl(sai, sai->base + reg_cr2); 37 regmap_read(sai->regmap, reg_cr2, &val_cr2);
38
65 val_cr2 &= ~FSL_SAI_CR2_MSEL_MASK; 39 val_cr2 &= ~FSL_SAI_CR2_MSEL_MASK;
66 40
67 switch (clk_id) { 41 switch (clk_id) {
@@ -81,7 +55,7 @@ static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai,
81 return -EINVAL; 55 return -EINVAL;
82 } 56 }
83 57
84 sai_writel(sai, val_cr2, sai->base + reg_cr2); 58 regmap_write(sai->regmap, reg_cr2, val_cr2);
85 59
86 return 0; 60 return 0;
87} 61}
@@ -89,32 +63,22 @@ static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai,
89static int fsl_sai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, 63static int fsl_sai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
90 int clk_id, unsigned int freq, int dir) 64 int clk_id, unsigned int freq, int dir)
91{ 65{
92 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
93 int ret; 66 int ret;
94 67
95 if (dir == SND_SOC_CLOCK_IN) 68 if (dir == SND_SOC_CLOCK_IN)
96 return 0; 69 return 0;
97 70
98 ret = clk_prepare_enable(sai->clk);
99 if (ret)
100 return ret;
101
102 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq, 71 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq,
103 FSL_FMT_TRANSMITTER); 72 FSL_FMT_TRANSMITTER);
104 if (ret) { 73 if (ret) {
105 dev_err(cpu_dai->dev, "Cannot set tx sysclk: %d\n", ret); 74 dev_err(cpu_dai->dev, "Cannot set tx sysclk: %d\n", ret);
106 goto err_clk; 75 return ret;
107 } 76 }
108 77
109 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq, 78 ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq,
110 FSL_FMT_RECEIVER); 79 FSL_FMT_RECEIVER);
111 if (ret) { 80 if (ret)
112 dev_err(cpu_dai->dev, "Cannot set rx sysclk: %d\n", ret); 81 dev_err(cpu_dai->dev, "Cannot set rx sysclk: %d\n", ret);
113 goto err_clk;
114 }
115
116err_clk:
117 clk_disable_unprepare(sai->clk);
118 82
119 return ret; 83 return ret;
120} 84}
@@ -133,8 +97,8 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai,
133 reg_cr4 = FSL_SAI_RCR4; 97 reg_cr4 = FSL_SAI_RCR4;
134 } 98 }
135 99
136 val_cr2 = sai_readl(sai, sai->base + reg_cr2); 100 regmap_read(sai->regmap, reg_cr2, &val_cr2);
137 val_cr4 = sai_readl(sai, sai->base + reg_cr4); 101 regmap_read(sai->regmap, reg_cr4, &val_cr4);
138 102
139 if (sai->big_endian_data) 103 if (sai->big_endian_data)
140 val_cr4 &= ~FSL_SAI_CR4_MF; 104 val_cr4 &= ~FSL_SAI_CR4_MF;
@@ -183,35 +147,25 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai,
183 return -EINVAL; 147 return -EINVAL;
184 } 148 }
185 149
186 sai_writel(sai, val_cr2, sai->base + reg_cr2); 150 regmap_write(sai->regmap, reg_cr2, val_cr2);
187 sai_writel(sai, val_cr4, sai->base + reg_cr4); 151 regmap_write(sai->regmap, reg_cr4, val_cr4);
188 152
189 return 0; 153 return 0;
190} 154}
191 155
192static int fsl_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) 156static int fsl_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
193{ 157{
194 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
195 int ret; 158 int ret;
196 159
197 ret = clk_prepare_enable(sai->clk);
198 if (ret)
199 return ret;
200
201 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, FSL_FMT_TRANSMITTER); 160 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, FSL_FMT_TRANSMITTER);
202 if (ret) { 161 if (ret) {
203 dev_err(cpu_dai->dev, "Cannot set tx format: %d\n", ret); 162 dev_err(cpu_dai->dev, "Cannot set tx format: %d\n", ret);
204 goto err_clk; 163 return ret;
205 } 164 }
206 165
207 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, FSL_FMT_RECEIVER); 166 ret = fsl_sai_set_dai_fmt_tr(cpu_dai, fmt, FSL_FMT_RECEIVER);
208 if (ret) { 167 if (ret)
209 dev_err(cpu_dai->dev, "Cannot set rx format: %d\n", ret); 168 dev_err(cpu_dai->dev, "Cannot set rx format: %d\n", ret);
210 goto err_clk;
211 }
212
213err_clk:
214 clk_disable_unprepare(sai->clk);
215 169
216 return ret; 170 return ret;
217} 171}
@@ -235,11 +189,12 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
235 reg_mr = FSL_SAI_RMR; 189 reg_mr = FSL_SAI_RMR;
236 } 190 }
237 191
238 val_cr4 = sai_readl(sai, sai->base + reg_cr4); 192 regmap_read(sai->regmap, reg_cr4, &val_cr4);
193 regmap_read(sai->regmap, reg_cr4, &val_cr5);
194
239 val_cr4 &= ~FSL_SAI_CR4_SYWD_MASK; 195 val_cr4 &= ~FSL_SAI_CR4_SYWD_MASK;
240 val_cr4 &= ~FSL_SAI_CR4_FRSZ_MASK; 196 val_cr4 &= ~FSL_SAI_CR4_FRSZ_MASK;
241 197
242 val_cr5 = sai_readl(sai, sai->base + reg_cr5);
243 val_cr5 &= ~FSL_SAI_CR5_WNW_MASK; 198 val_cr5 &= ~FSL_SAI_CR5_WNW_MASK;
244 val_cr5 &= ~FSL_SAI_CR5_W0W_MASK; 199 val_cr5 &= ~FSL_SAI_CR5_W0W_MASK;
245 val_cr5 &= ~FSL_SAI_CR5_FBT_MASK; 200 val_cr5 &= ~FSL_SAI_CR5_FBT_MASK;
@@ -257,9 +212,9 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
257 val_cr4 |= FSL_SAI_CR4_FRSZ(channels); 212 val_cr4 |= FSL_SAI_CR4_FRSZ(channels);
258 val_mr = ~0UL - ((1 << channels) - 1); 213 val_mr = ~0UL - ((1 << channels) - 1);
259 214
260 sai_writel(sai, val_cr4, sai->base + reg_cr4); 215 regmap_write(sai->regmap, reg_cr4, val_cr4);
261 sai_writel(sai, val_cr5, sai->base + reg_cr5); 216 regmap_write(sai->regmap, reg_cr5, val_cr5);
262 sai_writel(sai, val_mr, sai->base + reg_mr); 217 regmap_write(sai->regmap, reg_mr, val_mr);
263 218
264 return 0; 219 return 0;
265} 220}
@@ -268,44 +223,34 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
268 struct snd_soc_dai *cpu_dai) 223 struct snd_soc_dai *cpu_dai)
269{ 224{
270 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 225 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
271 u32 tcsr, rcsr, val_cr2, val_cr3, reg_cr3; 226 u32 tcsr, rcsr;
272
273 val_cr2 = sai_readl(sai, sai->base + FSL_SAI_TCR2);
274 val_cr2 &= ~FSL_SAI_CR2_SYNC;
275 sai_writel(sai, val_cr2, sai->base + FSL_SAI_TCR2);
276 227
277 val_cr2 = sai_readl(sai, sai->base + FSL_SAI_RCR2); 228 regmap_update_bits(sai->regmap, FSL_SAI_TCR2, FSL_SAI_CR2_SYNC,
278 val_cr2 |= FSL_SAI_CR2_SYNC; 229 ~FSL_SAI_CR2_SYNC);
279 sai_writel(sai, val_cr2, sai->base + FSL_SAI_RCR2); 230 regmap_update_bits(sai->regmap, FSL_SAI_RCR2, FSL_SAI_CR2_SYNC,
231 FSL_SAI_CR2_SYNC);
280 232
281 tcsr = sai_readl(sai, sai->base + FSL_SAI_TCSR); 233 regmap_read(sai->regmap, FSL_SAI_TCSR, &tcsr);
282 rcsr = sai_readl(sai, sai->base + FSL_SAI_RCSR); 234 regmap_read(sai->regmap, FSL_SAI_RCSR, &rcsr);
283 235
284 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 236 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
285 tcsr |= FSL_SAI_CSR_FRDE; 237 tcsr |= FSL_SAI_CSR_FRDE;
286 rcsr &= ~FSL_SAI_CSR_FRDE; 238 rcsr &= ~FSL_SAI_CSR_FRDE;
287 reg_cr3 = FSL_SAI_TCR3;
288 } else { 239 } else {
289 rcsr |= FSL_SAI_CSR_FRDE; 240 rcsr |= FSL_SAI_CSR_FRDE;
290 tcsr &= ~FSL_SAI_CSR_FRDE; 241 tcsr &= ~FSL_SAI_CSR_FRDE;
291 reg_cr3 = FSL_SAI_RCR3;
292 } 242 }
293 243
294 val_cr3 = sai_readl(sai, sai->base + reg_cr3);
295
296 switch (cmd) { 244 switch (cmd) {
297 case SNDRV_PCM_TRIGGER_START: 245 case SNDRV_PCM_TRIGGER_START:
298 case SNDRV_PCM_TRIGGER_RESUME: 246 case SNDRV_PCM_TRIGGER_RESUME:
299 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 247 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
300 tcsr |= FSL_SAI_CSR_TERE; 248 tcsr |= FSL_SAI_CSR_TERE;
301 rcsr |= FSL_SAI_CSR_TERE; 249 rcsr |= FSL_SAI_CSR_TERE;
302 val_cr3 |= FSL_SAI_CR3_TRCE;
303 250
304 sai_writel(sai, val_cr3, sai->base + reg_cr3); 251 regmap_write(sai->regmap, FSL_SAI_RCSR, rcsr);
305 sai_writel(sai, rcsr, sai->base + FSL_SAI_RCSR); 252 regmap_write(sai->regmap, FSL_SAI_TCSR, tcsr);
306 sai_writel(sai, tcsr, sai->base + FSL_SAI_TCSR);
307 break; 253 break;
308
309 case SNDRV_PCM_TRIGGER_STOP: 254 case SNDRV_PCM_TRIGGER_STOP:
310 case SNDRV_PCM_TRIGGER_SUSPEND: 255 case SNDRV_PCM_TRIGGER_SUSPEND:
311 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 256 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
@@ -314,11 +259,8 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
314 rcsr &= ~FSL_SAI_CSR_TERE; 259 rcsr &= ~FSL_SAI_CSR_TERE;
315 } 260 }
316 261
317 val_cr3 &= ~FSL_SAI_CR3_TRCE; 262 regmap_write(sai->regmap, FSL_SAI_TCSR, tcsr);
318 263 regmap_write(sai->regmap, FSL_SAI_RCSR, rcsr);
319 sai_writel(sai, tcsr, sai->base + FSL_SAI_TCSR);
320 sai_writel(sai, rcsr, sai->base + FSL_SAI_RCSR);
321 sai_writel(sai, val_cr3, sai->base + reg_cr3);
322 break; 264 break;
323 default: 265 default:
324 return -EINVAL; 266 return -EINVAL;
@@ -331,16 +273,32 @@ static int fsl_sai_startup(struct snd_pcm_substream *substream,
331 struct snd_soc_dai *cpu_dai) 273 struct snd_soc_dai *cpu_dai)
332{ 274{
333 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 275 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
276 u32 reg;
334 277
335 return clk_prepare_enable(sai->clk); 278 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
279 reg = FSL_SAI_TCR3;
280 else
281 reg = FSL_SAI_RCR3;
282
283 regmap_update_bits(sai->regmap, reg, FSL_SAI_CR3_TRCE,
284 FSL_SAI_CR3_TRCE);
285
286 return 0;
336} 287}
337 288
338static void fsl_sai_shutdown(struct snd_pcm_substream *substream, 289static void fsl_sai_shutdown(struct snd_pcm_substream *substream,
339 struct snd_soc_dai *cpu_dai) 290 struct snd_soc_dai *cpu_dai)
340{ 291{
341 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 292 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
293 u32 reg;
294
295 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
296 reg = FSL_SAI_TCR3;
297 else
298 reg = FSL_SAI_RCR3;
342 299
343 clk_disable_unprepare(sai->clk); 300 regmap_update_bits(sai->regmap, reg, FSL_SAI_CR3_TRCE,
301 ~FSL_SAI_CR3_TRCE);
344} 302}
345 303
346static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = { 304static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = {
@@ -355,18 +313,13 @@ static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = {
355static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai) 313static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai)
356{ 314{
357 struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev); 315 struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev);
358 int ret;
359
360 ret = clk_prepare_enable(sai->clk);
361 if (ret)
362 return ret;
363 316
364 sai_writel(sai, 0x0, sai->base + FSL_SAI_RCSR); 317 regmap_update_bits(sai->regmap, FSL_SAI_TCSR, 0xffffffff, 0x0);
365 sai_writel(sai, 0x0, sai->base + FSL_SAI_TCSR); 318 regmap_update_bits(sai->regmap, FSL_SAI_RCSR, 0xffffffff, 0x0);
366 sai_writel(sai, FSL_SAI_MAXBURST_TX * 2, sai->base + FSL_SAI_TCR1); 319 regmap_update_bits(sai->regmap, FSL_SAI_TCR1, FSL_SAI_CR1_RFW_MASK,
367 sai_writel(sai, FSL_SAI_MAXBURST_RX - 1, sai->base + FSL_SAI_RCR1); 320 FSL_SAI_MAXBURST_TX * 2);
368 321 regmap_update_bits(sai->regmap, FSL_SAI_RCR1, FSL_SAI_CR1_RFW_MASK,
369 clk_disable_unprepare(sai->clk); 322 FSL_SAI_MAXBURST_RX - 1);
370 323
371 snd_soc_dai_init_dma_data(cpu_dai, &sai->dma_params_tx, 324 snd_soc_dai_init_dma_data(cpu_dai, &sai->dma_params_tx,
372 &sai->dma_params_rx); 325 &sai->dma_params_rx);
@@ -397,26 +350,109 @@ static const struct snd_soc_component_driver fsl_component = {
397 .name = "fsl-sai", 350 .name = "fsl-sai",
398}; 351};
399 352
353static bool fsl_sai_readable_reg(struct device *dev, unsigned int reg)
354{
355 switch (reg) {
356 case FSL_SAI_TCSR:
357 case FSL_SAI_TCR1:
358 case FSL_SAI_TCR2:
359 case FSL_SAI_TCR3:
360 case FSL_SAI_TCR4:
361 case FSL_SAI_TCR5:
362 case FSL_SAI_TFR:
363 case FSL_SAI_TMR:
364 case FSL_SAI_RCSR:
365 case FSL_SAI_RCR1:
366 case FSL_SAI_RCR2:
367 case FSL_SAI_RCR3:
368 case FSL_SAI_RCR4:
369 case FSL_SAI_RCR5:
370 case FSL_SAI_RDR:
371 case FSL_SAI_RFR:
372 case FSL_SAI_RMR:
373 return true;
374 default:
375 return false;
376 }
377}
378
379static bool fsl_sai_volatile_reg(struct device *dev, unsigned int reg)
380{
381 switch (reg) {
382 case FSL_SAI_TFR:
383 case FSL_SAI_RFR:
384 case FSL_SAI_TDR:
385 case FSL_SAI_RDR:
386 return true;
387 default:
388 return false;
389 }
390
391}
392
393static bool fsl_sai_writeable_reg(struct device *dev, unsigned int reg)
394{
395 switch (reg) {
396 case FSL_SAI_TCSR:
397 case FSL_SAI_TCR1:
398 case FSL_SAI_TCR2:
399 case FSL_SAI_TCR3:
400 case FSL_SAI_TCR4:
401 case FSL_SAI_TCR5:
402 case FSL_SAI_TDR:
403 case FSL_SAI_TMR:
404 case FSL_SAI_RCSR:
405 case FSL_SAI_RCR1:
406 case FSL_SAI_RCR2:
407 case FSL_SAI_RCR3:
408 case FSL_SAI_RCR4:
409 case FSL_SAI_RCR5:
410 case FSL_SAI_RMR:
411 return true;
412 default:
413 return false;
414 }
415}
416
417static struct regmap_config fsl_sai_regmap_config = {
418 .reg_bits = 32,
419 .reg_stride = 4,
420 .val_bits = 32,
421
422 .max_register = FSL_SAI_RMR,
423 .readable_reg = fsl_sai_readable_reg,
424 .volatile_reg = fsl_sai_volatile_reg,
425 .writeable_reg = fsl_sai_writeable_reg,
426};
427
400static int fsl_sai_probe(struct platform_device *pdev) 428static int fsl_sai_probe(struct platform_device *pdev)
401{ 429{
402 struct device_node *np = pdev->dev.of_node; 430 struct device_node *np = pdev->dev.of_node;
403 struct fsl_sai *sai; 431 struct fsl_sai *sai;
404 struct resource *res; 432 struct resource *res;
433 void __iomem *base;
405 int ret; 434 int ret;
406 435
407 sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL); 436 sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL);
408 if (!sai) 437 if (!sai)
409 return -ENOMEM; 438 return -ENOMEM;
410 439
440 sai->big_endian_regs = of_property_read_bool(np, "big-endian-regs");
441 if (sai->big_endian_regs)
442 fsl_sai_regmap_config.val_format_endian = REGMAP_ENDIAN_BIG;
443
444 sai->big_endian_data = of_property_read_bool(np, "big-endian-data");
445
411 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 446 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
412 sai->base = devm_ioremap_resource(&pdev->dev, res); 447 base = devm_ioremap_resource(&pdev->dev, res);
413 if (IS_ERR(sai->base)) 448 if (IS_ERR(base))
414 return PTR_ERR(sai->base); 449 return PTR_ERR(base);
415 450
416 sai->clk = devm_clk_get(&pdev->dev, "sai"); 451 sai->regmap = devm_regmap_init_mmio_clk(&pdev->dev,
417 if (IS_ERR(sai->clk)) { 452 "sai", base, &fsl_sai_regmap_config);
418 dev_err(&pdev->dev, "Cannot get SAI's clock\n"); 453 if (IS_ERR(sai->regmap)) {
419 return PTR_ERR(sai->clk); 454 dev_err(&pdev->dev, "regmap init failed\n");
455 return PTR_ERR(sai->regmap);
420 } 456 }
421 457
422 sai->dma_params_rx.addr = res->start + FSL_SAI_RDR; 458 sai->dma_params_rx.addr = res->start + FSL_SAI_RDR;
@@ -424,9 +460,6 @@ static int fsl_sai_probe(struct platform_device *pdev)
424 sai->dma_params_rx.maxburst = FSL_SAI_MAXBURST_RX; 460 sai->dma_params_rx.maxburst = FSL_SAI_MAXBURST_RX;
425 sai->dma_params_tx.maxburst = FSL_SAI_MAXBURST_TX; 461 sai->dma_params_tx.maxburst = FSL_SAI_MAXBURST_TX;
426 462
427 sai->big_endian_regs = of_property_read_bool(np, "big-endian-regs");
428 sai->big_endian_data = of_property_read_bool(np, "big-endian-data");
429
430 platform_set_drvdata(pdev, sai); 463 platform_set_drvdata(pdev, sai);
431 464
432 ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, 465 ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h
index 41bb62e69361..1571459d13ec 100644
--- a/sound/soc/fsl/fsl_sai.h
+++ b/sound/soc/fsl/fsl_sai.h
@@ -15,31 +15,36 @@
15 SNDRV_PCM_FMTBIT_S20_3LE |\ 15 SNDRV_PCM_FMTBIT_S20_3LE |\
16 SNDRV_PCM_FMTBIT_S24_LE) 16 SNDRV_PCM_FMTBIT_S24_LE)
17 17
18/* SAI Register Map Register */
19#define FSL_SAI_TCSR 0x00 /* SAI Transmit Control */
20#define FSL_SAI_TCR1 0x04 /* SAI Transmit Configuration 1 */
21#define FSL_SAI_TCR2 0x08 /* SAI Transmit Configuration 2 */
22#define FSL_SAI_TCR3 0x0c /* SAI Transmit Configuration 3 */
23#define FSL_SAI_TCR4 0x10 /* SAI Transmit Configuration 4 */
24#define FSL_SAI_TCR5 0x14 /* SAI Transmit Configuration 5 */
25#define FSL_SAI_TDR 0x20 /* SAI Transmit Data */
26#define FSL_SAI_TFR 0x40 /* SAI Transmit FIFO */
27#define FSL_SAI_TMR 0x60 /* SAI Transmit Mask */
28#define FSL_SAI_RCSR 0x80 /* SAI Receive Control */
29#define FSL_SAI_RCR1 0x84 /* SAI Receive Configuration 1 */
30#define FSL_SAI_RCR2 0x88 /* SAI Receive Configuration 2 */
31#define FSL_SAI_RCR3 0x8c /* SAI Receive Configuration 3 */
32#define FSL_SAI_RCR4 0x90 /* SAI Receive Configuration 4 */
33#define FSL_SAI_RCR5 0x94 /* SAI Receive Configuration 5 */
34#define FSL_SAI_RDR 0xa0 /* SAI Receive Data */
35#define FSL_SAI_RFR 0xc0 /* SAI Receive FIFO */
36#define FSL_SAI_RMR 0xe0 /* SAI Receive Mask */
37
18/* SAI Transmit/Recieve Control Register */ 38/* SAI Transmit/Recieve Control Register */
19#define FSL_SAI_TCSR 0x00
20#define FSL_SAI_RCSR 0x80
21#define FSL_SAI_CSR_TERE BIT(31) 39#define FSL_SAI_CSR_TERE BIT(31)
22#define FSL_SAI_CSR_FWF BIT(17) 40#define FSL_SAI_CSR_FWF BIT(17)
23#define FSL_SAI_CSR_FRIE BIT(8) 41#define FSL_SAI_CSR_FRIE BIT(8)
24#define FSL_SAI_CSR_FRDE BIT(0) 42#define FSL_SAI_CSR_FRDE BIT(0)
25 43
26/* SAI Transmit Data/FIFO/MASK Register */
27#define FSL_SAI_TDR 0x20
28#define FSL_SAI_TFR 0x40
29#define FSL_SAI_TMR 0x60
30
31/* SAI Recieve Data/FIFO/MASK Register */
32#define FSL_SAI_RDR 0xa0
33#define FSL_SAI_RFR 0xc0
34#define FSL_SAI_RMR 0xe0
35
36/* SAI Transmit and Recieve Configuration 1 Register */ 44/* SAI Transmit and Recieve Configuration 1 Register */
37#define FSL_SAI_TCR1 0x04 45#define FSL_SAI_CR1_RFW_MASK 0x1f
38#define FSL_SAI_RCR1 0x84
39 46
40/* SAI Transmit and Recieve Configuration 2 Register */ 47/* SAI Transmit and Recieve Configuration 2 Register */
41#define FSL_SAI_TCR2 0x08
42#define FSL_SAI_RCR2 0x88
43#define FSL_SAI_CR2_SYNC BIT(30) 48#define FSL_SAI_CR2_SYNC BIT(30)
44#define FSL_SAI_CR2_MSEL_MASK (0xff << 26) 49#define FSL_SAI_CR2_MSEL_MASK (0xff << 26)
45#define FSL_SAI_CR2_MSEL_BUS 0 50#define FSL_SAI_CR2_MSEL_BUS 0
@@ -50,15 +55,11 @@
50#define FSL_SAI_CR2_BCD_MSTR BIT(24) 55#define FSL_SAI_CR2_BCD_MSTR BIT(24)
51 56
52/* SAI Transmit and Recieve Configuration 3 Register */ 57/* SAI Transmit and Recieve Configuration 3 Register */
53#define FSL_SAI_TCR3 0x0c
54#define FSL_SAI_RCR3 0x8c
55#define FSL_SAI_CR3_TRCE BIT(16) 58#define FSL_SAI_CR3_TRCE BIT(16)
56#define FSL_SAI_CR3_WDFL(x) (x) 59#define FSL_SAI_CR3_WDFL(x) (x)
57#define FSL_SAI_CR3_WDFL_MASK 0x1f 60#define FSL_SAI_CR3_WDFL_MASK 0x1f
58 61
59/* SAI Transmit and Recieve Configuration 4 Register */ 62/* SAI Transmit and Recieve Configuration 4 Register */
60#define FSL_SAI_TCR4 0x10
61#define FSL_SAI_RCR4 0x90
62#define FSL_SAI_CR4_FRSZ(x) (((x) - 1) << 16) 63#define FSL_SAI_CR4_FRSZ(x) (((x) - 1) << 16)
63#define FSL_SAI_CR4_FRSZ_MASK (0x1f << 16) 64#define FSL_SAI_CR4_FRSZ_MASK (0x1f << 16)
64#define FSL_SAI_CR4_SYWD(x) (((x) - 1) << 8) 65#define FSL_SAI_CR4_SYWD(x) (((x) - 1) << 8)
@@ -69,8 +70,6 @@
69#define FSL_SAI_CR4_FSD_MSTR BIT(0) 70#define FSL_SAI_CR4_FSD_MSTR BIT(0)
70 71
71/* SAI Transmit and Recieve Configuration 5 Register */ 72/* SAI Transmit and Recieve Configuration 5 Register */
72#define FSL_SAI_TCR5 0x14
73#define FSL_SAI_RCR5 0x94
74#define FSL_SAI_CR5_WNW(x) (((x) - 1) << 24) 73#define FSL_SAI_CR5_WNW(x) (((x) - 1) << 24)
75#define FSL_SAI_CR5_WNW_MASK (0x1f << 24) 74#define FSL_SAI_CR5_WNW_MASK (0x1f << 24)
76#define FSL_SAI_CR5_W0W(x) (((x) - 1) << 16) 75#define FSL_SAI_CR5_W0W(x) (((x) - 1) << 16)
@@ -100,9 +99,7 @@
100#define FSL_SAI_MAXBURST_RX 6 99#define FSL_SAI_MAXBURST_RX 6
101 100
102struct fsl_sai { 101struct fsl_sai {
103 struct clk *clk; 102 struct regmap *regmap;
104
105 void __iomem *base;
106 103
107 bool big_endian_regs; 104 bool big_endian_regs;
108 bool big_endian_data; 105 bool big_endian_data;