1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63#include <linux/list.h>
64#include <linux/module.h>
65#include <linux/string.h>
66#include <linux/ioport.h>
67#include <linux/sched.h>
68#include <linux/delay.h>
69#include <linux/sound.h>
70#include <linux/slab.h>
71#include <linux/soundcard.h>
72#include <linux/pci.h>
73#include <linux/bitops.h>
74#include <linux/interrupt.h>
75#include <linux/init.h>
76#include <linux/poll.h>
77#include <linux/mutex.h>
78#include <linux/kernel.h>
79
80#include <asm/byteorder.h>
81#include <asm/dma.h>
82#include <asm/io.h>
83#include <asm/uaccess.h>
84
85#include <asm/sibyte/sb1250_regs.h>
86#include <asm/sibyte/sb1250_int.h>
87#include <asm/sibyte/sb1250_dma.h>
88#include <asm/sibyte/sb1250_scd.h>
89#include <asm/sibyte/sb1250_syncser.h>
90#include <asm/sibyte/sb1250_mac.h>
91#include <asm/sibyte/sb1250.h>
92
93struct cs4297a_state;
94
95static DEFINE_MUTEX(swarm_cs4297a_mutex);
96static void stop_dac(struct cs4297a_state *s);
97static void stop_adc(struct cs4297a_state *s);
98static void start_dac(struct cs4297a_state *s);
99static void start_adc(struct cs4297a_state *s);
100#undef OSS_DOCUMENTED_MIXER_SEMANTICS
101
102
103
104#define CS4297a_MAGIC 0xf00beef1
105
106
107
108
109
110
111
112
113
114
115
116#define CSDEBUG 0
117#if CSDEBUG
118#define CSDEBUG_INTERFACE 1
119#else
120#undef CSDEBUG_INTERFACE
121#endif
122
123
124
125#define CS_INIT 0x00000001
126#define CS_ERROR 0x00000002
127#define CS_INTERRUPT 0x00000004
128#define CS_FUNCTION 0x00000008
129#define CS_WAVE_WRITE 0x00000010
130#define CS_WAVE_READ 0x00000020
131#define CS_AC97 0x00000040
132#define CS_DESCR 0x00000080
133#define CS_OPEN 0x00000400
134#define CS_RELEASE 0x00000800
135#define CS_PARMS 0x00001000
136#define CS_IOCTL 0x00002000
137#define CS_TMP 0x10000000
138
139
140
141
142
143
144
145#if CSDEBUG
146#define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask) ) {x;}
147#else
148#define CS_DBGOUT(mask,level,x)
149#endif
150
151#if CSDEBUG
152static unsigned long cs_debuglevel = 4;
153static unsigned long cs_debugmask = CS_INIT ;
154module_param(cs_debuglevel, int, 0);
155module_param(cs_debugmask, int, 0);
156#endif
157#define CS_TRUE 1
158#define CS_FALSE 0
159
160#define CS_TYPE_ADC 0
161#define CS_TYPE_DAC 1
162
163#define SER_BASE (A_SER_BASE_1 + KSEG1)
164#define SS_CSR(t) (SER_BASE+t)
165#define SS_TXTBL(t) (SER_BASE+R_SER_TX_TABLE_BASE+(t*8))
166#define SS_RXTBL(t) (SER_BASE+R_SER_RX_TABLE_BASE+(t*8))
167
168#define FRAME_BYTES 32
169#define FRAME_SAMPLE_BYTES 4
170
171
172#define SAMPLE_BUF_SIZE (16*1024)
173#define SAMPLE_FRAME_COUNT (SAMPLE_BUF_SIZE / FRAME_SAMPLE_BYTES)
174
175
176#define DMA_BLOAT_FACTOR 1
177#define DMA_DESCR (SAMPLE_FRAME_COUNT / DMA_BLOAT_FACTOR)
178#define DMA_BUF_SIZE (DMA_DESCR * FRAME_BYTES)
179
180
181#define DMA_INT_CNT ((1 << S_DMA_INT_PKTCNT) - 1)
182
183
184#define REG_LATENCY 150
185
186#define FRAME_TX_US 20
187
188#define SERDMA_NEXTBUF(d,f) (((d)->f+1) % (d)->ringsz)
189
190static const char invalid_magic[] =
191 KERN_CRIT "cs4297a: invalid magic value\n";
192
193#define VALIDATE_STATE(s) \
194({ \
195 if (!(s) || (s)->magic != CS4297a_MAGIC) { \
196 printk(invalid_magic); \
197 return -ENXIO; \
198 } \
199})
200
201
202#define AC97_MASTER_VOL_STEREO 0x0002
203#define AC97_PCBEEP_VOL 0x000a
204#define AC97_PHONE_VOL 0x000c
205#define AC97_MIC_VOL 0x000e
206#define AC97_LINEIN_VOL 0x0010
207#define AC97_CD_VOL 0x0012
208#define AC97_AUX_VOL 0x0016
209#define AC97_PCMOUT_VOL 0x0018
210#define AC97_RECORD_SELECT 0x001a
211#define AC97_RECORD_GAIN 0x001c
212#define AC97_GENERAL_PURPOSE 0x0020
213#define AC97_3D_CONTROL 0x0022
214#define AC97_POWER_CONTROL 0x0026
215#define AC97_VENDOR_ID1 0x007c
216
217struct list_head cs4297a_devs = { &cs4297a_devs, &cs4297a_devs };
218
219typedef struct serdma_descr_s {
220 u64 descr_a;
221 u64 descr_b;
222} serdma_descr_t;
223
224typedef unsigned long paddr_t;
225
226typedef struct serdma_s {
227 unsigned ringsz;
228 serdma_descr_t *descrtab;
229 serdma_descr_t *descrtab_end;
230 paddr_t descrtab_phys;
231
232 serdma_descr_t *descr_add;
233 serdma_descr_t *descr_rem;
234
235 u64 *dma_buf;
236 paddr_t dma_buf_phys;
237 u16 *sample_buf;
238 u16 *sb_swptr;
239 u16 *sb_hwptr;
240 u16 *sb_end;
241
242 dma_addr_t dmaaddr;
243
244 unsigned numfrag;
245 unsigned fragshift;
246 unsigned hwptr, swptr;
247 unsigned total_bytes;
248 unsigned blocks;
249 unsigned wakeup;
250 int count;
251 unsigned underrun;
252 unsigned error;
253 wait_queue_head_t wait;
254 wait_queue_head_t reg_wait;
255
256 unsigned fragsize;
257 unsigned sbufsz;
258 unsigned fragsamples;
259
260 unsigned mapped:1;
261 unsigned ready:1;
262 unsigned endcleared:1;
263 unsigned type:1;
264 unsigned ossfragshift;
265 int ossmaxfrags;
266 unsigned subdivision;
267} serdma_t;
268
269struct cs4297a_state {
270
271 unsigned int magic;
272
273 struct list_head list;
274
275
276 int dev_audio;
277 int dev_mixer;
278
279
280 unsigned int irq;
281
282 struct {
283 unsigned int rx_ovrrn;
284 unsigned int rx_overflow;
285 unsigned int tx_underrun;
286 unsigned int rx_bad;
287 unsigned int rx_good;
288 } stats;
289
290
291 struct {
292 unsigned short vol[10];
293 unsigned int recsrc;
294 unsigned int modcnt;
295 unsigned short micpreamp;
296 } mix;
297
298
299 struct properties {
300 unsigned fmt;
301 unsigned fmt_original;
302 unsigned channels;
303 unsigned rate;
304 } prop_dac, prop_adc;
305 unsigned conversion:1;
306 unsigned ena;
307 spinlock_t lock;
308 struct mutex open_mutex;
309 struct mutex open_sem_adc;
310 struct mutex open_sem_dac;
311 fmode_t open_mode;
312 wait_queue_head_t open_wait;
313 wait_queue_head_t open_wait_adc;
314 wait_queue_head_t open_wait_dac;
315
316 dma_addr_t dmaaddr_sample_buf;
317 unsigned buforder_sample_buf;
318
319 serdma_t dma_dac, dma_adc;
320
321 volatile u16 read_value;
322 volatile u16 read_reg;
323 volatile u64 reg_request;
324};
325
326#if 1
327#define prog_codec(a,b)
328#define dealloc_dmabuf(a,b);
329#endif
330
331static int prog_dmabuf_adc(struct cs4297a_state *s)
332{
333 s->dma_adc.ready = 1;
334 return 0;
335}
336
337
338static int prog_dmabuf_dac(struct cs4297a_state *s)
339{
340 s->dma_dac.ready = 1;
341 return 0;
342}
343
344static void clear_advance(void *buf, unsigned bsize, unsigned bptr,
345 unsigned len, unsigned char c)
346{
347 if (bptr + len > bsize) {
348 unsigned x = bsize - bptr;
349 memset(((char *) buf) + bptr, c, x);
350 bptr = 0;
351 len -= x;
352 }
353 CS_DBGOUT(CS_WAVE_WRITE, 4, printk(KERN_INFO
354 "cs4297a: clear_advance(): memset %d at 0x%.8x for %d size \n",
355 (unsigned)c, (unsigned)((char *) buf) + bptr, len));
356 memset(((char *) buf) + bptr, c, len);
357}
358
359#if CSDEBUG
360
361
362
363#define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
364#define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
365#define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
366#define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
367
368static void cs_printioctl(unsigned int x)
369{
370 unsigned int i;
371 unsigned char vidx;
372
373
374
375 static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
376 [SOUND_MIXER_PCM] = 1,
377 [SOUND_MIXER_LINE1] = 2,
378 [SOUND_MIXER_CD] = 3,
379 [SOUND_MIXER_LINE] = 4,
380 [SOUND_MIXER_SYNTH] = 5,
381 [SOUND_MIXER_MIC] = 6,
382 [SOUND_MIXER_SPEAKER] = 7,
383 [SOUND_MIXER_RECLEV] = 8,
384 [SOUND_MIXER_VOLUME] = 9
385 };
386
387 switch (x) {
388 case SOUND_MIXER_CS_GETDBGMASK:
389 CS_DBGOUT(CS_IOCTL, 4,
390 printk("SOUND_MIXER_CS_GETDBGMASK:\n"));
391 break;
392 case SOUND_MIXER_CS_GETDBGLEVEL:
393 CS_DBGOUT(CS_IOCTL, 4,
394 printk("SOUND_MIXER_CS_GETDBGLEVEL:\n"));
395 break;
396 case SOUND_MIXER_CS_SETDBGMASK:
397 CS_DBGOUT(CS_IOCTL, 4,
398 printk("SOUND_MIXER_CS_SETDBGMASK:\n"));
399 break;
400 case SOUND_MIXER_CS_SETDBGLEVEL:
401 CS_DBGOUT(CS_IOCTL, 4,
402 printk("SOUND_MIXER_CS_SETDBGLEVEL:\n"));
403 break;
404 case OSS_GETVERSION:
405 CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION:\n"));
406 break;
407 case SNDCTL_DSP_SYNC:
408 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC:\n"));
409 break;
410 case SNDCTL_DSP_SETDUPLEX:
411 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX:\n"));
412 break;
413 case SNDCTL_DSP_GETCAPS:
414 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS:\n"));
415 break;
416 case SNDCTL_DSP_RESET:
417 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET:\n"));
418 break;
419 case SNDCTL_DSP_SPEED:
420 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED:\n"));
421 break;
422 case SNDCTL_DSP_STEREO:
423 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO:\n"));
424 break;
425 case SNDCTL_DSP_CHANNELS:
426 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS:\n"));
427 break;
428 case SNDCTL_DSP_GETFMTS:
429 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS:\n"));
430 break;
431 case SNDCTL_DSP_SETFMT:
432 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT:\n"));
433 break;
434 case SNDCTL_DSP_POST:
435 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST:\n"));
436 break;
437 case SNDCTL_DSP_GETTRIGGER:
438 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER:\n"));
439 break;
440 case SNDCTL_DSP_SETTRIGGER:
441 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER:\n"));
442 break;
443 case SNDCTL_DSP_GETOSPACE:
444 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE:\n"));
445 break;
446 case SNDCTL_DSP_GETISPACE:
447 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE:\n"));
448 break;
449 case SNDCTL_DSP_NONBLOCK:
450 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK:\n"));
451 break;
452 case SNDCTL_DSP_GETODELAY:
453 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY:\n"));
454 break;
455 case SNDCTL_DSP_GETIPTR:
456 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR:\n"));
457 break;
458 case SNDCTL_DSP_GETOPTR:
459 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR:\n"));
460 break;
461 case SNDCTL_DSP_GETBLKSIZE:
462 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE:\n"));
463 break;
464 case SNDCTL_DSP_SETFRAGMENT:
465 CS_DBGOUT(CS_IOCTL, 4,
466 printk("SNDCTL_DSP_SETFRAGMENT:\n"));
467 break;
468 case SNDCTL_DSP_SUBDIVIDE:
469 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE:\n"));
470 break;
471 case SOUND_PCM_READ_RATE:
472 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE:\n"));
473 break;
474 case SOUND_PCM_READ_CHANNELS:
475 CS_DBGOUT(CS_IOCTL, 4,
476 printk("SOUND_PCM_READ_CHANNELS:\n"));
477 break;
478 case SOUND_PCM_READ_BITS:
479 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS:\n"));
480 break;
481 case SOUND_PCM_WRITE_FILTER:
482 CS_DBGOUT(CS_IOCTL, 4,
483 printk("SOUND_PCM_WRITE_FILTER:\n"));
484 break;
485 case SNDCTL_DSP_SETSYNCRO:
486 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO:\n"));
487 break;
488 case SOUND_PCM_READ_FILTER:
489 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER:\n"));
490 break;
491 case SOUND_MIXER_PRIVATE1:
492 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1:\n"));
493 break;
494 case SOUND_MIXER_PRIVATE2:
495 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2:\n"));
496 break;
497 case SOUND_MIXER_PRIVATE3:
498 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3:\n"));
499 break;
500 case SOUND_MIXER_PRIVATE4:
501 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4:\n"));
502 break;
503 case SOUND_MIXER_PRIVATE5:
504 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5:\n"));
505 break;
506 case SOUND_MIXER_INFO:
507 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO:\n"));
508 break;
509 case SOUND_OLD_MIXER_INFO:
510 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO:\n"));
511 break;
512
513 default:
514 switch (_IOC_NR(x)) {
515 case SOUND_MIXER_VOLUME:
516 CS_DBGOUT(CS_IOCTL, 4,
517 printk("SOUND_MIXER_VOLUME:\n"));
518 break;
519 case SOUND_MIXER_SPEAKER:
520 CS_DBGOUT(CS_IOCTL, 4,
521 printk("SOUND_MIXER_SPEAKER:\n"));
522 break;
523 case SOUND_MIXER_RECLEV:
524 CS_DBGOUT(CS_IOCTL, 4,
525 printk("SOUND_MIXER_RECLEV:\n"));
526 break;
527 case SOUND_MIXER_MIC:
528 CS_DBGOUT(CS_IOCTL, 4,
529 printk("SOUND_MIXER_MIC:\n"));
530 break;
531 case SOUND_MIXER_SYNTH:
532 CS_DBGOUT(CS_IOCTL, 4,
533 printk("SOUND_MIXER_SYNTH:\n"));
534 break;
535 case SOUND_MIXER_RECSRC:
536 CS_DBGOUT(CS_IOCTL, 4,
537 printk("SOUND_MIXER_RECSRC:\n"));
538 break;
539 case SOUND_MIXER_DEVMASK:
540 CS_DBGOUT(CS_IOCTL, 4,
541 printk("SOUND_MIXER_DEVMASK:\n"));
542 break;
543 case SOUND_MIXER_RECMASK:
544 CS_DBGOUT(CS_IOCTL, 4,
545 printk("SOUND_MIXER_RECMASK:\n"));
546 break;
547 case SOUND_MIXER_STEREODEVS:
548 CS_DBGOUT(CS_IOCTL, 4,
549 printk("SOUND_MIXER_STEREODEVS:\n"));
550 break;
551 case SOUND_MIXER_CAPS:
552 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:\n"));
553 break;
554 default:
555 i = _IOC_NR(x);
556 if (i >= SOUND_MIXER_NRDEVICES
557 || !(vidx = mixtable1[i])) {
558 CS_DBGOUT(CS_IOCTL, 4, printk
559 ("UNKNOWN IOCTL: 0x%.8x NR=%d\n",
560 x, i));
561 } else {
562 CS_DBGOUT(CS_IOCTL, 4, printk
563 ("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d\n",
564 x, i));
565 }
566 break;
567 }
568 }
569}
570#endif
571
572
573static int ser_init(struct cs4297a_state *s)
574{
575 int i;
576
577 CS_DBGOUT(CS_INIT, 2,
578 printk(KERN_INFO "cs4297a: Setting up serial parameters\n"));
579
580 __raw_writeq(M_SYNCSER_CMD_RX_RESET | M_SYNCSER_CMD_TX_RESET, SS_CSR(R_SER_CMD));
581
582 __raw_writeq(M_SYNCSER_MSB_FIRST, SS_CSR(R_SER_MODE));
583 __raw_writeq(32, SS_CSR(R_SER_MINFRM_SZ));
584 __raw_writeq(32, SS_CSR(R_SER_MAXFRM_SZ));
585
586 __raw_writeq(1, SS_CSR(R_SER_TX_RD_THRSH));
587 __raw_writeq(4, SS_CSR(R_SER_TX_WR_THRSH));
588 __raw_writeq(8, SS_CSR(R_SER_RX_RD_THRSH));
589
590
591 __raw_writeq((M_SYNCSER_TXSYNC_INT | V_SYNCSER_TXSYNC_DLY(0) | M_SYNCSER_TXCLK_EXT |
592 M_SYNCSER_RXSYNC_INT | V_SYNCSER_RXSYNC_DLY(1) | M_SYNCSER_RXCLK_EXT | M_SYNCSER_RXSYNC_EDGE),
593 SS_CSR(R_SER_LINE_MODE));
594
595
596 __raw_writeq(V_SYNCSER_SEQ_COUNT(14) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_STROBE,
597 SS_TXTBL(0));
598 __raw_writeq(V_SYNCSER_SEQ_COUNT(15) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
599 SS_TXTBL(1));
600 __raw_writeq(V_SYNCSER_SEQ_COUNT(13) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
601 SS_TXTBL(2));
602 __raw_writeq(V_SYNCSER_SEQ_COUNT( 0) | M_SYNCSER_SEQ_ENABLE |
603 M_SYNCSER_SEQ_STROBE | M_SYNCSER_SEQ_LAST, SS_TXTBL(3));
604
605 __raw_writeq(V_SYNCSER_SEQ_COUNT(14) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_STROBE,
606 SS_RXTBL(0));
607 __raw_writeq(V_SYNCSER_SEQ_COUNT(15) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
608 SS_RXTBL(1));
609 __raw_writeq(V_SYNCSER_SEQ_COUNT(13) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_BYTE,
610 SS_RXTBL(2));
611 __raw_writeq(V_SYNCSER_SEQ_COUNT( 0) | M_SYNCSER_SEQ_ENABLE | M_SYNCSER_SEQ_STROBE |
612 M_SYNCSER_SEQ_LAST, SS_RXTBL(3));
613
614 for (i=4; i<16; i++) {
615
616 __raw_writeq(M_SYNCSER_SEQ_LAST, SS_TXTBL(i));
617 __raw_writeq(M_SYNCSER_SEQ_LAST, SS_RXTBL(i));
618 }
619
620 return 0;
621}
622
623static int init_serdma(serdma_t *dma)
624{
625 CS_DBGOUT(CS_INIT, 2,
626 printk(KERN_ERR "cs4297a: desc - %d sbufsize - %d dbufsize - %d\n",
627 DMA_DESCR, SAMPLE_BUF_SIZE, DMA_BUF_SIZE));
628
629
630 dma->ringsz = DMA_DESCR;
631 dma->descrtab = kzalloc(dma->ringsz * sizeof(serdma_descr_t), GFP_KERNEL);
632 if (!dma->descrtab) {
633 printk(KERN_ERR "cs4297a: kzalloc descrtab failed\n");
634 return -1;
635 }
636 dma->descrtab_end = dma->descrtab + dma->ringsz;
637
638 dma->descrtab_phys = CPHYSADDR((long)dma->descrtab);
639 dma->descr_add = dma->descr_rem = dma->descrtab;
640
641
642 dma->dma_buf = kzalloc(DMA_BUF_SIZE, GFP_KERNEL);
643 if (!dma->dma_buf) {
644 printk(KERN_ERR "cs4297a: kzalloc dma_buf failed\n");
645 kfree(dma->descrtab);
646 return -1;
647 }
648 dma->dma_buf_phys = CPHYSADDR((long)dma->dma_buf);
649
650
651 dma->sbufsz = SAMPLE_BUF_SIZE;
652 dma->sample_buf = kmalloc(dma->sbufsz, GFP_KERNEL);
653 if (!dma->sample_buf) {
654 printk(KERN_ERR "cs4297a: kmalloc sample_buf failed\n");
655 kfree(dma->descrtab);
656 kfree(dma->dma_buf);
657 return -1;
658 }
659 dma->sb_swptr = dma->sb_hwptr = dma->sample_buf;
660 dma->sb_end = (u16 *)((void *)dma->sample_buf + dma->sbufsz);
661 dma->fragsize = dma->sbufsz >> 1;
662
663 CS_DBGOUT(CS_INIT, 4,
664 printk(KERN_ERR "cs4297a: descrtab - %08x dma_buf - %x sample_buf - %x\n",
665 (int)dma->descrtab, (int)dma->dma_buf,
666 (int)dma->sample_buf));
667
668 return 0;
669}
670
671static int dma_init(struct cs4297a_state *s)
672{
673 int i;
674
675 CS_DBGOUT(CS_INIT, 2,
676 printk(KERN_INFO "cs4297a: Setting up DMA\n"));
677
678 if (init_serdma(&s->dma_adc) ||
679 init_serdma(&s->dma_dac))
680 return -1;
681
682 if (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_RX))||
683 __raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX))) {
684 panic("DMA state corrupted?!");
685 }
686
687
688
689 for (i=0; i<DMA_DESCR; i++) {
690 s->dma_dac.descrtab[i].descr_a = M_DMA_SERRX_SOP | V_DMA_DSCRA_A_SIZE(1) |
691 (s->dma_dac.dma_buf_phys + i*FRAME_BYTES);
692 s->dma_dac.descrtab[i].descr_b = V_DMA_DSCRB_PKT_SIZE(FRAME_BYTES);
693 s->dma_adc.descrtab[i].descr_a = V_DMA_DSCRA_A_SIZE(1) |
694 (s->dma_adc.dma_buf_phys + i*FRAME_BYTES);
695 s->dma_adc.descrtab[i].descr_b = 0;
696 }
697
698 __raw_writeq((M_DMA_EOP_INT_EN | V_DMA_INT_PKTCNT(DMA_INT_CNT) |
699 V_DMA_RINGSZ(DMA_DESCR) | M_DMA_TDX_EN),
700 SS_CSR(R_SER_DMA_CONFIG0_RX));
701 __raw_writeq(M_DMA_L2CA, SS_CSR(R_SER_DMA_CONFIG1_RX));
702 __raw_writeq(s->dma_adc.descrtab_phys, SS_CSR(R_SER_DMA_DSCR_BASE_RX));
703
704 __raw_writeq(V_DMA_RINGSZ(DMA_DESCR), SS_CSR(R_SER_DMA_CONFIG0_TX));
705 __raw_writeq(M_DMA_L2CA | M_DMA_NO_DSCR_UPDT, SS_CSR(R_SER_DMA_CONFIG1_TX));
706 __raw_writeq(s->dma_dac.descrtab_phys, SS_CSR(R_SER_DMA_DSCR_BASE_TX));
707
708
709 __raw_writeq(DMA_DESCR, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
710
711 __raw_writeq(M_SYNCSER_DMA_RX_EN | M_SYNCSER_DMA_TX_EN, SS_CSR(R_SER_DMA_ENABLE));
712
713 __raw_writeq((M_SYNCSER_RX_SYNC_ERR | M_SYNCSER_RX_OVERRUN | M_SYNCSER_RX_EOP_COUNT),
714 SS_CSR(R_SER_INT_MASK));
715
716
717
718
719 __raw_writeq(M_SYNCSER_CMD_TX_EN, SS_CSR(R_SER_CMD));
720 udelay(1000);
721 __raw_writeq(M_SYNCSER_CMD_RX_EN | M_SYNCSER_CMD_TX_EN, SS_CSR(R_SER_CMD));
722
723
724 while ((__raw_readq(SS_CSR(R_SER_STATUS)) & 0xf1) != 1)
725 ;
726
727 CS_DBGOUT(CS_INIT, 4,
728 printk(KERN_INFO "cs4297a: status: %08x\n",
729 (unsigned int)(__raw_readq(SS_CSR(R_SER_STATUS)) & 0xffffffff)));
730
731 return 0;
732}
733
734static int serdma_reg_access(struct cs4297a_state *s, u64 data)
735{
736 serdma_t *d = &s->dma_dac;
737 u64 *data_p;
738 unsigned swptr;
739 unsigned long flags;
740 serdma_descr_t *descr;
741
742 if (s->reg_request) {
743 printk(KERN_ERR "cs4297a: attempt to issue multiple reg_access\n");
744 return -1;
745 }
746
747 if (s->ena & FMODE_WRITE) {
748
749
750 s->reg_request = data;
751 interruptible_sleep_on(&s->dma_dac.reg_wait);
752
753
754 } else {
755
756 spin_lock_irqsave(&s->lock, flags);
757 if (d->hwptr != d->swptr) {
758 printk(KERN_ERR "cs4297a: reg access found bookkeeping error (hw/sw = %d/%d\n",
759 d->hwptr, d->swptr);
760 spin_unlock_irqrestore(&s->lock, flags);
761 return -1;
762 }
763 swptr = d->swptr;
764 d->hwptr = d->swptr = (d->swptr + 1) % d->ringsz;
765 spin_unlock_irqrestore(&s->lock, flags);
766
767 descr = &d->descrtab[swptr];
768 data_p = &d->dma_buf[swptr * 4];
769 *data_p = cpu_to_be64(data);
770 __raw_writeq(1, SS_CSR(R_SER_DMA_DSCR_COUNT_TX));
771 CS_DBGOUT(CS_DESCR, 4,
772 printk(KERN_INFO "cs4297a: add_tx %p (%x -> %x)\n",
773 data_p, swptr, d->hwptr));
774 }
775
776 CS_DBGOUT(CS_FUNCTION, 6,
777 printk(KERN_INFO "cs4297a: serdma_reg_access()-\n"));
778
779 return 0;
780}
781
782
783
784
785static int cs4297a_read_ac97(struct cs4297a_state *s, u32 offset,
786 u32 * value)
787{
788 CS_DBGOUT(CS_AC97, 1,
789 printk(KERN_INFO "cs4297a: read reg %2x\n", offset));
790 if (serdma_reg_access(s, (0xCLL << 60) | (1LL << 47) | ((u64)(offset & 0x7F) << 40)))
791 return -1;
792
793 interruptible_sleep_on(&s->dma_adc.reg_wait);
794 *value = s->read_value;
795 CS_DBGOUT(CS_AC97, 2,
796 printk(KERN_INFO "cs4297a: rdr reg %x -> %x\n", s->read_reg, s->read_value));
797
798 return 0;
799}
800
801
802
803
804
805static int cs4297a_write_ac97(struct cs4297a_state *s, u32 offset,
806 u32 value)
807{
808 CS_DBGOUT(CS_AC97, 1,
809 printk(KERN_INFO "cs4297a: write reg %2x -> %04x\n", offset, value));
810 return (serdma_reg_access(s, (0xELL << 60) | ((u64)(offset & 0x7F) << 40) | ((value & 0xffff) << 12)));
811}
812
813static void stop_dac(struct cs4297a_state *s)
814{
815 unsigned long flags;
816
817 CS_DBGOUT(CS_WAVE_WRITE, 3, printk(KERN_INFO "cs4297a: stop_dac():\n"));
818 spin_lock_irqsave(&s->lock, flags);
819 s->ena &= ~FMODE_WRITE;
820#if 0
821
822
823
824 __raw_writeq((s->ena & FMODE_READ) ? M_SYNCSER_DMA_RX_EN : 0,
825 SS_CSR(R_SER_DMA_ENABLE));
826#endif
827
828 spin_unlock_irqrestore(&s->lock, flags);
829}
830
831
832static void start_dac(struct cs4297a_state *s)
833{
834 unsigned long flags;
835
836 CS_DBGOUT(CS_FUNCTION, 3, printk(KERN_INFO "cs4297a: start_dac()+\n"));
837 spin_lock_irqsave(&s->lock, flags);
838 if (!(s->ena & FMODE_WRITE) && (s->dma_dac.mapped ||
839 (s->dma_dac.count > 0
840 && s->dma_dac.ready))) {
841 s->ena |= FMODE_WRITE;
842
843
844
845
846
847 CS_DBGOUT(CS_WAVE_WRITE | CS_PARMS, 8, printk(KERN_INFO
848 "cs4297a: start_dac(): start dma\n"));
849
850 }
851 spin_unlock_irqrestore(&s->lock, flags);
852 CS_DBGOUT(CS_FUNCTION, 3,
853 printk(KERN_INFO "cs4297a: start_dac()-\n"));
854}
855
856
857static void stop_adc(struct cs4297a_state *s)
858{
859 unsigned long flags;
860
861 CS_DBGOUT(CS_FUNCTION, 3,
862 printk(KERN_INFO "cs4297a: stop_adc()+\n"));
863
864 spin_lock_irqsave(&s->lock, flags);
865 s->ena &= ~FMODE_READ;
866
867 if (s->conversion == 1) {
868 s->conversion = 0;
869 s->prop_adc.fmt = s->prop_adc.fmt_original;
870 }
871
872
873 spin_unlock_irqrestore(&s->lock, flags);
874 CS_DBGOUT(CS_FUNCTION, 3,
875 printk(KERN_INFO "cs4297a: stop_adc()-\n"));
876}
877
878
879static void start_adc(struct cs4297a_state *s)
880{
881 unsigned long flags;
882
883 CS_DBGOUT(CS_FUNCTION, 2,
884 printk(KERN_INFO "cs4297a: start_adc()+\n"));
885
886 if (!(s->ena & FMODE_READ) &&
887 (s->dma_adc.mapped || s->dma_adc.count <=
888 (signed) (s->dma_adc.sbufsz - 2 * s->dma_adc.fragsize))
889 && s->dma_adc.ready) {
890 if (s->prop_adc.fmt & AFMT_S8 || s->prop_adc.fmt & AFMT_U8) {
891
892
893
894
895
896
897 s->prop_adc.fmt_original = s->prop_adc.fmt;
898 if (s->prop_adc.fmt & AFMT_S8) {
899 s->prop_adc.fmt &= ~AFMT_S8;
900 s->prop_adc.fmt |= AFMT_S16_LE;
901 }
902 if (s->prop_adc.fmt & AFMT_U8) {
903 s->prop_adc.fmt &= ~AFMT_U8;
904 s->prop_adc.fmt |= AFMT_U16_LE;
905 }
906
907
908
909
910 prog_codec(s, CS_TYPE_ADC);
911
912 prog_dmabuf_adc(s);
913 s->conversion = 1;
914 }
915 spin_lock_irqsave(&s->lock, flags);
916 s->ena |= FMODE_READ;
917
918
919
920 spin_unlock_irqrestore(&s->lock, flags);
921
922 CS_DBGOUT(CS_PARMS, 6, printk(KERN_INFO
923 "cs4297a: start_adc(): start adc\n"));
924 }
925 CS_DBGOUT(CS_FUNCTION, 2,
926 printk(KERN_INFO "cs4297a: start_adc()-\n"));
927
928}
929
930
931
932static void cs4297a_update_ptr(struct cs4297a_state *s, int intflag)
933{
934 int good_diff, diff, diff2;
935 u64 *data_p, data;
936 u32 *s_ptr;
937 unsigned hwptr;
938 u32 status;
939 serdma_t *d;
940 serdma_descr_t *descr;
941
942
943 status = intflag ? __raw_readq(SS_CSR(R_SER_STATUS)) : 0;
944
945 if ((s->ena & FMODE_READ) || (status & (M_SYNCSER_RX_EOP_COUNT))) {
946 d = &s->dma_adc;
947 hwptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
948 d->descrtab_phys) / sizeof(serdma_descr_t));
949
950 if (s->ena & FMODE_READ) {
951 CS_DBGOUT(CS_FUNCTION, 2,
952 printk(KERN_INFO "cs4297a: upd_rcv sw->hw->hw %x/%x/%x (int-%d)n",
953 d->swptr, d->hwptr, hwptr, intflag));
954
955 diff2 = diff = (d->ringsz + hwptr - d->hwptr) % d->ringsz;
956 d->hwptr = hwptr;
957 good_diff = 0;
958 s_ptr = (u32 *)&(d->dma_buf[d->swptr*4]);
959 descr = &d->descrtab[d->swptr];
960 while (diff2--) {
961 u64 data = be64_to_cpu(*(u64 *)s_ptr);
962 u64 descr_a;
963 u16 left, right;
964 descr_a = descr->descr_a;
965 descr->descr_a &= ~M_DMA_SERRX_SOP;
966 if ((descr_a & M_DMA_DSCRA_A_ADDR) != CPHYSADDR((long)s_ptr)) {
967 printk(KERN_ERR "cs4297a: RX Bad address (read)\n");
968 }
969 if (((data & 0x9800000000000000) != 0x9800000000000000) ||
970 (!(descr_a & M_DMA_SERRX_SOP)) ||
971 (G_DMA_DSCRB_PKT_SIZE(descr->descr_b) != FRAME_BYTES)) {
972 s->stats.rx_bad++;
973 printk(KERN_DEBUG "cs4297a: RX Bad attributes (read)\n");
974 continue;
975 }
976 s->stats.rx_good++;
977 if ((data >> 61) == 7) {
978 s->read_value = (data >> 12) & 0xffff;
979 s->read_reg = (data >> 40) & 0x7f;
980 wake_up(&d->reg_wait);
981 }
982 if (d->count && (d->sb_hwptr == d->sb_swptr)) {
983 s->stats.rx_overflow++;
984 printk(KERN_DEBUG "cs4297a: RX overflow\n");
985 continue;
986 }
987 good_diff++;
988 left = ((be32_to_cpu(s_ptr[1]) & 0xff) << 8) |
989 ((be32_to_cpu(s_ptr[2]) >> 24) & 0xff);
990 right = (be32_to_cpu(s_ptr[2]) >> 4) & 0xffff;
991 *d->sb_hwptr++ = cpu_to_be16(left);
992 *d->sb_hwptr++ = cpu_to_be16(right);
993 if (d->sb_hwptr == d->sb_end)
994 d->sb_hwptr = d->sample_buf;
995 descr++;
996 if (descr == d->descrtab_end) {
997 descr = d->descrtab;
998 s_ptr = (u32 *)s->dma_adc.dma_buf;
999 } else {
1000 s_ptr += 8;
1001 }
1002 }
1003 d->total_bytes += good_diff * FRAME_SAMPLE_BYTES;
1004 d->count += good_diff * FRAME_SAMPLE_BYTES;
1005 if (d->count > d->sbufsz) {
1006 printk(KERN_ERR "cs4297a: bogus receive overflow!!\n");
1007 }
1008 d->swptr = (d->swptr + diff) % d->ringsz;
1009 __raw_writeq(diff, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
1010 if (d->mapped) {
1011 if (d->count >= (signed) d->fragsize)
1012 wake_up(&d->wait);
1013 } else {
1014 if (d->count > 0) {
1015 CS_DBGOUT(CS_WAVE_READ, 4,
1016 printk(KERN_INFO
1017 "cs4297a: update count -> %d\n", d->count));
1018 wake_up(&d->wait);
1019 }
1020 }
1021 } else {
1022
1023
1024
1025 diff2 = diff = (hwptr + d->ringsz - d->hwptr) % d->ringsz;
1026 if (!diff) {
1027 printk(KERN_ERR "cs4297a: RX full or empty?\n");
1028 }
1029
1030 descr = &d->descrtab[d->swptr];
1031 data_p = &d->dma_buf[d->swptr*4];
1032
1033
1034
1035
1036 do {
1037 data = be64_to_cpu(*data_p);
1038 if ((descr->descr_a & M_DMA_DSCRA_A_ADDR) != CPHYSADDR((long)data_p)) {
1039 printk(KERN_ERR "cs4297a: RX Bad address %d (%llx %lx)\n", d->swptr,
1040 (long long)(descr->descr_a & M_DMA_DSCRA_A_ADDR),
1041 (long)CPHYSADDR((long)data_p));
1042 }
1043 if (!(data & (1LL << 63)) ||
1044 !(descr->descr_a & M_DMA_SERRX_SOP) ||
1045 (G_DMA_DSCRB_PKT_SIZE(descr->descr_b) != FRAME_BYTES)) {
1046 s->stats.rx_bad++;
1047 printk(KERN_DEBUG "cs4297a: RX Bad attributes\n");
1048 } else {
1049 s->stats.rx_good++;
1050 if ((data >> 61) == 7) {
1051 s->read_value = (data >> 12) & 0xffff;
1052 s->read_reg = (data >> 40) & 0x7f;
1053 wake_up(&d->reg_wait);
1054 }
1055 }
1056 descr->descr_a &= ~M_DMA_SERRX_SOP;
1057 descr++;
1058 d->swptr++;
1059 data_p += 4;
1060 if (descr == d->descrtab_end) {
1061 descr = d->descrtab;
1062 d->swptr = 0;
1063 data_p = d->dma_buf;
1064 }
1065 __raw_writeq(1, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
1066 } while (--diff);
1067 d->hwptr = hwptr;
1068
1069 CS_DBGOUT(CS_DESCR, 6,
1070 printk(KERN_INFO "cs4297a: hw/sw %x/%x\n", d->hwptr, d->swptr));
1071 }
1072
1073 CS_DBGOUT(CS_PARMS, 8, printk(KERN_INFO
1074 "cs4297a: cs4297a_update_ptr(): s=0x%.8x hwptr=%d total_bytes=%d count=%d \n",
1075 (unsigned)s, d->hwptr,
1076 d->total_bytes, d->count));
1077 }
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088 if (s->ena & FMODE_WRITE) {
1089 serdma_t *d = &s->dma_dac;
1090 hwptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
1091 d->descrtab_phys) / sizeof(serdma_descr_t));
1092 diff = (d->ringsz + hwptr - d->hwptr) % d->ringsz;
1093 CS_DBGOUT(CS_WAVE_WRITE, 4, printk(KERN_INFO
1094 "cs4297a: cs4297a_update_ptr(): hw/hw/sw %x/%x/%x diff %d count %d\n",
1095 d->hwptr, hwptr, d->swptr, diff, d->count));
1096 d->hwptr = hwptr;
1097
1098 d->total_bytes += diff * FRAME_SAMPLE_BYTES;
1099 if (d->mapped) {
1100 d->count += diff * FRAME_SAMPLE_BYTES;
1101 if (d->count >= d->fragsize) {
1102 d->wakeup = 1;
1103 wake_up(&d->wait);
1104 if (d->count > d->sbufsz)
1105 d->count &= d->sbufsz - 1;
1106 }
1107 } else {
1108 d->count -= diff * FRAME_SAMPLE_BYTES;
1109 if (d->count <= 0) {
1110
1111
1112
1113
1114 CS_DBGOUT(CS_WAVE_WRITE, 6, printk(KERN_INFO
1115 "cs4297a: cs4297a_update_ptr(): memset %d at 0x%.8x for %d size \n",
1116 (unsigned)(s->prop_dac.fmt &
1117 (AFMT_U8 | AFMT_U16_LE)) ? 0x80 : 0,
1118 (unsigned)d->dma_buf,
1119 d->ringsz));
1120 memset(d->dma_buf, 0, d->ringsz * FRAME_BYTES);
1121 if (d->count < 0) {
1122 d->underrun = 1;
1123 s->stats.tx_underrun++;
1124 d->count = 0;
1125 CS_DBGOUT(CS_ERROR, 9, printk(KERN_INFO
1126 "cs4297a: cs4297a_update_ptr(): underrun\n"));
1127 }
1128 } else if (d->count <=
1129 (signed) d->fragsize
1130 && !d->endcleared) {
1131
1132 clear_advance(d->dma_buf,
1133 d->sbufsz,
1134 d->swptr,
1135 d->fragsize,
1136 0);
1137 d->endcleared = 1;
1138 }
1139 if ( (d->count <= (signed) d->sbufsz/2) || intflag)
1140 {
1141 CS_DBGOUT(CS_WAVE_WRITE, 4,
1142 printk(KERN_INFO
1143 "cs4297a: update count -> %d\n", d->count));
1144 wake_up(&d->wait);
1145 }
1146 }
1147 CS_DBGOUT(CS_PARMS, 8, printk(KERN_INFO
1148 "cs4297a: cs4297a_update_ptr(): s=0x%.8x hwptr=%d total_bytes=%d count=%d \n",
1149 (unsigned) s, d->hwptr,
1150 d->total_bytes, d->count));
1151 }
1152}
1153
1154static int mixer_ioctl(struct cs4297a_state *s, unsigned int cmd,
1155 unsigned long arg)
1156{
1157
1158
1159 static const unsigned int mixer_src[8] = {
1160 SOUND_MASK_MIC, SOUND_MASK_CD, 0, SOUND_MASK_LINE1,
1161 SOUND_MASK_LINE, SOUND_MASK_VOLUME, 0, 0
1162 };
1163
1164
1165
1166
1167 static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
1168 [SOUND_MIXER_PCM] = 1,
1169 [SOUND_MIXER_LINE1] = 2,
1170 [SOUND_MIXER_CD] = 3,
1171 [SOUND_MIXER_LINE] = 4,
1172 [SOUND_MIXER_SYNTH] = 5,
1173 [SOUND_MIXER_MIC] = 6,
1174 [SOUND_MIXER_SPEAKER] = 7,
1175 [SOUND_MIXER_RECLEV] = 8,
1176 [SOUND_MIXER_VOLUME] = 9
1177 };
1178
1179 static const unsigned mixreg[] = {
1180 AC97_PCMOUT_VOL,
1181 AC97_AUX_VOL,
1182 AC97_CD_VOL,
1183 AC97_LINEIN_VOL
1184 };
1185 unsigned char l, r, rl, rr, vidx;
1186 unsigned char attentbl[11] =
1187 { 63, 42, 26, 17, 14, 11, 8, 6, 4, 2, 0 };
1188 unsigned temp1;
1189 int i, val;
1190
1191 VALIDATE_STATE(s);
1192 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
1193 "cs4297a: mixer_ioctl(): s=0x%.8x cmd=0x%.8x\n",
1194 (unsigned) s, cmd));
1195#if CSDEBUG
1196 cs_printioctl(cmd);
1197#endif
1198#if CSDEBUG_INTERFACE
1199
1200 if ((cmd == SOUND_MIXER_CS_GETDBGMASK) ||
1201 (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
1202 (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
1203 (cmd == SOUND_MIXER_CS_SETDBGLEVEL))
1204 {
1205 switch (cmd) {
1206
1207 case SOUND_MIXER_CS_GETDBGMASK:
1208 return put_user(cs_debugmask,
1209 (unsigned long *) arg);
1210
1211 case SOUND_MIXER_CS_GETDBGLEVEL:
1212 return put_user(cs_debuglevel,
1213 (unsigned long *) arg);
1214
1215 case SOUND_MIXER_CS_SETDBGMASK:
1216 if (get_user(val, (unsigned long *) arg))
1217 return -EFAULT;
1218 cs_debugmask = val;
1219 return 0;
1220
1221 case SOUND_MIXER_CS_SETDBGLEVEL:
1222 if (get_user(val, (unsigned long *) arg))
1223 return -EFAULT;
1224 cs_debuglevel = val;
1225 return 0;
1226 default:
1227 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
1228 "cs4297a: mixer_ioctl(): ERROR unknown debug cmd\n"));
1229 return 0;
1230 }
1231 }
1232#endif
1233
1234 if (cmd == SOUND_MIXER_PRIVATE1) {
1235 return -EINVAL;
1236 }
1237 if (cmd == SOUND_MIXER_PRIVATE2) {
1238
1239 if (get_user(val, (int *) arg))
1240 return -EFAULT;
1241 if (val != -1) {
1242 temp1 = (val & 0x3f) >> 2;
1243 cs4297a_write_ac97(s, AC97_3D_CONTROL, temp1);
1244 cs4297a_read_ac97(s, AC97_GENERAL_PURPOSE,
1245 &temp1);
1246 cs4297a_write_ac97(s, AC97_GENERAL_PURPOSE,
1247 temp1 | 0x2000);
1248 }
1249 cs4297a_read_ac97(s, AC97_3D_CONTROL, &temp1);
1250 return put_user((temp1 << 2) | 3, (int *) arg);
1251 }
1252 if (cmd == SOUND_MIXER_INFO) {
1253 mixer_info info;
1254 memset(&info, 0, sizeof(info));
1255 strlcpy(info.id, "CS4297a", sizeof(info.id));
1256 strlcpy(info.name, "Crystal CS4297a", sizeof(info.name));
1257 info.modify_counter = s->mix.modcnt;
1258 if (copy_to_user((void *) arg, &info, sizeof(info)))
1259 return -EFAULT;
1260 return 0;
1261 }
1262 if (cmd == SOUND_OLD_MIXER_INFO) {
1263 _old_mixer_info info;
1264 memset(&info, 0, sizeof(info));
1265 strlcpy(info.id, "CS4297a", sizeof(info.id));
1266 strlcpy(info.name, "Crystal CS4297a", sizeof(info.name));
1267 if (copy_to_user((void *) arg, &info, sizeof(info)))
1268 return -EFAULT;
1269 return 0;
1270 }
1271 if (cmd == OSS_GETVERSION)
1272 return put_user(SOUND_VERSION, (int *) arg);
1273
1274 if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
1275 return -EINVAL;
1276
1277
1278
1279 if (_SIOC_DIR(cmd) == _SIOC_READ) {
1280 switch (_IOC_NR(cmd)) {
1281 case SOUND_MIXER_RECSRC:
1282 cs4297a_read_ac97(s, AC97_RECORD_SELECT,
1283 &temp1);
1284 return put_user(mixer_src[temp1 & 7], (int *) arg);
1285
1286 case SOUND_MIXER_DEVMASK:
1287 return put_user(SOUND_MASK_PCM | SOUND_MASK_LINE |
1288 SOUND_MASK_VOLUME | SOUND_MASK_RECLEV,
1289 (int *) arg);
1290
1291 case SOUND_MIXER_RECMASK:
1292 return put_user(SOUND_MASK_LINE | SOUND_MASK_VOLUME,
1293 (int *) arg);
1294
1295 case SOUND_MIXER_STEREODEVS:
1296 return put_user(SOUND_MASK_PCM | SOUND_MASK_LINE |
1297 SOUND_MASK_VOLUME | SOUND_MASK_RECLEV,
1298 (int *) arg);
1299
1300 case SOUND_MIXER_CAPS:
1301 return put_user(SOUND_CAP_EXCL_INPUT, (int *) arg);
1302
1303 default:
1304 i = _IOC_NR(cmd);
1305 if (i >= SOUND_MIXER_NRDEVICES
1306 || !(vidx = mixtable1[i]))
1307 return -EINVAL;
1308 return put_user(s->mix.vol[vidx - 1], (int *) arg);
1309 }
1310 }
1311
1312
1313 if (_SIOC_DIR(cmd) != (_SIOC_READ | _SIOC_WRITE))
1314 return -EINVAL;
1315
1316
1317 s->mix.modcnt++;
1318
1319
1320 switch (_IOC_NR(cmd)) {
1321
1322 case SOUND_MIXER_RECSRC:
1323 if (get_user(val, (int *) arg))
1324 return -EFAULT;
1325 i = hweight32(val);
1326 if (i != 1)
1327 return 0;
1328 for (i = 0; i < sizeof(mixer_src) / sizeof(int); i++) {
1329 if (val == mixer_src[i]) {
1330 temp1 = (i << 8) | i;
1331 cs4297a_write_ac97(s,
1332 AC97_RECORD_SELECT,
1333 temp1);
1334 return 0;
1335 }
1336 }
1337 return 0;
1338
1339 case SOUND_MIXER_VOLUME:
1340 if (get_user(val, (int *) arg))
1341 return -EFAULT;
1342 l = val & 0xff;
1343 if (l > 100)
1344 l = 100;
1345 if (l < 6) {
1346 rl = 63;
1347 l = 0;
1348 } else
1349 rl = attentbl[(10 * l) / 100];
1350
1351 r = (val >> 8) & 0xff;
1352 if (r > 100)
1353 r = 100;
1354 if (r < 6) {
1355 rr = 63;
1356 r = 0;
1357 } else
1358 rr = attentbl[(10 * r) / 100];
1359
1360 if ((rl > 60) && (rr > 60))
1361 temp1 = 0x8000;
1362 else
1363 temp1 = 0;
1364
1365 temp1 |= (rl << 8) | rr;
1366
1367 cs4297a_write_ac97(s, AC97_MASTER_VOL_STEREO, temp1);
1368 cs4297a_write_ac97(s, AC97_PHONE_VOL, temp1);
1369
1370#ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1371 s->mix.vol[8] = ((unsigned int) r << 8) | l;
1372#else
1373 s->mix.vol[8] = val;
1374#endif
1375 return put_user(s->mix.vol[8], (int *) arg);
1376
1377 case SOUND_MIXER_SPEAKER:
1378 if (get_user(val, (int *) arg))
1379 return -EFAULT;
1380 l = val & 0xff;
1381 if (l > 100)
1382 l = 100;
1383 if (l < 3) {
1384 rl = 0;
1385 l = 0;
1386 } else {
1387 rl = (l * 2 - 5) / 13;
1388 l = (rl * 13 + 5) / 2;
1389 }
1390
1391 if (rl < 3) {
1392 temp1 = 0x8000;
1393 rl = 0;
1394 } else
1395 temp1 = 0;
1396 rl = 15 - rl;
1397 temp1 |= rl << 1;
1398 cs4297a_write_ac97(s, AC97_PCBEEP_VOL, temp1);
1399
1400#ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1401 s->mix.vol[6] = l << 8;
1402#else
1403 s->mix.vol[6] = val;
1404#endif
1405 return put_user(s->mix.vol[6], (int *) arg);
1406
1407 case SOUND_MIXER_RECLEV:
1408 if (get_user(val, (int *) arg))
1409 return -EFAULT;
1410 l = val & 0xff;
1411 if (l > 100)
1412 l = 100;
1413 r = (val >> 8) & 0xff;
1414 if (r > 100)
1415 r = 100;
1416 rl = (l * 2 - 5) / 13;
1417 rr = (r * 2 - 5) / 13;
1418 if (rl < 3 && rr < 3)
1419 temp1 = 0x8000;
1420 else
1421 temp1 = 0;
1422
1423 temp1 = temp1 | (rl << 8) | rr;
1424 cs4297a_write_ac97(s, AC97_RECORD_GAIN, temp1);
1425
1426#ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1427 s->mix.vol[7] = ((unsigned int) r << 8) | l;
1428#else
1429 s->mix.vol[7] = val;
1430#endif
1431 return put_user(s->mix.vol[7], (int *) arg);
1432
1433 case SOUND_MIXER_MIC:
1434 if (get_user(val, (int *) arg))
1435 return -EFAULT;
1436 l = val & 0xff;
1437 if (l > 100)
1438 l = 100;
1439 if (l < 1) {
1440 l = 0;
1441 rl = 0;
1442 } else {
1443 rl = ((unsigned) l * 5 - 4) / 16;
1444 l = (rl * 16 + 4) / 5;
1445 }
1446 cs4297a_read_ac97(s, AC97_MIC_VOL, &temp1);
1447 temp1 &= 0x40;
1448 if (rl < 3) {
1449 temp1 |= 0x8000;
1450 rl = 0;
1451 }
1452 rl = 31 - rl;
1453 temp1 |= rl;
1454 cs4297a_write_ac97(s, AC97_MIC_VOL, temp1);
1455
1456#ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1457 s->mix.vol[5] = val << 8;
1458#else
1459 s->mix.vol[5] = val;
1460#endif
1461 return put_user(s->mix.vol[5], (int *) arg);
1462
1463
1464 case SOUND_MIXER_SYNTH:
1465 if (get_user(val, (int *) arg))
1466 return -EFAULT;
1467 l = val & 0xff;
1468 if (l > 100)
1469 l = 100;
1470 if (get_user(val, (int *) arg))
1471 return -EFAULT;
1472 r = (val >> 8) & 0xff;
1473 if (r > 100)
1474 r = 100;
1475 rl = (l * 2 - 11) / 3;
1476 rr = (r * 2 - 11) / 3;
1477 if (rl < 3)
1478 temp1 = 0x0080;
1479 else
1480 temp1 = 0;
1481
1482 rl = 63 - rl;
1483
1484 if (rr < 3)
1485 temp1 = 0x0080;
1486 else
1487 temp1 = 0;
1488 rr = 63 - rr;
1489
1490
1491#ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1492 s->mix.vol[4] = (r << 8) | l;
1493#else
1494 s->mix.vol[4] = val;
1495#endif
1496 return put_user(s->mix.vol[4], (int *) arg);
1497
1498
1499 default:
1500 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
1501 "cs4297a: mixer_ioctl(): default\n"));
1502
1503 i = _IOC_NR(cmd);
1504 if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
1505 return -EINVAL;
1506 if (get_user(val, (int *) arg))
1507 return -EFAULT;
1508 l = val & 0xff;
1509 if (l > 100)
1510 l = 100;
1511 if (l < 1) {
1512 l = 0;
1513 rl = 31;
1514 } else
1515 rl = (attentbl[(l * 10) / 100]) >> 1;
1516
1517 r = (val >> 8) & 0xff;
1518 if (r > 100)
1519 r = 100;
1520 if (r < 1) {
1521 r = 0;
1522 rr = 31;
1523 } else
1524 rr = (attentbl[(r * 10) / 100]) >> 1;
1525 if ((rl > 30) && (rr > 30))
1526 temp1 = 0x8000;
1527 else
1528 temp1 = 0;
1529 temp1 = temp1 | (rl << 8) | rr;
1530 cs4297a_write_ac97(s, mixreg[vidx - 1], temp1);
1531
1532#ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1533 s->mix.vol[vidx - 1] = ((unsigned int) r << 8) | l;
1534#else
1535 s->mix.vol[vidx - 1] = val;
1536#endif
1537 return put_user(s->mix.vol[vidx - 1], (int *) arg);
1538 }
1539}
1540
1541
1542
1543
1544static int cs4297a_open_mixdev(struct inode *inode, struct file *file)
1545{
1546 int minor = iminor(inode);
1547 struct cs4297a_state *s=NULL;
1548 struct list_head *entry;
1549
1550 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
1551 printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()+\n"));
1552
1553 mutex_lock(&swarm_cs4297a_mutex);
1554 list_for_each(entry, &cs4297a_devs)
1555 {
1556 s = list_entry(entry, struct cs4297a_state, list);
1557 if(s->dev_mixer == minor)
1558 break;
1559 }
1560 if (!s)
1561 {
1562 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
1563 printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- -ENODEV\n"));
1564
1565 mutex_unlock(&swarm_cs4297a_mutex);
1566 return -ENODEV;
1567 }
1568 VALIDATE_STATE(s);
1569 file->private_data = s;
1570
1571 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
1572 printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- 0\n"));
1573 mutex_unlock(&swarm_cs4297a_mutex);
1574
1575 return nonseekable_open(inode, file);
1576}
1577
1578
1579static int cs4297a_release_mixdev(struct inode *inode, struct file *file)
1580{
1581 struct cs4297a_state *s =
1582 (struct cs4297a_state *) file->private_data;
1583
1584 VALIDATE_STATE(s);
1585 return 0;
1586}
1587
1588
1589static int cs4297a_ioctl_mixdev(struct file *file,
1590 unsigned int cmd, unsigned long arg)
1591{
1592 int ret;
1593 mutex_lock(&swarm_cs4297a_mutex);
1594 ret = mixer_ioctl((struct cs4297a_state *) file->private_data, cmd,
1595 arg);
1596 mutex_unlock(&swarm_cs4297a_mutex);
1597 return ret;
1598}
1599
1600
1601
1602
1603
1604static const struct file_operations cs4297a_mixer_fops = {
1605 .owner = THIS_MODULE,
1606 .llseek = no_llseek,
1607 .unlocked_ioctl = cs4297a_ioctl_mixdev,
1608 .open = cs4297a_open_mixdev,
1609 .release = cs4297a_release_mixdev,
1610};
1611
1612
1613
1614
1615static int drain_adc(struct cs4297a_state *s, int nonblock)
1616{
1617
1618
1619
1620
1621 return 0;
1622}
1623
1624static int drain_dac(struct cs4297a_state *s, int nonblock)
1625{
1626 DECLARE_WAITQUEUE(wait, current);
1627 unsigned long flags;
1628 unsigned hwptr;
1629 unsigned tmo;
1630 int count;
1631
1632 if (s->dma_dac.mapped)
1633 return 0;
1634 if (nonblock)
1635 return -EBUSY;
1636 add_wait_queue(&s->dma_dac.wait, &wait);
1637 while ((count = __raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX))) ||
1638 (s->dma_dac.count > 0)) {
1639 if (!signal_pending(current)) {
1640 set_current_state(TASK_INTERRUPTIBLE);
1641
1642 tmo = ((count * FRAME_TX_US) * HZ) / 1000000;
1643 schedule_timeout(tmo + 1);
1644 } else {
1645
1646 }
1647 }
1648 spin_lock_irqsave(&s->lock, flags);
1649
1650 hwptr = (int)(((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
1651 s->dma_dac.descrtab_phys) / sizeof(serdma_descr_t));
1652 s->dma_dac.hwptr = s->dma_dac.swptr = hwptr;
1653 spin_unlock_irqrestore(&s->lock, flags);
1654 remove_wait_queue(&s->dma_dac.wait, &wait);
1655 current->state = TASK_RUNNING;
1656 return 0;
1657}
1658
1659
1660
1661
1662static ssize_t cs4297a_read(struct file *file, char *buffer, size_t count,
1663 loff_t * ppos)
1664{
1665 struct cs4297a_state *s =
1666 (struct cs4297a_state *) file->private_data;
1667 ssize_t ret;
1668 unsigned long flags;
1669 int cnt, count_fr, cnt_by;
1670 unsigned copied = 0;
1671
1672 CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
1673 printk(KERN_INFO "cs4297a: cs4297a_read()+ %d \n", count));
1674
1675 VALIDATE_STATE(s);
1676 if (s->dma_adc.mapped)
1677 return -ENXIO;
1678 if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
1679 return ret;
1680 if (!access_ok(VERIFY_WRITE, buffer, count))
1681 return -EFAULT;
1682 ret = 0;
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692 while (count > 0) {
1693 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1694 "_read() count>0 count=%d .count=%d .swptr=%d .hwptr=%d \n",
1695 count, s->dma_adc.count,
1696 s->dma_adc.swptr, s->dma_adc.hwptr));
1697 spin_lock_irqsave(&s->lock, flags);
1698
1699
1700
1701
1702 cnt = (s->dma_adc.sb_end - s->dma_adc.sb_swptr) / 2;
1703 count_fr = s->dma_adc.count / FRAME_SAMPLE_BYTES;
1704
1705
1706
1707
1708
1709
1710
1711 if (count_fr < cnt)
1712 cnt = count_fr;
1713 cnt_by = cnt * FRAME_SAMPLE_BYTES;
1714 spin_unlock_irqrestore(&s->lock, flags);
1715
1716
1717
1718
1719 if (s->conversion) {
1720 if (cnt_by > (count * 2)) {
1721 cnt = (count * 2) / FRAME_SAMPLE_BYTES;
1722 cnt_by = count * 2;
1723 }
1724 } else {
1725 if (cnt_by > count) {
1726 cnt = count / FRAME_SAMPLE_BYTES;
1727 cnt_by = count;
1728 }
1729 }
1730
1731
1732
1733
1734
1735
1736 if (cnt <= 0) {
1737
1738
1739
1740 start_adc(s);
1741 if (file->f_flags & O_NONBLOCK)
1742 return ret ? ret : -EAGAIN;
1743 interruptible_sleep_on(&s->dma_adc.wait);
1744 if (signal_pending(current))
1745 return ret ? ret : -ERESTARTSYS;
1746 continue;
1747 }
1748
1749
1750
1751
1752
1753
1754 CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
1755 "_read() copy_to cnt=%d count=%d ", cnt_by, count));
1756 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1757 " .sbufsz=%d .count=%d buffer=0x%.8x ret=%d\n",
1758 s->dma_adc.sbufsz, s->dma_adc.count,
1759 (unsigned) buffer, ret));
1760
1761 if (copy_to_user (buffer, ((void *)s->dma_adc.sb_swptr), cnt_by))
1762 return ret ? ret : -EFAULT;
1763 copied = cnt_by;
1764
1765
1766 spin_lock_irqsave(&s->lock, flags);
1767 CS_DBGOUT(CS_FUNCTION, 2,
1768 printk(KERN_INFO "cs4297a: upd_rcv sw->hw %x/%x\n", s->dma_adc.swptr, s->dma_adc.hwptr));
1769 s->dma_adc.count -= cnt_by;
1770 s->dma_adc.sb_swptr += cnt * 2;
1771 if (s->dma_adc.sb_swptr == s->dma_adc.sb_end)
1772 s->dma_adc.sb_swptr = s->dma_adc.sample_buf;
1773 spin_unlock_irqrestore(&s->lock, flags);
1774 count -= copied;
1775 buffer += copied;
1776 ret += copied;
1777 start_adc(s);
1778 }
1779 CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
1780 printk(KERN_INFO "cs4297a: cs4297a_read()- %d\n", ret));
1781 return ret;
1782}
1783
1784
1785static ssize_t cs4297a_write(struct file *file, const char *buffer,
1786 size_t count, loff_t * ppos)
1787{
1788 struct cs4297a_state *s =
1789 (struct cs4297a_state *) file->private_data;
1790 ssize_t ret;
1791 unsigned long flags;
1792 unsigned swptr, hwptr;
1793 int cnt;
1794
1795 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
1796 printk(KERN_INFO "cs4297a: cs4297a_write()+ count=%d\n",
1797 count));
1798 VALIDATE_STATE(s);
1799
1800 if (s->dma_dac.mapped)
1801 return -ENXIO;
1802 if (!s->dma_dac.ready && (ret = prog_dmabuf_dac(s)))
1803 return ret;
1804 if (!access_ok(VERIFY_READ, buffer, count))
1805 return -EFAULT;
1806 ret = 0;
1807 while (count > 0) {
1808 serdma_t *d = &s->dma_dac;
1809 int copy_cnt;
1810 u32 *s_tmpl;
1811 u32 *t_tmpl;
1812 u32 left, right;
1813 int swap = (s->prop_dac.fmt == AFMT_S16_LE) || (s->prop_dac.fmt == AFMT_U16_LE);
1814
1815
1816 spin_lock_irqsave(&s->lock, flags);
1817 if (d->count < 0) {
1818 d->count = 0;
1819 d->swptr = d->hwptr;
1820 }
1821 if (d->underrun) {
1822 d->underrun = 0;
1823 hwptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
1824 d->descrtab_phys) / sizeof(serdma_descr_t));
1825 d->swptr = d->hwptr = hwptr;
1826 }
1827 swptr = d->swptr;
1828 cnt = d->sbufsz - (swptr * FRAME_SAMPLE_BYTES);
1829
1830 if (d->count + cnt > d->sbufsz)
1831 cnt = d->sbufsz - d->count;
1832 spin_unlock_irqrestore(&s->lock, flags);
1833 if (cnt > count)
1834 cnt = count;
1835 if (cnt <= 0) {
1836 start_dac(s);
1837 if (file->f_flags & O_NONBLOCK)
1838 return ret ? ret : -EAGAIN;
1839 interruptible_sleep_on(&d->wait);
1840 if (signal_pending(current))
1841 return ret ? ret : -ERESTARTSYS;
1842 continue;
1843 }
1844 if (copy_from_user(d->sample_buf, buffer, cnt))
1845 return ret ? ret : -EFAULT;
1846
1847 copy_cnt = cnt;
1848 s_tmpl = (u32 *)d->sample_buf;
1849 t_tmpl = (u32 *)(d->dma_buf + (swptr * 4));
1850
1851
1852 do {
1853 u32 tmp;
1854
1855 t_tmpl[0] = cpu_to_be32(0x98000000);
1856
1857 tmp = be32_to_cpu(s_tmpl[0]);
1858 left = tmp & 0xffff;
1859 right = tmp >> 16;
1860 if (swap) {
1861 left = swab16(left);
1862 right = swab16(right);
1863 }
1864 t_tmpl[1] = cpu_to_be32(left >> 8);
1865 t_tmpl[2] = cpu_to_be32(((left & 0xff) << 24) |
1866 (right << 4));
1867
1868 s_tmpl++;
1869 t_tmpl += 8;
1870 copy_cnt -= 4;
1871 } while (copy_cnt);
1872
1873
1874 if (s->reg_request) {
1875 *(u64 *)(d->dma_buf + (swptr * 4)) |=
1876 cpu_to_be64(s->reg_request);
1877 s->reg_request = 0;
1878 wake_up(&s->dma_dac.reg_wait);
1879 }
1880
1881 CS_DBGOUT(CS_WAVE_WRITE, 4,
1882 printk(KERN_INFO
1883 "cs4297a: copy in %d to swptr %x\n", cnt, swptr));
1884
1885 swptr = (swptr + (cnt/FRAME_SAMPLE_BYTES)) % d->ringsz;
1886 __raw_writeq(cnt/FRAME_SAMPLE_BYTES, SS_CSR(R_SER_DMA_DSCR_COUNT_TX));
1887 spin_lock_irqsave(&s->lock, flags);
1888 d->swptr = swptr;
1889 d->count += cnt;
1890 d->endcleared = 0;
1891 spin_unlock_irqrestore(&s->lock, flags);
1892 count -= cnt;
1893 buffer += cnt;
1894 ret += cnt;
1895 start_dac(s);
1896 }
1897 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
1898 printk(KERN_INFO "cs4297a: cs4297a_write()- %d\n", ret));
1899 return ret;
1900}
1901
1902
1903static unsigned int cs4297a_poll(struct file *file,
1904 struct poll_table_struct *wait)
1905{
1906 struct cs4297a_state *s =
1907 (struct cs4297a_state *) file->private_data;
1908 unsigned long flags;
1909 unsigned int mask = 0;
1910
1911 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1912 printk(KERN_INFO "cs4297a: cs4297a_poll()+\n"));
1913 VALIDATE_STATE(s);
1914 if (file->f_mode & FMODE_WRITE) {
1915 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1916 printk(KERN_INFO
1917 "cs4297a: cs4297a_poll() wait on FMODE_WRITE\n"));
1918 if(!s->dma_dac.ready && prog_dmabuf_dac(s))
1919 return 0;
1920 poll_wait(file, &s->dma_dac.wait, wait);
1921 }
1922 if (file->f_mode & FMODE_READ) {
1923 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1924 printk(KERN_INFO
1925 "cs4297a: cs4297a_poll() wait on FMODE_READ\n"));
1926 if(!s->dma_dac.ready && prog_dmabuf_adc(s))
1927 return 0;
1928 poll_wait(file, &s->dma_adc.wait, wait);
1929 }
1930 spin_lock_irqsave(&s->lock, flags);
1931 cs4297a_update_ptr(s,CS_FALSE);
1932 if (file->f_mode & FMODE_WRITE) {
1933 if (s->dma_dac.mapped) {
1934 if (s->dma_dac.count >=
1935 (signed) s->dma_dac.fragsize) {
1936 if (s->dma_dac.wakeup)
1937 mask |= POLLOUT | POLLWRNORM;
1938 else
1939 mask = 0;
1940 s->dma_dac.wakeup = 0;
1941 }
1942 } else {
1943 if ((signed) (s->dma_dac.sbufsz/2) >= s->dma_dac.count)
1944 mask |= POLLOUT | POLLWRNORM;
1945 }
1946 } else if (file->f_mode & FMODE_READ) {
1947 if (s->dma_adc.mapped) {
1948 if (s->dma_adc.count >= (signed) s->dma_adc.fragsize)
1949 mask |= POLLIN | POLLRDNORM;
1950 } else {
1951 if (s->dma_adc.count > 0)
1952 mask |= POLLIN | POLLRDNORM;
1953 }
1954 }
1955 spin_unlock_irqrestore(&s->lock, flags);
1956 CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
1957 printk(KERN_INFO "cs4297a: cs4297a_poll()- 0x%.8x\n",
1958 mask));
1959 return mask;
1960}
1961
1962
1963static int cs4297a_mmap(struct file *file, struct vm_area_struct *vma)
1964{
1965
1966 return -EINVAL;
1967 return 0;
1968}
1969
1970
1971static int cs4297a_ioctl(struct file *file,
1972 unsigned int cmd, unsigned long arg)
1973{
1974 struct cs4297a_state *s =
1975 (struct cs4297a_state *) file->private_data;
1976 unsigned long flags;
1977 audio_buf_info abinfo;
1978 count_info cinfo;
1979 int val, mapped, ret;
1980
1981 CS_DBGOUT(CS_FUNCTION|CS_IOCTL, 4, printk(KERN_INFO
1982 "cs4297a: cs4297a_ioctl(): file=0x%.8x cmd=0x%.8x\n",
1983 (unsigned) file, cmd));
1984#if CSDEBUG
1985 cs_printioctl(cmd);
1986#endif
1987 VALIDATE_STATE(s);
1988 mapped = ((file->f_mode & FMODE_WRITE) && s->dma_dac.mapped) ||
1989 ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
1990 switch (cmd) {
1991 case OSS_GETVERSION:
1992 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
1993 "cs4297a: cs4297a_ioctl(): SOUND_VERSION=0x%.8x\n",
1994 SOUND_VERSION));
1995 return put_user(SOUND_VERSION, (int *) arg);
1996
1997 case SNDCTL_DSP_SYNC:
1998 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
1999 "cs4297a: cs4297a_ioctl(): DSP_SYNC\n"));
2000 if (file->f_mode & FMODE_WRITE)
2001 return drain_dac(s,
2002 0
2003 );
2004 return 0;
2005
2006 case SNDCTL_DSP_SETDUPLEX:
2007 return 0;
2008
2009 case SNDCTL_DSP_GETCAPS:
2010 return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
2011 DSP_CAP_TRIGGER | DSP_CAP_MMAP,
2012 (int *) arg);
2013
2014 case SNDCTL_DSP_RESET:
2015 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
2016 "cs4297a: cs4297a_ioctl(): DSP_RESET\n"));
2017 if (file->f_mode & FMODE_WRITE) {
2018 stop_dac(s);
2019 synchronize_irq(s->irq);
2020 s->dma_dac.count = s->dma_dac.total_bytes =
2021 s->dma_dac.blocks = s->dma_dac.wakeup = 0;
2022 s->dma_dac.swptr = s->dma_dac.hwptr =
2023 (int)(((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_TX)) & M_DMA_CURDSCR_ADDR) -
2024 s->dma_dac.descrtab_phys) / sizeof(serdma_descr_t));
2025 }
2026 if (file->f_mode & FMODE_READ) {
2027 stop_adc(s);
2028 synchronize_irq(s->irq);
2029 s->dma_adc.count = s->dma_adc.total_bytes =
2030 s->dma_adc.blocks = s->dma_dac.wakeup = 0;
2031 s->dma_adc.swptr = s->dma_adc.hwptr =
2032 (int)(((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
2033 s->dma_adc.descrtab_phys) / sizeof(serdma_descr_t));
2034 }
2035 return 0;
2036
2037 case SNDCTL_DSP_SPEED:
2038 if (get_user(val, (int *) arg))
2039 return -EFAULT;
2040 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2041 "cs4297a: cs4297a_ioctl(): DSP_SPEED val=%d -> 48000\n", val));
2042 val = 48000;
2043 return put_user(val, (int *) arg);
2044
2045 case SNDCTL_DSP_STEREO:
2046 if (get_user(val, (int *) arg))
2047 return -EFAULT;
2048 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2049 "cs4297a: cs4297a_ioctl(): DSP_STEREO val=%d\n", val));
2050 if (file->f_mode & FMODE_READ) {
2051 stop_adc(s);
2052 s->dma_adc.ready = 0;
2053 s->prop_adc.channels = val ? 2 : 1;
2054 }
2055 if (file->f_mode & FMODE_WRITE) {
2056 stop_dac(s);
2057 s->dma_dac.ready = 0;
2058 s->prop_dac.channels = val ? 2 : 1;
2059 }
2060 return 0;
2061
2062 case SNDCTL_DSP_CHANNELS:
2063 if (get_user(val, (int *) arg))
2064 return -EFAULT;
2065 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2066 "cs4297a: cs4297a_ioctl(): DSP_CHANNELS val=%d\n",
2067 val));
2068 if (val != 0) {
2069 if (file->f_mode & FMODE_READ) {
2070 stop_adc(s);
2071 s->dma_adc.ready = 0;
2072 if (val >= 2)
2073 s->prop_adc.channels = 2;
2074 else
2075 s->prop_adc.channels = 1;
2076 }
2077 if (file->f_mode & FMODE_WRITE) {
2078 stop_dac(s);
2079 s->dma_dac.ready = 0;
2080 if (val >= 2)
2081 s->prop_dac.channels = 2;
2082 else
2083 s->prop_dac.channels = 1;
2084 }
2085 }
2086
2087 if (file->f_mode & FMODE_WRITE)
2088 val = s->prop_dac.channels;
2089 else if (file->f_mode & FMODE_READ)
2090 val = s->prop_adc.channels;
2091
2092 return put_user(val, (int *) arg);
2093
2094 case SNDCTL_DSP_GETFMTS:
2095 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2096 "cs4297a: cs4297a_ioctl(): DSP_GETFMT val=0x%.8x\n",
2097 AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
2098 AFMT_U8));
2099 return put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
2100 AFMT_U8, (int *) arg);
2101
2102 case SNDCTL_DSP_SETFMT:
2103 if (get_user(val, (int *) arg))
2104 return -EFAULT;
2105 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2106 "cs4297a: cs4297a_ioctl(): DSP_SETFMT val=0x%.8x\n",
2107 val));
2108 if (val != AFMT_QUERY) {
2109 if (file->f_mode & FMODE_READ) {
2110 stop_adc(s);
2111 s->dma_adc.ready = 0;
2112 if (val != AFMT_S16_LE
2113 && val != AFMT_U16_LE && val != AFMT_S8
2114 && val != AFMT_U8)
2115 val = AFMT_U8;
2116 s->prop_adc.fmt = val;
2117 s->prop_adc.fmt_original = s->prop_adc.fmt;
2118 }
2119 if (file->f_mode & FMODE_WRITE) {
2120 stop_dac(s);
2121 s->dma_dac.ready = 0;
2122 if (val != AFMT_S16_LE
2123 && val != AFMT_U16_LE && val != AFMT_S8
2124 && val != AFMT_U8)
2125 val = AFMT_U8;
2126 s->prop_dac.fmt = val;
2127 s->prop_dac.fmt_original = s->prop_dac.fmt;
2128 }
2129 } else {
2130 if (file->f_mode & FMODE_WRITE)
2131 val = s->prop_dac.fmt_original;
2132 else if (file->f_mode & FMODE_READ)
2133 val = s->prop_adc.fmt_original;
2134 }
2135 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
2136 "cs4297a: cs4297a_ioctl(): DSP_SETFMT return val=0x%.8x\n",
2137 val));
2138 return put_user(val, (int *) arg);
2139
2140 case SNDCTL_DSP_POST:
2141 CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
2142 "cs4297a: cs4297a_ioctl(): DSP_POST\n"));
2143 return 0;
2144
2145 case SNDCTL_DSP_GETTRIGGER:
2146 val = 0;
2147 if (file->f_mode & s->ena & FMODE_READ)
2148 val |= PCM_ENABLE_INPUT;
2149 if (file->f_mode & s->ena & FMODE_WRITE)
2150 val |= PCM_ENABLE_OUTPUT;
2151 return put_user(val, (int *) arg);
2152
2153 case SNDCTL_DSP_SETTRIGGER:
2154 if (get_user(val, (int *) arg))
2155 return -EFAULT;
2156 if (file->f_mode & FMODE_READ) {
2157 if (val & PCM_ENABLE_INPUT) {
2158 if (!s->dma_adc.ready
2159 && (ret = prog_dmabuf_adc(s)))
2160 return ret;
2161 start_adc(s);
2162 } else
2163 stop_adc(s);
2164 }
2165 if (file->f_mode & FMODE_WRITE) {
2166 if (val & PCM_ENABLE_OUTPUT) {
2167 if (!s->dma_dac.ready
2168 && (ret = prog_dmabuf_dac(s)))
2169 return ret;
2170 start_dac(s);
2171 } else
2172 stop_dac(s);
2173 }
2174 return 0;
2175
2176 case SNDCTL_DSP_GETOSPACE:
2177 if (!(file->f_mode & FMODE_WRITE))
2178 return -EINVAL;
2179 if (!s->dma_dac.ready && (val = prog_dmabuf_dac(s)))
2180 return val;
2181 spin_lock_irqsave(&s->lock, flags);
2182 cs4297a_update_ptr(s,CS_FALSE);
2183 abinfo.fragsize = s->dma_dac.fragsize;
2184 if (s->dma_dac.mapped)
2185 abinfo.bytes = s->dma_dac.sbufsz;
2186 else
2187 abinfo.bytes =
2188 s->dma_dac.sbufsz - s->dma_dac.count;
2189 abinfo.fragstotal = s->dma_dac.numfrag;
2190 abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;
2191 CS_DBGOUT(CS_FUNCTION | CS_PARMS, 4, printk(KERN_INFO
2192 "cs4297a: cs4297a_ioctl(): GETOSPACE .fragsize=%d .bytes=%d .fragstotal=%d .fragments=%d\n",
2193 abinfo.fragsize,abinfo.bytes,abinfo.fragstotal,
2194 abinfo.fragments));
2195 spin_unlock_irqrestore(&s->lock, flags);
2196 return copy_to_user((void *) arg, &abinfo,
2197 sizeof(abinfo)) ? -EFAULT : 0;
2198
2199 case SNDCTL_DSP_GETISPACE:
2200 if (!(file->f_mode & FMODE_READ))
2201 return -EINVAL;
2202 if (!s->dma_adc.ready && (val = prog_dmabuf_adc(s)))
2203 return val;
2204 spin_lock_irqsave(&s->lock, flags);
2205 cs4297a_update_ptr(s,CS_FALSE);
2206 if (s->conversion) {
2207 abinfo.fragsize = s->dma_adc.fragsize / 2;
2208 abinfo.bytes = s->dma_adc.count / 2;
2209 abinfo.fragstotal = s->dma_adc.numfrag;
2210 abinfo.fragments =
2211 abinfo.bytes >> (s->dma_adc.fragshift - 1);
2212 } else {
2213 abinfo.fragsize = s->dma_adc.fragsize;
2214 abinfo.bytes = s->dma_adc.count;
2215 abinfo.fragstotal = s->dma_adc.numfrag;
2216 abinfo.fragments =
2217 abinfo.bytes >> s->dma_adc.fragshift;
2218 }
2219 spin_unlock_irqrestore(&s->lock, flags);
2220 return copy_to_user((void *) arg, &abinfo,
2221 sizeof(abinfo)) ? -EFAULT : 0;
2222
2223 case SNDCTL_DSP_NONBLOCK:
2224 spin_lock(&file->f_lock);
2225 file->f_flags |= O_NONBLOCK;
2226 spin_unlock(&file->f_lock);
2227 return 0;
2228
2229 case SNDCTL_DSP_GETODELAY:
2230 if (!(file->f_mode & FMODE_WRITE))
2231 return -EINVAL;
2232 if(!s->dma_dac.ready && prog_dmabuf_dac(s))
2233 return 0;
2234 spin_lock_irqsave(&s->lock, flags);
2235 cs4297a_update_ptr(s,CS_FALSE);
2236 val = s->dma_dac.count;
2237 spin_unlock_irqrestore(&s->lock, flags);
2238 return put_user(val, (int *) arg);
2239
2240 case SNDCTL_DSP_GETIPTR:
2241 if (!(file->f_mode & FMODE_READ))
2242 return -EINVAL;
2243 if(!s->dma_adc.ready && prog_dmabuf_adc(s))
2244 return 0;
2245 spin_lock_irqsave(&s->lock, flags);
2246 cs4297a_update_ptr(s,CS_FALSE);
2247 cinfo.bytes = s->dma_adc.total_bytes;
2248 if (s->dma_adc.mapped) {
2249 cinfo.blocks =
2250 (cinfo.bytes >> s->dma_adc.fragshift) -
2251 s->dma_adc.blocks;
2252 s->dma_adc.blocks =
2253 cinfo.bytes >> s->dma_adc.fragshift;
2254 } else {
2255 if (s->conversion) {
2256 cinfo.blocks =
2257 s->dma_adc.count /
2258 2 >> (s->dma_adc.fragshift - 1);
2259 } else
2260 cinfo.blocks =
2261 s->dma_adc.count >> s->dma_adc.
2262 fragshift;
2263 }
2264 if (s->conversion)
2265 cinfo.ptr = s->dma_adc.hwptr / 2;
2266 else
2267 cinfo.ptr = s->dma_adc.hwptr;
2268 if (s->dma_adc.mapped)
2269 s->dma_adc.count &= s->dma_adc.fragsize - 1;
2270 spin_unlock_irqrestore(&s->lock, flags);
2271 return copy_to_user((void *) arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2272
2273 case SNDCTL_DSP_GETOPTR:
2274 if (!(file->f_mode & FMODE_WRITE))
2275 return -EINVAL;
2276 if(!s->dma_dac.ready && prog_dmabuf_dac(s))
2277 return 0;
2278 spin_lock_irqsave(&s->lock, flags);
2279 cs4297a_update_ptr(s,CS_FALSE);
2280 cinfo.bytes = s->dma_dac.total_bytes;
2281 if (s->dma_dac.mapped) {
2282 cinfo.blocks =
2283 (cinfo.bytes >> s->dma_dac.fragshift) -
2284 s->dma_dac.blocks;
2285 s->dma_dac.blocks =
2286 cinfo.bytes >> s->dma_dac.fragshift;
2287 } else {
2288 cinfo.blocks =
2289 s->dma_dac.count >> s->dma_dac.fragshift;
2290 }
2291 cinfo.ptr = s->dma_dac.hwptr;
2292 if (s->dma_dac.mapped)
2293 s->dma_dac.count &= s->dma_dac.fragsize - 1;
2294 spin_unlock_irqrestore(&s->lock, flags);
2295 return copy_to_user((void *) arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2296
2297 case SNDCTL_DSP_GETBLKSIZE:
2298 if (file->f_mode & FMODE_WRITE) {
2299 if ((val = prog_dmabuf_dac(s)))
2300 return val;
2301 return put_user(s->dma_dac.fragsize, (int *) arg);
2302 }
2303 if ((val = prog_dmabuf_adc(s)))
2304 return val;
2305 if (s->conversion)
2306 return put_user(s->dma_adc.fragsize / 2,
2307 (int *) arg);
2308 else
2309 return put_user(s->dma_adc.fragsize, (int *) arg);
2310
2311 case SNDCTL_DSP_SETFRAGMENT:
2312 if (get_user(val, (int *) arg))
2313 return -EFAULT;
2314 return 0;
2315
2316 case SNDCTL_DSP_SUBDIVIDE:
2317 if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision)
2318 || (file->f_mode & FMODE_WRITE
2319 && s->dma_dac.subdivision)) return -EINVAL;
2320 if (get_user(val, (int *) arg))
2321 return -EFAULT;
2322 if (val != 1 && val != 2 && val != 4)
2323 return -EINVAL;
2324 if (file->f_mode & FMODE_READ)
2325 s->dma_adc.subdivision = val;
2326 else if (file->f_mode & FMODE_WRITE)
2327 s->dma_dac.subdivision = val;
2328 return 0;
2329
2330 case SOUND_PCM_READ_RATE:
2331 if (file->f_mode & FMODE_READ)
2332 return put_user(s->prop_adc.rate, (int *) arg);
2333 else if (file->f_mode & FMODE_WRITE)
2334 return put_user(s->prop_dac.rate, (int *) arg);
2335
2336 case SOUND_PCM_READ_CHANNELS:
2337 if (file->f_mode & FMODE_READ)
2338 return put_user(s->prop_adc.channels, (int *) arg);
2339 else if (file->f_mode & FMODE_WRITE)
2340 return put_user(s->prop_dac.channels, (int *) arg);
2341
2342 case SOUND_PCM_READ_BITS:
2343 if (file->f_mode & FMODE_READ)
2344 return
2345 put_user(
2346 (s->prop_adc.
2347 fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
2348 (int *) arg);
2349 else if (file->f_mode & FMODE_WRITE)
2350 return
2351 put_user(
2352 (s->prop_dac.
2353 fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
2354 (int *) arg);
2355
2356 case SOUND_PCM_WRITE_FILTER:
2357 case SNDCTL_DSP_SETSYNCRO:
2358 case SOUND_PCM_READ_FILTER:
2359 return -EINVAL;
2360 }
2361 return mixer_ioctl(s, cmd, arg);
2362}
2363
2364static long cs4297a_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
2365{
2366 int ret;
2367
2368 mutex_lock(&swarm_cs4297a_mutex);
2369 ret = cs4297a_ioctl(file, cmd, arg);
2370 mutex_unlock(&swarm_cs4297a_mutex);
2371
2372 return ret;
2373}
2374
2375static int cs4297a_release(struct inode *inode, struct file *file)
2376{
2377 struct cs4297a_state *s =
2378 (struct cs4297a_state *) file->private_data;
2379
2380 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk(KERN_INFO
2381 "cs4297a: cs4297a_release(): inode=0x%.8x file=0x%.8x f_mode=0x%x\n",
2382 (unsigned) inode, (unsigned) file, file->f_mode));
2383 VALIDATE_STATE(s);
2384
2385 if (file->f_mode & FMODE_WRITE) {
2386 drain_dac(s, file->f_flags & O_NONBLOCK);
2387 mutex_lock(&s->open_sem_dac);
2388 stop_dac(s);
2389 dealloc_dmabuf(s, &s->dma_dac);
2390 s->open_mode &= ~FMODE_WRITE;
2391 mutex_unlock(&s->open_sem_dac);
2392 wake_up(&s->open_wait_dac);
2393 }
2394 if (file->f_mode & FMODE_READ) {
2395 drain_adc(s, file->f_flags & O_NONBLOCK);
2396 mutex_lock(&s->open_sem_adc);
2397 stop_adc(s);
2398 dealloc_dmabuf(s, &s->dma_adc);
2399 s->open_mode &= ~FMODE_READ;
2400 mutex_unlock(&s->open_sem_adc);
2401 wake_up(&s->open_wait_adc);
2402 }
2403 return 0;
2404}
2405
2406static int cs4297a_locked_open(struct inode *inode, struct file *file)
2407{
2408 int minor = iminor(inode);
2409 struct cs4297a_state *s=NULL;
2410 struct list_head *entry;
2411
2412 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
2413 "cs4297a: cs4297a_open(): inode=0x%.8x file=0x%.8x f_mode=0x%x\n",
2414 (unsigned) inode, (unsigned) file, file->f_mode));
2415 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
2416 "cs4297a: status = %08x\n", (int)__raw_readq(SS_CSR(R_SER_STATUS_DEBUG))));
2417
2418 list_for_each(entry, &cs4297a_devs)
2419 {
2420 s = list_entry(entry, struct cs4297a_state, list);
2421
2422 if (!((s->dev_audio ^ minor) & ~0xf))
2423 break;
2424 }
2425 if (entry == &cs4297a_devs)
2426 return -ENODEV;
2427 if (!s) {
2428 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
2429 "cs4297a: cs4297a_open(): Error - unable to find audio state struct\n"));
2430 return -ENODEV;
2431 }
2432 VALIDATE_STATE(s);
2433 file->private_data = s;
2434
2435
2436 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) {
2437 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2, printk(KERN_INFO
2438 "cs4297a: cs4297a_open(): Error - must open READ and/or WRITE\n"));
2439 return -ENODEV;
2440 }
2441 if (file->f_mode & FMODE_WRITE) {
2442 if (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX)) != 0) {
2443 printk(KERN_ERR "cs4297a: TX pipe needs to drain\n");
2444 while (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_TX)))
2445 ;
2446 }
2447
2448 mutex_lock(&s->open_sem_dac);
2449 while (s->open_mode & FMODE_WRITE) {
2450 if (file->f_flags & O_NONBLOCK) {
2451 mutex_unlock(&s->open_sem_dac);
2452 return -EBUSY;
2453 }
2454 mutex_unlock(&s->open_sem_dac);
2455 interruptible_sleep_on(&s->open_wait_dac);
2456
2457 if (signal_pending(current)) {
2458 printk("open - sig pending\n");
2459 return -ERESTARTSYS;
2460 }
2461 mutex_lock(&s->open_sem_dac);
2462 }
2463 }
2464 if (file->f_mode & FMODE_READ) {
2465 mutex_lock(&s->open_sem_adc);
2466 while (s->open_mode & FMODE_READ) {
2467 if (file->f_flags & O_NONBLOCK) {
2468 mutex_unlock(&s->open_sem_adc);
2469 return -EBUSY;
2470 }
2471 mutex_unlock(&s->open_sem_adc);
2472 interruptible_sleep_on(&s->open_wait_adc);
2473
2474 if (signal_pending(current)) {
2475 printk("open - sig pending\n");
2476 return -ERESTARTSYS;
2477 }
2478 mutex_lock(&s->open_sem_adc);
2479 }
2480 }
2481 s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2482 if (file->f_mode & FMODE_READ) {
2483 s->prop_adc.fmt = AFMT_S16_BE;
2484 s->prop_adc.fmt_original = s->prop_adc.fmt;
2485 s->prop_adc.channels = 2;
2486 s->prop_adc.rate = 48000;
2487 s->conversion = 0;
2488 s->ena &= ~FMODE_READ;
2489 s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
2490 s->dma_adc.subdivision = 0;
2491 mutex_unlock(&s->open_sem_adc);
2492
2493 if (prog_dmabuf_adc(s)) {
2494 CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
2495 "cs4297a: adc Program dmabufs failed.\n"));
2496 cs4297a_release(inode, file);
2497 return -ENOMEM;
2498 }
2499 }
2500 if (file->f_mode & FMODE_WRITE) {
2501 s->prop_dac.fmt = AFMT_S16_BE;
2502 s->prop_dac.fmt_original = s->prop_dac.fmt;
2503 s->prop_dac.channels = 2;
2504 s->prop_dac.rate = 48000;
2505 s->conversion = 0;
2506 s->ena &= ~FMODE_WRITE;
2507 s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
2508 s->dma_dac.subdivision = 0;
2509 mutex_unlock(&s->open_sem_dac);
2510
2511 if (prog_dmabuf_dac(s)) {
2512 CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
2513 "cs4297a: dac Program dmabufs failed.\n"));
2514 cs4297a_release(inode, file);
2515 return -ENOMEM;
2516 }
2517 }
2518 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2,
2519 printk(KERN_INFO "cs4297a: cs4297a_open()- 0\n"));
2520 return nonseekable_open(inode, file);
2521}
2522
2523static int cs4297a_open(struct inode *inode, struct file *file)
2524{
2525 int ret;
2526
2527 mutex_lock(&swarm_cs4297a_mutex);
2528 ret = cs4297a_open(inode, file);
2529 mutex_unlock(&swarm_cs4297a_mutex);
2530
2531 return ret;
2532}
2533
2534
2535
2536
2537static const struct file_operations cs4297a_audio_fops = {
2538 .owner = THIS_MODULE,
2539 .llseek = no_llseek,
2540 .read = cs4297a_read,
2541 .write = cs4297a_write,
2542 .poll = cs4297a_poll,
2543 .unlocked_ioctl = cs4297a_unlocked_ioctl,
2544 .mmap = cs4297a_mmap,
2545 .open = cs4297a_open,
2546 .release = cs4297a_release,
2547};
2548
2549static void cs4297a_interrupt(int irq, void *dev_id)
2550{
2551 struct cs4297a_state *s = (struct cs4297a_state *) dev_id;
2552 u32 status;
2553
2554 status = __raw_readq(SS_CSR(R_SER_STATUS_DEBUG));
2555
2556 CS_DBGOUT(CS_INTERRUPT, 6, printk(KERN_INFO
2557 "cs4297a: cs4297a_interrupt() HISR=0x%.8x\n", status));
2558
2559#if 0
2560
2561 if (!(status & (M_SYNCSER_RX_EOP_COUNT | M_SYNCSER_RX_OVERRUN | M_SYNCSER_RX_SYNC_ERR))) {
2562 status = __raw_readq(SS_CSR(R_SER_STATUS));
2563 printk(KERN_ERR "cs4297a: unexpected interrupt (status %08x)\n", status);
2564 return;
2565 }
2566#endif
2567
2568 if (status & M_SYNCSER_RX_SYNC_ERR) {
2569 status = __raw_readq(SS_CSR(R_SER_STATUS));
2570 printk(KERN_ERR "cs4297a: rx sync error (status %08x)\n", status);
2571 return;
2572 }
2573
2574 if (status & M_SYNCSER_RX_OVERRUN) {
2575 int newptr, i;
2576 s->stats.rx_ovrrn++;
2577 printk(KERN_ERR "cs4297a: receive FIFO overrun\n");
2578
2579
2580
2581 while (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_RX)))
2582 ;
2583 newptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
2584 s->dma_adc.descrtab_phys) / sizeof(serdma_descr_t));
2585 for (i=0; i<DMA_DESCR; i++) {
2586 s->dma_adc.descrtab[i].descr_a &= ~M_DMA_SERRX_SOP;
2587 }
2588 s->dma_adc.swptr = s->dma_adc.hwptr = newptr;
2589 s->dma_adc.count = 0;
2590 s->dma_adc.sb_swptr = s->dma_adc.sb_hwptr = s->dma_adc.sample_buf;
2591 __raw_writeq(DMA_DESCR, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
2592 }
2593
2594 spin_lock(&s->lock);
2595 cs4297a_update_ptr(s,CS_TRUE);
2596 spin_unlock(&s->lock);
2597
2598 CS_DBGOUT(CS_INTERRUPT, 6, printk(KERN_INFO
2599 "cs4297a: cs4297a_interrupt()-\n"));
2600}
2601
2602#if 0
2603static struct initvol {
2604 int mixch;
2605 int vol;
2606} initvol[] __initdata = {
2607
2608 {SOUND_MIXER_WRITE_VOLUME, 0x4040},
2609 {SOUND_MIXER_WRITE_PCM, 0x4040},
2610 {SOUND_MIXER_WRITE_SYNTH, 0x4040},
2611 {SOUND_MIXER_WRITE_CD, 0x4040},
2612 {SOUND_MIXER_WRITE_LINE, 0x4040},
2613 {SOUND_MIXER_WRITE_LINE1, 0x4040},
2614 {SOUND_MIXER_WRITE_RECLEV, 0x0000},
2615 {SOUND_MIXER_WRITE_SPEAKER, 0x4040},
2616 {SOUND_MIXER_WRITE_MIC, 0x0000}
2617};
2618#endif
2619
2620static int __init cs4297a_init(void)
2621{
2622 struct cs4297a_state *s;
2623 u32 pwr, id;
2624 mm_segment_t fs;
2625 int rval;
2626#ifndef CONFIG_BCM_CS4297A_CSWARM
2627 u64 cfg;
2628 int mdio_val;
2629#endif
2630
2631 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
2632 "cs4297a: cs4297a_init_module()+ \n"));
2633
2634#ifndef CONFIG_BCM_CS4297A_CSWARM
2635 mdio_val = __raw_readq(KSEG1 + A_MAC_REGISTER(2, R_MAC_MDIO)) &
2636 (M_MAC_MDIO_DIR|M_MAC_MDIO_OUT);
2637
2638
2639 cfg = __raw_readq(KSEG1 + A_SCD_SYSTEM_CFG);
2640 if (!(cfg & M_SYS_SER1_ENABLE)) {
2641 __raw_writeq(cfg | M_SYS_SER1_ENABLE, KSEG1+A_SCD_SYSTEM_CFG);
2642 cfg = __raw_readq(KSEG1 + A_SCD_SYSTEM_CFG);
2643 if (!(cfg & M_SYS_SER1_ENABLE)) {
2644 printk(KERN_INFO "cs4297a: serial port 1 not configured for synchronous operation\n");
2645 return -1;
2646 }
2647
2648 printk(KERN_INFO "cs4297a: serial port 1 switching to synchronous operation\n");
2649
2650
2651
2652 __raw_writeq(mdio_val, KSEG1+A_MAC_REGISTER(2, R_MAC_MDIO));
2653 udelay(10);
2654 }
2655
2656
2657 __raw_writeq(mdio_val | M_MAC_GENC, KSEG1+A_MAC_REGISTER(2, R_MAC_MDIO));
2658
2659 udelay(100);
2660#endif
2661
2662 if (!(s = kzalloc(sizeof(struct cs4297a_state), GFP_KERNEL))) {
2663 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
2664 "cs4297a: probe() no memory for state struct.\n"));
2665 return -1;
2666 }
2667 s->magic = CS4297a_MAGIC;
2668 init_waitqueue_head(&s->dma_adc.wait);
2669 init_waitqueue_head(&s->dma_dac.wait);
2670 init_waitqueue_head(&s->dma_adc.reg_wait);
2671 init_waitqueue_head(&s->dma_dac.reg_wait);
2672 init_waitqueue_head(&s->open_wait);
2673 init_waitqueue_head(&s->open_wait_adc);
2674 init_waitqueue_head(&s->open_wait_dac);
2675 mutex_init(&s->open_sem_adc);
2676 mutex_init(&s->open_sem_dac);
2677 spin_lock_init(&s->lock);
2678
2679 s->irq = K_INT_SER_1;
2680
2681 if (request_irq
2682 (s->irq, cs4297a_interrupt, 0, "Crystal CS4297a", s)) {
2683 CS_DBGOUT(CS_INIT | CS_ERROR, 1,
2684 printk(KERN_ERR "cs4297a: irq %u in use\n", s->irq));
2685 goto err_irq;
2686 }
2687 if ((s->dev_audio = register_sound_dsp(&cs4297a_audio_fops, -1)) <
2688 0) {
2689 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
2690 "cs4297a: probe() register_sound_dsp() failed.\n"));
2691 goto err_dev1;
2692 }
2693 if ((s->dev_mixer = register_sound_mixer(&cs4297a_mixer_fops, -1)) <
2694 0) {
2695 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
2696 "cs4297a: probe() register_sound_mixer() failed.\n"));
2697 goto err_dev2;
2698 }
2699
2700 if (ser_init(s) || dma_init(s)) {
2701 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
2702 "cs4297a: ser_init failed.\n"));
2703 goto err_dev3;
2704 }
2705
2706 do {
2707 udelay(4000);
2708 rval = cs4297a_read_ac97(s, AC97_POWER_CONTROL, &pwr);
2709 } while (!rval && (pwr != 0xf));
2710
2711 if (!rval) {
2712 char *sb1250_duart_present;
2713
2714 fs = get_fs();
2715 set_fs(KERNEL_DS);
2716#if 0
2717 val = SOUND_MASK_LINE;
2718 mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long) &val);
2719 for (i = 0; i < ARRAY_SIZE(initvol); i++) {
2720 val = initvol[i].vol;
2721 mixer_ioctl(s, initvol[i].mixch, (unsigned long) &val);
2722 }
2723
2724#else
2725
2726 cs4297a_write_ac97(s, 0x02, 0x0808);
2727 cs4297a_write_ac97(s, 0x18, 0x0808);
2728#endif
2729 set_fs(fs);
2730
2731 list_add(&s->list, &cs4297a_devs);
2732
2733 cs4297a_read_ac97(s, AC97_VENDOR_ID1, &id);
2734
2735 sb1250_duart_present = symbol_get(sb1250_duart_present);
2736 if (sb1250_duart_present)
2737 sb1250_duart_present[1] = 0;
2738
2739 printk(KERN_INFO "cs4297a: initialized (vendor id = %x)\n", id);
2740
2741 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
2742 printk(KERN_INFO "cs4297a: cs4297a_init_module()-\n"));
2743
2744 return 0;
2745 }
2746
2747 err_dev3:
2748 unregister_sound_mixer(s->dev_mixer);
2749 err_dev2:
2750 unregister_sound_dsp(s->dev_audio);
2751 err_dev1:
2752 free_irq(s->irq, s);
2753 err_irq:
2754 kfree(s);
2755
2756 printk(KERN_INFO "cs4297a: initialization failed\n");
2757
2758 return -1;
2759}
2760
2761static void __exit cs4297a_cleanup(void)
2762{
2763
2764
2765
2766
2767
2768
2769
2770
2771 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
2772 printk(KERN_INFO "cs4297a: cleanup_cs4297a() finished\n"));
2773}
2774
2775
2776
2777MODULE_AUTHOR("Kip Walker, Broadcom Corp.");
2778MODULE_DESCRIPTION("Cirrus Logic CS4297a Driver for Broadcom SWARM board");
2779
2780
2781
2782module_init(cs4297a_init);
2783module_exit(cs4297a_cleanup);
2784