1 /*
2 * Crystal SoundFusion CS46xx driver
3 *
4 * Copyright 1998-2001 Cirrus Logic Corporation <pcaudio@crystal.cirrus.com>
5 * <twoller@crystal.cirrus.com>
6 * Copyright 1999-2000 Jaroslav Kysela <perex@suse.cz>
7 * Copyright 2000 Alan Cox <alan@redhat.com>
8 *
9 * The core of this code is taken from the ALSA project driver by
10 * Jaroslav. Please send Jaroslav the credit for the driver and
11 * report bugs in this port to <alan@redhat.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * Current maintainers:
27 * Cirrus Logic Corporation, Thomas Woller (tw)
28 * <twoller@crystal.cirrus.com>
29 * Nils Faerber (nf)
30 * <nils@kernelconcepts.de>
31 * Thanks to David Pollard for testing.
32 *
33 * Changes:
34 * 20000909-nf Changed cs_read, cs_write and drain_dac
35 * 20001025-tw Separate Playback/Capture structs and buffers.
36 * Added Scatter/Gather support for Playback.
37 * Added Capture.
38 * 20001027-nf Port to kernel 2.4.0-test9, some clean-ups
39 * Start of powermanagement support (CS46XX_PM).
40 * 20001128-tw Add module parm for default buffer order.
41 * added DMA_GFP flag to kmalloc dma buffer allocs.
42 * backfill silence to eliminate stuttering on
43 * underruns.
44 * 20001201-tw add resyncing of swptr on underruns.
45 * 20001205-tw-nf fixed GETOSPACE ioctl() after open()
46 * 20010113-tw patch from Hans Grobler general cleanup.
47 * 20010117-tw 2.4.0 pci cleanup, wrapper code for 2.2.16-2.4.0
48 * 20010118-tw basic PM support for 2.2.16+ and 2.4.0/2.4.2.
49 * 20010228-dh patch from David Huggins - cs_update_ptr recursion.
50 * 20010409-tw add hercules game theatre XP amp code.
51 * 20010420-tw cleanup powerdown/up code.
52 * 20010521-tw eliminate pops, and fixes for powerdown.
53 * 20010525-tw added fixes for thinkpads with powerdown logic.
54 * 20010723-sh patch from Horms (Simon Horman) -
55 * SOUND_PCM_READ_BITS returns bits as set in driver
56 * rather than a logical or of the possible values.
57 * Various ioctls handle the case where the device
58 * is open for reading or writing but not both better.
59 *
60 * Status:
61 * Playback/Capture supported from 8k-48k.
62 * 16Bit Signed LE & 8Bit Unsigned, with Mono or Stereo supported.
63 *
64 * APM/PM - 2.2.x APM is enabled and functioning fine. APM can also
65 * be enabled for 2.4.x by modifying the CS46XX_ACPI_SUPPORT macro
66 * definition.
67 *
68 * Hercules Game Theatre XP - the EGPIO2 pin controls the external Amp,
69 * so, use the drain/polarity to enable.
70 * hercules_egpio_disable set to 1, will force a 0 to EGPIODR.
71 *
72 * VTB Santa Cruz - the GPIO7/GPIO8 on the Secondary Codec control
73 * the external amplifier for the "back" speakers, since we do not
74 * support the secondary codec then this external amp is also not
75 * turned on.
76 */
77
78 #include <linux/list.h>
79 #include <linux/version.h>
80 #include <linux/module.h>
81 #include <linux/string.h>
82 #include <linux/ioport.h>
83 #include <linux/sched.h>
84 #include <linux/delay.h>
85 #include <linux/sound.h>
86 #include <linux/slab.h>
87 #include <linux/soundcard.h>
88 #include <linux/pci.h>
89 #include <linux/bitops.h>
90 #include <asm/io.h>
91 #include <asm/dma.h>
92 #include <linux/init.h>
93 #include <linux/poll.h>
94 #include <linux/smp_lock.h>
95 #include <linux/wrapper.h>
96 #include <asm/uaccess.h>
97 #include <asm/hardirq.h>
98 #include <linux/ac97_codec.h>
99 #include "cs46xxpm-24.h"
100 #include "cs46xx_wrapper-24.h"
101
102 #include "cs461x.h"
103
104 /* MIDI buffer sizes */
105 #define CS_MIDIINBUF 500
106 #define CS_MIDIOUTBUF 500
107
108 #define ADC_RUNNING 1
109 #define DAC_RUNNING 2
110
111 #define CS_FMT_16BIT 1 /* These are fixed in fact */
112 #define CS_FMT_STEREO 2
113 #define CS_FMT_MASK 3
114
115 #define CS_TYPE_ADC 1
116 #define CS_TYPE_DAC 2
117
118 #define CS_TRUE 1
119 #define CS_FALSE 0
120
121 #define CS_INC_USE_COUNT(m) (atomic_inc(m))
122 #define CS_DEC_USE_COUNT(m) (atomic_dec(m))
123 #define CS_DEC_AND_TEST(m) (atomic_dec_and_test(m))
124 #define CS_IN_USE(m) (atomic_read(m) != 0)
125
126 #define CS_DBGBREAKPOINT {__asm__("INT $3");}
127 /*
128 * CS461x definitions
129 */
130
131 #define CS461X_BA0_SIZE 0x2000
132 #define CS461X_BA1_DATA0_SIZE 0x3000
133 #define CS461X_BA1_DATA1_SIZE 0x3800
134 #define CS461X_BA1_PRG_SIZE 0x7000
135 #define CS461X_BA1_REG_SIZE 0x0100
136
137 #define GOF_PER_SEC 200
138
139 #define CSDEBUG_INTERFACE 1
140 #define CSDEBUG 1
141 /*
142 * Turn on/off debugging compilation by using 1/0 respectively for CSDEBUG
143 *
144 *
145 * CSDEBUG is usual mode is set to 1, then use the
146 * cs_debuglevel and cs_debugmask to turn on or off debugging.
147 * Debug level of 1 has been defined to be kernel errors and info
148 * that should be printed on any released driver.
149 */
150 #if CSDEBUG
151 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;}
152 #else
153 #define CS_DBGOUT(mask,level,x)
154 #endif
155 /*
156 * cs_debugmask areas
157 */
158 #define CS_INIT 0x00000001 /* initialization and probe functions */
159 #define CS_ERROR 0x00000002 /* tmp debugging bit placeholder */
160 #define CS_INTERRUPT 0x00000004 /* interrupt handler (separate from all other) */
161 #define CS_FUNCTION 0x00000008 /* enter/leave functions */
162 #define CS_WAVE_WRITE 0x00000010 /* write information for wave */
163 #define CS_WAVE_READ 0x00000020 /* read information for wave */
164 #define CS_MIDI_WRITE 0x00000040 /* write information for midi */
165 #define CS_MIDI_READ 0x00000080 /* read information for midi */
166 #define CS_MPU401_WRITE 0x00000100 /* write information for mpu401 */
167 #define CS_MPU401_READ 0x00000200 /* read information for mpu401 */
168 #define CS_OPEN 0x00000400 /* all open functions in the driver */
169 #define CS_RELEASE 0x00000800 /* all release functions in the driver */
170 #define CS_PARMS 0x00001000 /* functional and operational parameters */
171 #define CS_IOCTL 0x00002000 /* ioctl (non-mixer) */
172 #define CS_PM 0x00004000 /* PM */
173 #define CS_TMP 0x10000000 /* tmp debug mask bit */
174
175 #define CS_IOCTL_CMD_SUSPEND 0x1 // suspend
176 #define CS_IOCTL_CMD_RESUME 0x2 // resume
177
178 #if CSDEBUG
179 static unsigned long cs_debuglevel=1; /* levels range from 1-9 */
180 MODULE_PARM(cs_debuglevel, "i");
181 static unsigned long cs_debugmask=CS_INIT | CS_ERROR; /* use CS_DBGOUT with various mask values */
182 MODULE_PARM(cs_debugmask, "i");
183 #endif
184 static unsigned long hercules_egpio_disable=0; /* if non-zero set all EGPIO to 0 */
185 MODULE_PARM(hercules_egpio_disable, "i");
186 static unsigned long initdelay=700; /* PM delay in millisecs */
187 MODULE_PARM(initdelay, "i");
188 static unsigned long powerdown=-1; /* turn on/off powerdown processing in driver */
189 MODULE_PARM(powerdown, "i");
190 #define DMABUF_DEFAULTORDER 3
191 static unsigned long defaultorder=DMABUF_DEFAULTORDER;
192 MODULE_PARM(defaultorder, "i");
193
194 static int external_amp;
195 MODULE_PARM(external_amp, "i");
196 static int thinkpad;
197 MODULE_PARM(thinkpad, "i");
198
199 /*
200 * set the powerdown module parm to 0 to disable all
201 * powerdown. also set thinkpad to 1 to disable powerdown,
202 * but also to enable the clkrun functionality.
203 */
204 static unsigned cs_powerdown=1;
205 static unsigned cs_laptop_wait=1;
206
207 /* An instance of the 4610 channel */
208 struct cs_channel
209 {
210 int used;
211 int num;
212 void *state;
213 };
214
215 #define CS46XX_MAJOR_VERSION "1"
216 #define CS46XX_MINOR_VERSION "28"
217
218 #ifdef __ia64__
219 #define CS46XX_ARCH "64" //architecture key
220 #else
221 #define CS46XX_ARCH "32" //architecture key
222 #endif
223
224 struct list_head cs46xx_devs = { &cs46xx_devs, &cs46xx_devs };
225
226 /* magic numbers to protect our data structures */
227 #define CS_CARD_MAGIC 0x43525553 /* "CRUS" */
228 #define CS_STATE_MAGIC 0x4c4f4749 /* "LOGI" */
229 #define NR_HW_CH 3
230
231 /* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
232 #define NR_AC97 2
233
234 static const unsigned sample_size[] = { 1, 2, 2, 4 };
235 static const unsigned sample_shift[] = { 0, 1, 1, 2 };
236
237 /* "software" or virtual channel, an instance of opened /dev/dsp */
238 struct cs_state {
239 unsigned int magic;
240 struct cs_card *card; /* Card info */
241
242 /* single open lock mechanism, only used for recording */
243 struct semaphore open_sem;
244 wait_queue_head_t open_wait;
245
246 /* file mode */
247 mode_t open_mode;
248
249 /* virtual channel number */
250 int virt;
251
252 struct dmabuf {
253 /* wave sample stuff */
254 unsigned int rate;
255 unsigned char fmt, enable;
256
257 /* hardware channel */
258 struct cs_channel *channel;
259 int pringbuf; /* Software ring slot */
260 void *pbuf; /* 4K hardware DMA buffer */
261
262 /* OSS buffer management stuff */
263 void *rawbuf;
264 dma_addr_t dma_handle;
265 unsigned buforder;
266 unsigned numfrag;
267 unsigned fragshift;
268 unsigned divisor;
269 unsigned type;
270 void *tmpbuff; /* tmp buffer for sample conversions */
271 dma_addr_t dmaaddr;
272 dma_addr_t dmaaddr_tmpbuff;
273 unsigned buforder_tmpbuff; /* Log base 2 of size in bytes.. */
274
275 /* our buffer acts like a circular ring */
276 unsigned hwptr; /* where dma last started, updated by update_ptr */
277 unsigned swptr; /* where driver last clear/filled, updated by read/write */
278 int count; /* bytes to be comsumed or been generated by dma machine */
279 unsigned total_bytes; /* total bytes dmaed by hardware */
280 unsigned blocks; /* total blocks */
281
282 unsigned error; /* number of over/underruns */
283 unsigned underrun; /* underrun pending before next write has occurred */
284 wait_queue_head_t wait; /* put process on wait queue when no more space in buffer */
285
286 /* redundant, but makes calculations easier */
287 unsigned fragsize;
288 unsigned dmasize;
289 unsigned fragsamples;
290
291 /* OSS stuff */
292 unsigned mapped:1;
293 unsigned ready:1;
294 unsigned endcleared:1;
295 unsigned SGok:1;
296 unsigned update_flag;
297 unsigned ossfragshift;
298 int ossmaxfrags;
299 unsigned subdivision;
300 } dmabuf;
301 /* Guard against mmap/write/read races */
302 struct semaphore sem;
303 };
304
305 struct cs_card {
306 struct cs_channel channel[2];
307 unsigned int magic;
308
309 /* We keep cs461x cards in a linked list */
310 struct cs_card *next;
311
312 /* The cs461x has a certain amount of cross channel interaction
313 so we use a single per card lock */
314 spinlock_t lock;
315
316 /* Keep AC97 sane */
317 spinlock_t ac97_lock;
318
319 /* mixer use count */
320 atomic_t mixer_use_cnt;
321
322 /* PCI device stuff */
323 struct pci_dev * pci_dev;
324 struct list_head list;
325
326 unsigned int pctl, cctl; /* Hardware DMA flag sets */
327
328 /* soundcore stuff */
329 int dev_audio;
330 int dev_midi;
331
332 /* structures for abstraction of hardware facilities, codecs, banks and channels*/
333 struct ac97_codec *ac97_codec[NR_AC97];
334 struct cs_state *states[2];
335
336 u16 ac97_features;
337
338 int amplifier; /* Amplifier control */
339 void (*amplifier_ctrl)(struct cs_card *, int);
340 void (*amp_init)(struct cs_card *);
341
342 int active; /* Active clocking */
343 void (*active_ctrl)(struct cs_card *, int);
344
345 /* hardware resources */
346 unsigned long ba0_addr;
347 unsigned long ba1_addr;
348 u32 irq;
349
350 /* mappings */
351 void *ba0;
352 union
353 {
354 struct
355 {
356 u8 *data0;
357 u8 *data1;
358 u8 *pmem;
359 u8 *reg;
360 } name;
361 u8 *idx[4];
362 } ba1;
363
364 /* Function support */
365 struct cs_channel *(*alloc_pcm_channel)(struct cs_card *);
366 struct cs_channel *(*alloc_rec_pcm_channel)(struct cs_card *);
367 void (*free_pcm_channel)(struct cs_card *, int chan);
368
369 /* /dev/midi stuff */
370 struct {
371 unsigned ird, iwr, icnt;
372 unsigned ord, owr, ocnt;
373 wait_queue_head_t open_wait;
374 wait_queue_head_t iwait;
375 wait_queue_head_t owait;
376 spinlock_t lock;
377 unsigned char ibuf[CS_MIDIINBUF];
378 unsigned char obuf[CS_MIDIOUTBUF];
379 mode_t open_mode;
380 struct semaphore open_sem;
381 } midi;
382 struct cs46xx_pm pm;
383 };
384
385 static int cs_open_mixdev(struct inode *inode, struct file *file);
386 static int cs_release_mixdev(struct inode *inode, struct file *file);
387 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
388 unsigned long arg);
389 static int cs_hardware_init(struct cs_card *card);
390 static int cs46xx_powerup(struct cs_card *card, unsigned int type);
391 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag);
392 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type);
393 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state);
394 static int cs46xx_resume_tbl(struct pci_dev *pcidev);
395
ld2(unsigned int x)396 static inline unsigned ld2(unsigned int x)
397 {
398 unsigned r = 0;
399
400 if (x >= 0x10000) {
401 x >>= 16;
402 r += 16;
403 }
404 if (x >= 0x100) {
405 x >>= 8;
406 r += 8;
407 }
408 if (x >= 0x10) {
409 x >>= 4;
410 r += 4;
411 }
412 if (x >= 4) {
413 x >>= 2;
414 r += 2;
415 }
416 if (x >= 2)
417 r++;
418 return r;
419 }
420
421 #if CSDEBUG
422
423 /* DEBUG ROUTINES */
424
425 #define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
426 #define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
427 #define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
428 #define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
429 #define SOUND_MIXER_CS_APM _SIOWR('M',124, int)
430
printioctl(unsigned int x)431 void printioctl(unsigned int x)
432 {
433 unsigned int i;
434 unsigned char vidx;
435 /* these values are incorrect for the ac97 driver, fix.
436 * Index of mixtable1[] member is Device ID
437 * and must be <= SOUND_MIXER_NRDEVICES.
438 * Value of array member is index into s->mix.vol[]
439 */
440 static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
441 [SOUND_MIXER_PCM] = 1, /* voice */
442 [SOUND_MIXER_LINE1] = 2, /* AUX */
443 [SOUND_MIXER_CD] = 3, /* CD */
444 [SOUND_MIXER_LINE] = 4, /* Line */
445 [SOUND_MIXER_SYNTH] = 5, /* FM */
446 [SOUND_MIXER_MIC] = 6, /* Mic */
447 [SOUND_MIXER_SPEAKER] = 7, /* Speaker */
448 [SOUND_MIXER_RECLEV] = 8, /* Recording level */
449 [SOUND_MIXER_VOLUME] = 9 /* Master Volume */
450 };
451
452 switch(x)
453 {
454 case SOUND_MIXER_CS_GETDBGMASK:
455 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") );
456 break;
457 case SOUND_MIXER_CS_GETDBGLEVEL:
458 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGLEVEL: ") );
459 break;
460 case SOUND_MIXER_CS_SETDBGMASK:
461 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGMASK: ") );
462 break;
463 case SOUND_MIXER_CS_SETDBGLEVEL:
464 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGLEVEL: ") );
465 break;
466 case OSS_GETVERSION:
467 CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION: ") );
468 break;
469 case SNDCTL_DSP_SYNC:
470 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC: ") );
471 break;
472 case SNDCTL_DSP_SETDUPLEX:
473 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX: ") );
474 break;
475 case SNDCTL_DSP_GETCAPS:
476 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS: ") );
477 break;
478 case SNDCTL_DSP_RESET:
479 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET: ") );
480 break;
481 case SNDCTL_DSP_SPEED:
482 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED: ") );
483 break;
484 case SNDCTL_DSP_STEREO:
485 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO: ") );
486 break;
487 case SNDCTL_DSP_CHANNELS:
488 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS: ") );
489 break;
490 case SNDCTL_DSP_GETFMTS:
491 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS: ") );
492 break;
493 case SNDCTL_DSP_SETFMT:
494 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT: ") );
495 break;
496 case SNDCTL_DSP_POST:
497 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST: ") );
498 break;
499 case SNDCTL_DSP_GETTRIGGER:
500 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER: ") );
501 break;
502 case SNDCTL_DSP_SETTRIGGER:
503 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER: ") );
504 break;
505 case SNDCTL_DSP_GETOSPACE:
506 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE: ") );
507 break;
508 case SNDCTL_DSP_GETISPACE:
509 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE: ") );
510 break;
511 case SNDCTL_DSP_NONBLOCK:
512 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK: ") );
513 break;
514 case SNDCTL_DSP_GETODELAY:
515 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY: ") );
516 break;
517 case SNDCTL_DSP_GETIPTR:
518 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR: ") );
519 break;
520 case SNDCTL_DSP_GETOPTR:
521 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR: ") );
522 break;
523 case SNDCTL_DSP_GETBLKSIZE:
524 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE: ") );
525 break;
526 case SNDCTL_DSP_SETFRAGMENT:
527 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFRAGMENT: ") );
528 break;
529 case SNDCTL_DSP_SUBDIVIDE:
530 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE: ") );
531 break;
532 case SOUND_PCM_READ_RATE:
533 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE: ") );
534 break;
535 case SOUND_PCM_READ_CHANNELS:
536 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_CHANNELS: ") );
537 break;
538 case SOUND_PCM_READ_BITS:
539 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS: ") );
540 break;
541 case SOUND_PCM_WRITE_FILTER:
542 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_WRITE_FILTER: ") );
543 break;
544 case SNDCTL_DSP_SETSYNCRO:
545 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO: ") );
546 break;
547 case SOUND_PCM_READ_FILTER:
548 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") );
549 break;
550
551 case SOUND_MIXER_PRIVATE1:
552 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") );
553 break;
554 case SOUND_MIXER_PRIVATE2:
555 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2: ") );
556 break;
557 case SOUND_MIXER_PRIVATE3:
558 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3: ") );
559 break;
560 case SOUND_MIXER_PRIVATE4:
561 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4: ") );
562 break;
563 case SOUND_MIXER_PRIVATE5:
564 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5: ") );
565 break;
566 case SOUND_MIXER_INFO:
567 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO: ") );
568 break;
569 case SOUND_OLD_MIXER_INFO:
570 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") );
571 break;
572
573 default:
574 switch (_IOC_NR(x))
575 {
576 case SOUND_MIXER_VOLUME:
577 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") );
578 break;
579 case SOUND_MIXER_SPEAKER:
580 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SPEAKER: ") );
581 break;
582 case SOUND_MIXER_RECLEV:
583 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECLEV: ") );
584 break;
585 case SOUND_MIXER_MIC:
586 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_MIC: ") );
587 break;
588 case SOUND_MIXER_SYNTH:
589 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SYNTH: ") );
590 break;
591 case SOUND_MIXER_RECSRC:
592 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECSRC: ") );
593 break;
594 case SOUND_MIXER_DEVMASK:
595 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_DEVMASK: ") );
596 break;
597 case SOUND_MIXER_RECMASK:
598 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECMASK: ") );
599 break;
600 case SOUND_MIXER_STEREODEVS:
601 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_STEREODEVS: ") );
602 break;
603 case SOUND_MIXER_CAPS:
604 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:") );
605 break;
606 default:
607 i = _IOC_NR(x);
608 if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
609 {
610 CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) );
611 }
612 else
613 {
614 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ",
615 x,i) );
616 }
617 break;
618 }
619 }
620 CS_DBGOUT(CS_IOCTL, 4, printk("command = 0x%x IOC_NR=%d\n",x, _IOC_NR(x)) );
621 }
622 #endif
623
624 /*
625 * common I/O routines
626 */
627
cs461x_poke(struct cs_card * codec,unsigned long reg,unsigned int val)628 static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
629 {
630 writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
631 }
632
cs461x_peek(struct cs_card * codec,unsigned long reg)633 static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
634 {
635 return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
636 }
637
cs461x_pokeBA0(struct cs_card * codec,unsigned long reg,unsigned int val)638 static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
639 {
640 writel(val, codec->ba0+reg);
641 }
642
cs461x_peekBA0(struct cs_card * codec,unsigned long reg)643 static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
644 {
645 return readl(codec->ba0+reg);
646 }
647
648
649 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
650 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
651
cs_alloc_pcm_channel(struct cs_card * card)652 static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
653 {
654 if(card->channel[1].used==1)
655 return NULL;
656 card->channel[1].used=1;
657 card->channel[1].num=1;
658 return &card->channel[1];
659 }
660
cs_alloc_rec_pcm_channel(struct cs_card * card)661 static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
662 {
663 if(card->channel[0].used==1)
664 return NULL;
665 card->channel[0].used=1;
666 card->channel[0].num=0;
667 return &card->channel[0];
668 }
669
cs_free_pcm_channel(struct cs_card * card,int channel)670 static void cs_free_pcm_channel(struct cs_card *card, int channel)
671 {
672 card->channel[channel].state = NULL;
673 card->channel[channel].used=0;
674 }
675
676 /*
677 * setup a divisor value to help with conversion from
678 * 16bit Stereo, down to 8bit stereo/mono or 16bit mono.
679 * assign a divisor of 1 if using 16bit Stereo as that is
680 * the only format that the static image will capture.
681 */
cs_set_divisor(struct dmabuf * dmabuf)682 static void cs_set_divisor(struct dmabuf *dmabuf)
683 {
684 if(dmabuf->type == CS_TYPE_DAC)
685 dmabuf->divisor = 1;
686 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
687 (dmabuf->fmt & CS_FMT_16BIT))
688 dmabuf->divisor = 2;
689 else if( (dmabuf->fmt & CS_FMT_STEREO) &&
690 !(dmabuf->fmt & CS_FMT_16BIT))
691 dmabuf->divisor = 2;
692 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
693 !(dmabuf->fmt & CS_FMT_16BIT))
694 dmabuf->divisor = 4;
695 else
696 dmabuf->divisor = 1;
697
698 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, printk(
699 "cs46xx: cs_set_divisor()- %s %d\n",
700 (dmabuf->type == CS_TYPE_ADC) ? "ADC" : "DAC",
701 dmabuf->divisor) );
702 }
703
704 /*
705 * mute some of the more prevalent registers to avoid popping.
706 */
cs_mute(struct cs_card * card,int state)707 static void cs_mute(struct cs_card *card, int state)
708 {
709 struct ac97_codec *dev=card->ac97_codec[0];
710
711 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n",
712 (state == CS_TRUE) ? "Muting" : "UnMuting") );
713
714 if(state == CS_TRUE)
715 {
716 /*
717 * fix pops when powering up on thinkpads
718 */
719 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
720 (u8)BA0_AC97_MASTER_VOLUME);
721 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
722 (u8)BA0_AC97_HEADPHONE_VOLUME);
723 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
724 (u8)BA0_AC97_MASTER_VOLUME_MONO);
725 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
726 (u8)BA0_AC97_PCM_OUT_VOLUME);
727
728 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
729 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
730 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
731 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
732 }
733 else
734 {
735 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume);
736 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume);
737 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono);
738 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, card->pm.u32AC97_pcm_out_volume);
739 }
740 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()-\n"));
741 }
742
743 /* set playback sample rate */
cs_set_dac_rate(struct cs_state * state,unsigned int rate)744 static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
745 {
746 struct dmabuf *dmabuf = &state->dmabuf;
747 unsigned int tmp1, tmp2;
748 unsigned int phiIncr;
749 unsigned int correctionPerGOF, correctionPerSec;
750 unsigned long flags;
751
752 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()+ %d\n",rate) );
753
754 /*
755 * Compute the values used to drive the actual sample rate conversion.
756 * The following formulas are being computed, using inline assembly
757 * since we need to use 64 bit arithmetic to compute the values:
758 *
759 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
760 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
761 * GOF_PER_SEC)
762 * ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
763 * GOF_PER_SEC * correctionPerGOF
764 *
765 * i.e.
766 *
767 * phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
768 * correctionPerGOF:correctionPerSec =
769 * dividend:remainder(ulOther / GOF_PER_SEC)
770 */
771 tmp1 = rate << 16;
772 phiIncr = tmp1 / 48000;
773 tmp1 -= phiIncr * 48000;
774 tmp1 <<= 10;
775 phiIncr <<= 10;
776 tmp2 = tmp1 / 48000;
777 phiIncr += tmp2;
778 tmp1 -= tmp2 * 48000;
779 correctionPerGOF = tmp1 / GOF_PER_SEC;
780 tmp1 -= correctionPerGOF * GOF_PER_SEC;
781 correctionPerSec = tmp1;
782
783 /*
784 * Fill in the SampleRateConverter control block.
785 */
786
787 spin_lock_irqsave(&state->card->lock, flags);
788 cs461x_poke(state->card, BA1_PSRC,
789 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
790 cs461x_poke(state->card, BA1_PPI, phiIncr);
791 spin_unlock_irqrestore(&state->card->lock, flags);
792 dmabuf->rate = rate;
793
794 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()- %d\n",rate) );
795 return rate;
796 }
797
798 /* set recording sample rate */
cs_set_adc_rate(struct cs_state * state,unsigned int rate)799 static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate)
800 {
801 struct dmabuf *dmabuf = &state->dmabuf;
802 struct cs_card *card = state->card;
803 unsigned int phiIncr, coeffIncr, tmp1, tmp2;
804 unsigned int correctionPerGOF, correctionPerSec, initialDelay;
805 unsigned int frameGroupLength, cnt;
806 unsigned long flags;
807 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()+ %d\n",rate) );
808
809 /*
810 * We can only decimate by up to a factor of 1/9th the hardware rate.
811 * Correct the value if an attempt is made to stray outside that limit.
812 */
813 if ((rate * 9) < 48000)
814 rate = 48000 / 9;
815
816 /*
817 * We can not capture at at rate greater than the Input Rate (48000).
818 * Return an error if an attempt is made to stray outside that limit.
819 */
820 if (rate > 48000)
821 rate = 48000;
822
823 /*
824 * Compute the values used to drive the actual sample rate conversion.
825 * The following formulas are being computed, using inline assembly
826 * since we need to use 64 bit arithmetic to compute the values:
827 *
828 * coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
829 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
830 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
831 * GOF_PER_SEC)
832 * correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
833 * GOF_PER_SEC * correctionPerGOF
834 * initialDelay = ceil((24 * Fs,in) / Fs,out)
835 *
836 * i.e.
837 *
838 * coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
839 * phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
840 * correctionPerGOF:correctionPerSec =
841 * dividend:remainder(ulOther / GOF_PER_SEC)
842 * initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
843 */
844
845 tmp1 = rate << 16;
846 coeffIncr = tmp1 / 48000;
847 tmp1 -= coeffIncr * 48000;
848 tmp1 <<= 7;
849 coeffIncr <<= 7;
850 coeffIncr += tmp1 / 48000;
851 coeffIncr ^= 0xFFFFFFFF;
852 coeffIncr++;
853 tmp1 = 48000 << 16;
854 phiIncr = tmp1 / rate;
855 tmp1 -= phiIncr * rate;
856 tmp1 <<= 10;
857 phiIncr <<= 10;
858 tmp2 = tmp1 / rate;
859 phiIncr += tmp2;
860 tmp1 -= tmp2 * rate;
861 correctionPerGOF = tmp1 / GOF_PER_SEC;
862 tmp1 -= correctionPerGOF * GOF_PER_SEC;
863 correctionPerSec = tmp1;
864 initialDelay = ((48000 * 24) + rate - 1) / rate;
865
866 /*
867 * Fill in the VariDecimate control block.
868 */
869 spin_lock_irqsave(&card->lock, flags);
870 cs461x_poke(card, BA1_CSRC,
871 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
872 cs461x_poke(card, BA1_CCI, coeffIncr);
873 cs461x_poke(card, BA1_CD,
874 (((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
875 cs461x_poke(card, BA1_CPI, phiIncr);
876 spin_unlock_irqrestore(&card->lock, flags);
877
878 /*
879 * Figure out the frame group length for the write back task. Basically,
880 * this is just the factors of 24000 (2^6*3*5^3) that are not present in
881 * the output sample rate.
882 */
883 frameGroupLength = 1;
884 for (cnt = 2; cnt <= 64; cnt *= 2) {
885 if (((rate / cnt) * cnt) != rate)
886 frameGroupLength *= 2;
887 }
888 if (((rate / 3) * 3) != rate) {
889 frameGroupLength *= 3;
890 }
891 for (cnt = 5; cnt <= 125; cnt *= 5) {
892 if (((rate / cnt) * cnt) != rate)
893 frameGroupLength *= 5;
894 }
895
896 /*
897 * Fill in the WriteBack control block.
898 */
899 spin_lock_irqsave(&card->lock, flags);
900 cs461x_poke(card, BA1_CFG1, frameGroupLength);
901 cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
902 cs461x_poke(card, BA1_CCST, 0x0000FFFF);
903 cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
904 cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
905 spin_unlock_irqrestore(&card->lock, flags);
906 dmabuf->rate = rate;
907 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()- %d\n",rate) );
908 return rate;
909 }
910
911 /* prepare channel attributes for playback */
cs_play_setup(struct cs_state * state)912 static void cs_play_setup(struct cs_state *state)
913 {
914 struct dmabuf *dmabuf = &state->dmabuf;
915 struct cs_card *card = state->card;
916 unsigned int tmp, Count, playFormat;
917
918 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") );
919 cs461x_poke(card, BA1_PVOL, 0x80008000);
920 if(!dmabuf->SGok)
921 cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
922
923 Count = 4;
924 playFormat=cs461x_peek(card, BA1_PFIE);
925 if ((dmabuf->fmt & CS_FMT_STEREO)) {
926 playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO;
927 Count *= 2;
928 }
929 else
930 playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO;
931
932 if ((dmabuf->fmt & CS_FMT_16BIT)) {
933 playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT
934 | DMA_RQ_C2_AC_SIGNED_CONVERT);
935 Count *= 2;
936 }
937 else
938 playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT
939 | DMA_RQ_C2_AC_SIGNED_CONVERT);
940
941 cs461x_poke(card, BA1_PFIE, playFormat);
942
943 tmp = cs461x_peek(card, BA1_PDTC);
944 tmp &= 0xfffffe00;
945 cs461x_poke(card, BA1_PDTC, tmp | --Count);
946
947 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") );
948
949 }
950
951 struct InitStruct
952 {
953 u32 off;
954 u32 val;
955 } InitArray[] = { {0x00000040, 0x3fc0000f},
956 {0x0000004c, 0x04800000},
957
958 {0x000000b3, 0x00000780},
959 {0x000000b7, 0x00000000},
960 {0x000000bc, 0x07800000},
961
962 {0x000000cd, 0x00800000},
963 };
964
965 /*
966 * "SetCaptureSPValues()" -- Initialize record task values before each
967 * capture startup.
968 */
SetCaptureSPValues(struct cs_card * card)969 void SetCaptureSPValues(struct cs_card *card)
970 {
971 unsigned i, offset;
972 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") );
973 for(i=0; i<sizeof(InitArray)/sizeof(struct InitStruct); i++)
974 {
975 offset = InitArray[i].off*4; /* 8bit to 32bit offset value */
976 cs461x_poke(card, offset, InitArray[i].val );
977 }
978 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()-\n") );
979 }
980
981 /* prepare channel attributes for recording */
cs_rec_setup(struct cs_state * state)982 static void cs_rec_setup(struct cs_state *state)
983 {
984 struct cs_card *card = state->card;
985 struct dmabuf *dmabuf = &state->dmabuf;
986 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n") );
987
988 SetCaptureSPValues(card);
989
990 /*
991 * set the attenuation to 0dB
992 */
993 cs461x_poke(card, BA1_CVOL, 0x80008000);
994
995 /*
996 * set the physical address of the capture buffer into the SP
997 */
998 cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->rawbuf));
999
1000 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()-\n") );
1001 }
1002
1003
1004 /* get current playback/recording dma buffer pointer (byte offset from LBA),
1005 called with spinlock held! */
1006
cs_get_dma_addr(struct cs_state * state)1007 static inline unsigned cs_get_dma_addr(struct cs_state *state)
1008 {
1009 struct dmabuf *dmabuf = &state->dmabuf;
1010 u32 offset;
1011
1012 if ( (!(dmabuf->enable & DAC_RUNNING)) &&
1013 (!(dmabuf->enable & ADC_RUNNING) ) )
1014 {
1015 CS_DBGOUT(CS_ERROR, 2, printk(
1016 "cs46xx: ERROR cs_get_dma_addr(): not enabled \n") );
1017 return 0;
1018 }
1019
1020 /*
1021 * ganularity is byte boundry, good part.
1022 */
1023 if(dmabuf->enable & DAC_RUNNING)
1024 {
1025 offset = cs461x_peek(state->card, BA1_PBA);
1026 }
1027 else /* ADC_RUNNING must be set */
1028 {
1029 offset = cs461x_peek(state->card, BA1_CBA);
1030 }
1031 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9,
1032 printk("cs46xx: cs_get_dma_addr() %d\n",offset) );
1033 offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf;
1034 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8,
1035 printk("cs46xx: cs_get_dma_addr()- %d\n",offset) );
1036 return offset;
1037 }
1038
resync_dma_ptrs(struct cs_state * state)1039 static void resync_dma_ptrs(struct cs_state *state)
1040 {
1041 struct dmabuf *dmabuf;
1042
1043 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") );
1044 if(state)
1045 {
1046 dmabuf = &state->dmabuf;
1047 dmabuf->hwptr=dmabuf->swptr = 0;
1048 dmabuf->pringbuf = 0;
1049 }
1050 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()- \n") );
1051 }
1052
1053 /* Stop recording (lock held) */
__stop_adc(struct cs_state * state)1054 static inline void __stop_adc(struct cs_state *state)
1055 {
1056 struct dmabuf *dmabuf = &state->dmabuf;
1057 struct cs_card *card = state->card;
1058 unsigned int tmp;
1059
1060 dmabuf->enable &= ~ADC_RUNNING;
1061
1062 tmp = cs461x_peek(card, BA1_CCTL);
1063 tmp &= 0xFFFF0000;
1064 cs461x_poke(card, BA1_CCTL, tmp );
1065 }
1066
stop_adc(struct cs_state * state)1067 static void stop_adc(struct cs_state *state)
1068 {
1069 unsigned long flags;
1070
1071 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()+ \n") );
1072 spin_lock_irqsave(&state->card->lock, flags);
1073 __stop_adc(state);
1074 spin_unlock_irqrestore(&state->card->lock, flags);
1075 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()- \n") );
1076 }
1077
start_adc(struct cs_state * state)1078 static void start_adc(struct cs_state *state)
1079 {
1080 struct dmabuf *dmabuf = &state->dmabuf;
1081 struct cs_card *card = state->card;
1082 unsigned long flags;
1083 unsigned int tmp;
1084
1085 spin_lock_irqsave(&card->lock, flags);
1086 if (!(dmabuf->enable & ADC_RUNNING) &&
1087 ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize)
1088 && dmabuf->ready) &&
1089 ((card->pm.flags & CS46XX_PM_IDLE) ||
1090 (card->pm.flags & CS46XX_PM_RESUMED)) )
1091 {
1092 dmabuf->enable |= ADC_RUNNING;
1093 cs_set_divisor(dmabuf);
1094 tmp = cs461x_peek(card, BA1_CCTL);
1095 tmp &= 0xFFFF0000;
1096 tmp |= card->cctl;
1097 CS_DBGOUT(CS_FUNCTION, 2, printk(
1098 "cs46xx: start_adc() poke 0x%x \n",tmp) );
1099 cs461x_poke(card, BA1_CCTL, tmp);
1100 }
1101 spin_unlock_irqrestore(&card->lock, flags);
1102 }
1103
1104 /* stop playback (lock held) */
__stop_dac(struct cs_state * state)1105 static inline void __stop_dac(struct cs_state *state)
1106 {
1107 struct dmabuf *dmabuf = &state->dmabuf;
1108 struct cs_card *card = state->card;
1109 unsigned int tmp;
1110
1111 dmabuf->enable &= ~DAC_RUNNING;
1112
1113 tmp=cs461x_peek(card, BA1_PCTL);
1114 tmp&=0xFFFF;
1115 cs461x_poke(card, BA1_PCTL, tmp);
1116 }
1117
stop_dac(struct cs_state * state)1118 static void stop_dac(struct cs_state *state)
1119 {
1120 unsigned long flags;
1121
1122 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()+ \n") );
1123 spin_lock_irqsave(&state->card->lock, flags);
1124 __stop_dac(state);
1125 spin_unlock_irqrestore(&state->card->lock, flags);
1126 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()- \n") );
1127 }
1128
start_dac(struct cs_state * state)1129 static void start_dac(struct cs_state *state)
1130 {
1131 struct dmabuf *dmabuf = &state->dmabuf;
1132 struct cs_card *card = state->card;
1133 unsigned long flags;
1134 int tmp;
1135
1136 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()+ \n") );
1137 spin_lock_irqsave(&card->lock, flags);
1138 if (!(dmabuf->enable & DAC_RUNNING) &&
1139 ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) &&
1140 ((card->pm.flags & CS46XX_PM_IDLE) ||
1141 (card->pm.flags & CS46XX_PM_RESUMED)) )
1142 {
1143 dmabuf->enable |= DAC_RUNNING;
1144 tmp = cs461x_peek(card, BA1_PCTL);
1145 tmp &= 0xFFFF;
1146 tmp |= card->pctl;
1147 CS_DBGOUT(CS_PARMS, 6, printk(
1148 "cs46xx: start_dac() poke card=0x%.08x tmp=0x%.08x addr=0x%.08x \n",
1149 (unsigned)card, (unsigned)tmp,
1150 (unsigned)card->ba1.idx[(BA1_PCTL >> 16) & 3]+(BA1_PCTL&0xffff) ) );
1151 cs461x_poke(card, BA1_PCTL, tmp);
1152 }
1153 spin_unlock_irqrestore(&card->lock, flags);
1154 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()- \n") );
1155 }
1156
1157 #define DMABUF_MINORDER 1
1158
1159 /*
1160 * allocate DMA buffer, playback and recording buffers are separate.
1161 */
alloc_dmabuf(struct cs_state * state)1162 static int alloc_dmabuf(struct cs_state *state)
1163 {
1164
1165 struct cs_card *card=state->card;
1166 struct dmabuf *dmabuf = &state->dmabuf;
1167 void *rawbuf = NULL;
1168 void *tmpbuff = NULL;
1169 int order;
1170 struct page *map, *mapend;
1171 unsigned long df;
1172
1173 dmabuf->ready = dmabuf->mapped = 0;
1174 dmabuf->SGok = 0;
1175 /*
1176 * check for order within limits, but do not overwrite value.
1177 */
1178 if((defaultorder > 1) && (defaultorder < 12))
1179 df = defaultorder;
1180 else
1181 df = 2;
1182
1183 for (order = df; order >= DMABUF_MINORDER; order--)
1184 if ( (rawbuf = (void *) pci_alloc_consistent(
1185 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr)))
1186 break;
1187 if (!rawbuf) {
1188 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
1189 "cs46xx: alloc_dmabuf(): unable to allocate rawbuf\n"));
1190 return -ENOMEM;
1191 }
1192 dmabuf->buforder = order;
1193 dmabuf->rawbuf = rawbuf;
1194 // Now mark the pages as reserved; otherwise the
1195 // remap_page_range() in cs46xx_mmap doesn't work.
1196 // 1. get index to last page in mem_map array for rawbuf.
1197 mapend = virt_to_page(dmabuf->rawbuf +
1198 (PAGE_SIZE << dmabuf->buforder) - 1);
1199
1200 // 2. mark each physical page in range as 'reserved'.
1201 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1202 cs4x_mem_map_reserve(map);
1203
1204 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: alloc_dmabuf(): allocated %ld (order = %d) bytes at %p\n",
1205 PAGE_SIZE << order, order, rawbuf) );
1206
1207 /*
1208 * only allocate the conversion buffer for the ADC
1209 */
1210 if(dmabuf->type == CS_TYPE_DAC)
1211 {
1212 dmabuf->tmpbuff = NULL;
1213 dmabuf->buforder_tmpbuff = 0;
1214 return 0;
1215 }
1216 /*
1217 * now the temp buffer for 16/8 conversions
1218 */
1219
1220 tmpbuff = (void *) pci_alloc_consistent(
1221 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr_tmpbuff);
1222
1223 if (!tmpbuff)
1224 return -ENOMEM;
1225 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: allocated %ld (order = %d) bytes at %p\n",
1226 PAGE_SIZE << order, order, tmpbuff) );
1227
1228 dmabuf->tmpbuff = tmpbuff;
1229 dmabuf->buforder_tmpbuff = order;
1230
1231 // Now mark the pages as reserved; otherwise the
1232 // remap_page_range() in cs46xx_mmap doesn't work.
1233 // 1. get index to last page in mem_map array for rawbuf.
1234 mapend = virt_to_page(dmabuf->tmpbuff +
1235 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1236
1237 // 2. mark each physical page in range as 'reserved'.
1238 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1239 cs4x_mem_map_reserve(map);
1240 return 0;
1241 }
1242
1243 /* free DMA buffer */
dealloc_dmabuf(struct cs_state * state)1244 static void dealloc_dmabuf(struct cs_state *state)
1245 {
1246 struct dmabuf *dmabuf = &state->dmabuf;
1247 struct page *map, *mapend;
1248
1249 if (dmabuf->rawbuf) {
1250 // Undo prog_dmabuf()'s marking the pages as reserved
1251 mapend = virt_to_page(dmabuf->rawbuf +
1252 (PAGE_SIZE << dmabuf->buforder) - 1);
1253 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1254 cs4x_mem_map_unreserve(map);
1255 free_dmabuf(state->card, dmabuf);
1256 }
1257
1258 if (dmabuf->tmpbuff) {
1259 // Undo prog_dmabuf()'s marking the pages as reserved
1260 mapend = virt_to_page(dmabuf->tmpbuff +
1261 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1262 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1263 cs4x_mem_map_unreserve(map);
1264 free_dmabuf2(state->card, dmabuf);
1265 }
1266
1267 dmabuf->rawbuf = NULL;
1268 dmabuf->tmpbuff = NULL;
1269 dmabuf->mapped = dmabuf->ready = 0;
1270 dmabuf->SGok = 0;
1271 }
1272
__prog_dmabuf(struct cs_state * state)1273 static int __prog_dmabuf(struct cs_state *state)
1274 {
1275 struct dmabuf *dmabuf = &state->dmabuf;
1276 unsigned long flags;
1277 unsigned long allocated_pages, allocated_bytes;
1278 unsigned long tmp1, tmp2, fmt=0;
1279 unsigned long *ptmp = (unsigned long *) dmabuf->pbuf;
1280 unsigned long SGarray[9], nSGpages=0;
1281 int ret;
1282
1283 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()+ \n"));
1284 /*
1285 * check for CAPTURE and use only non-sg for initial release
1286 */
1287 if(dmabuf->type == CS_TYPE_ADC)
1288 {
1289 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n"));
1290 /*
1291 * add in non-sg support for capture.
1292 */
1293 spin_lock_irqsave(&state->card->lock, flags);
1294 /* add code to reset the rawbuf memory. TRW */
1295 resync_dma_ptrs(state);
1296 dmabuf->total_bytes = dmabuf->blocks = 0;
1297 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1298
1299 dmabuf->SGok = 0;
1300
1301 spin_unlock_irqrestore(&state->card->lock, flags);
1302
1303 /* allocate DMA buffer if not allocated yet */
1304 if (!dmabuf->rawbuf || !dmabuf->tmpbuff)
1305 if ((ret = alloc_dmabuf(state)))
1306 return ret;
1307 /*
1308 * static image only supports 16Bit signed, stereo - hard code fmt
1309 */
1310 fmt = CS_FMT_16BIT | CS_FMT_STEREO;
1311
1312 dmabuf->numfrag = 2;
1313 dmabuf->fragsize = 2048;
1314 dmabuf->fragsamples = 2048 >> sample_shift[fmt];
1315 dmabuf->dmasize = 4096;
1316 dmabuf->fragshift = 11;
1317
1318 memset(dmabuf->rawbuf, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1319 dmabuf->dmasize);
1320 memset(dmabuf->tmpbuff, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1321 PAGE_SIZE<<dmabuf->buforder_tmpbuff);
1322
1323 /*
1324 * Now set up the ring
1325 */
1326
1327 spin_lock_irqsave(&state->card->lock, flags);
1328 cs_rec_setup(state);
1329 spin_unlock_irqrestore(&state->card->lock, flags);
1330
1331 /* set the ready flag for the dma buffer */
1332 dmabuf->ready = 1;
1333
1334 CS_DBGOUT(CS_PARMS, 4, printk(
1335 "cs46xx: prog_dmabuf(): CAPTURE rate=%d fmt=0x%x numfrag=%d "
1336 "fragsize=%d dmasize=%d\n",
1337 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1338 dmabuf->fragsize, dmabuf->dmasize) );
1339
1340 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n"));
1341 return 0;
1342 }
1343 else if (dmabuf->type == CS_TYPE_DAC)
1344 {
1345 /*
1346 * Must be DAC
1347 */
1348 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() DAC\n"));
1349 spin_lock_irqsave(&state->card->lock, flags);
1350 resync_dma_ptrs(state);
1351 dmabuf->total_bytes = dmabuf->blocks = 0;
1352 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1353
1354 dmabuf->SGok = 0;
1355
1356 spin_unlock_irqrestore(&state->card->lock, flags);
1357
1358 /* allocate DMA buffer if not allocated yet */
1359 if (!dmabuf->rawbuf)
1360 if ((ret = alloc_dmabuf(state)))
1361 return ret;
1362
1363 allocated_pages = 1 << dmabuf->buforder;
1364 allocated_bytes = allocated_pages*PAGE_SIZE;
1365
1366 if(allocated_pages < 2)
1367 {
1368 CS_DBGOUT(CS_FUNCTION, 4, printk(
1369 "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n",
1370 (unsigned)allocated_pages));
1371 return -ENOMEM;
1372 }
1373
1374 /* Use all the pages allocated, fragsize 4k. */
1375 /* Use 'pbuf' for S/G page map table. */
1376 dmabuf->SGok = 1; /* Use S/G. */
1377
1378 nSGpages = allocated_bytes/4096; /* S/G pages always 4k. */
1379
1380 /* Set up S/G variables. */
1381 *ptmp = virt_to_bus(dmabuf->rawbuf);
1382 *(ptmp+1) = 0x00000008;
1383 for(tmp1= 1; tmp1 < nSGpages; tmp1++) {
1384 *(ptmp+2*tmp1) = virt_to_bus( (dmabuf->rawbuf)+4096*tmp1);
1385 if( tmp1 == nSGpages-1)
1386 tmp2 = 0xbfff0000;
1387 else
1388 tmp2 = 0x80000000+8*(tmp1+1);
1389 *(ptmp+2*tmp1+1) = tmp2;
1390 }
1391 SGarray[0] = 0x82c0200d;
1392 SGarray[1] = 0xffff0000;
1393 SGarray[2] = *ptmp;
1394 SGarray[3] = 0x00010600;
1395 SGarray[4] = *(ptmp+2);
1396 SGarray[5] = 0x80000010;
1397 SGarray[6] = *ptmp;
1398 SGarray[7] = *(ptmp+2);
1399 SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10;
1400
1401 if (dmabuf->SGok) {
1402 dmabuf->numfrag = nSGpages;
1403 dmabuf->fragsize = 4096;
1404 dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt];
1405 dmabuf->fragshift = 12;
1406 dmabuf->dmasize = dmabuf->numfrag*4096;
1407 }
1408 else {
1409 SGarray[0] = 0xf2c0000f;
1410 SGarray[1] = 0x00000200;
1411 SGarray[2] = 0;
1412 SGarray[3] = 0x00010600;
1413 SGarray[4]=SGarray[5]=SGarray[6]=SGarray[7]=SGarray[8] = 0;
1414 dmabuf->numfrag = 2;
1415 dmabuf->fragsize = 2048;
1416 dmabuf->fragsamples = 2048 >> sample_shift[dmabuf->fmt];
1417 dmabuf->dmasize = 4096;
1418 dmabuf->fragshift = 11;
1419 }
1420 for(tmp1 = 0; tmp1 < sizeof(SGarray)/4; tmp1++)
1421 cs461x_poke( state->card, BA1_PDTC+tmp1*4, SGarray[tmp1]);
1422
1423 memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1424 dmabuf->dmasize);
1425
1426 /*
1427 * Now set up the ring
1428 */
1429
1430 spin_lock_irqsave(&state->card->lock, flags);
1431 cs_play_setup(state);
1432 spin_unlock_irqrestore(&state->card->lock, flags);
1433
1434 /* set the ready flag for the dma buffer */
1435 dmabuf->ready = 1;
1436
1437 CS_DBGOUT(CS_PARMS, 4, printk(
1438 "cs46xx: prog_dmabuf(): PLAYBACK rate=%d fmt=0x%x numfrag=%d "
1439 "fragsize=%d dmasize=%d\n",
1440 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1441 dmabuf->fragsize, dmabuf->dmasize) );
1442
1443 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n"));
1444 return 0;
1445 }
1446 else
1447 {
1448 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n",
1449 dmabuf->type));
1450 }
1451 return 1;
1452 }
1453
prog_dmabuf(struct cs_state * state)1454 static int prog_dmabuf(struct cs_state *state)
1455 {
1456 int ret;
1457
1458 down(&state->sem);
1459 ret = __prog_dmabuf(state);
1460 up(&state->sem);
1461
1462 return ret;
1463 }
1464
cs_clear_tail(struct cs_state * state)1465 static void cs_clear_tail(struct cs_state *state)
1466 {
1467 }
1468
drain_dac(struct cs_state * state,int nonblock)1469 static int drain_dac(struct cs_state *state, int nonblock)
1470 {
1471 DECLARE_WAITQUEUE(wait, current);
1472 struct dmabuf *dmabuf = &state->dmabuf;
1473 struct cs_card *card=state->card;
1474 unsigned long flags;
1475 unsigned long tmo;
1476 int count;
1477
1478 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()+ \n"));
1479 if (dmabuf->mapped || !dmabuf->ready)
1480 {
1481 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0, not ready\n"));
1482 return 0;
1483 }
1484
1485 add_wait_queue(&dmabuf->wait, &wait);
1486 for (;;) {
1487 /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1488 every time to make the process really go to sleep */
1489 current->state = TASK_INTERRUPTIBLE;
1490
1491 spin_lock_irqsave(&state->card->lock, flags);
1492 count = dmabuf->count;
1493 spin_unlock_irqrestore(&state->card->lock, flags);
1494
1495 if (count <= 0)
1496 break;
1497
1498 if (signal_pending(current))
1499 break;
1500
1501 if (nonblock) {
1502 remove_wait_queue(&dmabuf->wait, &wait);
1503 current->state = TASK_RUNNING;
1504 return -EBUSY;
1505 }
1506
1507 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1508 tmo >>= sample_shift[dmabuf->fmt];
1509 tmo += (2048*HZ)/dmabuf->rate;
1510
1511 if (!schedule_timeout(tmo ? tmo : 1) && tmo){
1512 printk(KERN_ERR "cs46xx: drain_dac, dma timeout? %d\n", count);
1513 break;
1514 }
1515 }
1516 remove_wait_queue(&dmabuf->wait, &wait);
1517 current->state = TASK_RUNNING;
1518 if (signal_pending(current))
1519 {
1520 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n"));
1521 /*
1522 * set to silence and let that clear the fifos.
1523 */
1524 cs461x_clear_serial_FIFOs(card, CS_TYPE_DAC);
1525 return -ERESTARTSYS;
1526 }
1527
1528 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0\n"));
1529 return 0;
1530 }
1531
1532
1533 /* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
cs_update_ptr(struct cs_card * card,int wake)1534 static void cs_update_ptr(struct cs_card *card, int wake)
1535 {
1536 struct cs_state *state;
1537 struct dmabuf *dmabuf;
1538 unsigned hwptr;
1539 int diff;
1540
1541 /* error handling and process wake up for ADC */
1542 state = card->states[0];
1543 if(state)
1544 {
1545 dmabuf = &state->dmabuf;
1546 if (dmabuf->enable & ADC_RUNNING) {
1547 /* update hardware pointer */
1548 hwptr = cs_get_dma_addr(state);
1549
1550 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1551 CS_DBGOUT(CS_PARMS, 9, printk(
1552 "cs46xx: cs_update_ptr()+ ADC hwptr=%d diff=%d\n",
1553 hwptr,diff) );
1554 dmabuf->hwptr = hwptr;
1555 dmabuf->total_bytes += diff;
1556 dmabuf->count += diff;
1557 if (dmabuf->count > dmabuf->dmasize)
1558 dmabuf->count = dmabuf->dmasize;
1559
1560 if(dmabuf->mapped)
1561 {
1562 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1563 wake_up(&dmabuf->wait);
1564 } else
1565 {
1566 if (wake && dmabuf->count > 0)
1567 wake_up(&dmabuf->wait);
1568 }
1569 }
1570 }
1571
1572 /*
1573 * Now the DAC
1574 */
1575 state = card->states[1];
1576 if(state)
1577 {
1578 dmabuf = &state->dmabuf;
1579 /* error handling and process wake up for DAC */
1580 if (dmabuf->enable & DAC_RUNNING) {
1581 /* update hardware pointer */
1582 hwptr = cs_get_dma_addr(state);
1583
1584 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1585 CS_DBGOUT(CS_PARMS, 9, printk(
1586 "cs46xx: cs_update_ptr()+ DAC hwptr=%d diff=%d\n",
1587 hwptr,diff) );
1588 dmabuf->hwptr = hwptr;
1589 dmabuf->total_bytes += diff;
1590 if (dmabuf->mapped) {
1591 dmabuf->count += diff;
1592 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1593 wake_up(&dmabuf->wait);
1594 /*
1595 * other drivers use fragsize, but don't see any sense
1596 * in that, since dmasize is the buffer asked for
1597 * via mmap.
1598 */
1599 if( dmabuf->count > dmabuf->dmasize)
1600 dmabuf->count &= dmabuf->dmasize-1;
1601 } else {
1602 dmabuf->count -= diff;
1603 /*
1604 * backfill with silence and clear out the last
1605 * "diff" number of bytes.
1606 */
1607 if(hwptr >= diff)
1608 {
1609 memset(dmabuf->rawbuf + hwptr - diff,
1610 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff);
1611 }
1612 else
1613 {
1614 memset(dmabuf->rawbuf,
1615 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1616 (unsigned)hwptr);
1617 memset((void *)((unsigned)dmabuf->rawbuf +
1618 dmabuf->dmasize + hwptr - diff),
1619 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1620 diff - hwptr);
1621 }
1622
1623 if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
1624 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
1625 "cs46xx: ERROR DAC count<0 or count > dmasize (%d)\n",
1626 dmabuf->count));
1627 /*
1628 * buffer underrun or buffer overrun, reset the
1629 * count of bytes written back to 0.
1630 */
1631 if(dmabuf->count < 0)
1632 dmabuf->underrun=1;
1633 dmabuf->count = 0;
1634 dmabuf->error++;
1635 }
1636 if (wake && dmabuf->count < (signed)dmabuf->dmasize/2)
1637 wake_up(&dmabuf->wait);
1638 }
1639 }
1640 }
1641 }
1642
1643
1644 /* hold spinlock for the following! */
cs_handle_midi(struct cs_card * card)1645 static void cs_handle_midi(struct cs_card *card)
1646 {
1647 unsigned char ch;
1648 int wake;
1649 unsigned temp1;
1650
1651 wake = 0;
1652 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_RBE)) {
1653 ch = cs461x_peekBA0(card, BA0_MIDRP);
1654 if (card->midi.icnt < CS_MIDIINBUF) {
1655 card->midi.ibuf[card->midi.iwr] = ch;
1656 card->midi.iwr = (card->midi.iwr + 1) % CS_MIDIINBUF;
1657 card->midi.icnt++;
1658 }
1659 wake = 1;
1660 }
1661 if (wake)
1662 wake_up(&card->midi.iwait);
1663 wake = 0;
1664 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_TBF) && card->midi.ocnt > 0) {
1665 temp1 = ( card->midi.obuf[card->midi.ord] ) & 0x000000ff;
1666 cs461x_pokeBA0(card, BA0_MIDWP,temp1);
1667 card->midi.ord = (card->midi.ord + 1) % CS_MIDIOUTBUF;
1668 card->midi.ocnt--;
1669 if (card->midi.ocnt < CS_MIDIOUTBUF-16)
1670 wake = 1;
1671 }
1672 if (wake)
1673 wake_up(&card->midi.owait);
1674 }
1675
cs_interrupt(int irq,void * dev_id,struct pt_regs * regs)1676 static void cs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1677 {
1678 struct cs_card *card = (struct cs_card *)dev_id;
1679 /* Single channel card */
1680 struct cs_state *recstate = card->channel[0].state;
1681 struct cs_state *playstate = card->channel[1].state;
1682 u32 status;
1683
1684 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()+ \n"));
1685
1686 spin_lock(&card->lock);
1687
1688 status = cs461x_peekBA0(card, BA0_HISR);
1689
1690 if ((status & 0x7fffffff) == 0)
1691 {
1692 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1693 spin_unlock(&card->lock);
1694 return;
1695 }
1696
1697 /*
1698 * check for playback or capture interrupt only
1699 */
1700 if( ((status & HISR_VC0) && playstate && playstate->dmabuf.ready) ||
1701 (((status & HISR_VC1) && recstate && recstate->dmabuf.ready)) )
1702 {
1703 CS_DBGOUT(CS_INTERRUPT, 8, printk(
1704 "cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status));
1705 cs_update_ptr(card, CS_TRUE);
1706 }
1707
1708 if( status & HISR_MIDI )
1709 cs_handle_midi(card);
1710
1711 /* clear 'em */
1712 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1713 spin_unlock(&card->lock);
1714 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n"));
1715 }
1716
1717
1718 /**********************************************************************/
1719
cs_midi_read(struct file * file,char * buffer,size_t count,loff_t * ppos)1720 static ssize_t cs_midi_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
1721 {
1722 struct cs_card *card = (struct cs_card *)file->private_data;
1723 ssize_t ret;
1724 unsigned long flags;
1725 unsigned ptr;
1726 int cnt;
1727
1728 if (ppos != &file->f_pos)
1729 return -ESPIPE;
1730 if (!access_ok(VERIFY_WRITE, buffer, count))
1731 return -EFAULT;
1732 ret = 0;
1733 while (count > 0) {
1734 spin_lock_irqsave(&card->lock, flags);
1735 ptr = card->midi.ird;
1736 cnt = CS_MIDIINBUF - ptr;
1737 if (card->midi.icnt < cnt)
1738 cnt = card->midi.icnt;
1739 spin_unlock_irqrestore(&card->lock, flags);
1740 if (cnt > count)
1741 cnt = count;
1742 if (cnt <= 0) {
1743 if (file->f_flags & O_NONBLOCK)
1744 return ret ? ret : -EAGAIN;
1745 interruptible_sleep_on(&card->midi.iwait);
1746 if (signal_pending(current))
1747 return ret ? ret : -ERESTARTSYS;
1748 continue;
1749 }
1750 if (copy_to_user(buffer, card->midi.ibuf + ptr, cnt))
1751 return ret ? ret : -EFAULT;
1752 ptr = (ptr + cnt) % CS_MIDIINBUF;
1753 spin_lock_irqsave(&card->lock, flags);
1754 card->midi.ird = ptr;
1755 card->midi.icnt -= cnt;
1756 spin_unlock_irqrestore(&card->lock, flags);
1757 count -= cnt;
1758 buffer += cnt;
1759 ret += cnt;
1760 }
1761 return ret;
1762 }
1763
1764
cs_midi_write(struct file * file,const char * buffer,size_t count,loff_t * ppos)1765 static ssize_t cs_midi_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
1766 {
1767 struct cs_card *card = (struct cs_card *)file->private_data;
1768 ssize_t ret;
1769 unsigned long flags;
1770 unsigned ptr;
1771 int cnt;
1772
1773 if (ppos != &file->f_pos)
1774 return -ESPIPE;
1775 if (!access_ok(VERIFY_READ, buffer, count))
1776 return -EFAULT;
1777 ret = 0;
1778 while (count > 0) {
1779 spin_lock_irqsave(&card->lock, flags);
1780 ptr = card->midi.owr;
1781 cnt = CS_MIDIOUTBUF - ptr;
1782 if (card->midi.ocnt + cnt > CS_MIDIOUTBUF)
1783 cnt = CS_MIDIOUTBUF - card->midi.ocnt;
1784 if (cnt <= 0)
1785 cs_handle_midi(card);
1786 spin_unlock_irqrestore(&card->lock, flags);
1787 if (cnt > count)
1788 cnt = count;
1789 if (cnt <= 0) {
1790 if (file->f_flags & O_NONBLOCK)
1791 return ret ? ret : -EAGAIN;
1792 interruptible_sleep_on(&card->midi.owait);
1793 if (signal_pending(current))
1794 return ret ? ret : -ERESTARTSYS;
1795 continue;
1796 }
1797 if (copy_from_user(card->midi.obuf + ptr, buffer, cnt))
1798 return ret ? ret : -EFAULT;
1799 ptr = (ptr + cnt) % CS_MIDIOUTBUF;
1800 spin_lock_irqsave(&card->lock, flags);
1801 card->midi.owr = ptr;
1802 card->midi.ocnt += cnt;
1803 spin_unlock_irqrestore(&card->lock, flags);
1804 count -= cnt;
1805 buffer += cnt;
1806 ret += cnt;
1807 spin_lock_irqsave(&card->lock, flags);
1808 cs_handle_midi(card);
1809 spin_unlock_irqrestore(&card->lock, flags);
1810 }
1811 return ret;
1812 }
1813
1814
cs_midi_poll(struct file * file,struct poll_table_struct * wait)1815 static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait)
1816 {
1817 struct cs_card *card = (struct cs_card *)file->private_data;
1818 unsigned long flags;
1819 unsigned int mask = 0;
1820
1821 if (file->f_flags & FMODE_WRITE)
1822 poll_wait(file, &card->midi.owait, wait);
1823 if (file->f_flags & FMODE_READ)
1824 poll_wait(file, &card->midi.iwait, wait);
1825 spin_lock_irqsave(&card->lock, flags);
1826 if (file->f_flags & FMODE_READ) {
1827 if (card->midi.icnt > 0)
1828 mask |= POLLIN | POLLRDNORM;
1829 }
1830 if (file->f_flags & FMODE_WRITE) {
1831 if (card->midi.ocnt < CS_MIDIOUTBUF)
1832 mask |= POLLOUT | POLLWRNORM;
1833 }
1834 spin_unlock_irqrestore(&card->lock, flags);
1835 return mask;
1836 }
1837
1838
cs_midi_open(struct inode * inode,struct file * file)1839 static int cs_midi_open(struct inode *inode, struct file *file)
1840 {
1841 int minor = MINOR(inode->i_rdev);
1842 struct cs_card *card=NULL;
1843 unsigned long flags;
1844 struct list_head *entry;
1845
1846 list_for_each(entry, &cs46xx_devs)
1847 {
1848 card = list_entry(entry, struct cs_card, list);
1849 if (card->dev_midi == minor)
1850 break;
1851 }
1852
1853 if (entry == &cs46xx_devs)
1854 return -ENODEV;
1855 if (!card)
1856 {
1857 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
1858 "cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n"));
1859 return -ENODEV;
1860 }
1861
1862 file->private_data = card;
1863 /* wait for device to become free */
1864 down(&card->midi.open_sem);
1865 while (card->midi.open_mode & file->f_mode) {
1866 if (file->f_flags & O_NONBLOCK) {
1867 up(&card->midi.open_sem);
1868 return -EBUSY;
1869 }
1870 up(&card->midi.open_sem);
1871 interruptible_sleep_on(&card->midi.open_wait);
1872 if (signal_pending(current))
1873 return -ERESTARTSYS;
1874 down(&card->midi.open_sem);
1875 }
1876 spin_lock_irqsave(&card->midi.lock, flags);
1877 if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) {
1878 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1879 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1880 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1881 cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f); /* Enable xmit, rcv. */
1882 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM); /* Enable interrupts */
1883 }
1884 if (file->f_mode & FMODE_READ) {
1885 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1886 }
1887 if (file->f_mode & FMODE_WRITE) {
1888 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1889 }
1890 spin_unlock_irqrestore(&card->midi.lock, flags);
1891 card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
1892 up(&card->midi.open_sem);
1893 MOD_INC_USE_COUNT; /* for 2.2 */
1894 return 0;
1895 }
1896
1897
cs_midi_release(struct inode * inode,struct file * file)1898 static int cs_midi_release(struct inode *inode, struct file *file)
1899 {
1900 struct cs_card *card = (struct cs_card *)file->private_data;
1901 DECLARE_WAITQUEUE(wait, current);
1902 unsigned long flags;
1903 unsigned count, tmo;
1904
1905 if (file->f_mode & FMODE_WRITE) {
1906 current->state = TASK_INTERRUPTIBLE;
1907 add_wait_queue(&card->midi.owait, &wait);
1908 for (;;) {
1909 spin_lock_irqsave(&card->midi.lock, flags);
1910 count = card->midi.ocnt;
1911 spin_unlock_irqrestore(&card->midi.lock, flags);
1912 if (count <= 0)
1913 break;
1914 if (signal_pending(current))
1915 break;
1916 if (file->f_flags & O_NONBLOCK)
1917 break;
1918 tmo = (count * HZ) / 3100;
1919 if (!schedule_timeout(tmo ? : 1) && tmo)
1920 printk(KERN_DEBUG "cs46xx: midi timed out??\n");
1921 }
1922 remove_wait_queue(&card->midi.owait, &wait);
1923 current->state = TASK_RUNNING;
1924 }
1925 down(&card->midi.open_sem);
1926 card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE)));
1927 up(&card->midi.open_sem);
1928 wake_up(&card->midi.open_wait);
1929 MOD_DEC_USE_COUNT; /* for 2.2 */
1930 return 0;
1931 }
1932
1933 /*
1934 * Midi file operations struct.
1935 */
1936 static /*const*/ struct file_operations cs_midi_fops = {
1937 CS_OWNER CS_THIS_MODULE
1938 llseek: no_llseek,
1939 read: cs_midi_read,
1940 write: cs_midi_write,
1941 poll: cs_midi_poll,
1942 open: cs_midi_open,
1943 release: cs_midi_release,
1944 };
1945
1946 /*
1947 *
1948 * CopySamples copies 16-bit stereo signed samples from the source to the
1949 * destination, possibly converting down to unsigned 8-bit and/or mono.
1950 * count specifies the number of output bytes to write.
1951 *
1952 * Arguments:
1953 *
1954 * dst - Pointer to a destination buffer.
1955 * src - Pointer to a source buffer
1956 * count - The number of bytes to copy into the destination buffer.
1957 * fmt - CS_FMT_16BIT and/or CS_FMT_STEREO bits
1958 * dmabuf - pointer to the dma buffer structure
1959 *
1960 * NOTES: only call this routine if the output desired is not 16 Signed Stereo
1961 *
1962 *
1963 */
CopySamples(char * dst,char * src,int count,unsigned fmt,struct dmabuf * dmabuf)1964 static void CopySamples(char *dst, char *src, int count, unsigned fmt,
1965 struct dmabuf *dmabuf)
1966 {
1967
1968 s32 s32AudioSample;
1969 s16 *psSrc=(s16 *)src;
1970 s16 *psDst=(s16 *)dst;
1971 u8 *pucDst=(u8 *)dst;
1972
1973 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") );
1974 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1975 " dst=0x%x src=0x%x count=%d fmt=0x%x\n",
1976 (unsigned)dst,(unsigned)src,(unsigned)count,(unsigned)fmt) );
1977
1978 /*
1979 * See if the data should be output as 8-bit unsigned stereo.
1980 */
1981 if((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1982 {
1983 /*
1984 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1985 * stereo using rounding.
1986 */
1987 psSrc = (s16 *)src;
1988 count = count/2;
1989 while(count--)
1990 {
1991 *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8);
1992 }
1993 }
1994 /*
1995 * See if the data should be output at 8-bit unsigned mono.
1996 */
1997 else if(!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1998 {
1999 /*
2000 * Convert each 16-bit signed stereo sample to 8-bit unsigned
2001 * mono using averaging and rounding.
2002 */
2003 psSrc = (s16 *)src;
2004 count = count/2;
2005 while(count--)
2006 {
2007 s32AudioSample = ((*psSrc)+(*(psSrc + 1)))/2 + (s32)0x80;
2008 if(s32AudioSample > 0x7fff)
2009 s32AudioSample = 0x7fff;
2010 *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8);
2011 psSrc += 2;
2012 }
2013 }
2014 /*
2015 * See if the data should be output at 16-bit signed mono.
2016 */
2017 else if(!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT))
2018 {
2019 /*
2020 * Convert each 16-bit signed stereo sample to 16-bit signed
2021 * mono using averaging.
2022 */
2023 psSrc = (s16 *)src;
2024 count = count/2;
2025 while(count--)
2026 {
2027 *(psDst++) = (s16)((*psSrc)+(*(psSrc + 1)))/2;
2028 psSrc += 2;
2029 }
2030 }
2031 }
2032
2033 /*
2034 * cs_copy_to_user()
2035 * replacement for the standard copy_to_user, to allow for a conversion from
2036 * 16 bit to 8 bit and from stereo to mono, if the record conversion is active.
2037 * The current CS46xx/CS4280 static image only records in 16bit unsigned Stereo,
2038 * so we convert from any of the other format combinations.
2039 */
cs_copy_to_user(struct cs_state * s,void * dest,void * hwsrc,unsigned cnt,unsigned * copied)2040 static unsigned cs_copy_to_user(
2041 struct cs_state *s,
2042 void *dest,
2043 void *hwsrc,
2044 unsigned cnt,
2045 unsigned *copied)
2046 {
2047 struct dmabuf *dmabuf = &s->dmabuf;
2048 void *src = hwsrc; /* default to the standard destination buffer addr */
2049
2050 CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
2051 "cs_copy_to_user()+ fmt=0x%x cnt=%d dest=0x%.8x\n",
2052 dmabuf->fmt,(unsigned)cnt,(unsigned)dest) );
2053
2054 if(cnt > dmabuf->dmasize)
2055 {
2056 cnt = dmabuf->dmasize;
2057 }
2058 if(!cnt)
2059 {
2060 *copied = 0;
2061 return 0;
2062 }
2063 if(dmabuf->divisor != 1)
2064 {
2065 if(!dmabuf->tmpbuff)
2066 {
2067 *copied = cnt/dmabuf->divisor;
2068 return 0;
2069 }
2070
2071 CopySamples((char *)dmabuf->tmpbuff, (char *)hwsrc, cnt,
2072 dmabuf->fmt, dmabuf);
2073 src = dmabuf->tmpbuff;
2074 cnt = cnt/dmabuf->divisor;
2075 }
2076 if (copy_to_user(dest, src, cnt))
2077 {
2078 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
2079 "cs46xx: cs_copy_to_user()- fault dest=0x%x src=0x%x cnt=%d\n",
2080 (unsigned)dest,(unsigned)src,cnt) );
2081 *copied = 0;
2082 return -EFAULT;
2083 }
2084 *copied = cnt;
2085 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
2086 "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt) );
2087 return 0;
2088 }
2089
2090 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
2091 the user's buffer. it is filled by the dma machine and drained by this loop. */
cs_read(struct file * file,char * buffer,size_t count,loff_t * ppos)2092 static ssize_t cs_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
2093 {
2094 struct cs_card *card = (struct cs_card *) file->private_data;
2095 struct cs_state *state;
2096 DECLARE_WAITQUEUE(wait, current);
2097 struct dmabuf *dmabuf;
2098 ssize_t ret = 0;
2099 unsigned long flags;
2100 unsigned swptr;
2101 int cnt;
2102 unsigned copied=0;
2103
2104 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2105 printk("cs46xx: cs_read()+ %d\n",count) );
2106 state = (struct cs_state *)card->states[0];
2107 if(!state)
2108 return -ENODEV;
2109 dmabuf = &state->dmabuf;
2110
2111 if (ppos != &file->f_pos)
2112 return -ESPIPE;
2113 if (dmabuf->mapped)
2114 return -ENXIO;
2115 if (!access_ok(VERIFY_WRITE, buffer, count))
2116 return -EFAULT;
2117
2118 down(&state->sem);
2119 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2120 goto out2;
2121
2122 add_wait_queue(&state->dmabuf.wait, &wait);
2123 while (count > 0) {
2124 while(!(card->pm.flags & CS46XX_PM_IDLE))
2125 {
2126 schedule();
2127 if (signal_pending(current)) {
2128 if(!ret) ret = -ERESTARTSYS;
2129 goto out;
2130 }
2131 }
2132 spin_lock_irqsave(&state->card->lock, flags);
2133 swptr = dmabuf->swptr;
2134 cnt = dmabuf->dmasize - swptr;
2135 if (dmabuf->count < cnt)
2136 cnt = dmabuf->count;
2137 if (cnt <= 0)
2138 __set_current_state(TASK_INTERRUPTIBLE);
2139 spin_unlock_irqrestore(&state->card->lock, flags);
2140
2141 if (cnt > (count * dmabuf->divisor))
2142 cnt = count * dmabuf->divisor;
2143 if (cnt <= 0) {
2144 /* buffer is empty, start the dma machine and wait for data to be
2145 recorded */
2146 start_adc(state);
2147 if (file->f_flags & O_NONBLOCK) {
2148 if (!ret) ret = -EAGAIN;
2149 goto out;
2150 }
2151 up(&state->sem);
2152 schedule();
2153 if (signal_pending(current)) {
2154 if(!ret) ret = -ERESTARTSYS;
2155 goto out;
2156 }
2157 down(&state->sem);
2158 if (dmabuf->mapped)
2159 {
2160 if(!ret)
2161 ret = -ENXIO;
2162 goto out;
2163 }
2164 continue;
2165 }
2166
2167 CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
2168 "_read() copy_to cnt=%d count=%d ", cnt,count) );
2169 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
2170 " .dmasize=%d .count=%d buffer=0x%.8x ret=%d\n",
2171 dmabuf->dmasize,dmabuf->count,(unsigned)buffer,ret) );
2172
2173 if (cs_copy_to_user(state, buffer,
2174 (void *)((unsigned)dmabuf->rawbuf + swptr), cnt, &copied))
2175 {
2176 if (!ret) ret = -EFAULT;
2177 goto out;
2178 }
2179 swptr = (swptr + cnt) % dmabuf->dmasize;
2180 spin_lock_irqsave(&card->lock, flags);
2181 dmabuf->swptr = swptr;
2182 dmabuf->count -= cnt;
2183 spin_unlock_irqrestore(&card->lock, flags);
2184 count -= copied;
2185 buffer += copied;
2186 ret += copied;
2187 start_adc(state);
2188 }
2189 out:
2190 remove_wait_queue(&state->dmabuf.wait, &wait);
2191 out2:
2192 up(&state->sem);
2193 set_current_state(TASK_RUNNING);
2194 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2195 printk("cs46xx: cs_read()- %d\n",ret) );
2196 return ret;
2197 }
2198
2199 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
2200 the soundcard. it is drained by the dma machine and filled by this loop. */
cs_write(struct file * file,const char * buffer,size_t count,loff_t * ppos)2201 static ssize_t cs_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
2202 {
2203 struct cs_card *card = (struct cs_card *) file->private_data;
2204 struct cs_state *state;
2205 DECLARE_WAITQUEUE(wait, current);
2206 struct dmabuf *dmabuf;
2207 ssize_t ret;
2208 unsigned long flags;
2209 unsigned swptr;
2210 int cnt;
2211
2212 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4,
2213 printk("cs46xx: cs_write called, count = %d\n", count) );
2214 state = (struct cs_state *)card->states[1];
2215 if(!state)
2216 return -ENODEV;
2217 if (!access_ok(VERIFY_READ, buffer, count))
2218 return -EFAULT;
2219 dmabuf = &state->dmabuf;
2220
2221 if (ppos != &file->f_pos)
2222 return -ESPIPE;
2223
2224 down(&state->sem);
2225 if (dmabuf->mapped)
2226 {
2227 ret = -ENXIO;
2228 goto out;
2229 }
2230
2231 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2232 goto out;
2233 add_wait_queue(&state->dmabuf.wait, &wait);
2234 ret = 0;
2235 /*
2236 * Start the loop to read from the user's buffer and write to the dma buffer.
2237 * check for PM events and underrun/overrun in the loop.
2238 */
2239 while (count > 0) {
2240 while(!(card->pm.flags & CS46XX_PM_IDLE))
2241 {
2242 schedule();
2243 if (signal_pending(current)) {
2244 if(!ret) ret = -ERESTARTSYS;
2245 goto out;
2246 }
2247 }
2248 spin_lock_irqsave(&state->card->lock, flags);
2249 if (dmabuf->count < 0) {
2250 /* buffer underrun, we are recovering from sleep_on_timeout,
2251 resync hwptr and swptr */
2252 dmabuf->count = 0;
2253 dmabuf->swptr = dmabuf->hwptr;
2254 }
2255 if (dmabuf->underrun)
2256 {
2257 dmabuf->underrun = 0;
2258 dmabuf->hwptr = cs_get_dma_addr(state);
2259 dmabuf->swptr = dmabuf->hwptr;
2260 }
2261
2262 swptr = dmabuf->swptr;
2263 cnt = dmabuf->dmasize - swptr;
2264 if (dmabuf->count + cnt > dmabuf->dmasize)
2265 cnt = dmabuf->dmasize - dmabuf->count;
2266 if (cnt <= 0)
2267 __set_current_state(TASK_INTERRUPTIBLE);
2268 spin_unlock_irqrestore(&state->card->lock, flags);
2269
2270 if (cnt > count)
2271 cnt = count;
2272 if (cnt <= 0) {
2273 /* buffer is full, start the dma machine and wait for data to be
2274 played */
2275 start_dac(state);
2276 if (file->f_flags & O_NONBLOCK) {
2277 if (!ret) ret = -EAGAIN;
2278 goto out;
2279 }
2280 up(&state->sem);
2281 schedule();
2282 if (signal_pending(current)) {
2283 if(!ret) ret = -ERESTARTSYS;
2284 goto out;
2285 }
2286 down(&state->sem);
2287 if (dmabuf->mapped)
2288 {
2289 if(!ret)
2290 ret = -ENXIO;
2291 goto out;
2292 }
2293 continue;
2294 }
2295 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
2296 if (!ret) ret = -EFAULT;
2297 goto out;
2298 }
2299 spin_lock_irqsave(&state->card->lock, flags);
2300 swptr = (swptr + cnt) % dmabuf->dmasize;
2301 dmabuf->swptr = swptr;
2302 dmabuf->count += cnt;
2303 if(dmabuf->count > dmabuf->dmasize)
2304 {
2305 CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk(
2306 "cs46xx: cs_write() d->count > dmasize - resetting\n"));
2307 dmabuf->count = dmabuf->dmasize;
2308 }
2309 dmabuf->endcleared = 0;
2310 spin_unlock_irqrestore(&state->card->lock, flags);
2311
2312 count -= cnt;
2313 buffer += cnt;
2314 ret += cnt;
2315 start_dac(state);
2316 }
2317 out:
2318 up(&state->sem);
2319 remove_wait_queue(&state->dmabuf.wait, &wait);
2320 set_current_state(TASK_RUNNING);
2321
2322 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2,
2323 printk("cs46xx: cs_write()- ret=0x%x\n", ret) );
2324 return ret;
2325 }
2326
cs_poll(struct file * file,struct poll_table_struct * wait)2327 static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
2328 {
2329 struct cs_card *card = (struct cs_card *)file->private_data;
2330 struct dmabuf *dmabuf;
2331 struct cs_state *state;
2332
2333 unsigned long flags;
2334 unsigned int mask = 0;
2335
2336 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n"));
2337 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
2338 {
2339 return -EINVAL;
2340 }
2341 if (file->f_mode & FMODE_WRITE)
2342 {
2343 state = card->states[1];
2344 if(state)
2345 {
2346 dmabuf = &state->dmabuf;
2347 poll_wait(file, &dmabuf->wait, wait);
2348 }
2349 }
2350 if (file->f_mode & FMODE_READ)
2351 {
2352 state = card->states[0];
2353 if(state)
2354 {
2355 dmabuf = &state->dmabuf;
2356 poll_wait(file, &dmabuf->wait, wait);
2357 }
2358 }
2359
2360 spin_lock_irqsave(&card->lock, flags);
2361 cs_update_ptr(card, CS_FALSE);
2362 if (file->f_mode & FMODE_READ) {
2363 state = card->states[0];
2364 if(state)
2365 {
2366 dmabuf = &state->dmabuf;
2367 if (dmabuf->count >= (signed)dmabuf->fragsize)
2368 mask |= POLLIN | POLLRDNORM;
2369 }
2370 }
2371 if (file->f_mode & FMODE_WRITE) {
2372 state = card->states[1];
2373 if(state)
2374 {
2375 dmabuf = &state->dmabuf;
2376 if (dmabuf->mapped) {
2377 if (dmabuf->count >= (signed)dmabuf->fragsize)
2378 mask |= POLLOUT | POLLWRNORM;
2379 } else {
2380 if ((signed)dmabuf->dmasize >= dmabuf->count
2381 + (signed)dmabuf->fragsize)
2382 mask |= POLLOUT | POLLWRNORM;
2383 }
2384 }
2385 }
2386 spin_unlock_irqrestore(&card->lock, flags);
2387
2388 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()- (0x%x) \n",
2389 mask));
2390 return mask;
2391 }
2392
2393 /*
2394 * We let users mmap the ring buffer. Its not the real DMA buffer but
2395 * that side of the code is hidden in the IRQ handling. We do a software
2396 * emulation of DMA from a 64K or so buffer into a 2K FIFO.
2397 * (the hardware probably deserves a moan here but Crystal send me nice
2398 * toys ;)).
2399 */
2400
cs_mmap(struct file * file,struct vm_area_struct * vma)2401 static int cs_mmap(struct file *file, struct vm_area_struct *vma)
2402 {
2403 struct cs_card *card = (struct cs_card *)file->private_data;
2404 struct cs_state *state;
2405 struct dmabuf *dmabuf;
2406 int ret = 0;
2407 unsigned long size;
2408
2409 CS_DBGOUT(CS_FUNCTION | CS_PARMS, 2, printk("cs46xx: cs_mmap()+ file=0x%x %s %s\n",
2410 (unsigned)file, vma->vm_flags & VM_WRITE ? "VM_WRITE" : "",
2411 vma->vm_flags & VM_READ ? "VM_READ" : "") );
2412
2413 if (vma->vm_flags & VM_WRITE) {
2414 state = card->states[1];
2415 if(state)
2416 {
2417 CS_DBGOUT(CS_OPEN, 2, printk(
2418 "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") );
2419 if ((ret = prog_dmabuf(state)) != 0)
2420 return ret;
2421 }
2422 } else if (vma->vm_flags & VM_READ) {
2423 state = card->states[0];
2424 if(state)
2425 {
2426 CS_DBGOUT(CS_OPEN, 2, printk(
2427 "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") );
2428 if ((ret = prog_dmabuf(state)) != 0)
2429 return ret;
2430 }
2431 } else {
2432 CS_DBGOUT(CS_ERROR, 2, printk(
2433 "cs46xx: cs_mmap() return -EINVAL\n") );
2434 return -EINVAL;
2435 }
2436
2437 /*
2438 * For now ONLY support playback, but seems like the only way to use
2439 * mmap() is to open an FD with RDWR, just read or just write access
2440 * does not function, get an error back from the kernel.
2441 * Also, QuakeIII opens with RDWR! So, there must be something
2442 * to needing read/write access mapping. So, allow read/write but
2443 * use the DAC only.
2444 */
2445 state = card->states[1];
2446 if(!(unsigned)state)
2447 {
2448 ret = -EINVAL;
2449 goto out;
2450 }
2451
2452 down(&state->sem);
2453 dmabuf = &state->dmabuf;
2454 if (cs4x_pgoff(vma) != 0)
2455 {
2456 ret = -EINVAL;
2457 goto out;
2458 }
2459 size = vma->vm_end - vma->vm_start;
2460
2461 CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) );
2462
2463 if (size > (PAGE_SIZE << dmabuf->buforder))
2464 {
2465 ret = -EINVAL;
2466 goto out;
2467 }
2468 if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
2469 size, vma->vm_page_prot))
2470 {
2471 ret = -EAGAIN;
2472 goto out;
2473 }
2474 dmabuf->mapped = 1;
2475
2476 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") );
2477 out:
2478 up(&state->sem);
2479 return ret;
2480 }
2481
cs_ioctl(struct inode * inode,struct file * file,unsigned int cmd,unsigned long arg)2482 static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2483 {
2484 struct cs_card *card = (struct cs_card *)file->private_data;
2485 struct cs_state *state;
2486 struct dmabuf *dmabuf=0;
2487 unsigned long flags;
2488 audio_buf_info abinfo;
2489 count_info cinfo;
2490 int val, valsave, mapped, ret;
2491
2492 state = (struct cs_state *)card->states[0];
2493 if(state)
2494 {
2495 dmabuf = &state->dmabuf;
2496 mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped;
2497 }
2498 state = (struct cs_state *)card->states[1];
2499 if(state)
2500 {
2501 dmabuf = &state->dmabuf;
2502 mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped;
2503 }
2504
2505 #if CSDEBUG
2506 printioctl(cmd);
2507 #endif
2508
2509 switch (cmd)
2510 {
2511 case OSS_GETVERSION:
2512 return put_user(SOUND_VERSION, (int *)arg);
2513
2514 case SNDCTL_DSP_RESET:
2515 /* FIXME: spin_lock ? */
2516 if (file->f_mode & FMODE_WRITE) {
2517 state = (struct cs_state *)card->states[1];
2518 if(state)
2519 {
2520 dmabuf = &state->dmabuf;
2521 stop_dac(state);
2522 synchronize_irq();
2523 dmabuf->ready = 0;
2524 resync_dma_ptrs(state);
2525 dmabuf->swptr = dmabuf->hwptr = 0;
2526 dmabuf->count = dmabuf->total_bytes = 0;
2527 dmabuf->blocks = 0;
2528 dmabuf->SGok = 0;
2529 }
2530 }
2531 if (file->f_mode & FMODE_READ) {
2532 state = (struct cs_state *)card->states[0];
2533 if(state)
2534 {
2535 dmabuf = &state->dmabuf;
2536 stop_adc(state);
2537 synchronize_irq();
2538 resync_dma_ptrs(state);
2539 dmabuf->ready = 0;
2540 dmabuf->swptr = dmabuf->hwptr = 0;
2541 dmabuf->count = dmabuf->total_bytes = 0;
2542 dmabuf->blocks = 0;
2543 dmabuf->SGok = 0;
2544 }
2545 }
2546 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") );
2547 return 0;
2548
2549 case SNDCTL_DSP_SYNC:
2550 if (file->f_mode & FMODE_WRITE)
2551 return drain_dac(state, file->f_flags & O_NONBLOCK);
2552 return 0;
2553
2554 case SNDCTL_DSP_SPEED: /* set sample rate */
2555 if (get_user(val, (int *)arg))
2556 return -EFAULT;
2557 if (val >= 0) {
2558 if (file->f_mode & FMODE_READ) {
2559 state = (struct cs_state *)card->states[0];
2560 if(state)
2561 {
2562 dmabuf = &state->dmabuf;
2563 stop_adc(state);
2564 dmabuf->ready = 0;
2565 dmabuf->SGok = 0;
2566 cs_set_adc_rate(state, val);
2567 cs_set_divisor(dmabuf);
2568 }
2569 }
2570 if (file->f_mode & FMODE_WRITE) {
2571 state = (struct cs_state *)card->states[1];
2572 if(state)
2573 {
2574 dmabuf = &state->dmabuf;
2575 stop_dac(state);
2576 dmabuf->ready = 0;
2577 dmabuf->SGok = 0;
2578 cs_set_dac_rate(state, val);
2579 cs_set_divisor(dmabuf);
2580 }
2581 }
2582 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2583 "cs46xx: cs_ioctl() DSP_SPEED %s %s %d\n",
2584 file->f_mode & FMODE_WRITE ? "DAC" : "",
2585 file->f_mode & FMODE_READ ? "ADC" : "",
2586 dmabuf->rate ) );
2587 return put_user(dmabuf->rate, (int *)arg);
2588 }
2589 return put_user(0, (int *)arg);
2590
2591 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2592 if (get_user(val, (int *)arg))
2593 return -EFAULT;
2594 if (file->f_mode & FMODE_WRITE) {
2595 state = (struct cs_state *)card->states[1];
2596 if(state)
2597 {
2598 dmabuf = &state->dmabuf;
2599 stop_dac(state);
2600 dmabuf->ready = 0;
2601 dmabuf->SGok = 0;
2602 if(val)
2603 dmabuf->fmt |= CS_FMT_STEREO;
2604 else
2605 dmabuf->fmt &= ~CS_FMT_STEREO;
2606 cs_set_divisor(dmabuf);
2607 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2608 "cs46xx: DSP_STEREO() DAC %s\n",
2609 (dmabuf->fmt & CS_FMT_STEREO) ?
2610 "STEREO":"MONO") );
2611 }
2612 }
2613 if (file->f_mode & FMODE_READ) {
2614 state = (struct cs_state *)card->states[0];
2615 if(state)
2616 {
2617 dmabuf = &state->dmabuf;
2618 stop_adc(state);
2619 dmabuf->ready = 0;
2620 dmabuf->SGok = 0;
2621 if(val)
2622 dmabuf->fmt |= CS_FMT_STEREO;
2623 else
2624 dmabuf->fmt &= ~CS_FMT_STEREO;
2625 cs_set_divisor(dmabuf);
2626 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2627 "cs46xx: DSP_STEREO() ADC %s\n",
2628 (dmabuf->fmt & CS_FMT_STEREO) ?
2629 "STEREO":"MONO") );
2630 }
2631 }
2632 return 0;
2633
2634 case SNDCTL_DSP_GETBLKSIZE:
2635 if (file->f_mode & FMODE_WRITE) {
2636 state = (struct cs_state *)card->states[1];
2637 if(state)
2638 {
2639 dmabuf = &state->dmabuf;
2640 if ((val = prog_dmabuf(state)))
2641 return val;
2642 return put_user(dmabuf->fragsize, (int *)arg);
2643 }
2644 }
2645 if (file->f_mode & FMODE_READ) {
2646 state = (struct cs_state *)card->states[0];
2647 if(state)
2648 {
2649 dmabuf = &state->dmabuf;
2650 if ((val = prog_dmabuf(state)))
2651 return val;
2652 return put_user(dmabuf->fragsize/dmabuf->divisor,
2653 (int *)arg);
2654 }
2655 }
2656 return put_user(0, (int *)arg);
2657
2658 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
2659 return put_user(AFMT_S16_LE | AFMT_U8, (int *)arg);
2660
2661 case SNDCTL_DSP_SETFMT: /* Select sample format */
2662 if (get_user(val, (int *)arg))
2663 return -EFAULT;
2664 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2665 "cs46xx: cs_ioctl() DSP_SETFMT %s %s %s %s\n",
2666 file->f_mode & FMODE_WRITE ? "DAC" : "",
2667 file->f_mode & FMODE_READ ? "ADC" : "",
2668 val == AFMT_S16_LE ? "16Bit Signed" : "",
2669 val == AFMT_U8 ? "8Bit Unsigned" : "") );
2670 valsave = val;
2671 if (val != AFMT_QUERY) {
2672 if(val==AFMT_S16_LE || val==AFMT_U8)
2673 {
2674 if (file->f_mode & FMODE_WRITE) {
2675 state = (struct cs_state *)card->states[1];
2676 if(state)
2677 {
2678 dmabuf = &state->dmabuf;
2679 stop_dac(state);
2680 dmabuf->ready = 0;
2681 dmabuf->SGok = 0;
2682 if(val==AFMT_S16_LE)
2683 dmabuf->fmt |= CS_FMT_16BIT;
2684 else
2685 dmabuf->fmt &= ~CS_FMT_16BIT;
2686 cs_set_divisor(dmabuf);
2687 if((ret = prog_dmabuf(state)))
2688 return ret;
2689 }
2690 }
2691 if (file->f_mode & FMODE_READ) {
2692 val = valsave;
2693 state = (struct cs_state *)card->states[0];
2694 if(state)
2695 {
2696 dmabuf = &state->dmabuf;
2697 stop_adc(state);
2698 dmabuf->ready = 0;
2699 dmabuf->SGok = 0;
2700 if(val==AFMT_S16_LE)
2701 dmabuf->fmt |= CS_FMT_16BIT;
2702 else
2703 dmabuf->fmt &= ~CS_FMT_16BIT;
2704 cs_set_divisor(dmabuf);
2705 if((ret = prog_dmabuf(state)))
2706 return ret;
2707 }
2708 }
2709 }
2710 else
2711 {
2712 CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk(
2713 "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n",
2714 valsave) );
2715 }
2716 }
2717 else
2718 {
2719 if(file->f_mode & FMODE_WRITE)
2720 {
2721 state = (struct cs_state *)card->states[1];
2722 if(state)
2723 dmabuf = &state->dmabuf;
2724 }
2725 else if(file->f_mode & FMODE_READ)
2726 {
2727 state = (struct cs_state *)card->states[0];
2728 if(state)
2729 dmabuf = &state->dmabuf;
2730 }
2731 }
2732 if(dmabuf)
2733 {
2734 if(dmabuf->fmt & CS_FMT_16BIT)
2735 return put_user(AFMT_S16_LE, (int *)arg);
2736 else
2737 return put_user(AFMT_U8, (int *)arg);
2738 }
2739 return put_user(0, (int *)arg);
2740
2741 case SNDCTL_DSP_CHANNELS:
2742 if (get_user(val, (int *)arg))
2743 return -EFAULT;
2744 if (val != 0) {
2745 if (file->f_mode & FMODE_WRITE) {
2746 state = (struct cs_state *)card->states[1];
2747 if(state)
2748 {
2749 dmabuf = &state->dmabuf;
2750 stop_dac(state);
2751 dmabuf->ready = 0;
2752 dmabuf->SGok = 0;
2753 if(val>1)
2754 dmabuf->fmt |= CS_FMT_STEREO;
2755 else
2756 dmabuf->fmt &= ~CS_FMT_STEREO;
2757 cs_set_divisor(dmabuf);
2758 if (prog_dmabuf(state))
2759 return 0;
2760 }
2761 }
2762 if (file->f_mode & FMODE_READ) {
2763 state = (struct cs_state *)card->states[0];
2764 if(state)
2765 {
2766 dmabuf = &state->dmabuf;
2767 stop_adc(state);
2768 dmabuf->ready = 0;
2769 dmabuf->SGok = 0;
2770 if(val>1)
2771 dmabuf->fmt |= CS_FMT_STEREO;
2772 else
2773 dmabuf->fmt &= ~CS_FMT_STEREO;
2774 cs_set_divisor(dmabuf);
2775 if (prog_dmabuf(state))
2776 return 0;
2777 }
2778 }
2779 }
2780 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
2781 (int *)arg);
2782
2783 case SNDCTL_DSP_POST:
2784 /*
2785 * There will be a longer than normal pause in the data.
2786 * so... do nothing, because there is nothing that we can do.
2787 */
2788 return 0;
2789
2790 case SNDCTL_DSP_SUBDIVIDE:
2791 if (file->f_mode & FMODE_WRITE) {
2792 state = (struct cs_state *)card->states[1];
2793 if(state)
2794 {
2795 dmabuf = &state->dmabuf;
2796 if (dmabuf->subdivision)
2797 return -EINVAL;
2798 if (get_user(val, (int *)arg))
2799 return -EFAULT;
2800 if (val != 1 && val != 2)
2801 return -EINVAL;
2802 dmabuf->subdivision = val;
2803 }
2804 }
2805 if (file->f_mode & FMODE_READ) {
2806 state = (struct cs_state *)card->states[0];
2807 if(state)
2808 {
2809 dmabuf = &state->dmabuf;
2810 if (dmabuf->subdivision)
2811 return -EINVAL;
2812 if (get_user(val, (int *)arg))
2813 return -EFAULT;
2814 if (val != 1 && val != 2)
2815 return -EINVAL;
2816 dmabuf->subdivision = val;
2817 }
2818 }
2819 return 0;
2820
2821 case SNDCTL_DSP_SETFRAGMENT:
2822 if (get_user(val, (int *)arg))
2823 return -EFAULT;
2824
2825 if (file->f_mode & FMODE_WRITE) {
2826 state = (struct cs_state *)card->states[1];
2827 if(state)
2828 {
2829 dmabuf = &state->dmabuf;
2830 dmabuf->ossfragshift = val & 0xffff;
2831 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2832 }
2833 }
2834 if (file->f_mode & FMODE_READ) {
2835 state = (struct cs_state *)card->states[0];
2836 if(state)
2837 {
2838 dmabuf = &state->dmabuf;
2839 dmabuf->ossfragshift = val & 0xffff;
2840 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2841 }
2842 }
2843 return 0;
2844
2845 case SNDCTL_DSP_GETOSPACE:
2846 if (!(file->f_mode & FMODE_WRITE))
2847 return -EINVAL;
2848 state = (struct cs_state *)card->states[1];
2849 if(state)
2850 {
2851 dmabuf = &state->dmabuf;
2852 spin_lock_irqsave(&state->card->lock, flags);
2853 cs_update_ptr(card, CS_TRUE);
2854 abinfo.fragsize = dmabuf->fragsize;
2855 abinfo.fragstotal = dmabuf->numfrag;
2856 /*
2857 * for mmap we always have total space available
2858 */
2859 if (dmabuf->mapped)
2860 abinfo.bytes = dmabuf->dmasize;
2861 else
2862 abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2863
2864 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2865 spin_unlock_irqrestore(&state->card->lock, flags);
2866 return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2867 }
2868 return -ENODEV;
2869
2870 case SNDCTL_DSP_GETISPACE:
2871 if (!(file->f_mode & FMODE_READ))
2872 return -EINVAL;
2873 state = (struct cs_state *)card->states[0];
2874 if(state)
2875 {
2876 dmabuf = &state->dmabuf;
2877 spin_lock_irqsave(&state->card->lock, flags);
2878 cs_update_ptr(card, CS_TRUE);
2879 abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
2880 abinfo.bytes = dmabuf->count/dmabuf->divisor;
2881 abinfo.fragstotal = dmabuf->numfrag;
2882 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2883 spin_unlock_irqrestore(&state->card->lock, flags);
2884 return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2885 }
2886 return -ENODEV;
2887
2888 case SNDCTL_DSP_NONBLOCK:
2889 file->f_flags |= O_NONBLOCK;
2890 return 0;
2891
2892 case SNDCTL_DSP_GETCAPS:
2893 return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
2894 (int *)arg);
2895
2896 case SNDCTL_DSP_GETTRIGGER:
2897 val = 0;
2898 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") );
2899 if (file->f_mode & FMODE_WRITE)
2900 {
2901 state = (struct cs_state *)card->states[1];
2902 if(state)
2903 {
2904 dmabuf = &state->dmabuf;
2905 if(dmabuf->enable & DAC_RUNNING)
2906 val |= PCM_ENABLE_INPUT;
2907 }
2908 }
2909 if (file->f_mode & FMODE_READ)
2910 {
2911 if(state)
2912 {
2913 state = (struct cs_state *)card->states[0];
2914 dmabuf = &state->dmabuf;
2915 if(dmabuf->enable & ADC_RUNNING)
2916 val |= PCM_ENABLE_OUTPUT;
2917 }
2918 }
2919 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) );
2920 return put_user(val, (int *)arg);
2921
2922 case SNDCTL_DSP_SETTRIGGER:
2923 if (get_user(val, (int *)arg))
2924 return -EFAULT;
2925 if (file->f_mode & FMODE_READ) {
2926 state = (struct cs_state *)card->states[0];
2927 if(state)
2928 {
2929 dmabuf = &state->dmabuf;
2930 if (val & PCM_ENABLE_INPUT) {
2931 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2932 return ret;
2933 start_adc(state);
2934 } else
2935 stop_adc(state);
2936 }
2937 }
2938 if (file->f_mode & FMODE_WRITE) {
2939 state = (struct cs_state *)card->states[1];
2940 if(state)
2941 {
2942 dmabuf = &state->dmabuf;
2943 if (val & PCM_ENABLE_OUTPUT) {
2944 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2945 return ret;
2946 start_dac(state);
2947 } else
2948 stop_dac(state);
2949 }
2950 }
2951 return 0;
2952
2953 case SNDCTL_DSP_GETIPTR:
2954 if (!(file->f_mode & FMODE_READ))
2955 return -EINVAL;
2956 state = (struct cs_state *)card->states[0];
2957 if(state)
2958 {
2959 dmabuf = &state->dmabuf;
2960 spin_lock_irqsave(&state->card->lock, flags);
2961 cs_update_ptr(card, CS_TRUE);
2962 cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
2963 cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
2964 cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
2965 spin_unlock_irqrestore(&state->card->lock, flags);
2966 return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2967 }
2968 return -ENODEV;
2969
2970 case SNDCTL_DSP_GETOPTR:
2971 if (!(file->f_mode & FMODE_WRITE))
2972 return -EINVAL;
2973 state = (struct cs_state *)card->states[1];
2974 if(state)
2975 {
2976 dmabuf = &state->dmabuf;
2977 spin_lock_irqsave(&state->card->lock, flags);
2978 cs_update_ptr(card, CS_TRUE);
2979 cinfo.bytes = dmabuf->total_bytes;
2980 if (dmabuf->mapped)
2981 {
2982 cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift)
2983 - dmabuf->blocks;
2984 CS_DBGOUT(CS_PARMS, 8,
2985 printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n",
2986 cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
2987 dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
2988 }
2989 else
2990 {
2991 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2992 }
2993 cinfo.ptr = dmabuf->hwptr;
2994
2995 CS_DBGOUT(CS_PARMS, 4, printk(
2996 "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%d\n",
2997 cinfo.bytes,cinfo.blocks,cinfo.ptr) );
2998 spin_unlock_irqrestore(&state->card->lock, flags);
2999 return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
3000 }
3001 return -ENODEV;
3002
3003 case SNDCTL_DSP_SETDUPLEX:
3004 return 0;
3005
3006 case SNDCTL_DSP_GETODELAY:
3007 if (!(file->f_mode & FMODE_WRITE))
3008 return -EINVAL;
3009 state = (struct cs_state *)card->states[1];
3010 if(state)
3011 {
3012 dmabuf = &state->dmabuf;
3013 spin_lock_irqsave(&state->card->lock, flags);
3014 cs_update_ptr(card, CS_TRUE);
3015 val = dmabuf->count;
3016 spin_unlock_irqrestore(&state->card->lock, flags);
3017 }
3018 else
3019 val = 0;
3020 return put_user(val, (int *)arg);
3021
3022 case SOUND_PCM_READ_RATE:
3023 if(file->f_mode & FMODE_READ)
3024 state = (struct cs_state *)card->states[0];
3025 else
3026 state = (struct cs_state *)card->states[1];
3027 if(state)
3028 {
3029 dmabuf = &state->dmabuf;
3030 return put_user(dmabuf->rate, (int *)arg);
3031 }
3032 return put_user(0, (int *)arg);
3033
3034
3035 case SOUND_PCM_READ_CHANNELS:
3036 if(file->f_mode & FMODE_READ)
3037 state = (struct cs_state *)card->states[0];
3038 else
3039 state = (struct cs_state *)card->states[1];
3040 if(state)
3041 {
3042 dmabuf = &state->dmabuf;
3043 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
3044 (int *)arg);
3045 }
3046 return put_user(0, (int *)arg);
3047
3048 case SOUND_PCM_READ_BITS:
3049 if(file->f_mode & FMODE_READ)
3050 state = (struct cs_state *)card->states[0];
3051 else
3052 state = (struct cs_state *)card->states[1];
3053 if(state)
3054 {
3055 dmabuf = &state->dmabuf;
3056 return put_user((dmabuf->fmt & CS_FMT_16BIT) ?
3057 AFMT_S16_LE : AFMT_U8, (int *)arg);
3058
3059 }
3060 return put_user(0, (int *)arg);
3061
3062 case SNDCTL_DSP_MAPINBUF:
3063 case SNDCTL_DSP_MAPOUTBUF:
3064 case SNDCTL_DSP_SETSYNCRO:
3065 case SOUND_PCM_WRITE_FILTER:
3066 case SOUND_PCM_READ_FILTER:
3067 return -EINVAL;
3068 }
3069 return -EINVAL;
3070 }
3071
3072
3073 /*
3074 * AMP control - null AMP
3075 */
3076
amp_none(struct cs_card * card,int change)3077 static void amp_none(struct cs_card *card, int change)
3078 {
3079 }
3080
3081 /*
3082 * Crystal EAPD mode
3083 */
3084
amp_voyetra(struct cs_card * card,int change)3085 static void amp_voyetra(struct cs_card *card, int change)
3086 {
3087 /* Manage the EAPD bit on the Crystal 4297
3088 and the Analog AD1885 */
3089
3090 int old=card->amplifier;
3091
3092 card->amplifier+=change;
3093 if(card->amplifier && !old)
3094 {
3095 /* Turn the EAPD amp on */
3096 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3097 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
3098 0x8000);
3099 }
3100 else if(old && !card->amplifier)
3101 {
3102 /* Turn the EAPD amp off */
3103 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3104 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
3105 ~0x8000);
3106 }
3107 }
3108
3109
3110 /*
3111 * Game Theatre XP card - EGPIO[2] is used to enable the external amp.
3112 */
3113
amp_hercules(struct cs_card * card,int change)3114 static void amp_hercules(struct cs_card *card, int change)
3115 {
3116 int old=card->amplifier;
3117 if(!card)
3118 {
3119 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
3120 "cs46xx: amp_hercules() called before initialized.\n"));
3121 return;
3122 }
3123 card->amplifier+=change;
3124 if( (card->amplifier && !old) && !(hercules_egpio_disable))
3125 {
3126 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3127 "cs46xx: amp_hercules() external amp enabled\n"));
3128 cs461x_pokeBA0(card, BA0_EGPIODR,
3129 EGPIODR_GPOE2); /* enable EGPIO2 output */
3130 cs461x_pokeBA0(card, BA0_EGPIOPTR,
3131 EGPIOPTR_GPPT2); /* open-drain on output */
3132 }
3133 else if(old && !card->amplifier)
3134 {
3135 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3136 "cs46xx: amp_hercules() external amp disabled\n"));
3137 cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
3138 cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
3139 }
3140 }
3141
3142 /*
3143 * Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
3144 * whenever we need to beat on the chip.
3145 *
3146 * The original idea and code for this hack comes from David Kaiser at
3147 * Linuxcare. Perhaps one day Crystal will document their chips well
3148 * enough to make them useful.
3149 */
3150
clkrun_hack(struct cs_card * card,int change)3151 static void clkrun_hack(struct cs_card *card, int change)
3152 {
3153 struct pci_dev *acpi_dev;
3154 u16 control;
3155 u8 pp;
3156 unsigned long port;
3157 int old=card->active;
3158
3159 card->active+=change;
3160
3161 acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
3162 if(acpi_dev == NULL)
3163 return; /* Not a thinkpad thats for sure */
3164
3165 /* Find the control port */
3166 pci_read_config_byte(acpi_dev, 0x41, &pp);
3167 port=pp<<8;
3168
3169 /* Read ACPI port */
3170 control=inw(port+0x10);
3171
3172 /* Flip CLKRUN off while running */
3173 if(!card->active && old)
3174 {
3175 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3176 "cs46xx: clkrun() enable clkrun - change=%d active=%d\n",
3177 change,card->active));
3178 outw(control|0x2000, port+0x10);
3179 }
3180 else
3181 {
3182 /*
3183 * sometimes on a resume the bit is set, so always reset the bit.
3184 */
3185 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3186 "cs46xx: clkrun() disable clkrun - change=%d active=%d\n",
3187 change,card->active));
3188 outw(control&~0x2000, port+0x10);
3189 }
3190 }
3191
3192
cs_open(struct inode * inode,struct file * file)3193 static int cs_open(struct inode *inode, struct file *file)
3194 {
3195 struct cs_card *card = (struct cs_card *)file->private_data;
3196 struct cs_state *state = NULL;
3197 struct dmabuf *dmabuf = NULL;
3198 struct list_head *entry;
3199 int minor = MINOR(inode->i_rdev);
3200 int ret=0;
3201 unsigned int tmp;
3202
3203 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=0x%x %s %s\n",
3204 (unsigned)file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3205 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3206
3207 list_for_each(entry, &cs46xx_devs)
3208 {
3209 card = list_entry(entry, struct cs_card, list);
3210
3211 if (!((card->dev_audio ^ minor) & ~0xf))
3212 break;
3213 }
3214 if (entry == &cs46xx_devs)
3215 return -ENODEV;
3216 if (!card) {
3217 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
3218 "cs46xx: cs_open(): Error - unable to find audio card struct\n"));
3219 return -ENODEV;
3220 }
3221
3222 /*
3223 * hardcode state[0] for capture, [1] for playback
3224 */
3225 if(file->f_mode & FMODE_READ)
3226 {
3227 CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
3228 if (card->states[0] == NULL) {
3229 state = card->states[0] = (struct cs_state *)
3230 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3231 if (state == NULL)
3232 return -ENOMEM;
3233 memset(state, 0, sizeof(struct cs_state));
3234 init_MUTEX(&state->sem);
3235 dmabuf = &state->dmabuf;
3236 dmabuf->pbuf = (void *)get_free_page(GFP_KERNEL | GFP_DMA);
3237 if(dmabuf->pbuf==NULL)
3238 {
3239 kfree(state);
3240 card->states[0]=NULL;
3241 return -ENOMEM;
3242 }
3243 }
3244 else
3245 {
3246 state = card->states[0];
3247 if(state->open_mode & FMODE_READ)
3248 return -EBUSY;
3249 }
3250 dmabuf->channel = card->alloc_rec_pcm_channel(card);
3251
3252 if (dmabuf->channel == NULL) {
3253 kfree (card->states[0]);
3254 card->states[0] = NULL;;
3255 return -ENODEV;
3256 }
3257
3258 /* Now turn on external AMP if needed */
3259 state->card = card;
3260 state->card->active_ctrl(state->card,1);
3261 state->card->amplifier_ctrl(state->card,1);
3262
3263 if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) )
3264 {
3265 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3266 "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n",tmp) );
3267 return -EIO;
3268 }
3269
3270 dmabuf->channel->state = state;
3271 /* initialize the virtual channel */
3272 state->virt = 0;
3273 state->magic = CS_STATE_MAGIC;
3274 init_waitqueue_head(&dmabuf->wait);
3275 init_MUTEX(&state->open_sem);
3276 file->private_data = card;
3277
3278 down(&state->open_sem);
3279
3280 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3281 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3282 /dev/dspW will accept 16-bits sample */
3283
3284 /* Default input is 8bit mono */
3285 dmabuf->fmt &= ~CS_FMT_MASK;
3286 dmabuf->type = CS_TYPE_ADC;
3287 dmabuf->ossfragshift = 0;
3288 dmabuf->ossmaxfrags = 0;
3289 dmabuf->subdivision = 0;
3290 cs_set_adc_rate(state, 8000);
3291 cs_set_divisor(dmabuf);
3292
3293 state->open_mode |= FMODE_READ;
3294 up(&state->open_sem);
3295 }
3296 if(file->f_mode & FMODE_WRITE)
3297 {
3298 CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
3299 if (card->states[1] == NULL) {
3300 state = card->states[1] = (struct cs_state *)
3301 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3302 if (state == NULL)
3303 return -ENOMEM;
3304 memset(state, 0, sizeof(struct cs_state));
3305 init_MUTEX(&state->sem);
3306 dmabuf = &state->dmabuf;
3307 dmabuf->pbuf = (void *)get_free_page(GFP_KERNEL | GFP_DMA);
3308 if(dmabuf->pbuf==NULL)
3309 {
3310 kfree(state);
3311 card->states[1]=NULL;
3312 return -ENOMEM;
3313 }
3314 }
3315 else
3316 {
3317 state = card->states[1];
3318 if(state->open_mode & FMODE_WRITE)
3319 return -EBUSY;
3320 }
3321 dmabuf->channel = card->alloc_pcm_channel(card);
3322
3323 if (dmabuf->channel == NULL) {
3324 kfree (card->states[1]);
3325 card->states[1] = NULL;;
3326 return -ENODEV;
3327 }
3328
3329 /* Now turn on external AMP if needed */
3330 state->card = card;
3331 state->card->active_ctrl(state->card,1);
3332 state->card->amplifier_ctrl(state->card,1);
3333
3334 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) )
3335 {
3336 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3337 "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n",tmp) );
3338 return -EIO;
3339 }
3340
3341 dmabuf->channel->state = state;
3342 /* initialize the virtual channel */
3343 state->virt = 1;
3344 state->magic = CS_STATE_MAGIC;
3345 init_waitqueue_head(&dmabuf->wait);
3346 init_MUTEX(&state->open_sem);
3347 file->private_data = card;
3348
3349 down(&state->open_sem);
3350
3351 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3352 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3353 /dev/dspW will accept 16-bits sample */
3354
3355 /* Default output is 8bit mono. */
3356 dmabuf->fmt &= ~CS_FMT_MASK;
3357 dmabuf->type = CS_TYPE_DAC;
3358 dmabuf->ossfragshift = 0;
3359 dmabuf->ossmaxfrags = 0;
3360 dmabuf->subdivision = 0;
3361 cs_set_dac_rate(state, 8000);
3362 cs_set_divisor(dmabuf);
3363
3364 state->open_mode |= FMODE_WRITE;
3365 up(&state->open_sem);
3366 if((ret = prog_dmabuf(state)))
3367 return ret;
3368 }
3369 MOD_INC_USE_COUNT; /* for 2.2 */
3370 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n") );
3371 return 0;
3372 }
3373
cs_release(struct inode * inode,struct file * file)3374 static int cs_release(struct inode *inode, struct file *file)
3375 {
3376 struct cs_card *card = (struct cs_card *)file->private_data;
3377 struct dmabuf *dmabuf;
3378 struct cs_state *state;
3379 unsigned int tmp;
3380 CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=0x%x %s %s\n",
3381 (unsigned)file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3382 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3383
3384 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
3385 {
3386 return -EINVAL;
3387 }
3388 state = card->states[1];
3389 if(state)
3390 {
3391 if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) )
3392 {
3393 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n") );
3394 dmabuf = &state->dmabuf;
3395 cs_clear_tail(state);
3396 drain_dac(state, file->f_flags & O_NONBLOCK);
3397 /* stop DMA state machine and free DMA buffers/channels */
3398 down(&state->open_sem);
3399 stop_dac(state);
3400 dealloc_dmabuf(state);
3401 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3402 free_page((unsigned long)state->dmabuf.pbuf);
3403
3404 /* we're covered by the open_sem */
3405 up(&state->open_sem);
3406 state->card->states[state->virt] = NULL;
3407 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3408
3409 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) )
3410 {
3411 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3412 "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) );
3413 }
3414
3415 /* Now turn off external AMP if needed */
3416 state->card->amplifier_ctrl(state->card, -1);
3417 state->card->active_ctrl(state->card, -1);
3418
3419 kfree(state);
3420 }
3421 }
3422
3423 state = card->states[0];
3424 if(state)
3425 {
3426 if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) )
3427 {
3428 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n") );
3429 dmabuf = &state->dmabuf;
3430 down(&state->open_sem);
3431 stop_adc(state);
3432 dealloc_dmabuf(state);
3433 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3434 free_page((unsigned long)state->dmabuf.pbuf);
3435
3436 /* we're covered by the open_sem */
3437 up(&state->open_sem);
3438 state->card->states[state->virt] = NULL;
3439 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3440
3441 if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) )
3442 {
3443 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3444 "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) );
3445 }
3446
3447 /* Now turn off external AMP if needed */
3448 state->card->amplifier_ctrl(state->card, -1);
3449 state->card->active_ctrl(state->card, -1);
3450
3451 kfree(state);
3452 }
3453 }
3454
3455 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n") );
3456 MOD_DEC_USE_COUNT; /* For 2.2 */
3457 return 0;
3458 }
3459
printpm(struct cs_card * s)3460 static void printpm(struct cs_card *s)
3461 {
3462 CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
3463 CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
3464 (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
3465 CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
3466 s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
3467 CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
3468 s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
3469 CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
3470 s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
3471 CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
3472 s->pm.u32SSCR,s->pm.u32SRCSA));
3473 CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
3474 s->pm.u32DacASR,s->pm.u32AdcASR));
3475 CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
3476 s->pm.u32DacSR,s->pm.u32AdcSR));
3477 CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
3478 s->pm.u32MIDCR_Save));
3479 CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%x\n",
3480 s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
3481 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%x\n",
3482 s->pm.u32AC97_master_volume));
3483 CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%x\n",
3484 s->pm.u32AC97_headphone_volume));
3485 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%x\n",
3486 s->pm.u32AC97_master_volume_mono));
3487 CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%x\n",
3488 s->pm.u32AC97_pcm_out_volume));
3489 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %d\n",
3490 s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
3491 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %d\n",
3492 s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
3493
3494 }
3495
3496 /****************************************************************************
3497 *
3498 * Suspend - save the ac97 regs, mute the outputs and power down the part.
3499 *
3500 ****************************************************************************/
cs46xx_ac97_suspend(struct cs_card * card)3501 void cs46xx_ac97_suspend(struct cs_card *card)
3502 {
3503 int Count,i;
3504 struct ac97_codec *dev=card->ac97_codec[0];
3505 unsigned int tmp;
3506
3507 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n"));
3508
3509 if(card->states[1])
3510 {
3511 stop_dac(card->states[1]);
3512 resync_dma_ptrs(card->states[1]);
3513 }
3514 if(card->states[0])
3515 {
3516 stop_adc(card->states[0]);
3517 resync_dma_ptrs(card->states[0]);
3518 }
3519
3520 for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3521 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3522 Count += 2, i++)
3523 {
3524 card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
3525 }
3526 /*
3527 * Save the ac97 volume registers as well as the current powerdown state.
3528 * Now, mute the all the outputs (master, headphone, and mono), as well
3529 * as the PCM volume, in preparation for powering down the entire part.
3530 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
3531 (u8)BA0_AC97_MASTER_VOLUME);
3532 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
3533 (u8)BA0_AC97_HEADPHONE_VOLUME);
3534 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
3535 (u8)BA0_AC97_MASTER_VOLUME_MONO);
3536 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
3537 (u8)BA0_AC97_PCM_OUT_VOLUME);
3538 */
3539 /*
3540 * mute the outputs
3541 */
3542 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
3543 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
3544 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
3545 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
3546
3547 /*
3548 * save the registers that cause pops
3549 */
3550 card->pm.u32AC97_powerdown = (u32)cs_ac97_get(dev, (u8)AC97_POWER_CONTROL);
3551 card->pm.u32AC97_general_purpose = (u32)cs_ac97_get(dev, (u8)BA0_AC97_GENERAL_PURPOSE);
3552 /*
3553 * And power down everything on the AC97 codec.
3554 * well, for now, only power down the DAC/ADC and MIXER VREFON components.
3555 * trouble with removing VREF.
3556 */
3557 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
3558 CS_POWER_MIXVON, CS_TRUE )) )
3559 {
3560 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3561 "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp) );
3562 }
3563
3564 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n"));
3565 }
3566
3567 /****************************************************************************
3568 *
3569 * Resume - power up the part and restore its registers..
3570 *
3571 ****************************************************************************/
cs46xx_ac97_resume(struct cs_card * card)3572 void cs46xx_ac97_resume(struct cs_card *card)
3573 {
3574 int Count,i;
3575 struct ac97_codec *dev=card->ac97_codec[0];
3576
3577 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()+\n"));
3578
3579 /*
3580 * First, we restore the state of the general purpose register. This
3581 * contains the mic select (mic1 or mic2) and if we restore this after
3582 * we restore the mic volume/boost state and mic2 was selected at
3583 * suspend time, we will end up with a brief period of time where mic1
3584 * is selected with the volume/boost settings for mic2, causing
3585 * acoustic feedback. So we restore the general purpose register
3586 * first, thereby getting the correct mic selected before we restore
3587 * the mic volume/boost.
3588 */
3589 cs_ac97_set(dev, (u8)BA0_AC97_GENERAL_PURPOSE,
3590 (u16)card->pm.u32AC97_general_purpose);
3591 /*
3592 * Now, while the outputs are still muted, restore the state of power
3593 * on the AC97 part.
3594 */
3595 cs_ac97_set(dev, (u8)BA0_AC97_POWERDOWN, (u16)card->pm.u32AC97_powerdown);
3596 mdelay(5 * cs_laptop_wait);
3597 /*
3598 * Restore just the first set of registers, from register number
3599 * 0x02 to the register number that ulHighestRegToRestore specifies.
3600 */
3601 for( Count = 0x2, i=0;
3602 (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3603 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3604 Count += 2, i++)
3605 {
3606 cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]);
3607 }
3608
3609 /* Check if we have to init the amplifier */
3610 if(card->amp_init)
3611 card->amp_init(card);
3612
3613 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-\n"));
3614 }
3615
3616
cs46xx_restart_part(struct cs_card * card)3617 static int cs46xx_restart_part(struct cs_card *card)
3618 {
3619 struct dmabuf *dmabuf;
3620 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3621 printk( "cs46xx: cs46xx_restart_part()+\n"));
3622 if(card->states[1])
3623 {
3624 dmabuf = &card->states[1]->dmabuf;
3625 dmabuf->ready = 0;
3626 resync_dma_ptrs(card->states[1]);
3627 cs_set_divisor(dmabuf);
3628 if(__prog_dmabuf(card->states[1]))
3629 {
3630 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3631 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n"));
3632 return -1;
3633 }
3634 cs_set_dac_rate(card->states[1], dmabuf->rate);
3635 }
3636 if(card->states[0])
3637 {
3638 dmabuf = &card->states[0]->dmabuf;
3639 dmabuf->ready = 0;
3640 resync_dma_ptrs(card->states[0]);
3641 cs_set_divisor(dmabuf);
3642 if(__prog_dmabuf(card->states[0]))
3643 {
3644 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3645 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n"));
3646 return -1;
3647 }
3648 cs_set_adc_rate(card->states[0], dmabuf->rate);
3649 }
3650 card->pm.flags |= CS46XX_PM_RESUMED;
3651 if(card->states[0])
3652 start_adc(card->states[0]);
3653 if(card->states[1])
3654 start_dac(card->states[1]);
3655
3656 card->pm.flags |= CS46XX_PM_IDLE;
3657 card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED
3658 | CS46XX_PM_RESUMING | CS46XX_PM_RESUMED);
3659 if(card->states[0])
3660 wake_up(&card->states[0]->dmabuf.wait);
3661 if(card->states[1])
3662 wake_up(&card->states[1]->dmabuf.wait);
3663
3664 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3665 printk( "cs46xx: cs46xx_restart_part()-\n"));
3666 return 0;
3667 }
3668
3669
3670 static void cs461x_reset(struct cs_card *card);
3671 static void cs461x_proc_stop(struct cs_card *card);
cs46xx_suspend(struct cs_card * card,u32 state)3672 static int cs46xx_suspend(struct cs_card *card, u32 state)
3673 {
3674 unsigned int tmp;
3675 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3676 printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=0x%x\n",
3677 (unsigned)card->pm.flags,(unsigned)card));
3678 /*
3679 * check the current state, only suspend if IDLE
3680 */
3681 if(!(card->pm.flags & CS46XX_PM_IDLE))
3682 {
3683 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3684 printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n"));
3685 return 1;
3686 }
3687 card->pm.flags &= ~CS46XX_PM_IDLE;
3688 card->pm.flags |= CS46XX_PM_SUSPENDING;
3689
3690 card->active_ctrl(card,1);
3691
3692 tmp = cs461x_peek(card, BA1_PFIE);
3693 tmp &= ~0x0000f03f;
3694 tmp |= 0x00000010;
3695 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
3696
3697 tmp = cs461x_peek(card, BA1_CIE);
3698 tmp &= ~0x0000003f;
3699 tmp |= 0x00000011;
3700 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
3701
3702 /*
3703 * Stop playback DMA.
3704 */
3705 tmp = cs461x_peek(card, BA1_PCTL);
3706 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
3707
3708 /*
3709 * Stop capture DMA.
3710 */
3711 tmp = cs461x_peek(card, BA1_CCTL);
3712 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
3713
3714 if(card->states[1])
3715 {
3716 card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr;
3717 card->pm.dmabuf_count_play = card->states[1]->dmabuf.count;
3718 }
3719 if(card->states[0])
3720 {
3721 card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr;
3722 card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count;
3723 }
3724
3725 cs46xx_ac97_suspend(card);
3726
3727 /*
3728 * Reset the processor.
3729 */
3730 cs461x_reset(card);
3731
3732 cs461x_proc_stop(card);
3733
3734 /*
3735 * Power down the DAC and ADC. For now leave the other areas on.
3736 */
3737 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x0300);
3738
3739 /*
3740 * Power down the PLL.
3741 */
3742 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
3743
3744 /*
3745 * Turn off the Processor by turning off the software clock enable flag in
3746 * the clock control register.
3747 */
3748 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
3749 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
3750
3751 card->active_ctrl(card,-1);
3752
3753 card->pm.flags &= ~CS46XX_PM_SUSPENDING;
3754 card->pm.flags |= CS46XX_PM_SUSPENDED;
3755
3756 printpm(card);
3757
3758 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3759 printk("cs46xx: cs46xx_suspend()- flags=0x%x\n",
3760 (unsigned)card->pm.flags));
3761 return 0;
3762 }
3763
cs46xx_resume(struct cs_card * card)3764 static int cs46xx_resume(struct cs_card *card)
3765 {
3766 int i;
3767
3768 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3769 printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n",
3770 (unsigned)card->pm.flags));
3771 if(!(card->pm.flags & CS46XX_PM_SUSPENDED))
3772 {
3773 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3774 printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n"));
3775 return 1;
3776 }
3777 card->pm.flags |= CS46XX_PM_RESUMING;
3778 card->pm.flags &= ~CS46XX_PM_SUSPENDED;
3779 printpm(card);
3780 card->active_ctrl(card, 1);
3781
3782 for(i=0;i<5;i++)
3783 {
3784 if (cs_hardware_init(card) != 0)
3785 {
3786 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3787 "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n"));
3788 mdelay(10 * cs_laptop_wait);
3789 cs461x_reset(card);
3790 continue;
3791 }
3792 break;
3793 }
3794 if(i>=4)
3795 {
3796 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
3797 "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i));
3798 return 0;
3799 }
3800
3801 if(cs46xx_restart_part(card))
3802 {
3803 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3804 "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n"));
3805 }
3806
3807 card->active_ctrl(card, -1);
3808
3809 CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_resume()- flags=0x%x\n",
3810 (unsigned)card->pm.flags));
3811 return 0;
3812 }
3813
3814 static /*const*/ struct file_operations cs461x_fops = {
3815 CS_OWNER CS_THIS_MODULE
3816 llseek: no_llseek,
3817 read: cs_read,
3818 write: cs_write,
3819 poll: cs_poll,
3820 ioctl: cs_ioctl,
3821 mmap: cs_mmap,
3822 open: cs_open,
3823 release: cs_release,
3824 };
3825
3826 /* Write AC97 codec registers */
3827
3828
_cs_ac97_get(struct ac97_codec * dev,u8 reg)3829 static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg)
3830 {
3831 struct cs_card *card = dev->private_data;
3832 int count,loopcnt;
3833 unsigned int tmp;
3834 u16 ret;
3835
3836 /*
3837 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3838 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3839 * 3. Write ACCTL = Control Register = 460h for initiating the write
3840 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
3841 * 5. if DCV not cleared, break and return error
3842 * 6. Read ACSTS = Status Register = 464h, check VSTS bit
3843 */
3844
3845 cs461x_peekBA0(card, BA0_ACSDA);
3846
3847 /*
3848 * Setup the AC97 control registers on the CS461x to send the
3849 * appropriate command to the AC97 to perform the read.
3850 * ACCAD = Command Address Register = 46Ch
3851 * ACCDA = Command Data Register = 470h
3852 * ACCTL = Control Register = 460h
3853 * set DCV - will clear when process completed
3854 * set CRW - Read command
3855 * set VFRM - valid frame enabled
3856 * set ESYN - ASYNC generation enabled
3857 * set RSTN - ARST# inactive, AC97 codec not reset
3858 */
3859
3860 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3861 cs461x_pokeBA0(card, BA0_ACCDA, 0);
3862 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
3863 ACCTL_VFRM | ACCTL_ESYN |
3864 ACCTL_RSTN);
3865
3866
3867 /*
3868 * Wait for the read to occur.
3869 */
3870 if(!(card->pm.flags & CS46XX_PM_IDLE))
3871 loopcnt = 2000;
3872 else
3873 loopcnt = 500 * cs_laptop_wait;
3874 loopcnt *= cs_laptop_wait;
3875 for (count = 0; count < loopcnt; count++) {
3876 /*
3877 * First, we want to wait for a short time.
3878 */
3879 udelay(10 * cs_laptop_wait);
3880 /*
3881 * Now, check to see if the read has completed.
3882 * ACCTL = 460h, DCV should be reset by now and 460h = 17h
3883 */
3884 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3885 break;
3886 }
3887
3888 /*
3889 * Make sure the read completed.
3890 */
3891 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
3892 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
3893 "cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffff\n", reg));
3894 return 0xffff;
3895 }
3896
3897 /*
3898 * Wait for the valid status bit to go active.
3899 */
3900
3901 if(!(card->pm.flags & CS46XX_PM_IDLE))
3902 loopcnt = 2000;
3903 else
3904 loopcnt = 1000;
3905 loopcnt *= cs_laptop_wait;
3906 for (count = 0; count < loopcnt; count++) {
3907 /*
3908 * Read the AC97 status register.
3909 * ACSTS = Status Register = 464h
3910 * VSTS - Valid Status
3911 */
3912 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
3913 break;
3914 udelay(10 * cs_laptop_wait);
3915 }
3916
3917 /*
3918 * Make sure we got valid status.
3919 */
3920 if (!( (tmp=cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) {
3921 CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING
3922 "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n",
3923 reg, tmp));
3924 return 0xffff;
3925 }
3926
3927 /*
3928 * Read the data returned from the AC97 register.
3929 * ACSDA = Status Data Register = 474h
3930 */
3931 CS_DBGOUT(CS_FUNCTION, 9, printk(KERN_INFO
3932 "cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n",
3933 reg, cs461x_peekBA0(card, BA0_ACSDA),
3934 cs461x_peekBA0(card, BA0_ACCAD)));
3935 ret = cs461x_peekBA0(card, BA0_ACSDA);
3936 return ret;
3937 }
3938
cs_ac97_get(struct ac97_codec * dev,u8 reg)3939 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
3940 {
3941 u16 ret;
3942 struct cs_card *card = dev->private_data;
3943
3944 spin_lock(&card->ac97_lock);
3945 ret = _cs_ac97_get(dev, reg);
3946 spin_unlock(&card->ac97_lock);
3947 return ret;
3948 }
3949
cs_ac97_set(struct ac97_codec * dev,u8 reg,u16 val)3950 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
3951 {
3952 struct cs_card *card = dev->private_data;
3953 int count;
3954 int val2 = 0;
3955
3956 spin_lock(&card->ac97_lock);
3957
3958 if(reg == AC97_CD_VOL)
3959 {
3960 val2 = _cs_ac97_get(dev, AC97_CD_VOL);
3961 }
3962
3963
3964 /*
3965 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3966 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3967 * 3. Write ACCTL = Control Register = 460h for initiating the write
3968 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
3969 * 5. if DCV not cleared, break and return error
3970 */
3971
3972 /*
3973 * Setup the AC97 control registers on the CS461x to send the
3974 * appropriate command to the AC97 to perform the read.
3975 * ACCAD = Command Address Register = 46Ch
3976 * ACCDA = Command Data Register = 470h
3977 * ACCTL = Control Register = 460h
3978 * set DCV - will clear when process completed
3979 * reset CRW - Write command
3980 * set VFRM - valid frame enabled
3981 * set ESYN - ASYNC generation enabled
3982 * set RSTN - ARST# inactive, AC97 codec not reset
3983 */
3984 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3985 cs461x_pokeBA0(card, BA0_ACCDA, val);
3986 cs461x_peekBA0(card, BA0_ACCTL);
3987 cs461x_pokeBA0(card, BA0_ACCTL, 0 | ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
3988 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
3989 ACCTL_ESYN | ACCTL_RSTN);
3990 for (count = 0; count < 1000; count++) {
3991 /*
3992 * First, we want to wait for a short time.
3993 */
3994 udelay(10 * cs_laptop_wait);
3995 /*
3996 * Now, check to see if the write has completed.
3997 * ACCTL = 460h, DCV should be reset by now and 460h = 07h
3998 */
3999 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
4000 break;
4001 }
4002 /*
4003 * Make sure the write completed.
4004 */
4005 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV)
4006 {
4007 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4008 "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val));
4009 }
4010
4011 spin_unlock(&card->ac97_lock);
4012
4013 /*
4014 * Adjust power if the mixer is selected/deselected according
4015 * to the CD.
4016 *
4017 * IF the CD is a valid input source (mixer or direct) AND
4018 * the CD is not muted THEN power is needed
4019 *
4020 * We do two things. When record select changes the input to
4021 * add/remove the CD we adjust the power count if the CD is
4022 * unmuted.
4023 *
4024 * When the CD mute changes we adjust the power level if the
4025 * CD was a valid input.
4026 *
4027 * We also check for CD volume != 0, as the CD mute isn't
4028 * normally tweaked from userspace.
4029 */
4030
4031 /* CD mute change ? */
4032
4033 if(reg==AC97_CD_VOL)
4034 {
4035 /* Mute bit change ? */
4036 if((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val))
4037 {
4038 /* This is a hack but its cleaner than the alternatives.
4039 Right now card->ac97_codec[0] might be NULL as we are
4040 still doing codec setup. This does an early assignment
4041 to avoid the problem if it occurs */
4042
4043 if(card->ac97_codec[0]==NULL)
4044 card->ac97_codec[0]=dev;
4045
4046 /* Mute on */
4047 if(val&0x8000 || val == 0x1f1f)
4048 card->amplifier_ctrl(card, -1);
4049 else /* Mute off power on */
4050 {
4051 if(card->amp_init)
4052 card->amp_init(card);
4053 card->amplifier_ctrl(card, 1);
4054 }
4055 }
4056 }
4057 }
4058
4059
4060 /* OSS /dev/mixer file operation methods */
4061
cs_open_mixdev(struct inode * inode,struct file * file)4062 static int cs_open_mixdev(struct inode *inode, struct file *file)
4063 {
4064 int i=0;
4065 int minor = MINOR(inode->i_rdev);
4066 struct cs_card *card=NULL;
4067 struct list_head *entry;
4068 unsigned int tmp;
4069
4070 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4071 printk(KERN_INFO "cs46xx: cs_open_mixdev()+\n"));
4072
4073 list_for_each(entry, &cs46xx_devs)
4074 {
4075 card = list_entry(entry, struct cs_card, list);
4076 for (i = 0; i < NR_AC97; i++)
4077 if (card->ac97_codec[i] != NULL &&
4078 card->ac97_codec[i]->dev_mixer == minor)
4079 goto match;
4080 }
4081 if (!card)
4082 {
4083 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4084 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4085 return -ENODEV;
4086 }
4087 match:
4088 if(!card->ac97_codec[i])
4089 return -ENODEV;
4090 file->private_data = card->ac97_codec[i];
4091
4092 card->active_ctrl(card,1);
4093 if(!CS_IN_USE(&card->mixer_use_cnt))
4094 {
4095 if( (tmp = cs46xx_powerup(card, CS_POWER_MIXVON )) )
4096 {
4097 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4098 "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n",tmp) );
4099 return -EIO;
4100 }
4101 }
4102 card->amplifier_ctrl(card, 1);
4103 CS_INC_USE_COUNT(&card->mixer_use_cnt);
4104 MOD_INC_USE_COUNT; /* for 2.2 */
4105 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4106 printk(KERN_INFO "cs46xx: cs_open_mixdev()- 0\n"));
4107 return 0;
4108 }
4109
cs_release_mixdev(struct inode * inode,struct file * file)4110 static int cs_release_mixdev(struct inode *inode, struct file *file)
4111 {
4112 int minor = MINOR(inode->i_rdev);
4113 struct cs_card *card=NULL;
4114 struct list_head *entry;
4115 int i;
4116 unsigned int tmp;
4117
4118 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4119 printk(KERN_INFO "cs46xx: cs_release_mixdev()+\n"));
4120 list_for_each(entry, &cs46xx_devs)
4121 {
4122 card = list_entry(entry, struct cs_card, list);
4123 for (i = 0; i < NR_AC97; i++)
4124 if (card->ac97_codec[i] != NULL &&
4125 card->ac97_codec[i]->dev_mixer == minor)
4126 goto match;
4127 }
4128 if (!card)
4129 {
4130 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4131 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4132 return -ENODEV;
4133 }
4134 match:
4135 MOD_DEC_USE_COUNT; /* for 2.2 */
4136 if(!CS_DEC_AND_TEST(&card->mixer_use_cnt))
4137 {
4138 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4139 printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n"));
4140 card->active_ctrl(card, -1);
4141 card->amplifier_ctrl(card, -1);
4142 return 0;
4143 }
4144 /*
4145 * ok, no outstanding mixer opens, so powerdown.
4146 */
4147 if( (tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE )) )
4148 {
4149 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4150 "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n",tmp) );
4151 card->active_ctrl(card, -1);
4152 card->amplifier_ctrl(card, -1);
4153 return -EIO;
4154 }
4155 card->active_ctrl(card, -1);
4156 card->amplifier_ctrl(card, -1);
4157 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4158 printk(KERN_INFO "cs46xx: cs_release_mixdev()- 0\n"));
4159 return 0;
4160 }
4161
4162 void __exit cs46xx_cleanup_module(void);
cs_ioctl_mixdev(struct inode * inode,struct file * file,unsigned int cmd,unsigned long arg)4163 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4164 unsigned long arg)
4165 {
4166 struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
4167 struct cs_card *card=NULL;
4168 struct list_head *entry;
4169
4170 #if CSDEBUG_INTERFACE
4171 int val;
4172
4173 if( (cmd == SOUND_MIXER_CS_GETDBGMASK) ||
4174 (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
4175 (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
4176 (cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
4177 (cmd == SOUND_MIXER_CS_APM))
4178 {
4179 switch(cmd)
4180 {
4181
4182 case SOUND_MIXER_CS_GETDBGMASK:
4183 return put_user(cs_debugmask, (unsigned long *)arg);
4184
4185 case SOUND_MIXER_CS_GETDBGLEVEL:
4186 return put_user(cs_debuglevel, (unsigned long *)arg);
4187
4188 case SOUND_MIXER_CS_SETDBGMASK:
4189 if (get_user(val, (unsigned long *)arg))
4190 return -EFAULT;
4191 cs_debugmask = val;
4192 return 0;
4193
4194 case SOUND_MIXER_CS_SETDBGLEVEL:
4195 if (get_user(val, (unsigned long *)arg))
4196 return -EFAULT;
4197 cs_debuglevel = val;
4198 return 0;
4199
4200 case SOUND_MIXER_CS_APM:
4201 if (get_user(val, (unsigned long *) arg))
4202 return -EFAULT;
4203 if(val == CS_IOCTL_CMD_SUSPEND)
4204 {
4205 list_for_each(entry, &cs46xx_devs)
4206 {
4207 card = list_entry(entry, struct cs_card, list);
4208 cs46xx_suspend(card, 0);
4209 }
4210
4211 }
4212 else if(val == CS_IOCTL_CMD_RESUME)
4213 {
4214 list_for_each(entry, &cs46xx_devs)
4215 {
4216 card = list_entry(entry, struct cs_card, list);
4217 cs46xx_resume(card);
4218 }
4219 }
4220 else
4221 {
4222 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4223 "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n",
4224 val));
4225 }
4226 return 0;
4227
4228 default:
4229 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4230 "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n") );
4231 return 0;
4232 }
4233 }
4234 #endif
4235 return codec->mixer_ioctl(codec, cmd, arg);
4236 }
4237
4238 static /*const*/ struct file_operations cs_mixer_fops = {
4239 CS_OWNER CS_THIS_MODULE
4240 llseek: no_llseek,
4241 ioctl: cs_ioctl_mixdev,
4242 open: cs_open_mixdev,
4243 release: cs_release_mixdev,
4244 };
4245
4246 /* AC97 codec initialisation. */
cs_ac97_init(struct cs_card * card)4247 static int __init cs_ac97_init(struct cs_card *card)
4248 {
4249 int num_ac97 = 0;
4250 int ready_2nd = 0;
4251 struct ac97_codec *codec;
4252 u16 eid;
4253
4254 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4255 "cs46xx: cs_ac97_init()+\n") );
4256
4257 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4258 if ((codec = ac97_alloc_codec()) == NULL)
4259 return -ENOMEM;
4260
4261 /* initialize some basic codec information, other fields will be filled
4262 in ac97_probe_codec */
4263 codec->private_data = card;
4264 codec->id = num_ac97;
4265
4266 codec->codec_read = cs_ac97_get;
4267 codec->codec_write = cs_ac97_set;
4268
4269 if (ac97_probe_codec(codec) == 0)
4270 {
4271 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4272 "cs46xx: cs_ac97_init()- codec number %d not found\n",
4273 num_ac97) );
4274 card->ac97_codec[num_ac97] = 0;
4275 break;
4276 }
4277 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4278 "cs46xx: cs_ac97_init() found codec %d\n",num_ac97) );
4279
4280 eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
4281
4282 if(eid==0xFFFF)
4283 {
4284 printk(KERN_WARNING "cs46xx: codec %d not present\n",num_ac97);
4285 ac97_release_codec(codec);
4286 break;
4287 }
4288
4289 card->ac97_features = eid;
4290
4291 if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
4292 printk(KERN_ERR "cs46xx: couldn't register mixer!\n");
4293 ac97_release_codec(codec);
4294 break;
4295 }
4296 card->ac97_codec[num_ac97] = codec;
4297
4298 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4299 "cs46xx: cs_ac97_init() ac97_codec[%d] set to 0x%x\n",
4300 (unsigned int)num_ac97,
4301 (unsigned int)codec));
4302 /* if there is no secondary codec at all, don't probe any more */
4303 if (!ready_2nd)
4304 {
4305 num_ac97 += 1;
4306 break;
4307 }
4308 }
4309 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4310 "cs46xx: cs_ac97_init()- %d\n", (unsigned int)num_ac97));
4311 return num_ac97;
4312 }
4313
4314 /*
4315 * load the static image into the DSP
4316 */
4317 #include "cs461x_image.h"
cs461x_download_image(struct cs_card * card)4318 static void cs461x_download_image(struct cs_card *card)
4319 {
4320 unsigned i, j, temp1, temp2, offset, count;
4321 unsigned char *pBA1 = ioremap(card->ba1_addr, 0x40000);
4322 for( i=0; i < CLEAR__COUNT; i++)
4323 {
4324 offset = ClrStat[i].BA1__DestByteOffset;
4325 count = ClrStat[i].BA1__SourceSize;
4326 for( temp1 = offset; temp1<(offset+count); temp1+=4 )
4327 writel(0, pBA1+temp1);
4328 }
4329
4330 for(i=0; i<FILL__COUNT; i++)
4331 {
4332 temp2 = FillStat[i].Offset;
4333 for(j=0; j<(FillStat[i].Size)/4; j++)
4334 {
4335 temp1 = (FillStat[i]).pFill[j];
4336 writel(temp1, pBA1+temp2+j*4);
4337 }
4338 }
4339 iounmap(pBA1);
4340 }
4341
4342
4343 /*
4344 * Chip reset
4345 */
4346
cs461x_reset(struct cs_card * card)4347 static void cs461x_reset(struct cs_card *card)
4348 {
4349 int idx;
4350
4351 /*
4352 * Write the reset bit of the SP control register.
4353 */
4354 cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
4355
4356 /*
4357 * Write the control register.
4358 */
4359 cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
4360
4361 /*
4362 * Clear the trap registers.
4363 */
4364 for (idx = 0; idx < 8; idx++) {
4365 cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
4366 cs461x_poke(card, BA1_TWPR, 0xFFFF);
4367 }
4368 cs461x_poke(card, BA1_DREG, 0);
4369
4370 /*
4371 * Set the frame timer to reflect the number of cycles per frame.
4372 */
4373 cs461x_poke(card, BA1_FRMT, 0xadf);
4374 }
4375
cs461x_clear_serial_FIFOs(struct cs_card * card,int type)4376 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type)
4377 {
4378 int idx, loop, startfifo=0, endfifo=0, powerdown1 = 0;
4379 unsigned int tmp;
4380
4381 /*
4382 * See if the devices are powered down. If so, we must power them up first
4383 * or they will not respond.
4384 */
4385 if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
4386 cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
4387 powerdown1 = 1;
4388 }
4389
4390 /*
4391 * We want to clear out the serial port FIFOs so we don't end up playing
4392 * whatever random garbage happens to be in them. We fill the sample FIFOS
4393 * with zero (silence).
4394 */
4395 cs461x_pokeBA0(card, BA0_SERBWP, 0);
4396
4397 /*
4398 * Check for which FIFO locations to clear, if we are currently
4399 * playing or capturing then we don't want to put in 128 bytes of
4400 * "noise".
4401 */
4402 if(type & CS_TYPE_DAC)
4403 {
4404 startfifo = 128;
4405 endfifo = 256;
4406 }
4407 if(type & CS_TYPE_ADC)
4408 {
4409 startfifo = 0;
4410 if(!endfifo)
4411 endfifo = 128;
4412 }
4413 /*
4414 * Fill sample FIFO locations (256 locations total).
4415 */
4416 for (idx = startfifo; idx < endfifo; idx++) {
4417 /*
4418 * Make sure the previous FIFO write operation has completed.
4419 */
4420 for (loop = 0; loop < 5; loop++) {
4421 udelay(50);
4422 if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
4423 break;
4424 }
4425 if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
4426 if (powerdown1)
4427 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4428 }
4429 /*
4430 * Write the serial port FIFO index.
4431 */
4432 cs461x_pokeBA0(card, BA0_SERBAD, idx);
4433 /*
4434 * Tell the serial port to load the new value into the FIFO location.
4435 */
4436 cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
4437 }
4438 /*
4439 * Now, if we powered up the devices, then power them back down again.
4440 * This is kinda ugly, but should never happen.
4441 */
4442 if (powerdown1)
4443 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4444 }
4445
4446
cs461x_powerdown(struct cs_card * card,unsigned int type,int suspendflag)4447 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag)
4448 {
4449 int count;
4450 unsigned int tmp=0,muted=0;
4451
4452 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4453 "cs46xx: cs461x_powerdown()+ type=0x%x\n",type));
4454 if(!cs_powerdown && !suspendflag)
4455 {
4456 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4457 "cs46xx: cs461x_powerdown() DISABLED exiting\n"));
4458 return 0;
4459 }
4460 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4461 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4462 "cs46xx: cs461x_powerdown() powerdown reg=0x%x\n",tmp));
4463 /*
4464 * if powering down only the VREF, and not powering down the DAC/ADC,
4465 * then do not power down the VREF, UNLESS both the DAC and ADC are not
4466 * currently powered down. If powering down DAC and ADC, then
4467 * it is possible to power down the VREF (ON).
4468 */
4469 if ( ((type & CS_POWER_MIXVON) &&
4470 (!(type & CS_POWER_ADC) || (!(type & CS_POWER_DAC))) )
4471 &&
4472 ((tmp & CS_AC97_POWER_CONTROL_ADC_ON) ||
4473 (tmp & CS_AC97_POWER_CONTROL_DAC_ON) ) )
4474 {
4475 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4476 "cs46xx: cs461x_powerdown()- 0 unable to powerdown. tmp=0x%x\n",tmp));
4477 return 0;
4478 }
4479 /*
4480 * for now, always keep power to the mixer block.
4481 * not sure why it's a problem but it seems to be if we power off.
4482 */
4483 type &= ~CS_POWER_MIXVON;
4484 type &= ~CS_POWER_MIXVOFF;
4485
4486 /*
4487 * Power down indicated areas.
4488 */
4489 if(type & CS_POWER_MIXVOFF)
4490 {
4491
4492 CS_DBGOUT(CS_FUNCTION, 4,
4493 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVOFF\n"));
4494 /*
4495 * Power down the MIXER (VREF ON) on the AC97 card.
4496 */
4497 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4498 if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4499 {
4500 if(!muted)
4501 {
4502 cs_mute(card, CS_TRUE);
4503 muted=1;
4504 }
4505 tmp |= CS_AC97_POWER_CONTROL_MIXVOFF;
4506 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4507 /*
4508 * Now, we wait until we sample a ready state.
4509 */
4510 for (count = 0; count < 32; count++) {
4511 /*
4512 * First, lets wait a short while to let things settle out a
4513 * bit, and to prevent retrying the read too quickly.
4514 */
4515 udelay(500);
4516
4517 /*
4518 * Read the current state of the power control register.
4519 */
4520 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4521 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4522 break;
4523 }
4524
4525 /*
4526 * Check the status..
4527 */
4528 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4529 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4530 {
4531 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4532 "cs46xx: powerdown MIXVOFF failed\n"));
4533 return 1;
4534 }
4535 }
4536 }
4537 if(type & CS_POWER_MIXVON)
4538 {
4539
4540 CS_DBGOUT(CS_FUNCTION, 4,
4541 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVON\n"));
4542 /*
4543 * Power down the MIXER (VREF ON) on the AC97 card.
4544 */
4545 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4546 if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)
4547 {
4548 if(!muted)
4549 {
4550 cs_mute(card, CS_TRUE);
4551 muted=1;
4552 }
4553 tmp |= CS_AC97_POWER_CONTROL_MIXVON;
4554 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4555 /*
4556 * Now, we wait until we sample a ready state.
4557 */
4558 for (count = 0; count < 32; count++) {
4559 /*
4560 * First, lets wait a short while to let things settle out a
4561 * bit, and to prevent retrying the read too quickly.
4562 */
4563 udelay(500);
4564
4565 /*
4566 * Read the current state of the power control register.
4567 */
4568 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4569 CS_AC97_POWER_CONTROL_MIXVON_ON))
4570 break;
4571 }
4572
4573 /*
4574 * Check the status..
4575 */
4576 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4577 CS_AC97_POWER_CONTROL_MIXVON_ON)
4578 {
4579 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4580 "cs46xx: powerdown MIXVON failed\n"));
4581 return 1;
4582 }
4583 }
4584 }
4585 if(type & CS_POWER_ADC)
4586 {
4587 /*
4588 * Power down the ADC on the AC97 card.
4589 */
4590 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADC\n"));
4591 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4592 if (tmp & CS_AC97_POWER_CONTROL_ADC_ON)
4593 {
4594 if(!muted)
4595 {
4596 cs_mute(card, CS_TRUE);
4597 muted=1;
4598 }
4599 tmp |= CS_AC97_POWER_CONTROL_ADC;
4600 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4601
4602 /*
4603 * Now, we wait until we sample a ready state.
4604 */
4605 for (count = 0; count < 32; count++) {
4606 /*
4607 * First, lets wait a short while to let things settle out a
4608 * bit, and to prevent retrying the read too quickly.
4609 */
4610 udelay(500);
4611
4612 /*
4613 * Read the current state of the power control register.
4614 */
4615 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4616 CS_AC97_POWER_CONTROL_ADC_ON))
4617 break;
4618 }
4619
4620 /*
4621 * Check the status..
4622 */
4623 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4624 CS_AC97_POWER_CONTROL_ADC_ON)
4625 {
4626 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4627 "cs46xx: powerdown ADC failed\n"));
4628 return 1;
4629 }
4630 }
4631 }
4632 if(type & CS_POWER_DAC)
4633 {
4634 /*
4635 * Power down the DAC on the AC97 card.
4636 */
4637
4638 CS_DBGOUT(CS_FUNCTION, 4,
4639 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DAC\n"));
4640 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4641 if (tmp & CS_AC97_POWER_CONTROL_DAC_ON)
4642 {
4643 if(!muted)
4644 {
4645 cs_mute(card, CS_TRUE);
4646 muted=1;
4647 }
4648 tmp |= CS_AC97_POWER_CONTROL_DAC;
4649 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4650 /*
4651 * Now, we wait until we sample a ready state.
4652 */
4653 for (count = 0; count < 32; count++) {
4654 /*
4655 * First, lets wait a short while to let things settle out a
4656 * bit, and to prevent retrying the read too quickly.
4657 */
4658 udelay(500);
4659
4660 /*
4661 * Read the current state of the power control register.
4662 */
4663 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4664 CS_AC97_POWER_CONTROL_DAC_ON))
4665 break;
4666 }
4667
4668 /*
4669 * Check the status..
4670 */
4671 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4672 CS_AC97_POWER_CONTROL_DAC_ON)
4673 {
4674 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4675 "cs46xx: powerdown DAC failed\n"));
4676 return 1;
4677 }
4678 }
4679 }
4680 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4681 if(muted)
4682 cs_mute(card, CS_FALSE);
4683 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4684 "cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp));
4685 return 0;
4686 }
4687
cs46xx_powerup(struct cs_card * card,unsigned int type)4688 static int cs46xx_powerup(struct cs_card *card, unsigned int type)
4689 {
4690 int count;
4691 unsigned int tmp=0,muted=0;
4692
4693 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4694 "cs46xx: cs46xx_powerup()+ type=0x%x\n",type));
4695 /*
4696 * check for VREF and powerup if need to.
4697 */
4698 if(type & CS_POWER_MIXVON)
4699 type |= CS_POWER_MIXVOFF;
4700 if(type & (CS_POWER_DAC | CS_POWER_ADC))
4701 type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF;
4702
4703 /*
4704 * Power up indicated areas.
4705 */
4706 if(type & CS_POWER_MIXVOFF)
4707 {
4708
4709 CS_DBGOUT(CS_FUNCTION, 4,
4710 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFF\n"));
4711 /*
4712 * Power up the MIXER (VREF ON) on the AC97 card.
4713 */
4714 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4715 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4716 {
4717 if(!muted)
4718 {
4719 cs_mute(card, CS_TRUE);
4720 muted=1;
4721 }
4722 tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF;
4723 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4724 /*
4725 * Now, we wait until we sample a ready state.
4726 */
4727 for (count = 0; count < 32; count++) {
4728 /*
4729 * First, lets wait a short while to let things settle out a
4730 * bit, and to prevent retrying the read too quickly.
4731 */
4732 udelay(500);
4733
4734 /*
4735 * Read the current state of the power control register.
4736 */
4737 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4738 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4739 break;
4740 }
4741
4742 /*
4743 * Check the status..
4744 */
4745 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4746 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4747 {
4748 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4749 "cs46xx: powerup MIXVOFF failed\n"));
4750 return 1;
4751 }
4752 }
4753 }
4754 if(type & CS_POWER_MIXVON)
4755 {
4756
4757 CS_DBGOUT(CS_FUNCTION, 4,
4758 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVON\n"));
4759 /*
4760 * Power up the MIXER (VREF ON) on the AC97 card.
4761 */
4762 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4763 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON))
4764 {
4765 if(!muted)
4766 {
4767 cs_mute(card, CS_TRUE);
4768 muted=1;
4769 }
4770 tmp &= ~CS_AC97_POWER_CONTROL_MIXVON;
4771 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4772 /*
4773 * Now, we wait until we sample a ready state.
4774 */
4775 for (count = 0; count < 32; count++) {
4776 /*
4777 * First, lets wait a short while to let things settle out a
4778 * bit, and to prevent retrying the read too quickly.
4779 */
4780 udelay(500);
4781
4782 /*
4783 * Read the current state of the power control register.
4784 */
4785 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4786 CS_AC97_POWER_CONTROL_MIXVON_ON)
4787 break;
4788 }
4789
4790 /*
4791 * Check the status..
4792 */
4793 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4794 CS_AC97_POWER_CONTROL_MIXVON_ON))
4795 {
4796 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4797 "cs46xx: powerup MIXVON failed\n"));
4798 return 1;
4799 }
4800 }
4801 }
4802 if(type & CS_POWER_ADC)
4803 {
4804 /*
4805 * Power up the ADC on the AC97 card.
4806 */
4807 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADC\n"));
4808 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4809 if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON))
4810 {
4811 if(!muted)
4812 {
4813 cs_mute(card, CS_TRUE);
4814 muted=1;
4815 }
4816 tmp &= ~CS_AC97_POWER_CONTROL_ADC;
4817 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4818
4819 /*
4820 * Now, we wait until we sample a ready state.
4821 */
4822 for (count = 0; count < 32; count++) {
4823 /*
4824 * First, lets wait a short while to let things settle out a
4825 * bit, and to prevent retrying the read too quickly.
4826 */
4827 udelay(500);
4828
4829 /*
4830 * Read the current state of the power control register.
4831 */
4832 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4833 CS_AC97_POWER_CONTROL_ADC_ON)
4834 break;
4835 }
4836
4837 /*
4838 * Check the status..
4839 */
4840 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4841 CS_AC97_POWER_CONTROL_ADC_ON))
4842 {
4843 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4844 "cs46xx: powerup ADC failed\n"));
4845 return 1;
4846 }
4847 }
4848 }
4849 if(type & CS_POWER_DAC)
4850 {
4851 /*
4852 * Power up the DAC on the AC97 card.
4853 */
4854
4855 CS_DBGOUT(CS_FUNCTION, 4,
4856 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DAC\n"));
4857 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4858 if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON))
4859 {
4860 if(!muted)
4861 {
4862 cs_mute(card, CS_TRUE);
4863 muted=1;
4864 }
4865 tmp &= ~CS_AC97_POWER_CONTROL_DAC;
4866 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4867 /*
4868 * Now, we wait until we sample a ready state.
4869 */
4870 for (count = 0; count < 32; count++) {
4871 /*
4872 * First, lets wait a short while to let things settle out a
4873 * bit, and to prevent retrying the read too quickly.
4874 */
4875 udelay(500);
4876
4877 /*
4878 * Read the current state of the power control register.
4879 */
4880 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4881 CS_AC97_POWER_CONTROL_DAC_ON)
4882 break;
4883 }
4884
4885 /*
4886 * Check the status..
4887 */
4888 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4889 CS_AC97_POWER_CONTROL_DAC_ON))
4890 {
4891 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4892 "cs46xx: powerup DAC failed\n"));
4893 return 1;
4894 }
4895 }
4896 }
4897 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4898 if(muted)
4899 cs_mute(card, CS_FALSE);
4900 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4901 "cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp));
4902 return 0;
4903 }
4904
4905
cs461x_proc_start(struct cs_card * card)4906 static void cs461x_proc_start(struct cs_card *card)
4907 {
4908 int cnt;
4909
4910 /*
4911 * Set the frame timer to reflect the number of cycles per frame.
4912 */
4913 cs461x_poke(card, BA1_FRMT, 0xadf);
4914 /*
4915 * Turn on the run, run at frame, and DMA enable bits in the local copy of
4916 * the SP control register.
4917 */
4918 cs461x_poke(card, BA1_SPCR, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
4919 /*
4920 * Wait until the run at frame bit resets itself in the SP control
4921 * register.
4922 */
4923 for (cnt = 0; cnt < 25; cnt++) {
4924 udelay(50);
4925 if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
4926 break;
4927 }
4928
4929 if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
4930 printk(KERN_WARNING "cs46xx: SPCR_RUNFR never reset\n");
4931 }
4932
cs461x_proc_stop(struct cs_card * card)4933 static void cs461x_proc_stop(struct cs_card *card)
4934 {
4935 /*
4936 * Turn off the run, run at frame, and DMA enable bits in the local copy of
4937 * the SP control register.
4938 */
4939 cs461x_poke(card, BA1_SPCR, 0);
4940 }
4941
cs_hardware_init(struct cs_card * card)4942 static int cs_hardware_init(struct cs_card *card)
4943 {
4944 unsigned long end_time;
4945 unsigned int tmp,count;
4946
4947 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4948 "cs46xx: cs_hardware_init()+\n") );
4949 /*
4950 * First, blast the clock control register to zero so that the PLL starts
4951 * out in a known state, and blast the master serial port control register
4952 * to zero so that the serial ports also start out in a known state.
4953 */
4954 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
4955 cs461x_pokeBA0(card, BA0_SERMC1, 0);
4956
4957 /*
4958 * If we are in AC97 mode, then we must set the part to a host controlled
4959 * AC-link. Otherwise, we won't be able to bring up the link.
4960 */
4961 cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03); /* 1.03 card */
4962 /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
4963
4964 /*
4965 * Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
4966 * spec) and then drive it high. This is done for non AC97 modes since
4967 * there might be logic external to the CS461x that uses the ARST# line
4968 * for a reset.
4969 */
4970 cs461x_pokeBA0(card, BA0_ACCTL, 1);
4971 udelay(50);
4972 cs461x_pokeBA0(card, BA0_ACCTL, 0);
4973 udelay(50);
4974 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
4975
4976 /*
4977 * The first thing we do here is to enable sync generation. As soon
4978 * as we start receiving bit clock, we'll start producing the SYNC
4979 * signal.
4980 */
4981 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
4982
4983 /*
4984 * Now wait for a short while to allow the AC97 part to start
4985 * generating bit clock (so we don't try to start the PLL without an
4986 * input clock).
4987 */
4988 mdelay(5 * cs_laptop_wait); /* 1 should be enough ?? (and pigs might fly) */
4989
4990 /*
4991 * Set the serial port timing configuration, so that
4992 * the clock control circuit gets its clock from the correct place.
4993 */
4994 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
4995
4996 /*
4997 * The part seems to not be ready for a while after a resume.
4998 * so, if we are resuming, then wait for 700 mils. Note that 600 mils
4999 * is not enough for some platforms! tested on an IBM Thinkpads and
5000 * reference cards.
5001 */
5002 if(!(card->pm.flags & CS46XX_PM_IDLE))
5003 mdelay(initdelay);
5004 /*
5005 * Write the selected clock control setup to the hardware. Do not turn on
5006 * SWCE yet (if requested), so that the devices clocked by the output of
5007 * PLL are not clocked until the PLL is stable.
5008 */
5009 cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
5010 cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
5011 cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
5012
5013 /*
5014 * Power up the PLL.
5015 */
5016 cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
5017
5018 /*
5019 * Wait until the PLL has stabilized.
5020 */
5021 mdelay(5 * cs_laptop_wait); /* Again 1 should be enough ?? */
5022
5023 /*
5024 * Turn on clocking of the core so that we can setup the serial ports.
5025 */
5026 tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
5027 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5028
5029 /*
5030 * Fill the serial port FIFOs with silence.
5031 */
5032 cs461x_clear_serial_FIFOs(card,CS_TYPE_DAC | CS_TYPE_ADC);
5033
5034 /*
5035 * Set the serial port FIFO pointer to the first sample in the FIFO.
5036 */
5037 /* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
5038
5039 /*
5040 * Write the serial port configuration to the part. The master
5041 * enable bit is not set until all other values have been written.
5042 */
5043 cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
5044 cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
5045 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
5046
5047
5048 mdelay(5 * cs_laptop_wait); /* Shouldnt be needed ?? */
5049
5050 /*
5051 * If we are resuming under 2.2.x then we can not schedule a timeout.
5052 * so, just spin the CPU.
5053 */
5054 if(card->pm.flags & CS46XX_PM_IDLE)
5055 {
5056 /*
5057 * Wait for the card ready signal from the AC97 card.
5058 */
5059 end_time = jiffies + 3 * (HZ >> 2);
5060 do {
5061 /*
5062 * Read the AC97 status register to see if we've seen a CODEC READY
5063 * signal from the AC97 card.
5064 */
5065 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5066 break;
5067 current->state = TASK_UNINTERRUPTIBLE;
5068 schedule_timeout(1);
5069 } while (time_before(jiffies, end_time));
5070 }
5071 else
5072 {
5073 for (count = 0; count < 100; count++) {
5074 // First, we want to wait for a short time.
5075 udelay(25 * cs_laptop_wait);
5076
5077 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5078 break;
5079 }
5080 }
5081
5082 /*
5083 * Make sure CODEC is READY.
5084 */
5085 if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
5086 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5087 "cs46xx: create - never read card ready from AC'97\n"));
5088 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5089 "cs46xx: probably not a bug, try using the CS4232 driver,\n"));
5090 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5091 "cs46xx: or turn off any automatic Power Management support in the BIOS.\n"));
5092 return -EIO;
5093 }
5094
5095 /*
5096 * Assert the vaid frame signal so that we can start sending commands
5097 * to the AC97 card.
5098 */
5099 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
5100
5101 if(card->pm.flags & CS46XX_PM_IDLE)
5102 {
5103 /*
5104 * Wait until we've sampled input slots 3 and 4 as valid, meaning that
5105 * the card is pumping ADC data across the AC-link.
5106 */
5107 end_time = jiffies + 3 * (HZ >> 2);
5108 do {
5109 /*
5110 * Read the input slot valid register and see if input slots 3 and
5111 * 4 are valid yet.
5112 */
5113 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5114 break;
5115 current->state = TASK_UNINTERRUPTIBLE;
5116 schedule_timeout(1);
5117 } while (time_before(jiffies, end_time));
5118 }
5119 else
5120 {
5121 for (count = 0; count < 100; count++) {
5122 // First, we want to wait for a short time.
5123 udelay(25 * cs_laptop_wait);
5124
5125 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5126 break;
5127 }
5128 }
5129 /*
5130 * Make sure input slots 3 and 4 are valid. If not, then return
5131 * an error.
5132 */
5133 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
5134 printk(KERN_WARNING "cs46xx: create - never read ISV3 & ISV4 from AC'97\n");
5135 return -EIO;
5136 }
5137
5138 /*
5139 * Now, assert valid frame and the slot 3 and 4 valid bits. This will
5140 * commense the transfer of digital audio data to the AC97 card.
5141 */
5142 cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
5143
5144 /*
5145 * Turn off the Processor by turning off the software clock enable flag in
5146 * the clock control register.
5147 */
5148 /* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
5149 /* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
5150
5151 /*
5152 * Reset the processor.
5153 */
5154 cs461x_reset(card);
5155
5156 /*
5157 * Download the image to the processor.
5158 */
5159
5160 cs461x_download_image(card);
5161
5162 /*
5163 * Stop playback DMA.
5164 */
5165 tmp = cs461x_peek(card, BA1_PCTL);
5166 card->pctl = tmp & 0xffff0000;
5167 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5168
5169 /*
5170 * Stop capture DMA.
5171 */
5172 tmp = cs461x_peek(card, BA1_CCTL);
5173 card->cctl = tmp & 0x0000ffff;
5174 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5175
5176 /* initialize AC97 codec and register /dev/mixer */
5177 if(card->pm.flags & CS46XX_PM_IDLE)
5178 {
5179 if (cs_ac97_init(card) <= 0)
5180 {
5181 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5182 "cs46xx: cs_ac97_init() failure\n") );
5183 return -EIO;
5184 }
5185 }
5186 else
5187 {
5188 cs46xx_ac97_resume(card);
5189 }
5190
5191 cs461x_proc_start(card);
5192
5193 /*
5194 * Enable interrupts on the part.
5195 */
5196 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
5197
5198 tmp = cs461x_peek(card, BA1_PFIE);
5199 tmp &= ~0x0000f03f;
5200 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt enable */
5201
5202 tmp = cs461x_peek(card, BA1_CIE);
5203 tmp &= ~0x0000003f;
5204 tmp |= 0x00000001;
5205 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt enable */
5206
5207 /*
5208 * If IDLE then Power down the part. We will power components up
5209 * when we need them.
5210 */
5211 if(card->pm.flags & CS46XX_PM_IDLE)
5212 {
5213 if(!cs_powerdown)
5214 {
5215 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC |
5216 CS_POWER_MIXVON )) )
5217 {
5218 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5219 "cs46xx: cs461x_powerup() failure (0x%x)\n",tmp) );
5220 return -EIO;
5221 }
5222 }
5223 else
5224 {
5225 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5226 CS_POWER_MIXVON, CS_FALSE )) )
5227 {
5228 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5229 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5230 return -EIO;
5231 }
5232 }
5233 }
5234 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
5235 "cs46xx: cs_hardware_init()- 0\n"));
5236 return 0;
5237 }
5238
5239 /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered
5240 until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
5241
5242 /*
5243 * Card subid table
5244 */
5245
5246 struct cs_card_type
5247 {
5248 u16 vendor;
5249 u16 id;
5250 char *name;
5251 void (*amp)(struct cs_card *, int);
5252 void (*amp_init)(struct cs_card *);
5253 void (*active)(struct cs_card *, int);
5254 };
5255
5256 static struct cs_card_type cards[]={
5257 {0x1489, 0x7001, "Genius Soundmaker 128 value", amp_none, NULL, NULL},
5258 {0x5053, 0x3357, "Voyetra", amp_voyetra, NULL, NULL},
5259 {0x1071, 0x6003, "Mitac MI6020/21", amp_voyetra, NULL, NULL},
5260 {0x14AF, 0x0050, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5261 {0x1681, 0x0050, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5262 {0x1681, 0x0051, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5263 {0x1681, 0x0052, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5264 {0x1681, 0x0053, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5265 {0x1681, 0x0054, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5266 {0x1681, 0xa010, "Hercules Fortissimo II", amp_none, NULL, NULL},
5267
5268 /* Not sure if the 570 needs the clkrun hack */
5269 {PCI_VENDOR_ID_IBM, 0x0132, "Thinkpad 570", amp_none, NULL, clkrun_hack},
5270 {PCI_VENDOR_ID_IBM, 0x0153, "Thinkpad 600X/A20/T20", amp_none, NULL, clkrun_hack},
5271 {PCI_VENDOR_ID_IBM, 0x1010, "Thinkpad 600E (unsupported)", NULL, NULL, NULL},
5272 {0, 0, "Card without SSID set", NULL, NULL, NULL },
5273 {0, 0, NULL, NULL, NULL}
5274 };
5275
5276 MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
5277 MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
5278 MODULE_LICENSE("GPL");
5279
5280
5281 static const char cs46xx_banner[] = KERN_INFO "Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION "." CS46XX_MINOR_VERSION "." CS46XX_ARCH ", " __TIME__ " " __DATE__ "\n";
5282 static const char fndmsg[] = KERN_INFO "cs46xx: Found %d audio device(s).\n";
5283
cs46xx_probe(struct pci_dev * pci_dev,const struct pci_device_id * pciid)5284 static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
5285 const struct pci_device_id *pciid)
5286 {
5287 struct pm_dev *pmdev;
5288 int i,j;
5289 u16 ss_card, ss_vendor;
5290 struct cs_card *card;
5291 dma_addr_t dma_mask;
5292 struct cs_card_type *cp = &cards[0];
5293
5294 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
5295 printk(KERN_INFO "cs46xx: probe()+\n"));
5296
5297 dma_mask = 0xffffffff; /* this enables playback and recording */
5298 if (pci_enable_device(pci_dev)) {
5299 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
5300 "cs46xx: pci_enable_device() failed\n"));
5301 return -1;
5302 }
5303 if (!RSRCISMEMORYREGION(pci_dev, 0) ||
5304 !RSRCISMEMORYREGION(pci_dev, 1)) {
5305 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5306 "cs46xx: probe()- Memory region not assigned\n"));
5307 return -1;
5308 }
5309 if (pci_dev->irq == 0) {
5310 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5311 "cs46xx: probe() IRQ not assigned\n"));
5312 return -1;
5313 }
5314 if (!pci_dma_supported(pci_dev, 0xffffffff)) {
5315 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5316 "cs46xx: probe() architecture does not support 32bit PCI busmaster DMA\n"));
5317 return -1;
5318 }
5319 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
5320 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
5321
5322 if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
5323 printk(KERN_ERR "cs46xx: out of memory\n");
5324 return -ENOMEM;
5325 }
5326 memset(card, 0, sizeof(*card));
5327 card->ba0_addr = RSRCADDRESS(pci_dev, 0);
5328 card->ba1_addr = RSRCADDRESS(pci_dev, 1);
5329 card->pci_dev = pci_dev;
5330 card->irq = pci_dev->irq;
5331 card->magic = CS_CARD_MAGIC;
5332 spin_lock_init(&card->lock);
5333 spin_lock_init(&card->ac97_lock);
5334
5335 pci_set_master(pci_dev);
5336
5337 printk(cs46xx_banner);
5338 printk(KERN_INFO "cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %d\n",
5339 card->ba0_addr, card->ba1_addr, card->irq);
5340
5341 card->alloc_pcm_channel = cs_alloc_pcm_channel;
5342 card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
5343 card->free_pcm_channel = cs_free_pcm_channel;
5344 card->amplifier_ctrl = amp_none;
5345 card->active_ctrl = amp_none;
5346
5347 while (cp->name)
5348 {
5349 if(cp->vendor == ss_vendor && cp->id == ss_card)
5350 {
5351 card->amplifier_ctrl = cp->amp;
5352 if(cp->active)
5353 card->active_ctrl = cp->active;
5354 if(cp->amp_init)
5355 card->amp_init = cp->amp_init;
5356 break;
5357 }
5358 cp++;
5359 }
5360 if (cp->name==NULL)
5361 {
5362 printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5363 ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5364 }
5365 else
5366 {
5367 printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5368 cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5369 }
5370
5371 if (card->amplifier_ctrl==NULL)
5372 {
5373 card->amplifier_ctrl = amp_none;
5374 card->active_ctrl = clkrun_hack;
5375 }
5376
5377 if (external_amp == 1)
5378 {
5379 printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.\n");
5380 card->amplifier_ctrl = amp_voyetra;
5381 }
5382
5383 if (thinkpad == 1)
5384 {
5385 printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.\n");
5386 card->active_ctrl = clkrun_hack;
5387 }
5388 /*
5389 * The thinkpads don't work well without runtime updating on their kernel
5390 * delay values (or any laptop with variable CPU speeds really).
5391 * so, just to be safe set the init delay to 2100. Eliminates
5392 * failures on T21 Thinkpads. remove this code when the udelay
5393 * and mdelay kernel code is replaced by a pm timer, or the delays
5394 * work well for battery and/or AC power both.
5395 */
5396 if(card->active_ctrl == clkrun_hack)
5397 {
5398 initdelay = 2100;
5399 cs_laptop_wait = 5;
5400 }
5401 if((card->active_ctrl == clkrun_hack) && !(powerdown == 1))
5402 {
5403 /*
5404 * for some currently unknown reason, powering down the DAC and ADC component
5405 * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97
5406 * codec access problems. probably the serial clock becomes unsynced.
5407 * added code to sync the chips back up, but only helped about 70% the time.
5408 */
5409 cs_powerdown = 0;
5410 }
5411 if(powerdown == 0)
5412 cs_powerdown = 0;
5413 card->active_ctrl(card, 1);
5414
5415 /* claim our iospace and irq */
5416
5417 card->ba0 = ioremap_nocache(card->ba0_addr, CS461X_BA0_SIZE);
5418 card->ba1.name.data0 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
5419 card->ba1.name.data1 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
5420 card->ba1.name.pmem = ioremap_nocache(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
5421 card->ba1.name.reg = ioremap_nocache(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
5422
5423 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5424 "cs46xx: card=0x%x card->ba0=0x%.08x\n",(unsigned)card,(unsigned)card->ba0) );
5425 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5426 "cs46xx: card->ba1=0x%.08x 0x%.08x 0x%.08x 0x%.08x\n",
5427 (unsigned)card->ba1.name.data0,
5428 (unsigned)card->ba1.name.data1,
5429 (unsigned)card->ba1.name.pmem,
5430 (unsigned)card->ba1.name.reg) );
5431
5432 if(card->ba0 == 0 || card->ba1.name.data0 == 0 ||
5433 card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
5434 card->ba1.name.reg == 0)
5435 goto fail2;
5436
5437 if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) {
5438 printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq);
5439 goto fail2;
5440 }
5441 /* register /dev/dsp */
5442 if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
5443 printk(KERN_ERR "cs46xx: unable to register dsp\n");
5444 goto fail;
5445 }
5446
5447 /* register /dev/midi */
5448 if((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0)
5449 printk(KERN_ERR "cs46xx: unable to register midi\n");
5450
5451 card->pm.flags |= CS46XX_PM_IDLE;
5452 for(i=0;i<5;i++)
5453 {
5454 if (cs_hardware_init(card) != 0)
5455 {
5456 CS_DBGOUT(CS_ERROR, 4, printk(
5457 "cs46xx: ERROR in cs_hardware_init()... retrying\n"));
5458 for (j = 0; j < NR_AC97; j++)
5459 if (card->ac97_codec[j] != NULL) {
5460 unregister_sound_mixer(card->ac97_codec[j]->dev_mixer);
5461 ac97_release_codec(card->ac97_codec[j]);
5462 }
5463 mdelay(10 * cs_laptop_wait);
5464 continue;
5465 }
5466 break;
5467 }
5468 if(i>=4)
5469 {
5470 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
5471 "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i));
5472 unregister_sound_dsp(card->dev_audio);
5473 if(card->dev_midi)
5474 unregister_sound_midi(card->dev_midi);
5475 goto fail;
5476 }
5477
5478 init_waitqueue_head(&card->midi.open_wait);
5479 init_MUTEX(&card->midi.open_sem);
5480 init_waitqueue_head(&card->midi.iwait);
5481 init_waitqueue_head(&card->midi.owait);
5482 cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST);
5483 cs461x_pokeBA0(card, BA0_MIDCR, 0);
5484
5485 /*
5486 * Check if we have to init the amplifier, but probably already done
5487 * since the CD logic in the ac97 init code will turn on the ext amp.
5488 */
5489 if(cp->amp_init)
5490 cp->amp_init(card);
5491 card->active_ctrl(card, -1);
5492
5493 PCI_SET_DRIVER_DATA(pci_dev, card);
5494 PCI_SET_DMA_MASK(pci_dev, dma_mask);
5495 list_add(&card->list, &cs46xx_devs);
5496
5497 pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), cs46xx_pm_callback);
5498 if (pmdev)
5499 {
5500 CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
5501 "cs46xx: probe() pm_register() succeeded (0x%x).\n",
5502 (unsigned)pmdev));
5503 pmdev->data = card;
5504 }
5505 else
5506 {
5507 CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 2, printk(KERN_INFO
5508 "cs46xx: probe() pm_register() failed (0x%x).\n",
5509 (unsigned)pmdev));
5510 card->pm.flags |= CS46XX_PM_NOT_REGISTERED;
5511 }
5512
5513 CS_DBGOUT(CS_PM, 9, printk(KERN_INFO "cs46xx: pm.flags=0x%x card=0x%x\n",
5514 (unsigned)card->pm.flags,(unsigned)card));
5515
5516 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5517 "cs46xx: probe()- device allocated successfully\n"));
5518 return 0;
5519
5520 fail:
5521 free_irq(card->irq, card);
5522 fail2:
5523 if(card->ba0)
5524 iounmap(card->ba0);
5525 if(card->ba1.name.data0)
5526 iounmap(card->ba1.name.data0);
5527 if(card->ba1.name.data1)
5528 iounmap(card->ba1.name.data1);
5529 if(card->ba1.name.pmem)
5530 iounmap(card->ba1.name.pmem);
5531 if(card->ba1.name.reg)
5532 iounmap(card->ba1.name.reg);
5533 kfree(card);
5534 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
5535 "cs46xx: probe()- no device allocated\n"));
5536 return -ENODEV;
5537 } // probe_cs46xx
5538
5539 // ---------------------------------------------------------------------
5540
cs46xx_remove(struct pci_dev * pci_dev)5541 static void __devinit cs46xx_remove(struct pci_dev *pci_dev)
5542 {
5543 struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
5544 int i;
5545 unsigned int tmp;
5546
5547 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5548 "cs46xx: cs46xx_remove()+\n"));
5549
5550 card->active_ctrl(card,1);
5551
5552 tmp = cs461x_peek(card, BA1_PFIE);
5553 tmp &= ~0x0000f03f;
5554 tmp |= 0x00000010;
5555 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
5556
5557 tmp = cs461x_peek(card, BA1_CIE);
5558 tmp &= ~0x0000003f;
5559 tmp |= 0x00000011;
5560 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
5561
5562 /*
5563 * Stop playback DMA.
5564 */
5565 tmp = cs461x_peek(card, BA1_PCTL);
5566 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5567
5568 /*
5569 * Stop capture DMA.
5570 */
5571 tmp = cs461x_peek(card, BA1_CCTL);
5572 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5573
5574 /*
5575 * Reset the processor.
5576 */
5577 cs461x_reset(card);
5578
5579 cs461x_proc_stop(card);
5580
5581 /*
5582 * Power down the DAC and ADC. We will power them up (if) when we need
5583 * them.
5584 */
5585 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5586 CS_POWER_MIXVON, CS_TRUE )) )
5587 {
5588 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5589 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5590 }
5591
5592 /*
5593 * Power down the PLL.
5594 */
5595 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
5596
5597 /*
5598 * Turn off the Processor by turning off the software clock enable flag in
5599 * the clock control register.
5600 */
5601 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
5602 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5603
5604 card->active_ctrl(card,-1);
5605
5606 /* free hardware resources */
5607 free_irq(card->irq, card);
5608 iounmap(card->ba0);
5609 iounmap(card->ba1.name.data0);
5610 iounmap(card->ba1.name.data1);
5611 iounmap(card->ba1.name.pmem);
5612 iounmap(card->ba1.name.reg);
5613
5614 /* unregister audio devices */
5615 for (i = 0; i < NR_AC97; i++)
5616 if (card->ac97_codec[i] != NULL) {
5617 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
5618 ac97_release_codec(card->ac97_codec[i]);
5619 }
5620 unregister_sound_dsp(card->dev_audio);
5621 if(card->dev_midi)
5622 unregister_sound_midi(card->dev_midi);
5623 list_del(&card->list);
5624 kfree(card);
5625 PCI_SET_DRIVER_DATA(pci_dev,NULL);
5626
5627 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5628 "cs46xx: cs46xx_remove()-: remove successful\n"));
5629 }
5630
5631 enum {
5632 CS46XX_4610 = 0,
5633 CS46XX_4612, /* same as 4630 */
5634 CS46XX_4615, /* same as 4624 */
5635 };
5636
5637 static struct pci_device_id cs46xx_pci_tbl[] __devinitdata = {
5638
5639 {PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4610},
5640 {PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4612, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4612},
5641 {PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4615},
5642 {0,}
5643 };
5644
5645 MODULE_DEVICE_TABLE(pci, cs46xx_pci_tbl);
5646
5647 struct pci_driver cs46xx_pci_driver = {
5648 name:"cs46xx",
5649 id_table:cs46xx_pci_tbl,
5650 probe:cs46xx_probe,
5651 remove:cs46xx_remove,
5652 suspend:CS46XX_SUSPEND_TBL,
5653 resume:CS46XX_RESUME_TBL,
5654 };
5655
cs46xx_init_module(void)5656 int __init cs46xx_init_module(void)
5657 {
5658 int rtn = 0;
5659 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5660 "cs46xx: cs46xx_init_module()+ \n"));
5661 if (!pci_present()) { /* No PCI bus in this machine! */
5662 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5663 "cs46xx: cs46xx_init_module()- no pci bus found\n"));
5664 return -ENODEV;
5665 }
5666 rtn = pci_module_init(&cs46xx_pci_driver);
5667
5668 if(rtn == -ENODEV)
5669 {
5670 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(
5671 "cs46xx: Unable to detect valid cs46xx device\n"));
5672 }
5673
5674 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5675 printk(KERN_INFO "cs46xx: cs46xx_init_module()- (%d)\n",rtn));
5676 return rtn;
5677 }
5678
cs46xx_cleanup_module(void)5679 void __exit cs46xx_cleanup_module(void)
5680 {
5681 pci_unregister_driver(&cs46xx_pci_driver);
5682 cs_pm_unregister_all(cs46xx_pm_callback);
5683 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5684 printk(KERN_INFO "cs46xx: cleanup_cs46xx() finished\n"));
5685 }
5686
5687 module_init(cs46xx_init_module);
5688 module_exit(cs46xx_cleanup_module);
5689
cs46xx_pm_callback(struct pm_dev * dev,pm_request_t rqst,void * data)5690 int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
5691 {
5692 struct cs_card *card;
5693
5694 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5695 "cs46xx: cs46xx_pm_callback dev=0x%x rqst=0x%x card=%d\n",
5696 (unsigned)dev,(unsigned)rqst,(unsigned)data));
5697 card = (struct cs_card *) dev->data;
5698 if (card) {
5699 switch(rqst) {
5700 case PM_SUSPEND:
5701 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5702 "cs46xx: PM suspend request\n"));
5703 if(cs46xx_suspend(card, 0))
5704 {
5705 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5706 "cs46xx: PM suspend request refused\n"));
5707 return 1;
5708 }
5709 break;
5710 case PM_RESUME:
5711 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5712 "cs46xx: PM resume request\n"));
5713 if(cs46xx_resume(card))
5714 {
5715 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5716 "cs46xx: PM resume request refused\n"));
5717 return 1;
5718 }
5719 break;
5720 }
5721 }
5722
5723 return 0;
5724 }
5725
5726 #if CS46XX_ACPI_SUPPORT
cs46xx_suspend_tbl(struct pci_dev * pcidev,u32 state)5727 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state)
5728 {
5729 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5730 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5731 printk(KERN_INFO "cs46xx: cs46xx_suspend_tbl request\n"));
5732 cs46xx_suspend(s, 0);
5733 return 0;
5734 }
5735
cs46xx_resume_tbl(struct pci_dev * pcidev)5736 static int cs46xx_resume_tbl(struct pci_dev *pcidev)
5737 {
5738 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5739 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5740 printk(KERN_INFO "cs46xx: cs46xx_resume_tbl request\n"));
5741 cs46xx_resume(s);
5742 return 0;
5743 }
5744 #endif
5745