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