This source file includes following definitions.
- fsl_dma_abort_stream
- fsl_dma_update_pointers
- fsl_dma_isr
- fsl_dma_new
- fsl_dma_open
- fsl_dma_hw_params
- fsl_dma_pointer
- fsl_dma_hw_free
- fsl_dma_close
- fsl_dma_free_dma_buffers
- find_ssi_node
- fsl_soc_dma_probe
- fsl_soc_dma_remove
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/platform_device.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/interrupt.h>
18 #include <linux/delay.h>
19 #include <linux/gfp.h>
20 #include <linux/of_address.h>
21 #include <linux/of_irq.h>
22 #include <linux/of_platform.h>
23 #include <linux/list.h>
24 #include <linux/slab.h>
25
26 #include <sound/core.h>
27 #include <sound/pcm.h>
28 #include <sound/pcm_params.h>
29 #include <sound/soc.h>
30
31 #include <asm/io.h>
32
33 #include "fsl_dma.h"
34 #include "fsl_ssi.h"
35
36 #define DRV_NAME "fsl_dma"
37
38
39
40
41
42 #define FSLDMA_PCM_FORMATS (SNDRV_PCM_FMTBIT_S8 | \
43 SNDRV_PCM_FMTBIT_U8 | \
44 SNDRV_PCM_FMTBIT_S16_LE | \
45 SNDRV_PCM_FMTBIT_S16_BE | \
46 SNDRV_PCM_FMTBIT_U16_LE | \
47 SNDRV_PCM_FMTBIT_U16_BE | \
48 SNDRV_PCM_FMTBIT_S24_LE | \
49 SNDRV_PCM_FMTBIT_S24_BE | \
50 SNDRV_PCM_FMTBIT_U24_LE | \
51 SNDRV_PCM_FMTBIT_U24_BE | \
52 SNDRV_PCM_FMTBIT_S32_LE | \
53 SNDRV_PCM_FMTBIT_S32_BE | \
54 SNDRV_PCM_FMTBIT_U32_LE | \
55 SNDRV_PCM_FMTBIT_U32_BE)
56 struct dma_object {
57 struct snd_soc_component_driver dai;
58 dma_addr_t ssi_stx_phys;
59 dma_addr_t ssi_srx_phys;
60 unsigned int ssi_fifo_depth;
61 struct ccsr_dma_channel __iomem *channel;
62 unsigned int irq;
63 bool assigned;
64 };
65
66
67
68
69
70 #define NUM_DMA_LINKS 2
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 struct fsl_dma_private {
94 struct fsl_dma_link_descriptor link[NUM_DMA_LINKS];
95 struct ccsr_dma_channel __iomem *dma_channel;
96 unsigned int irq;
97 struct snd_pcm_substream *substream;
98 dma_addr_t ssi_sxx_phys;
99 unsigned int ssi_fifo_depth;
100 dma_addr_t ld_buf_phys;
101 unsigned int current_link;
102 dma_addr_t dma_buf_phys;
103 dma_addr_t dma_buf_next;
104 dma_addr_t dma_buf_end;
105 size_t period_size;
106 unsigned int num_periods;
107 };
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 static const struct snd_pcm_hardware fsl_dma_hardware = {
129
130 .info = SNDRV_PCM_INFO_INTERLEAVED |
131 SNDRV_PCM_INFO_MMAP |
132 SNDRV_PCM_INFO_MMAP_VALID |
133 SNDRV_PCM_INFO_JOINT_DUPLEX |
134 SNDRV_PCM_INFO_PAUSE,
135 .formats = FSLDMA_PCM_FORMATS,
136 .period_bytes_min = 512,
137 .period_bytes_max = (u32) -1,
138 .periods_min = NUM_DMA_LINKS,
139 .periods_max = (unsigned int) -1,
140 .buffer_bytes_max = 128 * 1024,
141 };
142
143
144
145
146
147
148
149 static void fsl_dma_abort_stream(struct snd_pcm_substream *substream)
150 {
151 snd_pcm_stop_xrun(substream);
152 }
153
154
155
156
157
158
159
160 static void fsl_dma_update_pointers(struct fsl_dma_private *dma_private)
161 {
162 struct fsl_dma_link_descriptor *link =
163 &dma_private->link[dma_private->current_link];
164
165
166
167
168
169 if (dma_private->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
170 link->source_addr = cpu_to_be32(dma_private->dma_buf_next);
171 #ifdef CONFIG_PHYS_64BIT
172 link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
173 upper_32_bits(dma_private->dma_buf_next));
174 #endif
175 } else {
176 link->dest_addr = cpu_to_be32(dma_private->dma_buf_next);
177 #ifdef CONFIG_PHYS_64BIT
178 link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
179 upper_32_bits(dma_private->dma_buf_next));
180 #endif
181 }
182
183
184 dma_private->dma_buf_next += dma_private->period_size;
185
186 if (dma_private->dma_buf_next >= dma_private->dma_buf_end)
187 dma_private->dma_buf_next = dma_private->dma_buf_phys;
188
189 if (++dma_private->current_link >= NUM_DMA_LINKS)
190 dma_private->current_link = 0;
191 }
192
193
194
195
196
197
198
199 static irqreturn_t fsl_dma_isr(int irq, void *dev_id)
200 {
201 struct fsl_dma_private *dma_private = dev_id;
202 struct snd_pcm_substream *substream = dma_private->substream;
203 struct snd_soc_pcm_runtime *rtd = substream->private_data;
204 struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME);
205 struct device *dev = component->dev;
206 struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel;
207 irqreturn_t ret = IRQ_NONE;
208 u32 sr, sr2 = 0;
209
210
211
212
213 sr = in_be32(&dma_channel->sr);
214
215 if (sr & CCSR_DMA_SR_TE) {
216 dev_err(dev, "dma transmit error\n");
217 fsl_dma_abort_stream(substream);
218 sr2 |= CCSR_DMA_SR_TE;
219 ret = IRQ_HANDLED;
220 }
221
222 if (sr & CCSR_DMA_SR_CH)
223 ret = IRQ_HANDLED;
224
225 if (sr & CCSR_DMA_SR_PE) {
226 dev_err(dev, "dma programming error\n");
227 fsl_dma_abort_stream(substream);
228 sr2 |= CCSR_DMA_SR_PE;
229 ret = IRQ_HANDLED;
230 }
231
232 if (sr & CCSR_DMA_SR_EOLNI) {
233 sr2 |= CCSR_DMA_SR_EOLNI;
234 ret = IRQ_HANDLED;
235 }
236
237 if (sr & CCSR_DMA_SR_CB)
238 ret = IRQ_HANDLED;
239
240 if (sr & CCSR_DMA_SR_EOSI) {
241
242 snd_pcm_period_elapsed(substream);
243
244
245
246
247
248
249 if (dma_private->num_periods != NUM_DMA_LINKS)
250 fsl_dma_update_pointers(dma_private);
251
252 sr2 |= CCSR_DMA_SR_EOSI;
253 ret = IRQ_HANDLED;
254 }
255
256 if (sr & CCSR_DMA_SR_EOLSI) {
257 sr2 |= CCSR_DMA_SR_EOLSI;
258 ret = IRQ_HANDLED;
259 }
260
261
262 if (sr2)
263 out_be32(&dma_channel->sr, sr2);
264
265 return ret;
266 }
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283 static int fsl_dma_new(struct snd_soc_pcm_runtime *rtd)
284 {
285 struct snd_card *card = rtd->card->snd_card;
286 struct snd_pcm *pcm = rtd->pcm;
287 int ret;
288
289 ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(36));
290 if (ret)
291 return ret;
292
293
294
295
296
297 if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
298 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
299 fsl_dma_hardware.buffer_bytes_max,
300 &pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->dma_buffer);
301 if (ret) {
302 dev_err(card->dev, "can't alloc playback dma buffer\n");
303 return ret;
304 }
305 }
306
307 if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
308 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
309 fsl_dma_hardware.buffer_bytes_max,
310 &pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->dma_buffer);
311 if (ret) {
312 dev_err(card->dev, "can't alloc capture dma buffer\n");
313 snd_dma_free_pages(&pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->dma_buffer);
314 return ret;
315 }
316 }
317
318 return 0;
319 }
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383 static int fsl_dma_open(struct snd_pcm_substream *substream)
384 {
385 struct snd_pcm_runtime *runtime = substream->runtime;
386 struct snd_soc_pcm_runtime *rtd = substream->private_data;
387 struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME);
388 struct device *dev = component->dev;
389 struct dma_object *dma =
390 container_of(component->driver, struct dma_object, dai);
391 struct fsl_dma_private *dma_private;
392 struct ccsr_dma_channel __iomem *dma_channel;
393 dma_addr_t ld_buf_phys;
394 u64 temp_link;
395 u32 mr;
396 unsigned int channel;
397 int ret = 0;
398 unsigned int i;
399
400
401
402
403
404
405 ret = snd_pcm_hw_constraint_integer(runtime,
406 SNDRV_PCM_HW_PARAM_PERIODS);
407 if (ret < 0) {
408 dev_err(dev, "invalid buffer size\n");
409 return ret;
410 }
411
412 channel = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
413
414 if (dma->assigned) {
415 dev_err(dev, "dma channel already assigned\n");
416 return -EBUSY;
417 }
418
419 dma_private = dma_alloc_coherent(dev, sizeof(struct fsl_dma_private),
420 &ld_buf_phys, GFP_KERNEL);
421 if (!dma_private) {
422 dev_err(dev, "can't allocate dma private data\n");
423 return -ENOMEM;
424 }
425 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
426 dma_private->ssi_sxx_phys = dma->ssi_stx_phys;
427 else
428 dma_private->ssi_sxx_phys = dma->ssi_srx_phys;
429
430 dma_private->ssi_fifo_depth = dma->ssi_fifo_depth;
431 dma_private->dma_channel = dma->channel;
432 dma_private->irq = dma->irq;
433 dma_private->substream = substream;
434 dma_private->ld_buf_phys = ld_buf_phys;
435 dma_private->dma_buf_phys = substream->dma_buffer.addr;
436
437 ret = request_irq(dma_private->irq, fsl_dma_isr, 0, "fsldma-audio",
438 dma_private);
439 if (ret) {
440 dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n",
441 dma_private->irq, ret);
442 dma_free_coherent(dev, sizeof(struct fsl_dma_private),
443 dma_private, dma_private->ld_buf_phys);
444 return ret;
445 }
446
447 dma->assigned = true;
448
449 snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
450 snd_soc_set_runtime_hwparams(substream, &fsl_dma_hardware);
451 runtime->private_data = dma_private;
452
453
454
455 dma_channel = dma_private->dma_channel;
456
457 temp_link = dma_private->ld_buf_phys +
458 sizeof(struct fsl_dma_link_descriptor);
459
460 for (i = 0; i < NUM_DMA_LINKS; i++) {
461 dma_private->link[i].next = cpu_to_be64(temp_link);
462
463 temp_link += sizeof(struct fsl_dma_link_descriptor);
464 }
465
466 dma_private->link[i - 1].next = cpu_to_be64(dma_private->ld_buf_phys);
467
468
469 out_be32(&dma_channel->clndar,
470 CCSR_DMA_CLNDAR_ADDR(dma_private->ld_buf_phys));
471 out_be32(&dma_channel->eclndar,
472 CCSR_DMA_ECLNDAR_ADDR(dma_private->ld_buf_phys));
473
474
475 out_be32(&dma_channel->bcr, 0);
476
477
478
479
480
481 mr = in_be32(&dma_channel->mr) &
482 ~(CCSR_DMA_MR_CA | CCSR_DMA_MR_DAHE | CCSR_DMA_MR_SAHE);
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499 mr |= CCSR_DMA_MR_EOSIE | CCSR_DMA_MR_EIE | CCSR_DMA_MR_EMP_EN |
500 CCSR_DMA_MR_EMS_EN;
501
502
503
504 mr |= (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
505 CCSR_DMA_MR_DAHE : CCSR_DMA_MR_SAHE;
506
507 out_be32(&dma_channel->mr, mr);
508
509 return 0;
510 }
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536 static int fsl_dma_hw_params(struct snd_pcm_substream *substream,
537 struct snd_pcm_hw_params *hw_params)
538 {
539 struct snd_pcm_runtime *runtime = substream->runtime;
540 struct fsl_dma_private *dma_private = runtime->private_data;
541 struct snd_soc_pcm_runtime *rtd = substream->private_data;
542 struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME);
543 struct device *dev = component->dev;
544
545
546 unsigned int sample_bits =
547 snd_pcm_format_physical_width(params_format(hw_params));
548
549
550 unsigned int sample_bytes = sample_bits / 8;
551
552
553 dma_addr_t ssi_sxx_phys = dma_private->ssi_sxx_phys;
554
555
556 size_t buffer_size = params_buffer_bytes(hw_params);
557
558
559 size_t period_size = params_period_bytes(hw_params);
560
561
562 dma_addr_t temp_addr = substream->dma_buffer.addr;
563
564
565 struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel;
566
567 u32 mr;
568
569 unsigned int i;
570
571
572 dma_private->period_size = period_size;
573 dma_private->num_periods = params_periods(hw_params);
574 dma_private->dma_buf_end = dma_private->dma_buf_phys + buffer_size;
575 dma_private->dma_buf_next = dma_private->dma_buf_phys +
576 (NUM_DMA_LINKS * period_size);
577
578 if (dma_private->dma_buf_next >= dma_private->dma_buf_end)
579
580 dma_private->dma_buf_next = dma_private->dma_buf_phys;
581
582 mr = in_be32(&dma_channel->mr) & ~(CCSR_DMA_MR_BWC_MASK |
583 CCSR_DMA_MR_SAHTS_MASK | CCSR_DMA_MR_DAHTS_MASK);
584
585
586
587
588
589
590 switch (sample_bits) {
591 case 8:
592 mr |= CCSR_DMA_MR_DAHTS_1 | CCSR_DMA_MR_SAHTS_1;
593 ssi_sxx_phys += 3;
594 break;
595 case 16:
596 mr |= CCSR_DMA_MR_DAHTS_2 | CCSR_DMA_MR_SAHTS_2;
597 ssi_sxx_phys += 2;
598 break;
599 case 32:
600 mr |= CCSR_DMA_MR_DAHTS_4 | CCSR_DMA_MR_SAHTS_4;
601 break;
602 default:
603
604 dev_err(dev, "unsupported sample size %u\n", sample_bits);
605 return -EINVAL;
606 }
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639 mr |= CCSR_DMA_MR_BWC((dma_private->ssi_fifo_depth - 2) * sample_bytes);
640
641 out_be32(&dma_channel->mr, mr);
642
643 for (i = 0; i < NUM_DMA_LINKS; i++) {
644 struct fsl_dma_link_descriptor *link = &dma_private->link[i];
645
646 link->count = cpu_to_be32(period_size);
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
666 link->source_addr = cpu_to_be32(temp_addr);
667 link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
668 upper_32_bits(temp_addr));
669
670 link->dest_addr = cpu_to_be32(ssi_sxx_phys);
671 link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP |
672 upper_32_bits(ssi_sxx_phys));
673 } else {
674 link->source_addr = cpu_to_be32(ssi_sxx_phys);
675 link->source_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP |
676 upper_32_bits(ssi_sxx_phys));
677
678 link->dest_addr = cpu_to_be32(temp_addr);
679 link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP |
680 upper_32_bits(temp_addr));
681 }
682
683 temp_addr += period_size;
684 }
685
686 return 0;
687 }
688
689
690
691
692
693
694
695
696
697
698
699
700
701 static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream)
702 {
703 struct snd_pcm_runtime *runtime = substream->runtime;
704 struct fsl_dma_private *dma_private = runtime->private_data;
705 struct snd_soc_pcm_runtime *rtd = substream->private_data;
706 struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME);
707 struct device *dev = component->dev;
708 struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel;
709 dma_addr_t position;
710 snd_pcm_uframes_t frames;
711
712
713
714
715
716 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
717 position = in_be32(&dma_channel->sar);
718 #ifdef CONFIG_PHYS_64BIT
719 position |= (u64)(in_be32(&dma_channel->satr) &
720 CCSR_DMA_ATR_ESAD_MASK) << 32;
721 #endif
722 } else {
723 position = in_be32(&dma_channel->dar);
724 #ifdef CONFIG_PHYS_64BIT
725 position |= (u64)(in_be32(&dma_channel->datr) &
726 CCSR_DMA_ATR_ESAD_MASK) << 32;
727 #endif
728 }
729
730
731
732
733
734
735
736
737 if (!position)
738 return 0;
739
740 if ((position < dma_private->dma_buf_phys) ||
741 (position > dma_private->dma_buf_end)) {
742 dev_err(dev, "dma pointer is out of range, halting stream\n");
743 return SNDRV_PCM_POS_XRUN;
744 }
745
746 frames = bytes_to_frames(runtime, position - dma_private->dma_buf_phys);
747
748
749
750
751
752 if (frames == runtime->buffer_size)
753 frames = 0;
754
755 return frames;
756 }
757
758
759
760
761
762
763
764
765
766 static int fsl_dma_hw_free(struct snd_pcm_substream *substream)
767 {
768 struct snd_pcm_runtime *runtime = substream->runtime;
769 struct fsl_dma_private *dma_private = runtime->private_data;
770
771 if (dma_private) {
772 struct ccsr_dma_channel __iomem *dma_channel;
773
774 dma_channel = dma_private->dma_channel;
775
776
777 out_be32(&dma_channel->mr, CCSR_DMA_MR_CA);
778 out_be32(&dma_channel->mr, 0);
779
780
781 out_be32(&dma_channel->sr, -1);
782 out_be32(&dma_channel->clndar, 0);
783 out_be32(&dma_channel->eclndar, 0);
784 out_be32(&dma_channel->satr, 0);
785 out_be32(&dma_channel->sar, 0);
786 out_be32(&dma_channel->datr, 0);
787 out_be32(&dma_channel->dar, 0);
788 out_be32(&dma_channel->bcr, 0);
789 out_be32(&dma_channel->nlndar, 0);
790 out_be32(&dma_channel->enlndar, 0);
791 }
792
793 return 0;
794 }
795
796
797
798
799 static int fsl_dma_close(struct snd_pcm_substream *substream)
800 {
801 struct snd_pcm_runtime *runtime = substream->runtime;
802 struct fsl_dma_private *dma_private = runtime->private_data;
803 struct snd_soc_pcm_runtime *rtd = substream->private_data;
804 struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME);
805 struct device *dev = component->dev;
806 struct dma_object *dma =
807 container_of(component->driver, struct dma_object, dai);
808
809 if (dma_private) {
810 if (dma_private->irq)
811 free_irq(dma_private->irq, dma_private);
812
813
814 dma_free_coherent(dev, sizeof(struct fsl_dma_private),
815 dma_private, dma_private->ld_buf_phys);
816 substream->runtime->private_data = NULL;
817 }
818
819 dma->assigned = false;
820
821 return 0;
822 }
823
824
825
826
827 static void fsl_dma_free_dma_buffers(struct snd_pcm *pcm)
828 {
829 struct snd_pcm_substream *substream;
830 unsigned int i;
831
832 for (i = 0; i < ARRAY_SIZE(pcm->streams); i++) {
833 substream = pcm->streams[i].substream;
834 if (substream) {
835 snd_dma_free_pages(&substream->dma_buffer);
836 substream->dma_buffer.area = NULL;
837 substream->dma_buffer.addr = 0;
838 }
839 }
840 }
841
842
843
844
845
846
847
848
849
850
851
852
853 static struct device_node *find_ssi_node(struct device_node *dma_channel_np)
854 {
855 struct device_node *ssi_np, *np;
856
857 for_each_compatible_node(ssi_np, NULL, "fsl,mpc8610-ssi") {
858
859
860
861 np = of_parse_phandle(ssi_np, "fsl,playback-dma", 0);
862 of_node_put(np);
863 if (np == dma_channel_np)
864 return ssi_np;
865
866 np = of_parse_phandle(ssi_np, "fsl,capture-dma", 0);
867 of_node_put(np);
868 if (np == dma_channel_np)
869 return ssi_np;
870 }
871
872 return NULL;
873 }
874
875 static const struct snd_pcm_ops fsl_dma_ops = {
876 .open = fsl_dma_open,
877 .close = fsl_dma_close,
878 .ioctl = snd_pcm_lib_ioctl,
879 .hw_params = fsl_dma_hw_params,
880 .hw_free = fsl_dma_hw_free,
881 .pointer = fsl_dma_pointer,
882 };
883
884 static int fsl_soc_dma_probe(struct platform_device *pdev)
885 {
886 struct dma_object *dma;
887 struct device_node *np = pdev->dev.of_node;
888 struct device_node *ssi_np;
889 struct resource res;
890 const uint32_t *iprop;
891 int ret;
892
893
894 ssi_np = find_ssi_node(np);
895 if (!ssi_np) {
896 dev_err(&pdev->dev, "cannot find parent SSI node\n");
897 return -ENODEV;
898 }
899
900 ret = of_address_to_resource(ssi_np, 0, &res);
901 if (ret) {
902 dev_err(&pdev->dev, "could not determine resources for %pOF\n",
903 ssi_np);
904 of_node_put(ssi_np);
905 return ret;
906 }
907
908 dma = kzalloc(sizeof(*dma), GFP_KERNEL);
909 if (!dma) {
910 of_node_put(ssi_np);
911 return -ENOMEM;
912 }
913
914 dma->dai.name = DRV_NAME;
915 dma->dai.ops = &fsl_dma_ops;
916 dma->dai.pcm_new = fsl_dma_new;
917 dma->dai.pcm_free = fsl_dma_free_dma_buffers;
918
919
920 dma->ssi_stx_phys = res.start + REG_SSI_STX0;
921 dma->ssi_srx_phys = res.start + REG_SSI_SRX0;
922
923 iprop = of_get_property(ssi_np, "fsl,fifo-depth", NULL);
924 if (iprop)
925 dma->ssi_fifo_depth = be32_to_cpup(iprop);
926 else
927
928 dma->ssi_fifo_depth = 8;
929
930 of_node_put(ssi_np);
931
932 ret = devm_snd_soc_register_component(&pdev->dev, &dma->dai, NULL, 0);
933 if (ret) {
934 dev_err(&pdev->dev, "could not register platform\n");
935 kfree(dma);
936 return ret;
937 }
938
939 dma->channel = of_iomap(np, 0);
940 dma->irq = irq_of_parse_and_map(np, 0);
941
942 dev_set_drvdata(&pdev->dev, dma);
943
944 return 0;
945 }
946
947 static int fsl_soc_dma_remove(struct platform_device *pdev)
948 {
949 struct dma_object *dma = dev_get_drvdata(&pdev->dev);
950
951 iounmap(dma->channel);
952 irq_dispose_mapping(dma->irq);
953 kfree(dma);
954
955 return 0;
956 }
957
958 static const struct of_device_id fsl_soc_dma_ids[] = {
959 { .compatible = "fsl,ssi-dma-channel", },
960 {}
961 };
962 MODULE_DEVICE_TABLE(of, fsl_soc_dma_ids);
963
964 static struct platform_driver fsl_soc_dma_driver = {
965 .driver = {
966 .name = "fsl-pcm-audio",
967 .of_match_table = fsl_soc_dma_ids,
968 },
969 .probe = fsl_soc_dma_probe,
970 .remove = fsl_soc_dma_remove,
971 };
972
973 module_platform_driver(fsl_soc_dma_driver);
974
975 MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
976 MODULE_DESCRIPTION("Freescale Elo DMA ASoC PCM Driver");
977 MODULE_LICENSE("GPL v2");