Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/ppc/snd_ps3.c
29266 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Audio support for PS3
4
* Copyright (C) 2007 Sony Computer Entertainment Inc.
5
* All rights reserved.
6
* Copyright 2006, 2007 Sony Corporation
7
*/
8
9
#include <linux/dma-mapping.h>
10
#include <linux/dmapool.h>
11
#include <linux/gfp.h>
12
#include <linux/init.h>
13
#include <linux/interrupt.h>
14
#include <linux/io.h>
15
#include <linux/module.h>
16
17
#include <sound/asound.h>
18
#include <sound/control.h>
19
#include <sound/core.h>
20
#include <sound/initval.h>
21
#include <sound/memalloc.h>
22
#include <sound/pcm.h>
23
#include <sound/pcm_params.h>
24
25
#include <asm/dma.h>
26
#include <asm/firmware.h>
27
#include <asm/lv1call.h>
28
#include <asm/ps3.h>
29
#include <asm/ps3av.h>
30
31
#include "snd_ps3.h"
32
#include "snd_ps3_reg.h"
33
34
35
/*
36
* global
37
*/
38
static struct snd_ps3_card_info the_card;
39
40
static int snd_ps3_start_delay = CONFIG_SND_PS3_DEFAULT_START_DELAY;
41
42
module_param_named(start_delay, snd_ps3_start_delay, uint, 0644);
43
MODULE_PARM_DESC(start_delay, "time to insert silent data in ms");
44
45
static int index = SNDRV_DEFAULT_IDX1;
46
static char *id = SNDRV_DEFAULT_STR1;
47
48
module_param(index, int, 0444);
49
MODULE_PARM_DESC(index, "Index value for PS3 soundchip.");
50
module_param(id, charp, 0444);
51
MODULE_PARM_DESC(id, "ID string for PS3 soundchip.");
52
53
54
/*
55
* PS3 audio register access
56
*/
57
static inline u32 read_reg(unsigned int reg)
58
{
59
return in_be32(the_card.mapped_mmio_vaddr + reg);
60
}
61
static inline void write_reg(unsigned int reg, u32 val)
62
{
63
out_be32(the_card.mapped_mmio_vaddr + reg, val);
64
}
65
static inline void update_reg(unsigned int reg, u32 or_val)
66
{
67
u32 newval = read_reg(reg) | or_val;
68
write_reg(reg, newval);
69
}
70
static inline void update_mask_reg(unsigned int reg, u32 mask, u32 or_val)
71
{
72
u32 newval = (read_reg(reg) & mask) | or_val;
73
write_reg(reg, newval);
74
}
75
76
/*
77
* ALSA defs
78
*/
79
static const struct snd_pcm_hardware snd_ps3_pcm_hw = {
80
.info = (SNDRV_PCM_INFO_MMAP |
81
SNDRV_PCM_INFO_NONINTERLEAVED |
82
SNDRV_PCM_INFO_MMAP_VALID),
83
.formats = (SNDRV_PCM_FMTBIT_S16_BE |
84
SNDRV_PCM_FMTBIT_S24_BE),
85
.rates = (SNDRV_PCM_RATE_44100 |
86
SNDRV_PCM_RATE_48000 |
87
SNDRV_PCM_RATE_88200 |
88
SNDRV_PCM_RATE_96000),
89
.rate_min = 44100,
90
.rate_max = 96000,
91
92
.channels_min = 2, /* stereo only */
93
.channels_max = 2,
94
95
.buffer_bytes_max = PS3_AUDIO_FIFO_SIZE * 64,
96
97
/* interrupt by four stages */
98
.period_bytes_min = PS3_AUDIO_FIFO_STAGE_SIZE * 4,
99
.period_bytes_max = PS3_AUDIO_FIFO_STAGE_SIZE * 4,
100
101
.periods_min = 16,
102
.periods_max = 32, /* buffer_size_max/ period_bytes_max */
103
104
.fifo_size = PS3_AUDIO_FIFO_SIZE
105
};
106
107
static int snd_ps3_verify_dma_stop(struct snd_ps3_card_info *card,
108
int count, int force_stop)
109
{
110
int dma_ch, done, retries, stop_forced = 0;
111
uint32_t status;
112
113
for (dma_ch = 0; dma_ch < 8; dma_ch++) {
114
retries = count;
115
do {
116
status = read_reg(PS3_AUDIO_KICK(dma_ch)) &
117
PS3_AUDIO_KICK_STATUS_MASK;
118
switch (status) {
119
case PS3_AUDIO_KICK_STATUS_DONE:
120
case PS3_AUDIO_KICK_STATUS_NOTIFY:
121
case PS3_AUDIO_KICK_STATUS_CLEAR:
122
case PS3_AUDIO_KICK_STATUS_ERROR:
123
done = 1;
124
break;
125
default:
126
done = 0;
127
udelay(10);
128
}
129
} while (!done && --retries);
130
if (!retries && force_stop) {
131
pr_info("%s: DMA ch %d is not stopped.",
132
__func__, dma_ch);
133
/* last resort. force to stop dma.
134
* NOTE: this cause DMA done interrupts
135
*/
136
update_reg(PS3_AUDIO_CONFIG, PS3_AUDIO_CONFIG_CLEAR);
137
stop_forced = 1;
138
}
139
}
140
return stop_forced;
141
}
142
143
/*
144
* wait for all dma is done.
145
* NOTE: caller should reset card->running before call.
146
* If not, the interrupt handler will re-start DMA,
147
* then DMA is never stopped.
148
*/
149
static void snd_ps3_wait_for_dma_stop(struct snd_ps3_card_info *card)
150
{
151
int stop_forced;
152
/*
153
* wait for the last dma is done
154
*/
155
156
/*
157
* expected maximum DMA done time is 5.7ms + something (DMA itself).
158
* 5.7ms is from 16bit/sample 2ch 44.1Khz; the time next
159
* DMA kick event would occur.
160
*/
161
stop_forced = snd_ps3_verify_dma_stop(card, 700, 1);
162
163
/*
164
* clear outstanding interrupts.
165
*/
166
update_reg(PS3_AUDIO_INTR_0, 0);
167
update_reg(PS3_AUDIO_AX_IS, 0);
168
169
/*
170
*revert CLEAR bit since it will not reset automatically after DMA stop
171
*/
172
if (stop_forced)
173
update_mask_reg(PS3_AUDIO_CONFIG, ~PS3_AUDIO_CONFIG_CLEAR, 0);
174
/* ensure the hardware sees changes */
175
wmb();
176
}
177
178
static void snd_ps3_kick_dma(struct snd_ps3_card_info *card)
179
{
180
181
update_reg(PS3_AUDIO_KICK(0), PS3_AUDIO_KICK_REQUEST);
182
/* ensure the hardware sees the change */
183
wmb();
184
}
185
186
/*
187
* convert virtual addr to ioif bus addr.
188
*/
189
static dma_addr_t v_to_bus(struct snd_ps3_card_info *card, void *paddr, int ch)
190
{
191
return card->dma_start_bus_addr[ch] +
192
(paddr - card->dma_start_vaddr[ch]);
193
};
194
195
196
/*
197
* increment ring buffer pointer.
198
* NOTE: caller must hold write spinlock
199
*/
200
static void snd_ps3_bump_buffer(struct snd_ps3_card_info *card,
201
enum snd_ps3_ch ch, size_t byte_count,
202
int stage)
203
{
204
if (!stage)
205
card->dma_last_transfer_vaddr[ch] =
206
card->dma_next_transfer_vaddr[ch];
207
card->dma_next_transfer_vaddr[ch] += byte_count;
208
if ((card->dma_start_vaddr[ch] + (card->dma_buffer_size / 2)) <=
209
card->dma_next_transfer_vaddr[ch]) {
210
card->dma_next_transfer_vaddr[ch] = card->dma_start_vaddr[ch];
211
}
212
}
213
/*
214
* setup dmac to send data to audio and attenuate samples on the ring buffer
215
*/
216
static int snd_ps3_program_dma(struct snd_ps3_card_info *card,
217
enum snd_ps3_dma_filltype filltype)
218
{
219
/* this dmac does not support over 4G */
220
uint32_t dma_addr;
221
int fill_stages, dma_ch, stage;
222
enum snd_ps3_ch ch;
223
uint32_t ch0_kick_event = 0; /* initialize to mute gcc */
224
int silent = 0;
225
226
switch (filltype) {
227
case SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL:
228
silent = 1;
229
fallthrough;
230
case SND_PS3_DMA_FILLTYPE_FIRSTFILL:
231
ch0_kick_event = PS3_AUDIO_KICK_EVENT_ALWAYS;
232
break;
233
234
case SND_PS3_DMA_FILLTYPE_SILENT_RUNNING:
235
silent = 1;
236
fallthrough;
237
case SND_PS3_DMA_FILLTYPE_RUNNING:
238
ch0_kick_event = PS3_AUDIO_KICK_EVENT_SERIALOUT0_EMPTY;
239
break;
240
}
241
242
snd_ps3_verify_dma_stop(card, 700, 0);
243
fill_stages = 4;
244
guard(spinlock_irqsave)(&card->dma_lock);
245
for (ch = 0; ch < 2; ch++) {
246
for (stage = 0; stage < fill_stages; stage++) {
247
dma_ch = stage * 2 + ch;
248
if (silent)
249
dma_addr = card->null_buffer_start_dma_addr;
250
else
251
dma_addr =
252
v_to_bus(card,
253
card->dma_next_transfer_vaddr[ch],
254
ch);
255
256
write_reg(PS3_AUDIO_SOURCE(dma_ch),
257
(PS3_AUDIO_SOURCE_TARGET_SYSTEM_MEMORY |
258
dma_addr));
259
260
/* dst: fixed to 3wire#0 */
261
if (ch == 0)
262
write_reg(PS3_AUDIO_DEST(dma_ch),
263
(PS3_AUDIO_DEST_TARGET_AUDIOFIFO |
264
PS3_AUDIO_AO_3W_LDATA(0)));
265
else
266
write_reg(PS3_AUDIO_DEST(dma_ch),
267
(PS3_AUDIO_DEST_TARGET_AUDIOFIFO |
268
PS3_AUDIO_AO_3W_RDATA(0)));
269
270
/* count always 1 DMA block (1/2 stage = 128 bytes) */
271
write_reg(PS3_AUDIO_DMASIZE(dma_ch), 0);
272
/* bump pointer if needed */
273
if (!silent)
274
snd_ps3_bump_buffer(card, ch,
275
PS3_AUDIO_DMAC_BLOCK_SIZE,
276
stage);
277
278
/* kick event */
279
if (dma_ch == 0)
280
write_reg(PS3_AUDIO_KICK(dma_ch),
281
ch0_kick_event);
282
else
283
write_reg(PS3_AUDIO_KICK(dma_ch),
284
PS3_AUDIO_KICK_EVENT_AUDIO_DMA(dma_ch
285
- 1) |
286
PS3_AUDIO_KICK_REQUEST);
287
}
288
}
289
/* ensure the hardware sees the change */
290
wmb();
291
292
return 0;
293
}
294
295
/*
296
* Interrupt handler
297
*/
298
static irqreturn_t snd_ps3_interrupt(int irq, void *dev_id)
299
{
300
301
uint32_t port_intr;
302
int underflow_occured = 0;
303
struct snd_ps3_card_info *card = dev_id;
304
305
if (!card->running) {
306
update_reg(PS3_AUDIO_AX_IS, 0);
307
update_reg(PS3_AUDIO_INTR_0, 0);
308
return IRQ_HANDLED;
309
}
310
311
port_intr = read_reg(PS3_AUDIO_AX_IS);
312
/*
313
*serial buffer empty detected (every 4 times),
314
*program next dma and kick it
315
*/
316
if (port_intr & PS3_AUDIO_AX_IE_ASOBEIE(0)) {
317
write_reg(PS3_AUDIO_AX_IS, PS3_AUDIO_AX_IE_ASOBEIE(0));
318
if (port_intr & PS3_AUDIO_AX_IE_ASOBUIE(0)) {
319
write_reg(PS3_AUDIO_AX_IS, port_intr);
320
underflow_occured = 1;
321
}
322
if (card->silent) {
323
/* we are still in silent time */
324
snd_ps3_program_dma(card,
325
(underflow_occured) ?
326
SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL :
327
SND_PS3_DMA_FILLTYPE_SILENT_RUNNING);
328
snd_ps3_kick_dma(card);
329
card->silent--;
330
} else {
331
snd_ps3_program_dma(card,
332
(underflow_occured) ?
333
SND_PS3_DMA_FILLTYPE_FIRSTFILL :
334
SND_PS3_DMA_FILLTYPE_RUNNING);
335
snd_ps3_kick_dma(card);
336
snd_pcm_period_elapsed(card->substream);
337
}
338
} else if (port_intr & PS3_AUDIO_AX_IE_ASOBUIE(0)) {
339
write_reg(PS3_AUDIO_AX_IS, PS3_AUDIO_AX_IE_ASOBUIE(0));
340
/*
341
* serial out underflow, but buffer empty not detected.
342
* in this case, fill fifo with 0 to recover. After
343
* filling dummy data, serial automatically start to
344
* consume them and then will generate normal buffer
345
* empty interrupts.
346
* If both buffer underflow and buffer empty are occurred,
347
* it is better to do nomal data transfer than empty one
348
*/
349
snd_ps3_program_dma(card,
350
SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
351
snd_ps3_kick_dma(card);
352
snd_ps3_program_dma(card,
353
SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
354
snd_ps3_kick_dma(card);
355
}
356
/* clear interrupt cause */
357
return IRQ_HANDLED;
358
};
359
360
/*
361
* audio mute on/off
362
* mute_on : 0 output enabled
363
* 1 mute
364
*/
365
static int snd_ps3_mute(int mute_on)
366
{
367
return ps3av_audio_mute(mute_on);
368
}
369
370
/*
371
* av setting
372
* NOTE: calling this function may generate audio interrupt.
373
*/
374
static int snd_ps3_change_avsetting(struct snd_ps3_card_info *card)
375
{
376
int ret, retries, i;
377
pr_debug("%s: start\n", __func__);
378
379
ret = ps3av_set_audio_mode(card->avs.avs_audio_ch,
380
card->avs.avs_audio_rate,
381
card->avs.avs_audio_width,
382
card->avs.avs_audio_format,
383
card->avs.avs_audio_source);
384
/*
385
* Reset the following unwanted settings:
386
*/
387
388
/* disable all 3wire buffers */
389
update_mask_reg(PS3_AUDIO_AO_3WMCTRL,
390
~(PS3_AUDIO_AO_3WMCTRL_ASOEN(0) |
391
PS3_AUDIO_AO_3WMCTRL_ASOEN(1) |
392
PS3_AUDIO_AO_3WMCTRL_ASOEN(2) |
393
PS3_AUDIO_AO_3WMCTRL_ASOEN(3)),
394
0);
395
wmb(); /* ensure the hardware sees the change */
396
/* wait for actually stopped */
397
retries = 1000;
398
while ((read_reg(PS3_AUDIO_AO_3WMCTRL) &
399
(PS3_AUDIO_AO_3WMCTRL_ASORUN(0) |
400
PS3_AUDIO_AO_3WMCTRL_ASORUN(1) |
401
PS3_AUDIO_AO_3WMCTRL_ASORUN(2) |
402
PS3_AUDIO_AO_3WMCTRL_ASORUN(3))) &&
403
--retries) {
404
udelay(1);
405
}
406
407
/* reset buffer pointer */
408
for (i = 0; i < 4; i++) {
409
update_reg(PS3_AUDIO_AO_3WCTRL(i),
410
PS3_AUDIO_AO_3WCTRL_ASOBRST_RESET);
411
udelay(10);
412
}
413
wmb(); /* ensure the hardware actually start resetting */
414
415
/* enable 3wire#0 buffer */
416
update_reg(PS3_AUDIO_AO_3WMCTRL, PS3_AUDIO_AO_3WMCTRL_ASOEN(0));
417
418
419
/* In 24bit mode,ALSA inserts a zero byte at first byte of per sample */
420
update_mask_reg(PS3_AUDIO_AO_3WCTRL(0),
421
~PS3_AUDIO_AO_3WCTRL_ASODF,
422
PS3_AUDIO_AO_3WCTRL_ASODF_LSB);
423
update_mask_reg(PS3_AUDIO_AO_SPDCTRL(0),
424
~PS3_AUDIO_AO_SPDCTRL_SPODF,
425
PS3_AUDIO_AO_SPDCTRL_SPODF_LSB);
426
/* ensure all the setting above is written back to register */
427
wmb();
428
/* avsetting driver altered AX_IE, caller must reset it if you want */
429
pr_debug("%s: end\n", __func__);
430
return ret;
431
}
432
433
/*
434
* set sampling rate according to the substream
435
*/
436
static int snd_ps3_set_avsetting(struct snd_pcm_substream *substream)
437
{
438
struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
439
struct snd_ps3_avsetting_info avs;
440
int ret;
441
442
avs = card->avs;
443
444
pr_debug("%s: called freq=%d width=%d\n", __func__,
445
substream->runtime->rate,
446
snd_pcm_format_width(substream->runtime->format));
447
448
pr_debug("%s: before freq=%d width=%d\n", __func__,
449
card->avs.avs_audio_rate, card->avs.avs_audio_width);
450
451
/* sample rate */
452
switch (substream->runtime->rate) {
453
case 44100:
454
avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_44K;
455
break;
456
case 48000:
457
avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_48K;
458
break;
459
case 88200:
460
avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_88K;
461
break;
462
case 96000:
463
avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_96K;
464
break;
465
default:
466
pr_info("%s: invalid rate %d\n", __func__,
467
substream->runtime->rate);
468
return 1;
469
}
470
471
/* width */
472
switch (snd_pcm_format_width(substream->runtime->format)) {
473
case 16:
474
avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_16;
475
break;
476
case 24:
477
avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_24;
478
break;
479
default:
480
pr_info("%s: invalid width %d\n", __func__,
481
snd_pcm_format_width(substream->runtime->format));
482
return 1;
483
}
484
485
memcpy(avs.avs_cs_info, ps3av_mode_cs_info, 8);
486
487
if (memcmp(&card->avs, &avs, sizeof(avs))) {
488
pr_debug("%s: after freq=%d width=%d\n", __func__,
489
card->avs.avs_audio_rate, card->avs.avs_audio_width);
490
491
card->avs = avs;
492
snd_ps3_change_avsetting(card);
493
ret = 0;
494
} else
495
ret = 1;
496
497
/* check CS non-audio bit and mute accordingly */
498
if (avs.avs_cs_info[0] & 0x02)
499
ps3av_audio_mute_analog(1); /* mute if non-audio */
500
else
501
ps3av_audio_mute_analog(0);
502
503
return ret;
504
}
505
506
/*
507
* PCM operators
508
*/
509
static int snd_ps3_pcm_open(struct snd_pcm_substream *substream)
510
{
511
struct snd_pcm_runtime *runtime = substream->runtime;
512
struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
513
514
/* to retrieve substream/runtime in interrupt handler */
515
card->substream = substream;
516
517
runtime->hw = snd_ps3_pcm_hw;
518
519
card->start_delay = snd_ps3_start_delay;
520
521
/* mute off */
522
snd_ps3_mute(0); /* this function sleep */
523
524
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
525
PS3_AUDIO_FIFO_STAGE_SIZE * 4 * 2);
526
return 0;
527
};
528
529
static int snd_ps3_pcm_close(struct snd_pcm_substream *substream)
530
{
531
/* mute on */
532
snd_ps3_mute(1);
533
return 0;
534
};
535
536
static int snd_ps3_delay_to_bytes(struct snd_pcm_substream *substream,
537
unsigned int delay_ms)
538
{
539
int ret;
540
int rate ;
541
542
rate = substream->runtime->rate;
543
ret = snd_pcm_format_size(substream->runtime->format,
544
rate * delay_ms / 1000)
545
* substream->runtime->channels;
546
547
pr_debug("%s: time=%d rate=%d bytes=%ld, frames=%d, ret=%d\n",
548
__func__,
549
delay_ms,
550
rate,
551
snd_pcm_format_size(substream->runtime->format, rate),
552
rate * delay_ms / 1000,
553
ret);
554
555
return ret;
556
};
557
558
static int snd_ps3_pcm_prepare(struct snd_pcm_substream *substream)
559
{
560
struct snd_pcm_runtime *runtime = substream->runtime;
561
struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
562
563
if (!snd_ps3_set_avsetting(substream)) {
564
/* some parameter changed */
565
write_reg(PS3_AUDIO_AX_IE,
566
PS3_AUDIO_AX_IE_ASOBEIE(0) |
567
PS3_AUDIO_AX_IE_ASOBUIE(0));
568
/*
569
* let SPDIF device re-lock with SPDIF signal,
570
* start with some silence
571
*/
572
card->silent = snd_ps3_delay_to_bytes(substream,
573
card->start_delay) /
574
(PS3_AUDIO_FIFO_STAGE_SIZE * 4); /* every 4 times */
575
}
576
577
/* restart ring buffer pointer */
578
scoped_guard(spinlock_irqsave, &card->dma_lock) {
579
card->dma_buffer_size = runtime->dma_bytes;
580
581
card->dma_last_transfer_vaddr[SND_PS3_CH_L] =
582
card->dma_next_transfer_vaddr[SND_PS3_CH_L] =
583
card->dma_start_vaddr[SND_PS3_CH_L] =
584
runtime->dma_area;
585
card->dma_start_bus_addr[SND_PS3_CH_L] = runtime->dma_addr;
586
587
card->dma_last_transfer_vaddr[SND_PS3_CH_R] =
588
card->dma_next_transfer_vaddr[SND_PS3_CH_R] =
589
card->dma_start_vaddr[SND_PS3_CH_R] =
590
runtime->dma_area + (runtime->dma_bytes / 2);
591
card->dma_start_bus_addr[SND_PS3_CH_R] =
592
runtime->dma_addr + (runtime->dma_bytes / 2);
593
594
pr_debug("%s: vaddr=%p bus=%#llx\n", __func__,
595
card->dma_start_vaddr[SND_PS3_CH_L],
596
card->dma_start_bus_addr[SND_PS3_CH_L]);
597
598
}
599
600
/* ensure the hardware sees the change */
601
mb();
602
603
return 0;
604
};
605
606
static int snd_ps3_pcm_trigger(struct snd_pcm_substream *substream,
607
int cmd)
608
{
609
struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
610
611
switch (cmd) {
612
case SNDRV_PCM_TRIGGER_START:
613
/* clear outstanding interrupts */
614
update_reg(PS3_AUDIO_AX_IS, 0);
615
616
scoped_guard(spinlock, &card->dma_lock) {
617
card->running = 1;
618
}
619
620
snd_ps3_program_dma(card,
621
SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
622
snd_ps3_kick_dma(card);
623
while (read_reg(PS3_AUDIO_KICK(7)) &
624
PS3_AUDIO_KICK_STATUS_MASK) {
625
udelay(1);
626
}
627
snd_ps3_program_dma(card, SND_PS3_DMA_FILLTYPE_SILENT_RUNNING);
628
snd_ps3_kick_dma(card);
629
break;
630
631
case SNDRV_PCM_TRIGGER_STOP:
632
scoped_guard(spinlock, &card->dma_lock) {
633
card->running = 0;
634
}
635
snd_ps3_wait_for_dma_stop(card);
636
break;
637
default:
638
break;
639
640
}
641
642
return 0;
643
};
644
645
/*
646
* report current pointer
647
*/
648
static snd_pcm_uframes_t snd_ps3_pcm_pointer(
649
struct snd_pcm_substream *substream)
650
{
651
struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
652
size_t bytes;
653
snd_pcm_uframes_t ret;
654
655
scoped_guard(spinlock, &card->dma_lock) {
656
bytes = (size_t)(card->dma_last_transfer_vaddr[SND_PS3_CH_L] -
657
card->dma_start_vaddr[SND_PS3_CH_L]);
658
}
659
660
ret = bytes_to_frames(substream->runtime, bytes * 2);
661
662
return ret;
663
};
664
665
/*
666
* SPDIF status bits controls
667
*/
668
static int snd_ps3_spdif_mask_info(struct snd_kcontrol *kcontrol,
669
struct snd_ctl_elem_info *uinfo)
670
{
671
uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
672
uinfo->count = 1;
673
return 0;
674
}
675
676
/* FIXME: ps3av_set_audio_mode() assumes only consumer mode */
677
static int snd_ps3_spdif_cmask_get(struct snd_kcontrol *kcontrol,
678
struct snd_ctl_elem_value *ucontrol)
679
{
680
memset(ucontrol->value.iec958.status, 0xff, 8);
681
return 0;
682
}
683
684
static int snd_ps3_spdif_pmask_get(struct snd_kcontrol *kcontrol,
685
struct snd_ctl_elem_value *ucontrol)
686
{
687
return 0;
688
}
689
690
static int snd_ps3_spdif_default_get(struct snd_kcontrol *kcontrol,
691
struct snd_ctl_elem_value *ucontrol)
692
{
693
memcpy(ucontrol->value.iec958.status, ps3av_mode_cs_info, 8);
694
return 0;
695
}
696
697
static int snd_ps3_spdif_default_put(struct snd_kcontrol *kcontrol,
698
struct snd_ctl_elem_value *ucontrol)
699
{
700
if (memcmp(ps3av_mode_cs_info, ucontrol->value.iec958.status, 8)) {
701
memcpy(ps3av_mode_cs_info, ucontrol->value.iec958.status, 8);
702
return 1;
703
}
704
return 0;
705
}
706
707
static const struct snd_kcontrol_new spdif_ctls[] = {
708
{
709
.access = SNDRV_CTL_ELEM_ACCESS_READ,
710
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
711
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK),
712
.info = snd_ps3_spdif_mask_info,
713
.get = snd_ps3_spdif_cmask_get,
714
},
715
{
716
.access = SNDRV_CTL_ELEM_ACCESS_READ,
717
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
718
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PRO_MASK),
719
.info = snd_ps3_spdif_mask_info,
720
.get = snd_ps3_spdif_pmask_get,
721
},
722
{
723
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
724
.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
725
.info = snd_ps3_spdif_mask_info,
726
.get = snd_ps3_spdif_default_get,
727
.put = snd_ps3_spdif_default_put,
728
},
729
};
730
731
static const struct snd_pcm_ops snd_ps3_pcm_spdif_ops = {
732
.open = snd_ps3_pcm_open,
733
.close = snd_ps3_pcm_close,
734
.prepare = snd_ps3_pcm_prepare,
735
.trigger = snd_ps3_pcm_trigger,
736
.pointer = snd_ps3_pcm_pointer,
737
};
738
739
740
static int snd_ps3_map_mmio(void)
741
{
742
the_card.mapped_mmio_vaddr =
743
ioremap(the_card.ps3_dev->m_region->bus_addr,
744
the_card.ps3_dev->m_region->len);
745
746
if (!the_card.mapped_mmio_vaddr) {
747
pr_info("%s: ioremap 0 failed p=%#lx l=%#lx \n",
748
__func__, the_card.ps3_dev->m_region->lpar_addr,
749
the_card.ps3_dev->m_region->len);
750
return -ENXIO;
751
}
752
753
return 0;
754
};
755
756
static void snd_ps3_unmap_mmio(void)
757
{
758
iounmap(the_card.mapped_mmio_vaddr);
759
the_card.mapped_mmio_vaddr = NULL;
760
}
761
762
static int snd_ps3_allocate_irq(void)
763
{
764
int ret;
765
u64 lpar_addr, lpar_size;
766
u64 __iomem *mapped;
767
768
/* FIXME: move this to device_init (H/W probe) */
769
770
/* get irq outlet */
771
ret = lv1_gpu_device_map(1, &lpar_addr, &lpar_size);
772
if (ret) {
773
pr_info("%s: device map 1 failed %d\n", __func__,
774
ret);
775
return -ENXIO;
776
}
777
778
mapped = ioremap(lpar_addr, lpar_size);
779
if (!mapped) {
780
pr_info("%s: ioremap 1 failed \n", __func__);
781
return -ENXIO;
782
}
783
784
the_card.audio_irq_outlet = in_be64(mapped);
785
786
iounmap(mapped);
787
ret = lv1_gpu_device_unmap(1);
788
if (ret)
789
pr_info("%s: unmap 1 failed\n", __func__);
790
791
/* irq */
792
ret = ps3_irq_plug_setup(PS3_BINDING_CPU_ANY,
793
the_card.audio_irq_outlet,
794
&the_card.irq_no);
795
if (ret) {
796
pr_info("%s:ps3_alloc_irq failed (%d)\n", __func__, ret);
797
return ret;
798
}
799
800
ret = request_irq(the_card.irq_no, snd_ps3_interrupt, 0,
801
SND_PS3_DRIVER_NAME, &the_card);
802
if (ret) {
803
pr_info("%s: request_irq failed (%d)\n", __func__, ret);
804
goto cleanup_irq;
805
}
806
807
return 0;
808
809
cleanup_irq:
810
ps3_irq_plug_destroy(the_card.irq_no);
811
return ret;
812
};
813
814
static void snd_ps3_free_irq(void)
815
{
816
free_irq(the_card.irq_no, &the_card);
817
ps3_irq_plug_destroy(the_card.irq_no);
818
}
819
820
static void snd_ps3_audio_set_base_addr(uint64_t ioaddr_start)
821
{
822
uint64_t val;
823
int ret;
824
825
val = (ioaddr_start & (0x0fUL << 32)) >> (32 - 20) |
826
(0x03UL << 24) |
827
(0x0fUL << 12) |
828
(PS3_AUDIO_IOID);
829
830
ret = lv1_gpu_attribute(0x100, 0x007, val);
831
if (ret)
832
pr_info("%s: gpu_attribute failed %d\n", __func__,
833
ret);
834
}
835
836
static void snd_ps3_audio_fixup(struct snd_ps3_card_info *card)
837
{
838
/*
839
* avsetting driver seems to never change the following
840
* so, init them here once
841
*/
842
843
/* no dma interrupt needed */
844
write_reg(PS3_AUDIO_INTR_EN_0, 0);
845
846
/* use every 4 buffer empty interrupt */
847
update_mask_reg(PS3_AUDIO_AX_IC,
848
PS3_AUDIO_AX_IC_AASOIMD_MASK,
849
PS3_AUDIO_AX_IC_AASOIMD_EVERY4);
850
851
/* enable 3wire clocks */
852
update_mask_reg(PS3_AUDIO_AO_3WMCTRL,
853
~(PS3_AUDIO_AO_3WMCTRL_ASOBCLKD_DISABLED |
854
PS3_AUDIO_AO_3WMCTRL_ASOLRCKD_DISABLED),
855
0);
856
update_reg(PS3_AUDIO_AO_3WMCTRL,
857
PS3_AUDIO_AO_3WMCTRL_ASOPLRCK_DEFAULT);
858
}
859
860
static int snd_ps3_init_avsetting(struct snd_ps3_card_info *card)
861
{
862
int ret;
863
pr_debug("%s: start\n", __func__);
864
card->avs.avs_audio_ch = PS3AV_CMD_AUDIO_NUM_OF_CH_2;
865
card->avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_48K;
866
card->avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_16;
867
card->avs.avs_audio_format = PS3AV_CMD_AUDIO_FORMAT_PCM;
868
card->avs.avs_audio_source = PS3AV_CMD_AUDIO_SOURCE_SERIAL;
869
memcpy(card->avs.avs_cs_info, ps3av_mode_cs_info, 8);
870
871
ret = snd_ps3_change_avsetting(card);
872
873
snd_ps3_audio_fixup(card);
874
875
/* to start to generate SPDIF signal, fill data */
876
snd_ps3_program_dma(card, SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
877
snd_ps3_kick_dma(card);
878
pr_debug("%s: end\n", __func__);
879
return ret;
880
}
881
882
static int snd_ps3_driver_probe(struct ps3_system_bus_device *dev)
883
{
884
int i, ret;
885
u64 lpar_addr, lpar_size;
886
static u64 dummy_mask;
887
888
the_card.ps3_dev = dev;
889
890
ret = ps3_open_hv_device(dev);
891
892
if (ret)
893
return -ENXIO;
894
895
/* setup MMIO */
896
ret = lv1_gpu_device_map(2, &lpar_addr, &lpar_size);
897
if (ret) {
898
pr_info("%s: device map 2 failed %d\n", __func__, ret);
899
goto clean_open;
900
}
901
ps3_mmio_region_init(dev, dev->m_region, lpar_addr, lpar_size,
902
PAGE_SHIFT);
903
904
ret = snd_ps3_map_mmio();
905
if (ret)
906
goto clean_dev_map;
907
908
/* setup DMA area */
909
ps3_dma_region_init(dev, dev->d_region,
910
PAGE_SHIFT, /* use system page size */
911
0, /* dma type; not used */
912
NULL,
913
ALIGN(SND_PS3_DMA_REGION_SIZE, PAGE_SIZE));
914
dev->d_region->ioid = PS3_AUDIO_IOID;
915
916
ret = ps3_dma_region_create(dev->d_region);
917
if (ret) {
918
pr_info("%s: region_create\n", __func__);
919
goto clean_mmio;
920
}
921
922
dummy_mask = DMA_BIT_MASK(32);
923
dev->core.dma_mask = &dummy_mask;
924
dma_set_coherent_mask(&dev->core, dummy_mask);
925
926
snd_ps3_audio_set_base_addr(dev->d_region->bus_addr);
927
928
/* CONFIG_SND_PS3_DEFAULT_START_DELAY */
929
the_card.start_delay = snd_ps3_start_delay;
930
931
/* irq */
932
if (snd_ps3_allocate_irq()) {
933
ret = -ENXIO;
934
goto clean_dma_region;
935
}
936
937
/* create card instance */
938
ret = snd_card_new(&dev->core, index, id, THIS_MODULE,
939
0, &the_card.card);
940
if (ret < 0)
941
goto clean_irq;
942
943
strscpy(the_card.card->driver, "PS3");
944
strscpy(the_card.card->shortname, "PS3");
945
strscpy(the_card.card->longname, "PS3 sound");
946
947
/* create control elements */
948
for (i = 0; i < ARRAY_SIZE(spdif_ctls); i++) {
949
ret = snd_ctl_add(the_card.card,
950
snd_ctl_new1(&spdif_ctls[i], &the_card));
951
if (ret < 0)
952
goto clean_card;
953
}
954
955
/* create PCM devices instance */
956
/* NOTE:this driver works assuming pcm:substream = 1:1 */
957
ret = snd_pcm_new(the_card.card,
958
"SPDIF",
959
0, /* instance index, will be stored pcm.device*/
960
1, /* output substream */
961
0, /* input substream */
962
&(the_card.pcm));
963
if (ret)
964
goto clean_card;
965
966
the_card.pcm->private_data = &the_card;
967
strscpy(the_card.pcm->name, "SPDIF");
968
969
/* set pcm ops */
970
snd_pcm_set_ops(the_card.pcm, SNDRV_PCM_STREAM_PLAYBACK,
971
&snd_ps3_pcm_spdif_ops);
972
973
the_card.pcm->info_flags = SNDRV_PCM_INFO_NONINTERLEAVED;
974
/* pre-alloc PCM DMA buffer*/
975
snd_pcm_set_managed_buffer_all(the_card.pcm,
976
SNDRV_DMA_TYPE_DEV,
977
&dev->core,
978
SND_PS3_PCM_PREALLOC_SIZE,
979
SND_PS3_PCM_PREALLOC_SIZE);
980
981
/*
982
* allocate null buffer
983
* its size should be lager than PS3_AUDIO_FIFO_STAGE_SIZE * 2
984
* PAGE_SIZE is enogh
985
*/
986
the_card.null_buffer_start_vaddr =
987
dma_alloc_coherent(&the_card.ps3_dev->core,
988
PAGE_SIZE,
989
&the_card.null_buffer_start_dma_addr,
990
GFP_KERNEL);
991
if (!the_card.null_buffer_start_vaddr) {
992
pr_info("%s: nullbuffer alloc failed\n", __func__);
993
ret = -ENOMEM;
994
goto clean_card;
995
}
996
pr_debug("%s: null vaddr=%p dma=%#llx\n", __func__,
997
the_card.null_buffer_start_vaddr,
998
the_card.null_buffer_start_dma_addr);
999
/* set default sample rate/word width */
1000
snd_ps3_init_avsetting(&the_card);
1001
1002
/* register the card */
1003
ret = snd_card_register(the_card.card);
1004
if (ret < 0)
1005
goto clean_dma_map;
1006
1007
pr_info("%s started. start_delay=%dms\n",
1008
the_card.card->longname, the_card.start_delay);
1009
return 0;
1010
1011
clean_dma_map:
1012
dma_free_coherent(&the_card.ps3_dev->core,
1013
PAGE_SIZE,
1014
the_card.null_buffer_start_vaddr,
1015
the_card.null_buffer_start_dma_addr);
1016
clean_card:
1017
snd_card_free(the_card.card);
1018
clean_irq:
1019
snd_ps3_free_irq();
1020
clean_dma_region:
1021
ps3_dma_region_free(dev->d_region);
1022
clean_mmio:
1023
snd_ps3_unmap_mmio();
1024
clean_dev_map:
1025
lv1_gpu_device_unmap(2);
1026
clean_open:
1027
ps3_close_hv_device(dev);
1028
/*
1029
* there is no destructor function to pcm.
1030
* midlayer automatically releases if the card removed
1031
*/
1032
return ret;
1033
}; /* snd_ps3_probe */
1034
1035
/* called when module removal */
1036
static void snd_ps3_driver_remove(struct ps3_system_bus_device *dev)
1037
{
1038
pr_info("%s:start id=%d\n", __func__, dev->match_id);
1039
1040
/*
1041
* ctl and preallocate buffer will be freed in
1042
* snd_card_free
1043
*/
1044
snd_card_free(the_card.card);
1045
1046
dma_free_coherent(&dev->core,
1047
PAGE_SIZE,
1048
the_card.null_buffer_start_vaddr,
1049
the_card.null_buffer_start_dma_addr);
1050
1051
ps3_dma_region_free(dev->d_region);
1052
1053
snd_ps3_free_irq();
1054
snd_ps3_unmap_mmio();
1055
1056
lv1_gpu_device_unmap(2);
1057
ps3_close_hv_device(dev);
1058
pr_info("%s:end id=%d\n", __func__, dev->match_id);
1059
} /* snd_ps3_remove */
1060
1061
static struct ps3_system_bus_driver snd_ps3_bus_driver_info = {
1062
.match_id = PS3_MATCH_ID_SOUND,
1063
.probe = snd_ps3_driver_probe,
1064
.remove = snd_ps3_driver_remove,
1065
.shutdown = snd_ps3_driver_remove,
1066
.core = {
1067
.name = SND_PS3_DRIVER_NAME,
1068
.owner = THIS_MODULE,
1069
},
1070
};
1071
1072
1073
/*
1074
* module/subsystem initialize/terminate
1075
*/
1076
static int __init snd_ps3_init(void)
1077
{
1078
int ret;
1079
1080
if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
1081
return -ENXIO;
1082
1083
memset(&the_card, 0, sizeof(the_card));
1084
spin_lock_init(&the_card.dma_lock);
1085
1086
/* register systembus DRIVER, this calls our probe() func */
1087
ret = ps3_system_bus_driver_register(&snd_ps3_bus_driver_info);
1088
1089
return ret;
1090
}
1091
module_init(snd_ps3_init);
1092
1093
static void __exit snd_ps3_exit(void)
1094
{
1095
ps3_system_bus_driver_unregister(&snd_ps3_bus_driver_info);
1096
}
1097
module_exit(snd_ps3_exit);
1098
1099
MODULE_LICENSE("GPL v2");
1100
MODULE_DESCRIPTION("PS3 sound driver");
1101
MODULE_AUTHOR("Sony Computer Entertainment Inc.");
1102
MODULE_ALIAS(PS3_MODULE_ALIAS_SOUND);
1103
1104