ASoC: davinci-mcasp: Support for McASP version found in DRA7xx
[firefly-linux-kernel-4.4.55.git] / sound / soc / davinci / davinci-mcasp.c
1 /*
2  * ALSA SoC McASP Audio Layer for TI DAVINCI processor
3  *
4  * Multi-channel Audio Serial Port Driver
5  *
6  * Author: Nirmal Pandey <n-pandey@ti.com>,
7  *         Suresh Rajashekara <suresh.r@ti.com>
8  *         Steve Chen <schen@.mvista.com>
9  *
10  * Copyright:   (C) 2009 MontaVista Software, Inc., <source@mvista.com>
11  * Copyright:   (C) 2009  Texas Instruments, India
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License version 2 as
15  * published by the Free Software Foundation.
16  */
17
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/device.h>
21 #include <linux/slab.h>
22 #include <linux/delay.h>
23 #include <linux/io.h>
24 #include <linux/pm_runtime.h>
25 #include <linux/of.h>
26 #include <linux/of_platform.h>
27 #include <linux/of_device.h>
28
29 #include <sound/core.h>
30 #include <sound/pcm.h>
31 #include <sound/pcm_params.h>
32 #include <sound/initval.h>
33 #include <sound/soc.h>
34 #include <sound/dmaengine_pcm.h>
35
36 #include "davinci-pcm.h"
37 #include "davinci-mcasp.h"
38
39 struct davinci_mcasp {
40         struct davinci_pcm_dma_params dma_params[2];
41         struct snd_dmaengine_dai_dma_data dma_data[2];
42         void __iomem *base;
43         u32 fifo_base;
44         struct device *dev;
45
46         /* McASP specific data */
47         int     tdm_slots;
48         u8      op_mode;
49         u8      num_serializer;
50         u8      *serial_dir;
51         u8      version;
52         u16     bclk_lrclk_ratio;
53         int     streams;
54
55         /* McASP FIFO related */
56         u8      txnumevt;
57         u8      rxnumevt;
58
59         bool    dat_port;
60
61 #ifdef CONFIG_PM_SLEEP
62         struct {
63                 u32     txfmtctl;
64                 u32     rxfmtctl;
65                 u32     txfmt;
66                 u32     rxfmt;
67                 u32     aclkxctl;
68                 u32     aclkrctl;
69                 u32     pdir;
70         } context;
71 #endif
72 };
73
74 static inline void mcasp_set_bits(void __iomem *reg, u32 val)
75 {
76         __raw_writel(__raw_readl(reg) | val, reg);
77 }
78
79 static inline void mcasp_clr_bits(void __iomem *reg, u32 val)
80 {
81         __raw_writel((__raw_readl(reg) & ~(val)), reg);
82 }
83
84 static inline void mcasp_mod_bits(void __iomem *reg, u32 val, u32 mask)
85 {
86         __raw_writel((__raw_readl(reg) & ~mask) | val, reg);
87 }
88
89 static inline void mcasp_set_reg(void __iomem *reg, u32 val)
90 {
91         __raw_writel(val, reg);
92 }
93
94 static inline u32 mcasp_get_reg(void __iomem *reg)
95 {
96         return (unsigned int)__raw_readl(reg);
97 }
98
99 static void mcasp_set_ctl_reg(void __iomem *regs, u32 val)
100 {
101         int i = 0;
102
103         mcasp_set_bits(regs, val);
104
105         /* programming GBLCTL needs to read back from GBLCTL and verfiy */
106         /* loop count is to avoid the lock-up */
107         for (i = 0; i < 1000; i++) {
108                 if ((mcasp_get_reg(regs) & val) == val)
109                         break;
110         }
111
112         if (i == 1000 && ((mcasp_get_reg(regs) & val) != val))
113                 printk(KERN_ERR "GBLCTL write error\n");
114 }
115
116 static bool mcasp_is_synchronous(struct davinci_mcasp *mcasp)
117 {
118         u32 rxfmctl = mcasp_get_reg(mcasp->base + DAVINCI_MCASP_RXFMCTL_REG);
119         u32 aclkxctl = mcasp_get_reg(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG);
120
121         return !(aclkxctl & TX_ASYNC) && rxfmctl & AFSRE;
122 }
123
124 static void mcasp_start_rx(struct davinci_mcasp *mcasp)
125 {
126         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
127         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
128
129         /*
130          * When ASYNC == 0 the transmit and receive sections operate
131          * synchronously from the transmit clock and frame sync. We need to make
132          * sure that the TX signlas are enabled when starting reception.
133          */
134         if (mcasp_is_synchronous(mcasp)) {
135                 mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG,
136                                   TXHCLKRST);
137                 mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG,
138                                   TXCLKRST);
139         }
140
141         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
142         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXBUF_REG, 0);
143
144         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
145         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
146         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXBUF_REG, 0);
147
148         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
149         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
150
151         if (mcasp_is_synchronous(mcasp))
152                 mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG,
153                                   TXFSRST);
154 }
155
156 static void mcasp_start_tx(struct davinci_mcasp *mcasp)
157 {
158         u8 offset = 0, i;
159         u32 cnt;
160
161         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
162         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
163         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
164         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
165
166         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
167         mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
168         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
169         for (i = 0; i < mcasp->num_serializer; i++) {
170                 if (mcasp->serial_dir[i] == TX_MODE) {
171                         offset = i;
172                         break;
173                 }
174         }
175
176         /* wait for TX ready */
177         cnt = 0;
178         while (!(mcasp_get_reg(mcasp->base + DAVINCI_MCASP_XRSRCTL_REG(offset)) &
179                  TXSTATE) && (cnt < 100000))
180                 cnt++;
181
182         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
183 }
184
185 static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
186 {
187         u32 reg;
188
189         mcasp->streams++;
190
191         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
192                 if (mcasp->txnumevt) {  /* enable FIFO */
193                         reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
194                         mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
195                         mcasp_set_bits(mcasp->base + reg, FIFO_ENABLE);
196                 }
197                 mcasp_start_tx(mcasp);
198         } else {
199                 if (mcasp->rxnumevt) {  /* enable FIFO */
200                         reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
201                         mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
202                         mcasp_set_bits(mcasp->base + reg, FIFO_ENABLE);
203                 }
204                 mcasp_start_rx(mcasp);
205         }
206 }
207
208 static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
209 {
210         /*
211          * In synchronous mode stop the TX clocks if no other stream is
212          * running
213          */
214         if (mcasp_is_synchronous(mcasp) && !mcasp->streams)
215                 mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, 0);
216
217         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, 0);
218         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
219 }
220
221 static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
222 {
223         u32 val = 0;
224
225         /*
226          * In synchronous mode keep TX clocks running if the capture stream is
227          * still running.
228          */
229         if (mcasp_is_synchronous(mcasp) && mcasp->streams)
230                 val =  TXHCLKRST | TXCLKRST | TXFSRST;
231
232         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, val);
233         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
234 }
235
236 static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
237 {
238         u32 reg;
239
240         mcasp->streams--;
241
242         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
243                 if (mcasp->txnumevt) {  /* disable FIFO */
244                         reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
245                         mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
246                 }
247                 mcasp_stop_tx(mcasp);
248         } else {
249                 if (mcasp->rxnumevt) {  /* disable FIFO */
250                         reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
251                         mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
252                 }
253                 mcasp_stop_rx(mcasp);
254         }
255 }
256
257 static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
258                                          unsigned int fmt)
259 {
260         struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
261         void __iomem *base = mcasp->base;
262
263         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
264         case SND_SOC_DAIFMT_DSP_B:
265         case SND_SOC_DAIFMT_AC97:
266                 mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
267                 mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
268                 break;
269         default:
270                 /* configure a full-word SYNC pulse (LRCLK) */
271                 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
272                 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
273
274                 /* make 1st data bit occur one ACLK cycle after the frame sync */
275                 mcasp_set_bits(base + DAVINCI_MCASP_TXFMT_REG, FSXDLY(1));
276                 mcasp_set_bits(base + DAVINCI_MCASP_RXFMT_REG, FSRDLY(1));
277                 break;
278         }
279
280         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
281         case SND_SOC_DAIFMT_CBS_CFS:
282                 /* codec is clock and frame slave */
283                 mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
284                 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
285
286                 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
287                 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
288
289                 mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
290                                 ACLKX | ACLKR);
291                 mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
292                                 AFSX | AFSR);
293                 break;
294         case SND_SOC_DAIFMT_CBM_CFS:
295                 /* codec is clock master and frame slave */
296                 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
297                 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
298
299                 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
300                 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
301
302                 mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
303                                 ACLKX | ACLKR);
304                 mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
305                                 AFSX | AFSR);
306                 break;
307         case SND_SOC_DAIFMT_CBM_CFM:
308                 /* codec is clock and frame master */
309                 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
310                 mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
311
312                 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
313                 mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
314
315                 mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
316                                 ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
317                 break;
318
319         default:
320                 return -EINVAL;
321         }
322
323         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
324         case SND_SOC_DAIFMT_IB_NF:
325                 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
326                 mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
327
328                 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
329                 mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
330                 break;
331
332         case SND_SOC_DAIFMT_NB_IF:
333                 mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
334                 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
335
336                 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
337                 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
338                 break;
339
340         case SND_SOC_DAIFMT_IB_IF:
341                 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
342                 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
343
344                 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
345                 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
346                 break;
347
348         case SND_SOC_DAIFMT_NB_NF:
349                 mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
350                 mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
351
352                 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
353                 mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
354                 break;
355
356         default:
357                 return -EINVAL;
358         }
359
360         return 0;
361 }
362
363 static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
364 {
365         struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
366
367         switch (div_id) {
368         case 0:         /* MCLK divider */
369                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG,
370                                AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
371                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_AHCLKRCTL_REG,
372                                AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
373                 break;
374
375         case 1:         /* BCLK divider */
376                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG,
377                                ACLKXDIV(div - 1), ACLKXDIV_MASK);
378                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_ACLKRCTL_REG,
379                                ACLKRDIV(div - 1), ACLKRDIV_MASK);
380                 break;
381
382         case 2:         /* BCLK/LRCLK ratio */
383                 mcasp->bclk_lrclk_ratio = div;
384                 break;
385
386         default:
387                 return -EINVAL;
388         }
389
390         return 0;
391 }
392
393 static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
394                                     unsigned int freq, int dir)
395 {
396         struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
397
398         if (dir == SND_SOC_CLOCK_OUT) {
399                 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
400                 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
401                 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG, AHCLKX);
402         } else {
403                 mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
404                 mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
405                 mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG, AHCLKX);
406         }
407
408         return 0;
409 }
410
411 static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
412                                        int word_length)
413 {
414         u32 fmt;
415         u32 tx_rotate = (word_length / 4) & 0x7;
416         u32 rx_rotate = (32 - word_length) / 4;
417         u32 mask = (1ULL << word_length) - 1;
418
419         /*
420          * if s BCLK-to-LRCLK ratio has been configured via the set_clkdiv()
421          * callback, take it into account here. That allows us to for example
422          * send 32 bits per channel to the codec, while only 16 of them carry
423          * audio payload.
424          * The clock ratio is given for a full period of data (for I2S format
425          * both left and right channels), so it has to be divided by number of
426          * tdm-slots (for I2S - divided by 2).
427          */
428         if (mcasp->bclk_lrclk_ratio)
429                 word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
430
431         /* mapping of the XSSZ bit-field as described in the datasheet */
432         fmt = (word_length >> 1) - 1;
433
434         if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
435                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMT_REG,
436                                 RXSSZ(fmt), RXSSZ(0x0F));
437                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
438                                 TXSSZ(fmt), TXSSZ(0x0F));
439                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
440                                 TXROT(tx_rotate), TXROT(7));
441                 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMT_REG,
442                                 RXROT(rx_rotate), RXROT(7));
443                 mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXMASK_REG,
444                                 mask);
445         }
446
447         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXMASK_REG, mask);
448
449         return 0;
450 }
451
452 static int davinci_hw_common_param(struct davinci_mcasp *mcasp, int stream,
453                                     int channels)
454 {
455         int i;
456         u8 tx_ser = 0;
457         u8 rx_ser = 0;
458         u8 ser;
459         u8 slots = mcasp->tdm_slots;
460         u8 max_active_serializers = (channels + slots - 1) / slots;
461         u32 reg;
462         /* Default configuration */
463         if (mcasp->version != MCASP_VERSION_4)
464                 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PWREMUMGT_REG,
465                                MCASP_SOFT);
466
467         /* All PINS as McASP */
468         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);
469
470         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
471                 mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
472                 mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_XEVTCTL_REG,
473                                 TXDATADMADIS);
474         } else {
475                 mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
476                 mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_REVTCTL_REG,
477                                 RXDATADMADIS);
478         }
479
480         for (i = 0; i < mcasp->num_serializer; i++) {
481                 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_XRSRCTL_REG(i),
482                                         mcasp->serial_dir[i]);
483                 if (mcasp->serial_dir[i] == TX_MODE &&
484                                         tx_ser < max_active_serializers) {
485                         mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG,
486                                         AXR(i));
487                         tx_ser++;
488                 } else if (mcasp->serial_dir[i] == RX_MODE &&
489                                         rx_ser < max_active_serializers) {
490                         mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG,
491                                         AXR(i));
492                         rx_ser++;
493                 } else {
494                         mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_XRSRCTL_REG(i),
495                                         SRMOD_INACTIVE, SRMOD_MASK);
496                 }
497         }
498
499         if (stream == SNDRV_PCM_STREAM_PLAYBACK)
500                 ser = tx_ser;
501         else
502                 ser = rx_ser;
503
504         if (ser < max_active_serializers) {
505                 dev_warn(mcasp->dev, "stream has more channels (%d) than are "
506                         "enabled in mcasp (%d)\n", channels, ser * slots);
507                 return -EINVAL;
508         }
509
510         if (mcasp->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
511                 if (mcasp->txnumevt * tx_ser > 64)
512                         mcasp->txnumevt = 1;
513
514                 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
515                 mcasp_mod_bits(mcasp->base + reg, tx_ser, NUMDMA_MASK);
516                 mcasp_mod_bits(mcasp->base + reg,
517                                ((mcasp->txnumevt * tx_ser) << 8), NUMEVT_MASK);
518         }
519
520         if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
521                 if (mcasp->rxnumevt * rx_ser > 64)
522                         mcasp->rxnumevt = 1;
523
524                 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
525                 mcasp_mod_bits(mcasp->base + reg, rx_ser, NUMDMA_MASK);
526                 mcasp_mod_bits(mcasp->base + reg,
527                                ((mcasp->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
528         }
529
530         return 0;
531 }
532
533 static void davinci_hw_param(struct davinci_mcasp *mcasp, int stream)
534 {
535         int i, active_slots;
536         u32 mask = 0;
537         u32 busel = 0;
538
539         active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots;
540         for (i = 0; i < active_slots; i++)
541                 mask |= (1 << i);
542
543         mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
544
545         if (!mcasp->dat_port)
546                 busel = TXSEL;
547
548         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
549                 /* bit stream is MSB first  with no delay */
550                 /* DSP_B mode */
551                 mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXTDM_REG, mask);
552                 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
553                                busel | TXORD);
554
555                 if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32))
556                         mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_TXFMCTL_REG,
557                                         FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF));
558                 else
559                         printk(KERN_ERR "playback tdm slot %d not supported\n",
560                                 mcasp->tdm_slots);
561         } else {
562                 /* bit stream is MSB first with no delay */
563                 /* DSP_B mode */
564                 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_RXFMT_REG,
565                                busel | RXORD);
566                 mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXTDM_REG, mask);
567
568                 if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32))
569                         mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMCTL_REG,
570                                         FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF));
571                 else
572                         printk(KERN_ERR "capture tdm slot %d not supported\n",
573                                 mcasp->tdm_slots);
574         }
575 }
576
577 /* S/PDIF */
578 static void davinci_hw_dit_param(struct davinci_mcasp *mcasp)
579 {
580         /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
581            and LSB first */
582         mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
583                                                 TXROT(6) | TXSSZ(15));
584
585         /* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */
586         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXFMCTL_REG,
587                                                 AFSXE | FSXMOD(0x180));
588
589         /* Set the TX tdm : for all the slots */
590         mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
591
592         /* Set the TX clock controls : div = 1 and internal */
593         mcasp_set_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG,
594                                                 ACLKXE | TX_ASYNC);
595
596         mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
597
598         /* Only 44100 and 48000 are valid, both have the same setting */
599         mcasp_set_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
600
601         /* Enable the DIT */
602         mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXDITCTL_REG, DITEN);
603 }
604
605 static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
606                                         struct snd_pcm_hw_params *params,
607                                         struct snd_soc_dai *cpu_dai)
608 {
609         struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
610         struct davinci_pcm_dma_params *dma_params =
611                                         &mcasp->dma_params[substream->stream];
612         struct snd_dmaengine_dai_dma_data *dma_data =
613                                         &mcasp->dma_data[substream->stream];
614         int word_length;
615         u8 fifo_level;
616         u8 slots = mcasp->tdm_slots;
617         u8 active_serializers;
618         int channels;
619         struct snd_interval *pcm_channels = hw_param_interval(params,
620                                         SNDRV_PCM_HW_PARAM_CHANNELS);
621         channels = pcm_channels->min;
622
623         active_serializers = (channels + slots - 1) / slots;
624
625         if (davinci_hw_common_param(mcasp, substream->stream, channels) == -EINVAL)
626                 return -EINVAL;
627         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
628                 fifo_level = mcasp->txnumevt * active_serializers;
629         else
630                 fifo_level = mcasp->rxnumevt * active_serializers;
631
632         if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
633                 davinci_hw_dit_param(mcasp);
634         else
635                 davinci_hw_param(mcasp, substream->stream);
636
637         switch (params_format(params)) {
638         case SNDRV_PCM_FORMAT_U8:
639         case SNDRV_PCM_FORMAT_S8:
640                 dma_params->data_type = 1;
641                 word_length = 8;
642                 break;
643
644         case SNDRV_PCM_FORMAT_U16_LE:
645         case SNDRV_PCM_FORMAT_S16_LE:
646                 dma_params->data_type = 2;
647                 word_length = 16;
648                 break;
649
650         case SNDRV_PCM_FORMAT_U24_3LE:
651         case SNDRV_PCM_FORMAT_S24_3LE:
652                 dma_params->data_type = 3;
653                 word_length = 24;
654                 break;
655
656         case SNDRV_PCM_FORMAT_U24_LE:
657         case SNDRV_PCM_FORMAT_S24_LE:
658         case SNDRV_PCM_FORMAT_U32_LE:
659         case SNDRV_PCM_FORMAT_S32_LE:
660                 dma_params->data_type = 4;
661                 word_length = 32;
662                 break;
663
664         default:
665                 printk(KERN_WARNING "davinci-mcasp: unsupported PCM format");
666                 return -EINVAL;
667         }
668
669         if (mcasp->version == MCASP_VERSION_2 && !fifo_level)
670                 dma_params->acnt = 4;
671         else
672                 dma_params->acnt = dma_params->data_type;
673
674         dma_params->fifo_level = fifo_level;
675         dma_data->maxburst = fifo_level;
676
677         davinci_config_channel_size(mcasp, word_length);
678
679         return 0;
680 }
681
682 static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
683                                      int cmd, struct snd_soc_dai *cpu_dai)
684 {
685         struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
686         int ret = 0;
687
688         switch (cmd) {
689         case SNDRV_PCM_TRIGGER_RESUME:
690         case SNDRV_PCM_TRIGGER_START:
691         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
692                 ret = pm_runtime_get_sync(mcasp->dev);
693                 if (IS_ERR_VALUE(ret))
694                         dev_err(mcasp->dev, "pm_runtime_get_sync() failed\n");
695                 davinci_mcasp_start(mcasp, substream->stream);
696                 break;
697
698         case SNDRV_PCM_TRIGGER_SUSPEND:
699                 davinci_mcasp_stop(mcasp, substream->stream);
700                 ret = pm_runtime_put_sync(mcasp->dev);
701                 if (IS_ERR_VALUE(ret))
702                         dev_err(mcasp->dev, "pm_runtime_put_sync() failed\n");
703                 break;
704
705         case SNDRV_PCM_TRIGGER_STOP:
706         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
707                 davinci_mcasp_stop(mcasp, substream->stream);
708                 break;
709
710         default:
711                 ret = -EINVAL;
712         }
713
714         return ret;
715 }
716
717 static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
718                                  struct snd_soc_dai *dai)
719 {
720         struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
721
722         if (mcasp->version == MCASP_VERSION_4)
723                 snd_soc_dai_set_dma_data(dai, substream,
724                                         &mcasp->dma_data[substream->stream]);
725         else
726                 snd_soc_dai_set_dma_data(dai, substream, mcasp->dma_params);
727
728         return 0;
729 }
730
731 static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
732         .startup        = davinci_mcasp_startup,
733         .trigger        = davinci_mcasp_trigger,
734         .hw_params      = davinci_mcasp_hw_params,
735         .set_fmt        = davinci_mcasp_set_dai_fmt,
736         .set_clkdiv     = davinci_mcasp_set_clkdiv,
737         .set_sysclk     = davinci_mcasp_set_sysclk,
738 };
739
740 #define DAVINCI_MCASP_RATES     SNDRV_PCM_RATE_8000_192000
741
742 #define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
743                                 SNDRV_PCM_FMTBIT_U8 | \
744                                 SNDRV_PCM_FMTBIT_S16_LE | \
745                                 SNDRV_PCM_FMTBIT_U16_LE | \
746                                 SNDRV_PCM_FMTBIT_S24_LE | \
747                                 SNDRV_PCM_FMTBIT_U24_LE | \
748                                 SNDRV_PCM_FMTBIT_S24_3LE | \
749                                 SNDRV_PCM_FMTBIT_U24_3LE | \
750                                 SNDRV_PCM_FMTBIT_S32_LE | \
751                                 SNDRV_PCM_FMTBIT_U32_LE)
752
753 static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
754         {
755                 .name           = "davinci-mcasp.0",
756                 .playback       = {
757                         .channels_min   = 2,
758                         .channels_max   = 32 * 16,
759                         .rates          = DAVINCI_MCASP_RATES,
760                         .formats        = DAVINCI_MCASP_PCM_FMTS,
761                 },
762                 .capture        = {
763                         .channels_min   = 2,
764                         .channels_max   = 32 * 16,
765                         .rates          = DAVINCI_MCASP_RATES,
766                         .formats        = DAVINCI_MCASP_PCM_FMTS,
767                 },
768                 .ops            = &davinci_mcasp_dai_ops,
769
770         },
771         {
772                 .name           = "davinci-mcasp.1",
773                 .playback       = {
774                         .channels_min   = 1,
775                         .channels_max   = 384,
776                         .rates          = DAVINCI_MCASP_RATES,
777                         .formats        = DAVINCI_MCASP_PCM_FMTS,
778                 },
779                 .ops            = &davinci_mcasp_dai_ops,
780         },
781
782 };
783
784 static const struct snd_soc_component_driver davinci_mcasp_component = {
785         .name           = "davinci-mcasp",
786 };
787
788 /* Some HW specific values and defaults. The rest is filled in from DT. */
789 static struct snd_platform_data dm646x_mcasp_pdata = {
790         .tx_dma_offset = 0x400,
791         .rx_dma_offset = 0x400,
792         .asp_chan_q = EVENTQ_0,
793         .version = MCASP_VERSION_1,
794 };
795
796 static struct snd_platform_data da830_mcasp_pdata = {
797         .tx_dma_offset = 0x2000,
798         .rx_dma_offset = 0x2000,
799         .asp_chan_q = EVENTQ_0,
800         .version = MCASP_VERSION_2,
801 };
802
803 static struct snd_platform_data omap2_mcasp_pdata = {
804         .tx_dma_offset = 0,
805         .rx_dma_offset = 0,
806         .asp_chan_q = EVENTQ_0,
807         .version = MCASP_VERSION_3,
808 };
809
810 static struct snd_platform_data dra7_mcasp_pdata = {
811         .tx_dma_offset = 0x200,
812         .rx_dma_offset = 0x284,
813         .asp_chan_q = EVENTQ_0,
814         .version = MCASP_VERSION_4,
815 };
816
817 static const struct of_device_id mcasp_dt_ids[] = {
818         {
819                 .compatible = "ti,dm646x-mcasp-audio",
820                 .data = &dm646x_mcasp_pdata,
821         },
822         {
823                 .compatible = "ti,da830-mcasp-audio",
824                 .data = &da830_mcasp_pdata,
825         },
826         {
827                 .compatible = "ti,am33xx-mcasp-audio",
828                 .data = &omap2_mcasp_pdata,
829         },
830         {
831                 .compatible = "ti,dra7-mcasp-audio",
832                 .data = &dra7_mcasp_pdata,
833         },
834         { /* sentinel */ }
835 };
836 MODULE_DEVICE_TABLE(of, mcasp_dt_ids);
837
838 static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
839                                                 struct platform_device *pdev)
840 {
841         struct device_node *np = pdev->dev.of_node;
842         struct snd_platform_data *pdata = NULL;
843         const struct of_device_id *match =
844                         of_match_device(mcasp_dt_ids, &pdev->dev);
845         struct of_phandle_args dma_spec;
846
847         const u32 *of_serial_dir32;
848         u32 val;
849         int i, ret = 0;
850
851         if (pdev->dev.platform_data) {
852                 pdata = pdev->dev.platform_data;
853                 return pdata;
854         } else if (match) {
855                 pdata = (struct snd_platform_data *) match->data;
856         } else {
857                 /* control shouldn't reach here. something is wrong */
858                 ret = -EINVAL;
859                 goto nodata;
860         }
861
862         ret = of_property_read_u32(np, "op-mode", &val);
863         if (ret >= 0)
864                 pdata->op_mode = val;
865
866         ret = of_property_read_u32(np, "tdm-slots", &val);
867         if (ret >= 0) {
868                 if (val < 2 || val > 32) {
869                         dev_err(&pdev->dev,
870                                 "tdm-slots must be in rage [2-32]\n");
871                         ret = -EINVAL;
872                         goto nodata;
873                 }
874
875                 pdata->tdm_slots = val;
876         }
877
878         of_serial_dir32 = of_get_property(np, "serial-dir", &val);
879         val /= sizeof(u32);
880         if (of_serial_dir32) {
881                 u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
882                                                  (sizeof(*of_serial_dir) * val),
883                                                  GFP_KERNEL);
884                 if (!of_serial_dir) {
885                         ret = -ENOMEM;
886                         goto nodata;
887                 }
888
889                 for (i = 0; i < val; i++)
890                         of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);
891
892                 pdata->num_serializer = val;
893                 pdata->serial_dir = of_serial_dir;
894         }
895
896         ret = of_property_match_string(np, "dma-names", "tx");
897         if (ret < 0)
898                 goto nodata;
899
900         ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
901                                          &dma_spec);
902         if (ret < 0)
903                 goto nodata;
904
905         pdata->tx_dma_channel = dma_spec.args[0];
906
907         ret = of_property_match_string(np, "dma-names", "rx");
908         if (ret < 0)
909                 goto nodata;
910
911         ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
912                                          &dma_spec);
913         if (ret < 0)
914                 goto nodata;
915
916         pdata->rx_dma_channel = dma_spec.args[0];
917
918         ret = of_property_read_u32(np, "tx-num-evt", &val);
919         if (ret >= 0)
920                 pdata->txnumevt = val;
921
922         ret = of_property_read_u32(np, "rx-num-evt", &val);
923         if (ret >= 0)
924                 pdata->rxnumevt = val;
925
926         ret = of_property_read_u32(np, "sram-size-playback", &val);
927         if (ret >= 0)
928                 pdata->sram_size_playback = val;
929
930         ret = of_property_read_u32(np, "sram-size-capture", &val);
931         if (ret >= 0)
932                 pdata->sram_size_capture = val;
933
934         return  pdata;
935
936 nodata:
937         if (ret < 0) {
938                 dev_err(&pdev->dev, "Error populating platform data, err %d\n",
939                         ret);
940                 pdata = NULL;
941         }
942         return  pdata;
943 }
944
945 static int davinci_mcasp_probe(struct platform_device *pdev)
946 {
947         struct davinci_pcm_dma_params *dma_data;
948         struct resource *mem, *ioarea, *res, *dat;
949         struct snd_platform_data *pdata;
950         struct davinci_mcasp *mcasp;
951         int ret;
952
953         if (!pdev->dev.platform_data && !pdev->dev.of_node) {
954                 dev_err(&pdev->dev, "No platform data supplied\n");
955                 return -EINVAL;
956         }
957
958         mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
959                            GFP_KERNEL);
960         if (!mcasp)
961                 return  -ENOMEM;
962
963         pdata = davinci_mcasp_set_pdata_from_of(pdev);
964         if (!pdata) {
965                 dev_err(&pdev->dev, "no platform data\n");
966                 return -EINVAL;
967         }
968
969         mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
970         if (!mem) {
971                 dev_warn(mcasp->dev,
972                          "\"mpu\" mem resource not found, using index 0\n");
973                 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
974                 if (!mem) {
975                         dev_err(&pdev->dev, "no mem resource?\n");
976                         return -ENODEV;
977                 }
978         }
979
980         ioarea = devm_request_mem_region(&pdev->dev, mem->start,
981                         resource_size(mem), pdev->name);
982         if (!ioarea) {
983                 dev_err(&pdev->dev, "Audio region already claimed\n");
984                 return -EBUSY;
985         }
986
987         pm_runtime_enable(&pdev->dev);
988
989         ret = pm_runtime_get_sync(&pdev->dev);
990         if (IS_ERR_VALUE(ret)) {
991                 dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
992                 return ret;
993         }
994
995         mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
996         if (!mcasp->base) {
997                 dev_err(&pdev->dev, "ioremap failed\n");
998                 ret = -ENOMEM;
999                 goto err_release_clk;
1000         }
1001
1002         mcasp->op_mode = pdata->op_mode;
1003         mcasp->tdm_slots = pdata->tdm_slots;
1004         mcasp->num_serializer = pdata->num_serializer;
1005         mcasp->serial_dir = pdata->serial_dir;
1006         mcasp->version = pdata->version;
1007         mcasp->txnumevt = pdata->txnumevt;
1008         mcasp->rxnumevt = pdata->rxnumevt;
1009
1010         mcasp->dev = &pdev->dev;
1011
1012         dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
1013         if (dat)
1014                 mcasp->dat_port = true;
1015
1016         dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1017         dma_data->asp_chan_q = pdata->asp_chan_q;
1018         dma_data->ram_chan_q = pdata->ram_chan_q;
1019         dma_data->sram_pool = pdata->sram_pool;
1020         dma_data->sram_size = pdata->sram_size_playback;
1021         if (dat)
1022                 dma_data->dma_addr = dat->start;
1023         else
1024                 dma_data->dma_addr = mem->start + pdata->tx_dma_offset;
1025
1026         /* Unconditional dmaengine stuff */
1027         mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = dma_data->dma_addr;
1028
1029         res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1030         if (res)
1031                 dma_data->channel = res->start;
1032         else
1033                 dma_data->channel = pdata->tx_dma_channel;
1034
1035         dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1036         dma_data->asp_chan_q = pdata->asp_chan_q;
1037         dma_data->ram_chan_q = pdata->ram_chan_q;
1038         dma_data->sram_pool = pdata->sram_pool;
1039         dma_data->sram_size = pdata->sram_size_capture;
1040         if (dat)
1041                 dma_data->dma_addr = dat->start;
1042         else
1043                 dma_data->dma_addr = mem->start + pdata->rx_dma_offset;
1044
1045         /* Unconditional dmaengine stuff */
1046         mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = dma_data->dma_addr;
1047
1048         if (mcasp->version < MCASP_VERSION_3) {
1049                 mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE;
1050                 /* dma_data->dma_addr is pointing to the data port address */
1051                 mcasp->dat_port = true;
1052         } else {
1053                 mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE;
1054         }
1055
1056         res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1057         if (res)
1058                 dma_data->channel = res->start;
1059         else
1060                 dma_data->channel = pdata->rx_dma_channel;
1061
1062         /* Unconditional dmaengine stuff */
1063         mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = "tx";
1064         mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = "rx";
1065
1066         dev_set_drvdata(&pdev->dev, mcasp);
1067         ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
1068                                          &davinci_mcasp_dai[pdata->op_mode], 1);
1069
1070         if (ret != 0)
1071                 goto err_release_clk;
1072
1073         if (mcasp->version != MCASP_VERSION_4) {
1074                 ret = davinci_soc_platform_register(&pdev->dev);
1075                 if (ret) {
1076                         dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
1077                         goto err_unregister_component;
1078                 }
1079         }
1080
1081         return 0;
1082
1083 err_unregister_component:
1084         snd_soc_unregister_component(&pdev->dev);
1085 err_release_clk:
1086         pm_runtime_put_sync(&pdev->dev);
1087         pm_runtime_disable(&pdev->dev);
1088         return ret;
1089 }
1090
1091 static int davinci_mcasp_remove(struct platform_device *pdev)
1092 {
1093         struct davinci_mcasp *mcasp = dev_get_drvdata(&pdev->dev);
1094
1095         snd_soc_unregister_component(&pdev->dev);
1096         if (mcasp->version != MCASP_VERSION_4)
1097                 davinci_soc_platform_unregister(&pdev->dev);
1098
1099         pm_runtime_put_sync(&pdev->dev);
1100         pm_runtime_disable(&pdev->dev);
1101
1102         return 0;
1103 }
1104
1105 #ifdef CONFIG_PM_SLEEP
1106 static int davinci_mcasp_suspend(struct device *dev)
1107 {
1108         struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
1109         void __iomem *base = mcasp->base;
1110
1111         mcasp->context.txfmtctl = mcasp_get_reg(base + DAVINCI_MCASP_TXFMCTL_REG);
1112         mcasp->context.rxfmtctl = mcasp_get_reg(base + DAVINCI_MCASP_RXFMCTL_REG);
1113         mcasp->context.txfmt = mcasp_get_reg(base + DAVINCI_MCASP_TXFMT_REG);
1114         mcasp->context.rxfmt = mcasp_get_reg(base + DAVINCI_MCASP_RXFMT_REG);
1115         mcasp->context.aclkxctl = mcasp_get_reg(base + DAVINCI_MCASP_ACLKXCTL_REG);
1116         mcasp->context.aclkrctl = mcasp_get_reg(base + DAVINCI_MCASP_ACLKRCTL_REG);
1117         mcasp->context.pdir = mcasp_get_reg(base + DAVINCI_MCASP_PDIR_REG);
1118
1119         return 0;
1120 }
1121
1122 static int davinci_mcasp_resume(struct device *dev)
1123 {
1124         struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
1125         void __iomem *base = mcasp->base;
1126
1127         mcasp_set_reg(base + DAVINCI_MCASP_TXFMCTL_REG, mcasp->context.txfmtctl);
1128         mcasp_set_reg(base + DAVINCI_MCASP_RXFMCTL_REG, mcasp->context.rxfmtctl);
1129         mcasp_set_reg(base + DAVINCI_MCASP_TXFMT_REG, mcasp->context.txfmt);
1130         mcasp_set_reg(base + DAVINCI_MCASP_RXFMT_REG, mcasp->context.rxfmt);
1131         mcasp_set_reg(base + DAVINCI_MCASP_ACLKXCTL_REG, mcasp->context.aclkxctl);
1132         mcasp_set_reg(base + DAVINCI_MCASP_ACLKRCTL_REG, mcasp->context.aclkrctl);
1133         mcasp_set_reg(base + DAVINCI_MCASP_PDIR_REG, mcasp->context.pdir);
1134
1135         return 0;
1136 }
1137 #endif
1138
1139 SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
1140                   davinci_mcasp_suspend,
1141                   davinci_mcasp_resume);
1142
1143 static struct platform_driver davinci_mcasp_driver = {
1144         .probe          = davinci_mcasp_probe,
1145         .remove         = davinci_mcasp_remove,
1146         .driver         = {
1147                 .name   = "davinci-mcasp",
1148                 .owner  = THIS_MODULE,
1149                 .pm     = &davinci_mcasp_pm_ops,
1150                 .of_match_table = mcasp_dt_ids,
1151         },
1152 };
1153
1154 module_platform_driver(davinci_mcasp_driver);
1155
1156 MODULE_AUTHOR("Steve Chen");
1157 MODULE_DESCRIPTION("TI DAVINCI McASP SoC Interface");
1158 MODULE_LICENSE("GPL");