65
65
dma_addr_t dma_pos;
66
66
dma_addr_t src, dst;
68
par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
68
par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
70
70
period_size = snd_pcm_lib_period_bytes(substream);
71
71
dma_offset = prtd->period * period_size;
104
104
struct snd_pcm *pcm = data;
105
105
struct snd_soc_pcm_runtime *runtime = pcm->private_data;
106
struct s6000_pcm_dma_params *params =
107
snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
108
106
struct s6000_runtime_data *prtd;
109
107
unsigned int has_xrun;
110
108
int i, ret = IRQ_NONE;
112
[SNDRV_PCM_STREAM_PLAYBACK] = params->dma_out,
113
[SNDRV_PCM_STREAM_CAPTURE] = params->dma_in
116
has_xrun = params->check_xrun(runtime->dai->cpu_dai);
118
for (i = 0; i < ARRAY_SIZE(channel); ++i) {
110
for (i = 0; i < 2; ++i) {
119
111
struct snd_pcm_substream *substream = pcm->streams[i].substream;
112
struct s6000_pcm_dma_params *params =
113
snd_soc_dai_get_dma_data(runtime->cpu_dai, substream);
120
115
unsigned int pending;
117
if (substream == SNDRV_PCM_STREAM_PLAYBACK)
118
channel = params->dma_out;
120
channel = params->dma_in;
122
has_xrun = params->check_xrun(runtime->cpu_dai);
125
127
if (unlikely(has_xrun & (1 << i)) &&
130
132
ret = IRQ_HANDLED;
133
pending = s6dmac_int_sources(DMA_MASK_DMAC(channel[i]),
134
DMA_INDEX_CHNL(channel[i]));
135
pending = s6dmac_int_sources(DMA_MASK_DMAC(channel),
136
DMA_INDEX_CHNL(channel));
136
138
if (pending & 1) {
137
139
ret = IRQ_HANDLED;
139
141
snd_pcm_running(substream))) {
140
142
snd_pcm_period_elapsed(substream);
141
143
dev_dbg(pcm->dev, "period elapsed %x %x\n",
142
s6dmac_cur_src(DMA_MASK_DMAC(channel[i]),
143
DMA_INDEX_CHNL(channel[i])),
144
s6dmac_cur_dst(DMA_MASK_DMAC(channel[i]),
145
DMA_INDEX_CHNL(channel[i])));
144
s6dmac_cur_src(DMA_MASK_DMAC(channel),
145
DMA_INDEX_CHNL(channel)),
146
s6dmac_cur_dst(DMA_MASK_DMAC(channel),
147
DMA_INDEX_CHNL(channel)));
146
148
prtd = substream->runtime->private_data;
147
149
spin_lock(&prtd->lock);
148
150
s6000_pcm_enqueue_dma(substream);
154
156
if (pending & (1 << 3))
155
157
printk(KERN_WARNING
156
158
"s6000-pcm: DMA %x Underflow\n",
158
160
if (pending & (1 << 4))
159
161
printk(KERN_WARNING
160
162
"s6000-pcm: DMA %x Overflow\n",
162
164
if (pending & 0x1e0)
163
165
printk(KERN_WARNING
164
166
"s6000-pcm: DMA %x Master Error "
166
channel[i], pending >> 5);
168
channel, pending >> 5);
183
par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
185
par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
185
187
spin_lock_irqsave(&prtd->lock, flags);
246
248
struct s6000_pcm_dma_params *par;
249
par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
251
par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
251
253
ret = par->trigger(substream, cmd, 0);
291
293
unsigned int offset;
292
294
dma_addr_t count;
294
par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
296
par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
296
298
spin_lock_irqsave(&prtd->lock, flags);
321
323
struct s6000_runtime_data *prtd;
324
par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
326
par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
325
327
snd_soc_set_runtime_hwparams(substream, &s6000_pcm_hardware);
327
329
ret = snd_pcm_hw_constraint_step(runtime, 0,
408
410
struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
409
411
struct s6000_pcm_dma_params *par =
410
snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
412
snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
412
414
spin_lock(&par->lock);
413
415
par->in_use &= ~(1 << substream->stream);
434
436
struct snd_soc_pcm_runtime *runtime = pcm->private_data;
435
437
struct s6000_pcm_dma_params *params =
436
snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
438
snd_soc_dai_get_dma_data(runtime->cpu_dai, pcm->streams[0].substream);
438
440
free_irq(params->irq, pcm);
439
441
snd_pcm_lib_preallocate_free_for_all(pcm);
448
450
struct s6000_pcm_dma_params *params;
451
params = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
453
params = snd_soc_dai_get_dma_data(runtime->cpu_dai,
454
pcm->streams[0].substream);
453
456
if (!card->dev->dma_mask)
454
457
card->dev->dma_mask = &s6000_pcm_dmamask;
472
475
res = request_irq(params->irq, s6000_pcm_irq, IRQF_SHARED,
473
s6000_soc_platform.name, pcm);
475
478
printk(KERN_ERR "s6000-pcm couldn't get IRQ\n");
493
struct snd_soc_platform s6000_soc_platform = {
494
.name = "s6000-audio",
495
.pcm_ops = &s6000_pcm_ops,
496
static struct snd_soc_platform_driver s6000_soc_platform = {
497
.ops = &s6000_pcm_ops,
496
498
.pcm_new = s6000_pcm_new,
497
499
.pcm_free = s6000_pcm_free,
499
EXPORT_SYMBOL_GPL(s6000_soc_platform);
501
static int __init s6000_pcm_init(void)
503
return snd_soc_register_platform(&s6000_soc_platform);
505
module_init(s6000_pcm_init);
507
static void __exit s6000_pcm_exit(void)
509
snd_soc_unregister_platform(&s6000_soc_platform);
511
module_exit(s6000_pcm_exit);
502
static int __devinit s6000_soc_platform_probe(struct platform_device *pdev)
504
return snd_soc_register_platform(&pdev->dev, &s6000_soc_platform);
507
static int __devexit s6000_soc_platform_remove(struct platform_device *pdev)
509
snd_soc_unregister_platform(&pdev->dev);
513
static struct platform_driver s6000_pcm_driver = {
515
.name = "s6000-pcm-audio",
516
.owner = THIS_MODULE,
519
.probe = s6000_soc_platform_probe,
520
.remove = __devexit_p(s6000_soc_platform_remove),
523
static int __init snd_s6000_pcm_init(void)
525
return platform_driver_register(&s6000_pcm_driver);
527
module_init(snd_s6000_pcm_init);
529
static void __exit snd_s6000_pcm_exit(void)
531
platform_driver_unregister(&s6000_pcm_driver);
533
module_exit(snd_s6000_pcm_exit);
513
535
MODULE_AUTHOR("Daniel Gloeckner");
514
536
MODULE_DESCRIPTION("Stretch s6000 family PCM DMA module");