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