55a03db6daafded8ccd60c5214e379313fe9cade
[cascardo/linux.git] / sound / soc / sh / fsi.c
1 /*
2  * Fifo-attached Serial Interface (FSI) support for SH7724
3  *
4  * Copyright (C) 2009 Renesas Solutions Corp.
5  * Kuninori Morimoto <morimoto.kuninori@renesas.com>
6  *
7  * Based on ssi.c
8  * Copyright (c) 2007 Manuel Lauss <mano@roarinelk.homelinux.net>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14
15 #include <linux/delay.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/io.h>
18 #include <linux/slab.h>
19 #include <sound/soc.h>
20 #include <sound/sh_fsi.h>
21
22 #define DO_FMT          0x0000
23 #define DOFF_CTL        0x0004
24 #define DOFF_ST         0x0008
25 #define DI_FMT          0x000C
26 #define DIFF_CTL        0x0010
27 #define DIFF_ST         0x0014
28 #define CKG1            0x0018
29 #define CKG2            0x001C
30 #define DIDT            0x0020
31 #define DODT            0x0024
32 #define MUTE_ST         0x0028
33 #define REG_END         MUTE_ST
34
35
36 #define CPU_INT_ST      0x01F4
37 #define CPU_IEMSK       0x01F8
38 #define CPU_IMSK        0x01FC
39 #define INT_ST          0x0200
40 #define IEMSK           0x0204
41 #define IMSK            0x0208
42 #define MUTE            0x020C
43 #define CLK_RST         0x0210
44 #define SOFT_RST        0x0214
45 #define FIFO_SZ         0x0218
46 #define MREG_START      CPU_INT_ST
47 #define MREG_END        FIFO_SZ
48
49 /* DO_FMT */
50 /* DI_FMT */
51 #define CR_FMT(param) ((param) << 4)
52 # define CR_MONO        0x0
53 # define CR_MONO_D      0x1
54 # define CR_PCM         0x2
55 # define CR_I2S         0x3
56 # define CR_TDM         0x4
57 # define CR_TDM_D       0x5
58
59 /* DOFF_CTL */
60 /* DIFF_CTL */
61 #define IRQ_HALF        0x00100000
62 #define FIFO_CLR        0x00000001
63
64 /* DOFF_ST */
65 #define ERR_OVER        0x00000010
66 #define ERR_UNDER       0x00000001
67 #define ST_ERR          (ERR_OVER | ERR_UNDER)
68
69 /* CLK_RST */
70 #define B_CLK           0x00000010
71 #define A_CLK           0x00000001
72
73 /* INT_ST */
74 #define INT_B_IN        (1 << 12)
75 #define INT_B_OUT       (1 << 8)
76 #define INT_A_IN        (1 << 4)
77 #define INT_A_OUT       (1 << 0)
78
79 /* SOFT_RST */
80 #define PBSR            (1 << 12) /* Port B Software Reset */
81 #define PASR            (1 <<  8) /* Port A Software Reset */
82 #define IR              (1 <<  4) /* Interrupt Reset */
83 #define FSISR           (1 <<  0) /* Software Reset */
84
85 /* FIFO_SZ */
86 #define OUT_SZ_MASK     0x7
87 #define BO_SZ_SHIFT     8
88 #define AO_SZ_SHIFT     0
89
90 #define FSI_RATES SNDRV_PCM_RATE_8000_96000
91
92 #define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
93
94 /************************************************************************
95
96
97                 struct
98
99
100 ************************************************************************/
101 struct fsi_priv {
102         void __iomem *base;
103         struct snd_pcm_substream *substream;
104         struct fsi_master *master;
105
106         int fifo_max;
107         int chan;
108
109         int byte_offset;
110         int period_len;
111         int buffer_len;
112         int periods;
113 };
114
115 struct fsi_regs {
116         u32 int_st;
117         u32 iemsk;
118         u32 imsk;
119 };
120
121 struct fsi_master {
122         void __iomem *base;
123         int irq;
124         struct fsi_priv fsia;
125         struct fsi_priv fsib;
126         struct fsi_regs *regs;
127         struct sh_fsi_platform_info *info;
128         spinlock_t lock;
129 };
130
131 /************************************************************************
132
133
134                 basic read write function
135
136
137 ************************************************************************/
138 static void __fsi_reg_write(u32 reg, u32 data)
139 {
140         /* valid data area is 24bit */
141         data &= 0x00ffffff;
142
143         __raw_writel(data, reg);
144 }
145
146 static u32 __fsi_reg_read(u32 reg)
147 {
148         return __raw_readl(reg);
149 }
150
151 static void __fsi_reg_mask_set(u32 reg, u32 mask, u32 data)
152 {
153         u32 val = __fsi_reg_read(reg);
154
155         val &= ~mask;
156         val |= data & mask;
157
158         __fsi_reg_write(reg, val);
159 }
160
161 static void fsi_reg_write(struct fsi_priv *fsi, u32 reg, u32 data)
162 {
163         if (reg > REG_END)
164                 return;
165
166         __fsi_reg_write((u32)(fsi->base + reg), data);
167 }
168
169 static u32 fsi_reg_read(struct fsi_priv *fsi, u32 reg)
170 {
171         if (reg > REG_END)
172                 return 0;
173
174         return __fsi_reg_read((u32)(fsi->base + reg));
175 }
176
177 static void fsi_reg_mask_set(struct fsi_priv *fsi, u32 reg, u32 mask, u32 data)
178 {
179         if (reg > REG_END)
180                 return;
181
182         __fsi_reg_mask_set((u32)(fsi->base + reg), mask, data);
183 }
184
185 static void fsi_master_write(struct fsi_master *master, u32 reg, u32 data)
186 {
187         unsigned long flags;
188
189         if ((reg < MREG_START) ||
190             (reg > MREG_END))
191                 return;
192
193         spin_lock_irqsave(&master->lock, flags);
194         __fsi_reg_write((u32)(master->base + reg), data);
195         spin_unlock_irqrestore(&master->lock, flags);
196 }
197
198 static u32 fsi_master_read(struct fsi_master *master, u32 reg)
199 {
200         u32 ret;
201         unsigned long flags;
202
203         if ((reg < MREG_START) ||
204             (reg > MREG_END))
205                 return 0;
206
207         spin_lock_irqsave(&master->lock, flags);
208         ret = __fsi_reg_read((u32)(master->base + reg));
209         spin_unlock_irqrestore(&master->lock, flags);
210
211         return ret;
212 }
213
214 static void fsi_master_mask_set(struct fsi_master *master,
215                                u32 reg, u32 mask, u32 data)
216 {
217         unsigned long flags;
218
219         if ((reg < MREG_START) ||
220             (reg > MREG_END))
221                 return;
222
223         spin_lock_irqsave(&master->lock, flags);
224         __fsi_reg_mask_set((u32)(master->base + reg), mask, data);
225         spin_unlock_irqrestore(&master->lock, flags);
226 }
227
228 /************************************************************************
229
230
231                 basic function
232
233
234 ************************************************************************/
235 static struct fsi_master *fsi_get_master(struct fsi_priv *fsi)
236 {
237         return fsi->master;
238 }
239
240 static int fsi_is_port_a(struct fsi_priv *fsi)
241 {
242         return fsi->master->base == fsi->base;
243 }
244
245 static struct snd_soc_dai *fsi_get_dai(struct snd_pcm_substream *substream)
246 {
247         struct snd_soc_pcm_runtime *rtd = substream->private_data;
248         struct snd_soc_dai_link *machine = rtd->dai;
249
250         return  machine->cpu_dai;
251 }
252
253 static struct fsi_priv *fsi_get_priv(struct snd_pcm_substream *substream)
254 {
255         struct snd_soc_dai *dai = fsi_get_dai(substream);
256
257         return dai->private_data;
258 }
259
260 static u32 fsi_get_info_flags(struct fsi_priv *fsi)
261 {
262         int is_porta = fsi_is_port_a(fsi);
263         struct fsi_master *master = fsi_get_master(fsi);
264
265         return is_porta ? master->info->porta_flags :
266                 master->info->portb_flags;
267 }
268
269 static int fsi_is_master_mode(struct fsi_priv *fsi, int is_play)
270 {
271         u32 mode;
272         u32 flags = fsi_get_info_flags(fsi);
273
274         mode = is_play ? SH_FSI_OUT_SLAVE_MODE : SH_FSI_IN_SLAVE_MODE;
275
276         /* return
277          * 1 : master mode
278          * 0 : slave mode
279          */
280
281         return (mode & flags) != mode;
282 }
283
284 static u32 fsi_port_ab_io_bit(struct fsi_priv *fsi, int is_play)
285 {
286         int is_porta = fsi_is_port_a(fsi);
287         u32 data;
288
289         if (is_porta)
290                 data = is_play ? (1 << 0) : (1 << 4);
291         else
292                 data = is_play ? (1 << 8) : (1 << 12);
293
294         return data;
295 }
296
297 static void fsi_stream_push(struct fsi_priv *fsi,
298                             struct snd_pcm_substream *substream,
299                             u32 buffer_len,
300                             u32 period_len)
301 {
302         fsi->substream          = substream;
303         fsi->buffer_len         = buffer_len;
304         fsi->period_len         = period_len;
305         fsi->byte_offset        = 0;
306         fsi->periods            = 0;
307 }
308
309 static void fsi_stream_pop(struct fsi_priv *fsi)
310 {
311         fsi->substream          = NULL;
312         fsi->buffer_len         = 0;
313         fsi->period_len         = 0;
314         fsi->byte_offset        = 0;
315         fsi->periods            = 0;
316 }
317
318 static int fsi_get_fifo_residue(struct fsi_priv *fsi, int is_play)
319 {
320         u32 status;
321         u32 reg = is_play ? DOFF_ST : DIFF_ST;
322         int residue;
323
324         status = fsi_reg_read(fsi, reg);
325         residue = 0x1ff & (status >> 8);
326         residue *= fsi->chan;
327
328         return residue;
329 }
330
331 /************************************************************************
332
333
334                 irq function
335
336
337 ************************************************************************/
338 static void fsi_irq_enable(struct fsi_priv *fsi, int is_play)
339 {
340         u32 data = fsi_port_ab_io_bit(fsi, is_play);
341         struct fsi_master *master = fsi_get_master(fsi);
342
343         fsi_master_mask_set(master, master->regs->imsk,  data, data);
344         fsi_master_mask_set(master, master->regs->iemsk, data, data);
345 }
346
347 static void fsi_irq_disable(struct fsi_priv *fsi, int is_play)
348 {
349         u32 data = fsi_port_ab_io_bit(fsi, is_play);
350         struct fsi_master *master = fsi_get_master(fsi);
351
352         fsi_master_mask_set(master, master->regs->imsk,  data, 0);
353         fsi_master_mask_set(master, master->regs->iemsk, data, 0);
354 }
355
356 static u32 fsi_irq_get_status(struct fsi_master *master)
357 {
358         return fsi_master_read(master, master->regs->int_st);
359 }
360
361 static void fsi_irq_clear_all_status(struct fsi_master *master)
362 {
363         fsi_master_write(master, master->regs->int_st, 0x0000000);
364 }
365
366 static void fsi_irq_clear_status(struct fsi_priv *fsi)
367 {
368         u32 data = 0;
369         struct fsi_master *master = fsi_get_master(fsi);
370
371         data |= fsi_port_ab_io_bit(fsi, 0);
372         data |= fsi_port_ab_io_bit(fsi, 1);
373
374         /* clear interrupt factor */
375         fsi_master_mask_set(master, master->regs->int_st, data, 0);
376 }
377
378 /************************************************************************
379
380
381                 ctrl function
382
383
384 ************************************************************************/
385 static void fsi_clk_ctrl(struct fsi_priv *fsi, int enable)
386 {
387         u32 val = fsi_is_port_a(fsi) ? (1 << 0) : (1 << 4);
388         struct fsi_master *master = fsi_get_master(fsi);
389
390         if (enable)
391                 fsi_master_mask_set(master, CLK_RST, val, val);
392         else
393                 fsi_master_mask_set(master, CLK_RST, val, 0);
394 }
395
396 static void fsi_fifo_init(struct fsi_priv *fsi,
397                           int is_play,
398                           struct snd_soc_dai *dai)
399 {
400         struct fsi_master *master = fsi_get_master(fsi);
401         u32 ctrl, shift, i;
402
403         /* get on-chip RAM capacity */
404         shift = fsi_master_read(master, FIFO_SZ);
405         shift >>= fsi_is_port_a(fsi) ? AO_SZ_SHIFT : BO_SZ_SHIFT;
406         shift &= OUT_SZ_MASK;
407         fsi->fifo_max = 256 << shift;
408         dev_dbg(dai->dev, "fifo = %d words\n", fsi->fifo_max);
409
410         /*
411          * The maximum number of sample data varies depending
412          * on the number of channels selected for the format.
413          *
414          * FIFOs are used in 4-channel units in 3-channel mode
415          * and in 8-channel units in 5- to 7-channel mode
416          * meaning that more FIFOs than the required size of DPRAM
417          * are used.
418          *
419          * ex) if 256 words of DP-RAM is connected
420          * 1 channel:  256 (256 x 1 = 256)
421          * 2 channels: 128 (128 x 2 = 256)
422          * 3 channels:  64 ( 64 x 3 = 192)
423          * 4 channels:  64 ( 64 x 4 = 256)
424          * 5 channels:  32 ( 32 x 5 = 160)
425          * 6 channels:  32 ( 32 x 6 = 192)
426          * 7 channels:  32 ( 32 x 7 = 224)
427          * 8 channels:  32 ( 32 x 8 = 256)
428          */
429         for (i = 1; i < fsi->chan; i <<= 1)
430                 fsi->fifo_max >>= 1;
431         dev_dbg(dai->dev, "%d channel %d store\n", fsi->chan, fsi->fifo_max);
432
433         ctrl = is_play ? DOFF_CTL : DIFF_CTL;
434
435         /* set interrupt generation factor */
436         fsi_reg_write(fsi, ctrl, IRQ_HALF);
437
438         /* clear FIFO */
439         fsi_reg_mask_set(fsi, ctrl, FIFO_CLR, FIFO_CLR);
440 }
441
442 static void fsi_soft_all_reset(struct fsi_master *master)
443 {
444         /* port AB reset */
445         fsi_master_mask_set(master, SOFT_RST, PASR | PBSR, 0);
446         mdelay(10);
447
448         /* soft reset */
449         fsi_master_mask_set(master, SOFT_RST, FSISR, 0);
450         fsi_master_mask_set(master, SOFT_RST, FSISR, FSISR);
451         mdelay(10);
452 }
453
454 /* playback interrupt */
455 static int fsi_data_push(struct fsi_priv *fsi, int startup)
456 {
457         struct snd_pcm_runtime *runtime;
458         struct snd_pcm_substream *substream = NULL;
459         u32 status;
460         int send;
461         int fifo_free;
462         int width;
463         u8 *start;
464         int i, over_period;
465
466         if (!fsi                        ||
467             !fsi->substream             ||
468             !fsi->substream->runtime)
469                 return -EINVAL;
470
471         over_period     = 0;
472         substream       = fsi->substream;
473         runtime         = substream->runtime;
474
475         /* FSI FIFO has limit.
476          * So, this driver can not send periods data at a time
477          */
478         if (fsi->byte_offset >=
479             fsi->period_len * (fsi->periods + 1)) {
480
481                 over_period = 1;
482                 fsi->periods = (fsi->periods + 1) % runtime->periods;
483
484                 if (0 == fsi->periods)
485                         fsi->byte_offset = 0;
486         }
487
488         /* get 1 channel data width */
489         width = frames_to_bytes(runtime, 1) / fsi->chan;
490
491         /* get send size for alsa */
492         send = (fsi->buffer_len - fsi->byte_offset) / width;
493
494         /*  get FIFO free size */
495         fifo_free = (fsi->fifo_max * fsi->chan) - fsi_get_fifo_residue(fsi, 1);
496
497         /* size check */
498         if (fifo_free < send)
499                 send = fifo_free;
500
501         start = runtime->dma_area;
502         start += fsi->byte_offset;
503
504         switch (width) {
505         case 2:
506                 for (i = 0; i < send; i++)
507                         fsi_reg_write(fsi, DODT,
508                                       ((u32)*((u16 *)start + i) << 8));
509                 break;
510         case 4:
511                 for (i = 0; i < send; i++)
512                         fsi_reg_write(fsi, DODT, *((u32 *)start + i));
513                 break;
514         default:
515                 return -EINVAL;
516         }
517
518         fsi->byte_offset += send * width;
519
520         status = fsi_reg_read(fsi, DOFF_ST);
521         if (!startup) {
522                 struct snd_soc_dai *dai = fsi_get_dai(substream);
523
524                 if (status & ERR_OVER)
525                         dev_err(dai->dev, "over run\n");
526                 if (status & ERR_UNDER)
527                         dev_err(dai->dev, "under run\n");
528         }
529         fsi_reg_write(fsi, DOFF_ST, 0);
530
531         fsi_irq_enable(fsi, 1);
532
533         if (over_period)
534                 snd_pcm_period_elapsed(substream);
535
536         return 0;
537 }
538
539 static int fsi_data_pop(struct fsi_priv *fsi, int startup)
540 {
541         struct snd_pcm_runtime *runtime;
542         struct snd_pcm_substream *substream = NULL;
543         u32 status;
544         int free;
545         int fifo_fill;
546         int width;
547         u8 *start;
548         int i, over_period;
549
550         if (!fsi                        ||
551             !fsi->substream             ||
552             !fsi->substream->runtime)
553                 return -EINVAL;
554
555         over_period     = 0;
556         substream       = fsi->substream;
557         runtime         = substream->runtime;
558
559         /* FSI FIFO has limit.
560          * So, this driver can not send periods data at a time
561          */
562         if (fsi->byte_offset >=
563             fsi->period_len * (fsi->periods + 1)) {
564
565                 over_period = 1;
566                 fsi->periods = (fsi->periods + 1) % runtime->periods;
567
568                 if (0 == fsi->periods)
569                         fsi->byte_offset = 0;
570         }
571
572         /* get 1 channel data width */
573         width = frames_to_bytes(runtime, 1) / fsi->chan;
574
575         /* get free space for alsa */
576         free = (fsi->buffer_len - fsi->byte_offset) / width;
577
578         /* get recv size */
579         fifo_fill = fsi_get_fifo_residue(fsi, 0);
580
581         if (free < fifo_fill)
582                 fifo_fill = free;
583
584         start = runtime->dma_area;
585         start += fsi->byte_offset;
586
587         switch (width) {
588         case 2:
589                 for (i = 0; i < fifo_fill; i++)
590                         *((u16 *)start + i) =
591                                 (u16)(fsi_reg_read(fsi, DIDT) >> 8);
592                 break;
593         case 4:
594                 for (i = 0; i < fifo_fill; i++)
595                         *((u32 *)start + i) = fsi_reg_read(fsi, DIDT);
596                 break;
597         default:
598                 return -EINVAL;
599         }
600
601         fsi->byte_offset += fifo_fill * width;
602
603         status = fsi_reg_read(fsi, DIFF_ST);
604         if (!startup) {
605                 struct snd_soc_dai *dai = fsi_get_dai(substream);
606
607                 if (status & ERR_OVER)
608                         dev_err(dai->dev, "over run\n");
609                 if (status & ERR_UNDER)
610                         dev_err(dai->dev, "under run\n");
611         }
612         fsi_reg_write(fsi, DIFF_ST, 0);
613
614         fsi_irq_enable(fsi, 0);
615
616         if (over_period)
617                 snd_pcm_period_elapsed(substream);
618
619         return 0;
620 }
621
622 static irqreturn_t fsi_interrupt(int irq, void *data)
623 {
624         struct fsi_master *master = data;
625         u32 int_st = fsi_irq_get_status(master);
626
627         /* clear irq status */
628         fsi_master_mask_set(master, SOFT_RST, IR, 0);
629         fsi_master_mask_set(master, SOFT_RST, IR, IR);
630
631         if (int_st & INT_A_OUT)
632                 fsi_data_push(&master->fsia, 0);
633         if (int_st & INT_B_OUT)
634                 fsi_data_push(&master->fsib, 0);
635         if (int_st & INT_A_IN)
636                 fsi_data_pop(&master->fsia, 0);
637         if (int_st & INT_B_IN)
638                 fsi_data_pop(&master->fsib, 0);
639
640         fsi_irq_clear_all_status(master);
641
642         return IRQ_HANDLED;
643 }
644
645 /************************************************************************
646
647
648                 dai ops
649
650
651 ************************************************************************/
652 static int fsi_dai_startup(struct snd_pcm_substream *substream,
653                            struct snd_soc_dai *dai)
654 {
655         struct fsi_priv *fsi = fsi_get_priv(substream);
656         u32 flags = fsi_get_info_flags(fsi);
657         u32 fmt;
658         u32 reg;
659         u32 data;
660         int is_play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
661         int is_master;
662         int ret = 0;
663
664         pm_runtime_get_sync(dai->dev);
665
666         /* CKG1 */
667         data = is_play ? (1 << 0) : (1 << 4);
668         is_master = fsi_is_master_mode(fsi, is_play);
669         if (is_master)
670                 fsi_reg_mask_set(fsi, CKG1, data, data);
671         else
672                 fsi_reg_mask_set(fsi, CKG1, data, 0);
673
674         /* clock inversion (CKG2) */
675         data = 0;
676         if (SH_FSI_LRM_INV & flags)
677                 data |= 1 << 12;
678         if (SH_FSI_BRM_INV & flags)
679                 data |= 1 << 8;
680         if (SH_FSI_LRS_INV & flags)
681                 data |= 1 << 4;
682         if (SH_FSI_BRS_INV & flags)
683                 data |= 1 << 0;
684
685         fsi_reg_write(fsi, CKG2, data);
686
687         /* do fmt, di fmt */
688         data = 0;
689         reg = is_play ? DO_FMT : DI_FMT;
690         fmt = is_play ? SH_FSI_GET_OFMT(flags) : SH_FSI_GET_IFMT(flags);
691         switch (fmt) {
692         case SH_FSI_FMT_MONO:
693                 data = CR_FMT(CR_MONO);
694                 fsi->chan = 1;
695                 break;
696         case SH_FSI_FMT_MONO_DELAY:
697                 data = CR_FMT(CR_MONO_D);
698                 fsi->chan = 1;
699                 break;
700         case SH_FSI_FMT_PCM:
701                 data = CR_FMT(CR_PCM);
702                 fsi->chan = 2;
703                 break;
704         case SH_FSI_FMT_I2S:
705                 data = CR_FMT(CR_I2S);
706                 fsi->chan = 2;
707                 break;
708         case SH_FSI_FMT_TDM:
709                 fsi->chan = is_play ?
710                         SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags);
711                 data = CR_FMT(CR_TDM) | (fsi->chan - 1);
712                 break;
713         case SH_FSI_FMT_TDM_DELAY:
714                 fsi->chan = is_play ?
715                         SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags);
716                 data = CR_FMT(CR_TDM_D) | (fsi->chan - 1);
717                 break;
718         default:
719                 dev_err(dai->dev, "unknown format.\n");
720                 return -EINVAL;
721         }
722         fsi_reg_write(fsi, reg, data);
723
724         /*
725          * clear clk reset if master mode
726          */
727         if (is_master)
728                 fsi_clk_ctrl(fsi, 1);
729
730         /* irq clear */
731         fsi_irq_disable(fsi, is_play);
732         fsi_irq_clear_status(fsi);
733
734         /* fifo init */
735         fsi_fifo_init(fsi, is_play, dai);
736
737         return ret;
738 }
739
740 static void fsi_dai_shutdown(struct snd_pcm_substream *substream,
741                              struct snd_soc_dai *dai)
742 {
743         struct fsi_priv *fsi = fsi_get_priv(substream);
744         int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
745
746         fsi_irq_disable(fsi, is_play);
747         fsi_clk_ctrl(fsi, 0);
748
749         pm_runtime_put_sync(dai->dev);
750 }
751
752 static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd,
753                            struct snd_soc_dai *dai)
754 {
755         struct fsi_priv *fsi = fsi_get_priv(substream);
756         struct snd_pcm_runtime *runtime = substream->runtime;
757         int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
758         int ret = 0;
759
760         switch (cmd) {
761         case SNDRV_PCM_TRIGGER_START:
762                 fsi_stream_push(fsi, substream,
763                                 frames_to_bytes(runtime, runtime->buffer_size),
764                                 frames_to_bytes(runtime, runtime->period_size));
765                 ret = is_play ? fsi_data_push(fsi, 1) : fsi_data_pop(fsi, 1);
766                 break;
767         case SNDRV_PCM_TRIGGER_STOP:
768                 fsi_irq_disable(fsi, is_play);
769                 fsi_stream_pop(fsi);
770                 break;
771         }
772
773         return ret;
774 }
775
776 static struct snd_soc_dai_ops fsi_dai_ops = {
777         .startup        = fsi_dai_startup,
778         .shutdown       = fsi_dai_shutdown,
779         .trigger        = fsi_dai_trigger,
780 };
781
782 /************************************************************************
783
784
785                 pcm ops
786
787
788 ************************************************************************/
789 static struct snd_pcm_hardware fsi_pcm_hardware = {
790         .info =         SNDRV_PCM_INFO_INTERLEAVED      |
791                         SNDRV_PCM_INFO_MMAP             |
792                         SNDRV_PCM_INFO_MMAP_VALID       |
793                         SNDRV_PCM_INFO_PAUSE,
794         .formats                = FSI_FMTS,
795         .rates                  = FSI_RATES,
796         .rate_min               = 8000,
797         .rate_max               = 192000,
798         .channels_min           = 1,
799         .channels_max           = 2,
800         .buffer_bytes_max       = 64 * 1024,
801         .period_bytes_min       = 32,
802         .period_bytes_max       = 8192,
803         .periods_min            = 1,
804         .periods_max            = 32,
805         .fifo_size              = 256,
806 };
807
808 static int fsi_pcm_open(struct snd_pcm_substream *substream)
809 {
810         struct snd_pcm_runtime *runtime = substream->runtime;
811         int ret = 0;
812
813         snd_soc_set_runtime_hwparams(substream, &fsi_pcm_hardware);
814
815         ret = snd_pcm_hw_constraint_integer(runtime,
816                                             SNDRV_PCM_HW_PARAM_PERIODS);
817
818         return ret;
819 }
820
821 static int fsi_hw_params(struct snd_pcm_substream *substream,
822                          struct snd_pcm_hw_params *hw_params)
823 {
824         return snd_pcm_lib_malloc_pages(substream,
825                                         params_buffer_bytes(hw_params));
826 }
827
828 static int fsi_hw_free(struct snd_pcm_substream *substream)
829 {
830         return snd_pcm_lib_free_pages(substream);
831 }
832
833 static snd_pcm_uframes_t fsi_pointer(struct snd_pcm_substream *substream)
834 {
835         struct snd_pcm_runtime *runtime = substream->runtime;
836         struct fsi_priv *fsi = fsi_get_priv(substream);
837         long location;
838
839         location = (fsi->byte_offset - 1);
840         if (location < 0)
841                 location = 0;
842
843         return bytes_to_frames(runtime, location);
844 }
845
846 static struct snd_pcm_ops fsi_pcm_ops = {
847         .open           = fsi_pcm_open,
848         .ioctl          = snd_pcm_lib_ioctl,
849         .hw_params      = fsi_hw_params,
850         .hw_free        = fsi_hw_free,
851         .pointer        = fsi_pointer,
852 };
853
854 /************************************************************************
855
856
857                 snd_soc_platform
858
859
860 ************************************************************************/
861 #define PREALLOC_BUFFER         (32 * 1024)
862 #define PREALLOC_BUFFER_MAX     (32 * 1024)
863
864 static void fsi_pcm_free(struct snd_pcm *pcm)
865 {
866         snd_pcm_lib_preallocate_free_for_all(pcm);
867 }
868
869 static int fsi_pcm_new(struct snd_card *card,
870                        struct snd_soc_dai *dai,
871                        struct snd_pcm *pcm)
872 {
873         /*
874          * dont use SNDRV_DMA_TYPE_DEV, since it will oops the SH kernel
875          * in MMAP mode (i.e. aplay -M)
876          */
877         return snd_pcm_lib_preallocate_pages_for_all(
878                 pcm,
879                 SNDRV_DMA_TYPE_CONTINUOUS,
880                 snd_dma_continuous_data(GFP_KERNEL),
881                 PREALLOC_BUFFER, PREALLOC_BUFFER_MAX);
882 }
883
884 /************************************************************************
885
886
887                 alsa struct
888
889
890 ************************************************************************/
891 struct snd_soc_dai fsi_soc_dai[] = {
892         {
893                 .name                   = "FSIA",
894                 .id                     = 0,
895                 .playback = {
896                         .rates          = FSI_RATES,
897                         .formats        = FSI_FMTS,
898                         .channels_min   = 1,
899                         .channels_max   = 8,
900                 },
901                 .capture = {
902                         .rates          = FSI_RATES,
903                         .formats        = FSI_FMTS,
904                         .channels_min   = 1,
905                         .channels_max   = 8,
906                 },
907                 .ops = &fsi_dai_ops,
908         },
909         {
910                 .name                   = "FSIB",
911                 .id                     = 1,
912                 .playback = {
913                         .rates          = FSI_RATES,
914                         .formats        = FSI_FMTS,
915                         .channels_min   = 1,
916                         .channels_max   = 8,
917                 },
918                 .capture = {
919                         .rates          = FSI_RATES,
920                         .formats        = FSI_FMTS,
921                         .channels_min   = 1,
922                         .channels_max   = 8,
923                 },
924                 .ops = &fsi_dai_ops,
925         },
926 };
927 EXPORT_SYMBOL_GPL(fsi_soc_dai);
928
929 struct snd_soc_platform fsi_soc_platform = {
930         .name           = "fsi-pcm",
931         .pcm_ops        = &fsi_pcm_ops,
932         .pcm_new        = fsi_pcm_new,
933         .pcm_free       = fsi_pcm_free,
934 };
935 EXPORT_SYMBOL_GPL(fsi_soc_platform);
936
937 /************************************************************************
938
939
940                 platform function
941
942
943 ************************************************************************/
944 static int fsi_probe(struct platform_device *pdev)
945 {
946         struct fsi_master *master;
947         const struct platform_device_id *id_entry;
948         struct resource *res;
949         unsigned int irq;
950         int ret;
951
952         if (0 != pdev->id) {
953                 dev_err(&pdev->dev, "current fsi support id 0 only now\n");
954                 return -ENODEV;
955         }
956
957         id_entry = pdev->id_entry;
958         if (!id_entry) {
959                 dev_err(&pdev->dev, "unknown fsi device\n");
960                 return -ENODEV;
961         }
962
963         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
964         irq = platform_get_irq(pdev, 0);
965         if (!res || (int)irq <= 0) {
966                 dev_err(&pdev->dev, "Not enough FSI platform resources.\n");
967                 ret = -ENODEV;
968                 goto exit;
969         }
970
971         master = kzalloc(sizeof(*master), GFP_KERNEL);
972         if (!master) {
973                 dev_err(&pdev->dev, "Could not allocate master\n");
974                 ret = -ENOMEM;
975                 goto exit;
976         }
977
978         master->base = ioremap_nocache(res->start, resource_size(res));
979         if (!master->base) {
980                 ret = -ENXIO;
981                 dev_err(&pdev->dev, "Unable to ioremap FSI registers.\n");
982                 goto exit_kfree;
983         }
984
985         master->irq             = irq;
986         master->info            = pdev->dev.platform_data;
987         master->fsia.base       = master->base;
988         master->fsia.master     = master;
989         master->fsib.base       = master->base + 0x40;
990         master->fsib.master     = master;
991         master->regs            = (struct fsi_regs *)id_entry->driver_data;
992         spin_lock_init(&master->lock);
993
994         pm_runtime_enable(&pdev->dev);
995         pm_runtime_resume(&pdev->dev);
996
997         fsi_soc_dai[0].dev              = &pdev->dev;
998         fsi_soc_dai[0].private_data     = &master->fsia;
999         fsi_soc_dai[1].dev              = &pdev->dev;
1000         fsi_soc_dai[1].private_data     = &master->fsib;
1001
1002         fsi_soft_all_reset(master);
1003
1004         ret = request_irq(irq, &fsi_interrupt, IRQF_DISABLED,
1005                           id_entry->name, master);
1006         if (ret) {
1007                 dev_err(&pdev->dev, "irq request err\n");
1008                 goto exit_iounmap;
1009         }
1010
1011         ret = snd_soc_register_platform(&fsi_soc_platform);
1012         if (ret < 0) {
1013                 dev_err(&pdev->dev, "cannot snd soc register\n");
1014                 goto exit_free_irq;
1015         }
1016
1017         return snd_soc_register_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai));
1018
1019 exit_free_irq:
1020         free_irq(irq, master);
1021 exit_iounmap:
1022         iounmap(master->base);
1023         pm_runtime_disable(&pdev->dev);
1024 exit_kfree:
1025         kfree(master);
1026         master = NULL;
1027 exit:
1028         return ret;
1029 }
1030
1031 static int fsi_remove(struct platform_device *pdev)
1032 {
1033         struct fsi_master *master;
1034
1035         master = fsi_get_master(fsi_soc_dai[0].private_data);
1036
1037         snd_soc_unregister_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai));
1038         snd_soc_unregister_platform(&fsi_soc_platform);
1039
1040         pm_runtime_disable(&pdev->dev);
1041
1042         free_irq(master->irq, master);
1043
1044         iounmap(master->base);
1045         kfree(master);
1046
1047         fsi_soc_dai[0].dev              = NULL;
1048         fsi_soc_dai[0].private_data     = NULL;
1049         fsi_soc_dai[1].dev              = NULL;
1050         fsi_soc_dai[1].private_data     = NULL;
1051
1052         return 0;
1053 }
1054
1055 static int fsi_runtime_nop(struct device *dev)
1056 {
1057         /* Runtime PM callback shared between ->runtime_suspend()
1058          * and ->runtime_resume(). Simply returns success.
1059          *
1060          * This driver re-initializes all registers after
1061          * pm_runtime_get_sync() anyway so there is no need
1062          * to save and restore registers here.
1063          */
1064         return 0;
1065 }
1066
1067 static struct dev_pm_ops fsi_pm_ops = {
1068         .runtime_suspend        = fsi_runtime_nop,
1069         .runtime_resume         = fsi_runtime_nop,
1070 };
1071
1072 static struct fsi_regs fsi_regs = {
1073         .int_st = INT_ST,
1074         .iemsk  = IEMSK,
1075         .imsk   = IMSK,
1076 };
1077
1078 static struct fsi_regs fsi2_regs = {
1079         .int_st = CPU_INT_ST,
1080         .iemsk  = CPU_IEMSK,
1081         .imsk   = CPU_IMSK,
1082 };
1083
1084 static struct platform_device_id fsi_id_table[] = {
1085         { "sh_fsi",     (kernel_ulong_t)&fsi_regs },
1086         { "sh_fsi2",    (kernel_ulong_t)&fsi2_regs },
1087 };
1088
1089 static struct platform_driver fsi_driver = {
1090         .driver         = {
1091                 .name   = "sh_fsi",
1092                 .pm     = &fsi_pm_ops,
1093         },
1094         .probe          = fsi_probe,
1095         .remove         = fsi_remove,
1096         .id_table       = fsi_id_table,
1097 };
1098
1099 static int __init fsi_mobile_init(void)
1100 {
1101         return platform_driver_register(&fsi_driver);
1102 }
1103
1104 static void __exit fsi_mobile_exit(void)
1105 {
1106         platform_driver_unregister(&fsi_driver);
1107 }
1108 module_init(fsi_mobile_init);
1109 module_exit(fsi_mobile_exit);
1110
1111 MODULE_LICENSE("GPL");
1112 MODULE_DESCRIPTION("SuperH onchip FSI audio driver");
1113 MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");