[libata] ahci: minor PCI MSI cleanup
[linux-2.6/sactl.git] / sound / oss / cs46xx.c
blob9e42a1a67ca469d2c9f319bb076b2dbd2401b3ea
1 /*
2 * Crystal SoundFusion CS46xx driver
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>
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>
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.
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.
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.
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.
60 * Status:
61 * Playback/Capture supported from 8k-48k.
62 * 16Bit Signed LE & 8Bit Unsigned, with Mono or Stereo supported.
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.
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.
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.
78 #include <linux/interrupt.h>
79 #include <linux/list.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 <linux/init.h>
91 #include <linux/poll.h>
92 #include <linux/ac97_codec.h>
94 #include <asm/io.h>
95 #include <asm/dma.h>
96 #include <asm/uaccess.h>
98 #include "cs46xxpm-24.h"
99 #include "cs46xx_wrapper-24.h"
100 #include "cs461x.h"
102 /* MIDI buffer sizes */
103 #define CS_MIDIINBUF 500
104 #define CS_MIDIOUTBUF 500
106 #define ADC_RUNNING 1
107 #define DAC_RUNNING 2
109 #define CS_FMT_16BIT 1 /* These are fixed in fact */
110 #define CS_FMT_STEREO 2
111 #define CS_FMT_MASK 3
113 #define CS_TYPE_ADC 1
114 #define CS_TYPE_DAC 2
116 #define CS_TRUE 1
117 #define CS_FALSE 0
119 #define CS_INC_USE_COUNT(m) (atomic_inc(m))
120 #define CS_DEC_USE_COUNT(m) (atomic_dec(m))
121 #define CS_DEC_AND_TEST(m) (atomic_dec_and_test(m))
122 #define CS_IN_USE(m) (atomic_read(m) != 0)
124 #define CS_DBGBREAKPOINT {__asm__("INT $3");}
126 * CS461x definitions
129 #define CS461X_BA0_SIZE 0x2000
130 #define CS461X_BA1_DATA0_SIZE 0x3000
131 #define CS461X_BA1_DATA1_SIZE 0x3800
132 #define CS461X_BA1_PRG_SIZE 0x7000
133 #define CS461X_BA1_REG_SIZE 0x0100
135 #define GOF_PER_SEC 200
137 #define CSDEBUG_INTERFACE 1
138 #define CSDEBUG 1
140 * Turn on/off debugging compilation by using 1/0 respectively for CSDEBUG
143 * CSDEBUG is usual mode is set to 1, then use the
144 * cs_debuglevel and cs_debugmask to turn on or off debugging.
145 * Debug level of 1 has been defined to be kernel errors and info
146 * that should be printed on any released driver.
148 #if CSDEBUG
149 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;}
150 #else
151 #define CS_DBGOUT(mask,level,x)
152 #endif
154 * cs_debugmask areas
156 #define CS_INIT 0x00000001 /* initialization and probe functions */
157 #define CS_ERROR 0x00000002 /* tmp debugging bit placeholder */
158 #define CS_INTERRUPT 0x00000004 /* interrupt handler (separate from all other) */
159 #define CS_FUNCTION 0x00000008 /* enter/leave functions */
160 #define CS_WAVE_WRITE 0x00000010 /* write information for wave */
161 #define CS_WAVE_READ 0x00000020 /* read information for wave */
162 #define CS_MIDI_WRITE 0x00000040 /* write information for midi */
163 #define CS_MIDI_READ 0x00000080 /* read information for midi */
164 #define CS_MPU401_WRITE 0x00000100 /* write information for mpu401 */
165 #define CS_MPU401_READ 0x00000200 /* read information for mpu401 */
166 #define CS_OPEN 0x00000400 /* all open functions in the driver */
167 #define CS_RELEASE 0x00000800 /* all release functions in the driver */
168 #define CS_PARMS 0x00001000 /* functional and operational parameters */
169 #define CS_IOCTL 0x00002000 /* ioctl (non-mixer) */
170 #define CS_PM 0x00004000 /* PM */
171 #define CS_TMP 0x10000000 /* tmp debug mask bit */
173 #define CS_IOCTL_CMD_SUSPEND 0x1 // suspend
174 #define CS_IOCTL_CMD_RESUME 0x2 // resume
176 #if CSDEBUG
177 static unsigned long cs_debuglevel=1; /* levels range from 1-9 */
178 module_param(cs_debuglevel, ulong, 0644);
179 static unsigned long cs_debugmask=CS_INIT | CS_ERROR; /* use CS_DBGOUT with various mask values */
180 module_param(cs_debugmask, ulong, 0644);
181 #endif
182 static unsigned long hercules_egpio_disable; /* if non-zero set all EGPIO to 0 */
183 module_param(hercules_egpio_disable, ulong, 0);
184 static unsigned long initdelay=700; /* PM delay in millisecs */
185 module_param(initdelay, ulong, 0);
186 static unsigned long powerdown=-1; /* turn on/off powerdown processing in driver */
187 module_param(powerdown, ulong, 0);
188 #define DMABUF_DEFAULTORDER 3
189 static unsigned long defaultorder=DMABUF_DEFAULTORDER;
190 module_param(defaultorder, ulong, 0);
192 static int external_amp;
193 module_param(external_amp, bool, 0);
194 static int thinkpad;
195 module_param(thinkpad, bool, 0);
198 * set the powerdown module parm to 0 to disable all
199 * powerdown. also set thinkpad to 1 to disable powerdown,
200 * but also to enable the clkrun functionality.
202 static unsigned cs_powerdown=1;
203 static unsigned cs_laptop_wait=1;
205 /* An instance of the 4610 channel */
206 struct cs_channel
208 int used;
209 int num;
210 void *state;
213 #define CS46XX_MAJOR_VERSION "1"
214 #define CS46XX_MINOR_VERSION "28"
216 #ifdef __ia64__
217 #define CS46XX_ARCH "64" //architecture key
218 #else
219 #define CS46XX_ARCH "32" //architecture key
220 #endif
222 static struct list_head cs46xx_devs = { &cs46xx_devs, &cs46xx_devs };
224 /* magic numbers to protect our data structures */
225 #define CS_CARD_MAGIC 0x43525553 /* "CRUS" */
226 #define CS_STATE_MAGIC 0x4c4f4749 /* "LOGI" */
227 #define NR_HW_CH 3
229 /* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
230 #define NR_AC97 2
232 static const unsigned sample_size[] = { 1, 2, 2, 4 };
233 static const unsigned sample_shift[] = { 0, 1, 1, 2 };
235 /* "software" or virtual channel, an instance of opened /dev/dsp */
236 struct cs_state {
237 unsigned int magic;
238 struct cs_card *card; /* Card info */
240 /* single open lock mechanism, only used for recording */
241 struct semaphore open_sem;
242 wait_queue_head_t open_wait;
244 /* file mode */
245 mode_t open_mode;
247 /* virtual channel number */
248 int virt;
250 struct dmabuf {
251 /* wave sample stuff */
252 unsigned int rate;
253 unsigned char fmt, enable;
255 /* hardware channel */
256 struct cs_channel *channel;
257 int pringbuf; /* Software ring slot */
258 void *pbuf; /* 4K hardware DMA buffer */
260 /* OSS buffer management stuff */
261 void *rawbuf;
262 dma_addr_t dma_handle;
263 unsigned buforder;
264 unsigned numfrag;
265 unsigned fragshift;
266 unsigned divisor;
267 unsigned type;
268 void *tmpbuff; /* tmp buffer for sample conversions */
269 dma_addr_t dmaaddr;
270 dma_addr_t dmaaddr_tmpbuff;
271 unsigned buforder_tmpbuff; /* Log base 2 of size in bytes.. */
273 /* our buffer acts like a circular ring */
274 unsigned hwptr; /* where dma last started, updated by update_ptr */
275 unsigned swptr; /* where driver last clear/filled, updated by read/write */
276 int count; /* bytes to be comsumed or been generated by dma machine */
277 unsigned total_bytes; /* total bytes dmaed by hardware */
278 unsigned blocks; /* total blocks */
280 unsigned error; /* number of over/underruns */
281 unsigned underrun; /* underrun pending before next write has occurred */
282 wait_queue_head_t wait; /* put process on wait queue when no more space in buffer */
284 /* redundant, but makes calculations easier */
285 unsigned fragsize;
286 unsigned dmasize;
287 unsigned fragsamples;
289 /* OSS stuff */
290 unsigned mapped:1;
291 unsigned ready:1;
292 unsigned endcleared:1;
293 unsigned SGok:1;
294 unsigned update_flag;
295 unsigned ossfragshift;
296 int ossmaxfrags;
297 unsigned subdivision;
298 } dmabuf;
299 /* Guard against mmap/write/read races */
300 struct semaphore sem;
303 struct cs_card {
304 struct cs_channel channel[2];
305 unsigned int magic;
307 /* We keep cs461x cards in a linked list */
308 struct cs_card *next;
310 /* The cs461x has a certain amount of cross channel interaction
311 so we use a single per card lock */
312 spinlock_t lock;
314 /* Keep AC97 sane */
315 spinlock_t ac97_lock;
317 /* mixer use count */
318 atomic_t mixer_use_cnt;
320 /* PCI device stuff */
321 struct pci_dev * pci_dev;
322 struct list_head list;
324 unsigned int pctl, cctl; /* Hardware DMA flag sets */
326 /* soundcore stuff */
327 int dev_audio;
328 int dev_midi;
330 /* structures for abstraction of hardware facilities, codecs, banks and channels*/
331 struct ac97_codec *ac97_codec[NR_AC97];
332 struct cs_state *states[2];
334 u16 ac97_features;
336 int amplifier; /* Amplifier control */
337 void (*amplifier_ctrl)(struct cs_card *, int);
338 void (*amp_init)(struct cs_card *);
340 int active; /* Active clocking */
341 void (*active_ctrl)(struct cs_card *, int);
343 /* hardware resources */
344 unsigned long ba0_addr;
345 unsigned long ba1_addr;
346 u32 irq;
348 /* mappings */
349 void __iomem *ba0;
350 union
352 struct
354 u8 __iomem *data0;
355 u8 __iomem *data1;
356 u8 __iomem *pmem;
357 u8 __iomem *reg;
358 } name;
359 u8 __iomem *idx[4];
360 } ba1;
362 /* Function support */
363 struct cs_channel *(*alloc_pcm_channel)(struct cs_card *);
364 struct cs_channel *(*alloc_rec_pcm_channel)(struct cs_card *);
365 void (*free_pcm_channel)(struct cs_card *, int chan);
367 /* /dev/midi stuff */
368 struct {
369 unsigned ird, iwr, icnt;
370 unsigned ord, owr, ocnt;
371 wait_queue_head_t open_wait;
372 wait_queue_head_t iwait;
373 wait_queue_head_t owait;
374 spinlock_t lock;
375 unsigned char ibuf[CS_MIDIINBUF];
376 unsigned char obuf[CS_MIDIOUTBUF];
377 mode_t open_mode;
378 struct semaphore open_sem;
379 } midi;
380 struct cs46xx_pm pm;
383 static int cs_open_mixdev(struct inode *inode, struct file *file);
384 static int cs_release_mixdev(struct inode *inode, struct file *file);
385 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
386 unsigned long arg);
387 static int cs_hardware_init(struct cs_card *card);
388 static int cs46xx_powerup(struct cs_card *card, unsigned int type);
389 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag);
390 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type);
391 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, pm_message_t state);
392 static int cs46xx_resume_tbl(struct pci_dev *pcidev);
394 #ifndef CS46XX_ACPI_SUPPORT
395 static int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data);
396 #endif
398 #if CSDEBUG
400 /* DEBUG ROUTINES */
402 #define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
403 #define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
404 #define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
405 #define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
406 #define SOUND_MIXER_CS_APM _SIOWR('M',124, int)
408 static void printioctl(unsigned int x)
410 unsigned int i;
411 unsigned char vidx;
412 /* these values are incorrect for the ac97 driver, fix.
413 * Index of mixtable1[] member is Device ID
414 * and must be <= SOUND_MIXER_NRDEVICES.
415 * Value of array member is index into s->mix.vol[]
417 static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
418 [SOUND_MIXER_PCM] = 1, /* voice */
419 [SOUND_MIXER_LINE1] = 2, /* AUX */
420 [SOUND_MIXER_CD] = 3, /* CD */
421 [SOUND_MIXER_LINE] = 4, /* Line */
422 [SOUND_MIXER_SYNTH] = 5, /* FM */
423 [SOUND_MIXER_MIC] = 6, /* Mic */
424 [SOUND_MIXER_SPEAKER] = 7, /* Speaker */
425 [SOUND_MIXER_RECLEV] = 8, /* Recording level */
426 [SOUND_MIXER_VOLUME] = 9 /* Master Volume */
429 switch(x)
431 case SOUND_MIXER_CS_GETDBGMASK:
432 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") );
433 break;
434 case SOUND_MIXER_CS_GETDBGLEVEL:
435 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGLEVEL: ") );
436 break;
437 case SOUND_MIXER_CS_SETDBGMASK:
438 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGMASK: ") );
439 break;
440 case SOUND_MIXER_CS_SETDBGLEVEL:
441 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGLEVEL: ") );
442 break;
443 case OSS_GETVERSION:
444 CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION: ") );
445 break;
446 case SNDCTL_DSP_SYNC:
447 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC: ") );
448 break;
449 case SNDCTL_DSP_SETDUPLEX:
450 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX: ") );
451 break;
452 case SNDCTL_DSP_GETCAPS:
453 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS: ") );
454 break;
455 case SNDCTL_DSP_RESET:
456 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET: ") );
457 break;
458 case SNDCTL_DSP_SPEED:
459 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED: ") );
460 break;
461 case SNDCTL_DSP_STEREO:
462 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO: ") );
463 break;
464 case SNDCTL_DSP_CHANNELS:
465 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS: ") );
466 break;
467 case SNDCTL_DSP_GETFMTS:
468 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS: ") );
469 break;
470 case SNDCTL_DSP_SETFMT:
471 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT: ") );
472 break;
473 case SNDCTL_DSP_POST:
474 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST: ") );
475 break;
476 case SNDCTL_DSP_GETTRIGGER:
477 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER: ") );
478 break;
479 case SNDCTL_DSP_SETTRIGGER:
480 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER: ") );
481 break;
482 case SNDCTL_DSP_GETOSPACE:
483 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE: ") );
484 break;
485 case SNDCTL_DSP_GETISPACE:
486 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE: ") );
487 break;
488 case SNDCTL_DSP_NONBLOCK:
489 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK: ") );
490 break;
491 case SNDCTL_DSP_GETODELAY:
492 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY: ") );
493 break;
494 case SNDCTL_DSP_GETIPTR:
495 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR: ") );
496 break;
497 case SNDCTL_DSP_GETOPTR:
498 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR: ") );
499 break;
500 case SNDCTL_DSP_GETBLKSIZE:
501 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE: ") );
502 break;
503 case SNDCTL_DSP_SETFRAGMENT:
504 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFRAGMENT: ") );
505 break;
506 case SNDCTL_DSP_SUBDIVIDE:
507 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE: ") );
508 break;
509 case SOUND_PCM_READ_RATE:
510 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE: ") );
511 break;
512 case SOUND_PCM_READ_CHANNELS:
513 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_CHANNELS: ") );
514 break;
515 case SOUND_PCM_READ_BITS:
516 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS: ") );
517 break;
518 case SOUND_PCM_WRITE_FILTER:
519 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_WRITE_FILTER: ") );
520 break;
521 case SNDCTL_DSP_SETSYNCRO:
522 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO: ") );
523 break;
524 case SOUND_PCM_READ_FILTER:
525 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") );
526 break;
528 case SOUND_MIXER_PRIVATE1:
529 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") );
530 break;
531 case SOUND_MIXER_PRIVATE2:
532 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2: ") );
533 break;
534 case SOUND_MIXER_PRIVATE3:
535 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3: ") );
536 break;
537 case SOUND_MIXER_PRIVATE4:
538 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4: ") );
539 break;
540 case SOUND_MIXER_PRIVATE5:
541 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5: ") );
542 break;
543 case SOUND_MIXER_INFO:
544 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO: ") );
545 break;
546 case SOUND_OLD_MIXER_INFO:
547 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") );
548 break;
550 default:
551 switch (_IOC_NR(x))
553 case SOUND_MIXER_VOLUME:
554 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") );
555 break;
556 case SOUND_MIXER_SPEAKER:
557 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SPEAKER: ") );
558 break;
559 case SOUND_MIXER_RECLEV:
560 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECLEV: ") );
561 break;
562 case SOUND_MIXER_MIC:
563 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_MIC: ") );
564 break;
565 case SOUND_MIXER_SYNTH:
566 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SYNTH: ") );
567 break;
568 case SOUND_MIXER_RECSRC:
569 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECSRC: ") );
570 break;
571 case SOUND_MIXER_DEVMASK:
572 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_DEVMASK: ") );
573 break;
574 case SOUND_MIXER_RECMASK:
575 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECMASK: ") );
576 break;
577 case SOUND_MIXER_STEREODEVS:
578 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_STEREODEVS: ") );
579 break;
580 case SOUND_MIXER_CAPS:
581 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:") );
582 break;
583 default:
584 i = _IOC_NR(x);
585 if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
587 CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) );
589 else
591 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ",
592 x,i) );
594 break;
597 CS_DBGOUT(CS_IOCTL, 4, printk("command = 0x%x IOC_NR=%d\n",x, _IOC_NR(x)) );
599 #endif
602 * common I/O routines
605 static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
607 writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
610 static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
612 return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
615 static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
617 writel(val, codec->ba0+reg);
620 static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
622 return readl(codec->ba0+reg);
626 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
627 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
629 static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
631 if(card->channel[1].used==1)
632 return NULL;
633 card->channel[1].used=1;
634 card->channel[1].num=1;
635 return &card->channel[1];
638 static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
640 if(card->channel[0].used==1)
641 return NULL;
642 card->channel[0].used=1;
643 card->channel[0].num=0;
644 return &card->channel[0];
647 static void cs_free_pcm_channel(struct cs_card *card, int channel)
649 card->channel[channel].state = NULL;
650 card->channel[channel].used=0;
654 * setup a divisor value to help with conversion from
655 * 16bit Stereo, down to 8bit stereo/mono or 16bit mono.
656 * assign a divisor of 1 if using 16bit Stereo as that is
657 * the only format that the static image will capture.
659 static void cs_set_divisor(struct dmabuf *dmabuf)
661 if(dmabuf->type == CS_TYPE_DAC)
662 dmabuf->divisor = 1;
663 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
664 (dmabuf->fmt & CS_FMT_16BIT))
665 dmabuf->divisor = 2;
666 else if( (dmabuf->fmt & CS_FMT_STEREO) &&
667 !(dmabuf->fmt & CS_FMT_16BIT))
668 dmabuf->divisor = 2;
669 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
670 !(dmabuf->fmt & CS_FMT_16BIT))
671 dmabuf->divisor = 4;
672 else
673 dmabuf->divisor = 1;
675 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, printk(
676 "cs46xx: cs_set_divisor()- %s %d\n",
677 (dmabuf->type == CS_TYPE_ADC) ? "ADC" : "DAC",
678 dmabuf->divisor) );
682 * mute some of the more prevalent registers to avoid popping.
684 static void cs_mute(struct cs_card *card, int state)
686 struct ac97_codec *dev=card->ac97_codec[0];
688 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n",
689 (state == CS_TRUE) ? "Muting" : "UnMuting") );
691 if(state == CS_TRUE)
694 * fix pops when powering up on thinkpads
696 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
697 (u8)BA0_AC97_MASTER_VOLUME);
698 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
699 (u8)BA0_AC97_HEADPHONE_VOLUME);
700 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
701 (u8)BA0_AC97_MASTER_VOLUME_MONO);
702 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
703 (u8)BA0_AC97_PCM_OUT_VOLUME);
705 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
706 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
707 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
708 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
710 else
712 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume);
713 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume);
714 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono);
715 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, card->pm.u32AC97_pcm_out_volume);
717 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()-\n"));
720 /* set playback sample rate */
721 static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
723 struct dmabuf *dmabuf = &state->dmabuf;
724 unsigned int tmp1, tmp2;
725 unsigned int phiIncr;
726 unsigned int correctionPerGOF, correctionPerSec;
727 unsigned long flags;
729 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()+ %d\n",rate) );
732 * Compute the values used to drive the actual sample rate conversion.
733 * The following formulas are being computed, using inline assembly
734 * since we need to use 64 bit arithmetic to compute the values:
736 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
737 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
738 * GOF_PER_SEC)
739 * ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
740 * GOF_PER_SEC * correctionPerGOF
742 * i.e.
744 * phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
745 * correctionPerGOF:correctionPerSec =
746 * dividend:remainder(ulOther / GOF_PER_SEC)
748 tmp1 = rate << 16;
749 phiIncr = tmp1 / 48000;
750 tmp1 -= phiIncr * 48000;
751 tmp1 <<= 10;
752 phiIncr <<= 10;
753 tmp2 = tmp1 / 48000;
754 phiIncr += tmp2;
755 tmp1 -= tmp2 * 48000;
756 correctionPerGOF = tmp1 / GOF_PER_SEC;
757 tmp1 -= correctionPerGOF * GOF_PER_SEC;
758 correctionPerSec = tmp1;
761 * Fill in the SampleRateConverter control block.
764 spin_lock_irqsave(&state->card->lock, flags);
765 cs461x_poke(state->card, BA1_PSRC,
766 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
767 cs461x_poke(state->card, BA1_PPI, phiIncr);
768 spin_unlock_irqrestore(&state->card->lock, flags);
769 dmabuf->rate = rate;
771 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()- %d\n",rate) );
772 return rate;
775 /* set recording sample rate */
776 static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate)
778 struct dmabuf *dmabuf = &state->dmabuf;
779 struct cs_card *card = state->card;
780 unsigned int phiIncr, coeffIncr, tmp1, tmp2;
781 unsigned int correctionPerGOF, correctionPerSec, initialDelay;
782 unsigned int frameGroupLength, cnt;
783 unsigned long flags;
784 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()+ %d\n",rate) );
787 * We can only decimate by up to a factor of 1/9th the hardware rate.
788 * Correct the value if an attempt is made to stray outside that limit.
790 if ((rate * 9) < 48000)
791 rate = 48000 / 9;
794 * We can not capture at at rate greater than the Input Rate (48000).
795 * Return an error if an attempt is made to stray outside that limit.
797 if (rate > 48000)
798 rate = 48000;
801 * Compute the values used to drive the actual sample rate conversion.
802 * The following formulas are being computed, using inline assembly
803 * since we need to use 64 bit arithmetic to compute the values:
805 * coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
806 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
807 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
808 * GOF_PER_SEC)
809 * correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
810 * GOF_PER_SEC * correctionPerGOF
811 * initialDelay = ceil((24 * Fs,in) / Fs,out)
813 * i.e.
815 * coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
816 * phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
817 * correctionPerGOF:correctionPerSec =
818 * dividend:remainder(ulOther / GOF_PER_SEC)
819 * initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
822 tmp1 = rate << 16;
823 coeffIncr = tmp1 / 48000;
824 tmp1 -= coeffIncr * 48000;
825 tmp1 <<= 7;
826 coeffIncr <<= 7;
827 coeffIncr += tmp1 / 48000;
828 coeffIncr ^= 0xFFFFFFFF;
829 coeffIncr++;
830 tmp1 = 48000 << 16;
831 phiIncr = tmp1 / rate;
832 tmp1 -= phiIncr * rate;
833 tmp1 <<= 10;
834 phiIncr <<= 10;
835 tmp2 = tmp1 / rate;
836 phiIncr += tmp2;
837 tmp1 -= tmp2 * rate;
838 correctionPerGOF = tmp1 / GOF_PER_SEC;
839 tmp1 -= correctionPerGOF * GOF_PER_SEC;
840 correctionPerSec = tmp1;
841 initialDelay = ((48000 * 24) + rate - 1) / rate;
844 * Fill in the VariDecimate control block.
846 spin_lock_irqsave(&card->lock, flags);
847 cs461x_poke(card, BA1_CSRC,
848 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
849 cs461x_poke(card, BA1_CCI, coeffIncr);
850 cs461x_poke(card, BA1_CD,
851 (((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
852 cs461x_poke(card, BA1_CPI, phiIncr);
853 spin_unlock_irqrestore(&card->lock, flags);
856 * Figure out the frame group length for the write back task. Basically,
857 * this is just the factors of 24000 (2^6*3*5^3) that are not present in
858 * the output sample rate.
860 frameGroupLength = 1;
861 for (cnt = 2; cnt <= 64; cnt *= 2) {
862 if (((rate / cnt) * cnt) != rate)
863 frameGroupLength *= 2;
865 if (((rate / 3) * 3) != rate) {
866 frameGroupLength *= 3;
868 for (cnt = 5; cnt <= 125; cnt *= 5) {
869 if (((rate / cnt) * cnt) != rate)
870 frameGroupLength *= 5;
874 * Fill in the WriteBack control block.
876 spin_lock_irqsave(&card->lock, flags);
877 cs461x_poke(card, BA1_CFG1, frameGroupLength);
878 cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
879 cs461x_poke(card, BA1_CCST, 0x0000FFFF);
880 cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
881 cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
882 spin_unlock_irqrestore(&card->lock, flags);
883 dmabuf->rate = rate;
884 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()- %d\n",rate) );
885 return rate;
888 /* prepare channel attributes for playback */
889 static void cs_play_setup(struct cs_state *state)
891 struct dmabuf *dmabuf = &state->dmabuf;
892 struct cs_card *card = state->card;
893 unsigned int tmp, Count, playFormat;
895 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") );
896 cs461x_poke(card, BA1_PVOL, 0x80008000);
897 if(!dmabuf->SGok)
898 cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
900 Count = 4;
901 playFormat=cs461x_peek(card, BA1_PFIE);
902 if ((dmabuf->fmt & CS_FMT_STEREO)) {
903 playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO;
904 Count *= 2;
906 else
907 playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO;
909 if ((dmabuf->fmt & CS_FMT_16BIT)) {
910 playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT
911 | DMA_RQ_C2_AC_SIGNED_CONVERT);
912 Count *= 2;
914 else
915 playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT
916 | DMA_RQ_C2_AC_SIGNED_CONVERT);
918 cs461x_poke(card, BA1_PFIE, playFormat);
920 tmp = cs461x_peek(card, BA1_PDTC);
921 tmp &= 0xfffffe00;
922 cs461x_poke(card, BA1_PDTC, tmp | --Count);
924 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") );
928 static struct InitStruct
930 u32 off;
931 u32 val;
932 } InitArray[] = { {0x00000040, 0x3fc0000f},
933 {0x0000004c, 0x04800000},
935 {0x000000b3, 0x00000780},
936 {0x000000b7, 0x00000000},
937 {0x000000bc, 0x07800000},
939 {0x000000cd, 0x00800000},
943 * "SetCaptureSPValues()" -- Initialize record task values before each
944 * capture startup.
946 static void SetCaptureSPValues(struct cs_card *card)
948 unsigned i, offset;
949 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") );
950 for(i=0; i<sizeof(InitArray)/sizeof(struct InitStruct); i++)
952 offset = InitArray[i].off*4; /* 8bit to 32bit offset value */
953 cs461x_poke(card, offset, InitArray[i].val );
955 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()-\n") );
958 /* prepare channel attributes for recording */
959 static void cs_rec_setup(struct cs_state *state)
961 struct cs_card *card = state->card;
962 struct dmabuf *dmabuf = &state->dmabuf;
963 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n") );
965 SetCaptureSPValues(card);
968 * set the attenuation to 0dB
970 cs461x_poke(card, BA1_CVOL, 0x80008000);
973 * set the physical address of the capture buffer into the SP
975 cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->rawbuf));
977 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()-\n") );
981 /* get current playback/recording dma buffer pointer (byte offset from LBA),
982 called with spinlock held! */
984 static inline unsigned cs_get_dma_addr(struct cs_state *state)
986 struct dmabuf *dmabuf = &state->dmabuf;
987 u32 offset;
989 if ( (!(dmabuf->enable & DAC_RUNNING)) &&
990 (!(dmabuf->enable & ADC_RUNNING) ) )
992 CS_DBGOUT(CS_ERROR, 2, printk(
993 "cs46xx: ERROR cs_get_dma_addr(): not enabled \n") );
994 return 0;
998 * granularity is byte boundary, good part.
1000 if(dmabuf->enable & DAC_RUNNING)
1002 offset = cs461x_peek(state->card, BA1_PBA);
1004 else /* ADC_RUNNING must be set */
1006 offset = cs461x_peek(state->card, BA1_CBA);
1008 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9,
1009 printk("cs46xx: cs_get_dma_addr() %d\n",offset) );
1010 offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf;
1011 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8,
1012 printk("cs46xx: cs_get_dma_addr()- %d\n",offset) );
1013 return offset;
1016 static void resync_dma_ptrs(struct cs_state *state)
1018 struct dmabuf *dmabuf;
1020 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") );
1021 if(state)
1023 dmabuf = &state->dmabuf;
1024 dmabuf->hwptr=dmabuf->swptr = 0;
1025 dmabuf->pringbuf = 0;
1027 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()- \n") );
1030 /* Stop recording (lock held) */
1031 static inline void __stop_adc(struct cs_state *state)
1033 struct dmabuf *dmabuf = &state->dmabuf;
1034 struct cs_card *card = state->card;
1035 unsigned int tmp;
1037 dmabuf->enable &= ~ADC_RUNNING;
1039 tmp = cs461x_peek(card, BA1_CCTL);
1040 tmp &= 0xFFFF0000;
1041 cs461x_poke(card, BA1_CCTL, tmp );
1044 static void stop_adc(struct cs_state *state)
1046 unsigned long flags;
1048 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()+ \n") );
1049 spin_lock_irqsave(&state->card->lock, flags);
1050 __stop_adc(state);
1051 spin_unlock_irqrestore(&state->card->lock, flags);
1052 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()- \n") );
1055 static void start_adc(struct cs_state *state)
1057 struct dmabuf *dmabuf = &state->dmabuf;
1058 struct cs_card *card = state->card;
1059 unsigned long flags;
1060 unsigned int tmp;
1062 spin_lock_irqsave(&card->lock, flags);
1063 if (!(dmabuf->enable & ADC_RUNNING) &&
1064 ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize)
1065 && dmabuf->ready) &&
1066 ((card->pm.flags & CS46XX_PM_IDLE) ||
1067 (card->pm.flags & CS46XX_PM_RESUMED)) )
1069 dmabuf->enable |= ADC_RUNNING;
1070 cs_set_divisor(dmabuf);
1071 tmp = cs461x_peek(card, BA1_CCTL);
1072 tmp &= 0xFFFF0000;
1073 tmp |= card->cctl;
1074 CS_DBGOUT(CS_FUNCTION, 2, printk(
1075 "cs46xx: start_adc() poke 0x%x \n",tmp) );
1076 cs461x_poke(card, BA1_CCTL, tmp);
1078 spin_unlock_irqrestore(&card->lock, flags);
1081 /* stop playback (lock held) */
1082 static inline void __stop_dac(struct cs_state *state)
1084 struct dmabuf *dmabuf = &state->dmabuf;
1085 struct cs_card *card = state->card;
1086 unsigned int tmp;
1088 dmabuf->enable &= ~DAC_RUNNING;
1090 tmp=cs461x_peek(card, BA1_PCTL);
1091 tmp&=0xFFFF;
1092 cs461x_poke(card, BA1_PCTL, tmp);
1095 static void stop_dac(struct cs_state *state)
1097 unsigned long flags;
1099 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()+ \n") );
1100 spin_lock_irqsave(&state->card->lock, flags);
1101 __stop_dac(state);
1102 spin_unlock_irqrestore(&state->card->lock, flags);
1103 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()- \n") );
1106 static void start_dac(struct cs_state *state)
1108 struct dmabuf *dmabuf = &state->dmabuf;
1109 struct cs_card *card = state->card;
1110 unsigned long flags;
1111 int tmp;
1113 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()+ \n") );
1114 spin_lock_irqsave(&card->lock, flags);
1115 if (!(dmabuf->enable & DAC_RUNNING) &&
1116 ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) &&
1117 ((card->pm.flags & CS46XX_PM_IDLE) ||
1118 (card->pm.flags & CS46XX_PM_RESUMED)) )
1120 dmabuf->enable |= DAC_RUNNING;
1121 tmp = cs461x_peek(card, BA1_PCTL);
1122 tmp &= 0xFFFF;
1123 tmp |= card->pctl;
1124 CS_DBGOUT(CS_PARMS, 6, printk(
1125 "cs46xx: start_dac() poke card=%p tmp=0x%.08x addr=%p \n",
1126 card, (unsigned)tmp,
1127 card->ba1.idx[(BA1_PCTL >> 16) & 3]+(BA1_PCTL&0xffff) ) );
1128 cs461x_poke(card, BA1_PCTL, tmp);
1130 spin_unlock_irqrestore(&card->lock, flags);
1131 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()- \n") );
1134 #define DMABUF_MINORDER 1
1137 * allocate DMA buffer, playback and recording buffers are separate.
1139 static int alloc_dmabuf(struct cs_state *state)
1142 struct cs_card *card=state->card;
1143 struct dmabuf *dmabuf = &state->dmabuf;
1144 void *rawbuf = NULL;
1145 void *tmpbuff = NULL;
1146 int order;
1147 struct page *map, *mapend;
1148 unsigned long df;
1150 dmabuf->ready = dmabuf->mapped = 0;
1151 dmabuf->SGok = 0;
1153 * check for order within limits, but do not overwrite value.
1155 if((defaultorder > 1) && (defaultorder < 12))
1156 df = defaultorder;
1157 else
1158 df = 2;
1160 for (order = df; order >= DMABUF_MINORDER; order--)
1161 if ( (rawbuf = (void *) pci_alloc_consistent(
1162 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr)))
1163 break;
1164 if (!rawbuf) {
1165 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
1166 "cs46xx: alloc_dmabuf(): unable to allocate rawbuf\n"));
1167 return -ENOMEM;
1169 dmabuf->buforder = order;
1170 dmabuf->rawbuf = rawbuf;
1171 // Now mark the pages as reserved; otherwise the
1172 // remap_pfn_range() in cs46xx_mmap doesn't work.
1173 // 1. get index to last page in mem_map array for rawbuf.
1174 mapend = virt_to_page(dmabuf->rawbuf +
1175 (PAGE_SIZE << dmabuf->buforder) - 1);
1177 // 2. mark each physical page in range as 'reserved'.
1178 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1179 cs4x_mem_map_reserve(map);
1181 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: alloc_dmabuf(): allocated %ld (order = %d) bytes at %p\n",
1182 PAGE_SIZE << order, order, rawbuf) );
1185 * only allocate the conversion buffer for the ADC
1187 if(dmabuf->type == CS_TYPE_DAC)
1189 dmabuf->tmpbuff = NULL;
1190 dmabuf->buforder_tmpbuff = 0;
1191 return 0;
1194 * now the temp buffer for 16/8 conversions
1197 tmpbuff = (void *) pci_alloc_consistent(
1198 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr_tmpbuff);
1200 if (!tmpbuff)
1201 return -ENOMEM;
1202 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: allocated %ld (order = %d) bytes at %p\n",
1203 PAGE_SIZE << order, order, tmpbuff) );
1205 dmabuf->tmpbuff = tmpbuff;
1206 dmabuf->buforder_tmpbuff = order;
1208 // Now mark the pages as reserved; otherwise the
1209 // remap_pfn_range() in cs46xx_mmap doesn't work.
1210 // 1. get index to last page in mem_map array for rawbuf.
1211 mapend = virt_to_page(dmabuf->tmpbuff +
1212 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1214 // 2. mark each physical page in range as 'reserved'.
1215 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1216 cs4x_mem_map_reserve(map);
1217 return 0;
1220 /* free DMA buffer */
1221 static void dealloc_dmabuf(struct cs_state *state)
1223 struct dmabuf *dmabuf = &state->dmabuf;
1224 struct page *map, *mapend;
1226 if (dmabuf->rawbuf) {
1227 // Undo prog_dmabuf()'s marking the pages as reserved
1228 mapend = virt_to_page(dmabuf->rawbuf +
1229 (PAGE_SIZE << dmabuf->buforder) - 1);
1230 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1231 cs4x_mem_map_unreserve(map);
1232 free_dmabuf(state->card, dmabuf);
1235 if (dmabuf->tmpbuff) {
1236 // Undo prog_dmabuf()'s marking the pages as reserved
1237 mapend = virt_to_page(dmabuf->tmpbuff +
1238 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1239 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1240 cs4x_mem_map_unreserve(map);
1241 free_dmabuf2(state->card, dmabuf);
1244 dmabuf->rawbuf = NULL;
1245 dmabuf->tmpbuff = NULL;
1246 dmabuf->mapped = dmabuf->ready = 0;
1247 dmabuf->SGok = 0;
1250 static int __prog_dmabuf(struct cs_state *state)
1252 struct dmabuf *dmabuf = &state->dmabuf;
1253 unsigned long flags;
1254 unsigned long allocated_pages, allocated_bytes;
1255 unsigned long tmp1, tmp2, fmt=0;
1256 unsigned long *ptmp = (unsigned long *) dmabuf->pbuf;
1257 unsigned long SGarray[9], nSGpages=0;
1258 int ret;
1260 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()+ \n"));
1262 * check for CAPTURE and use only non-sg for initial release
1264 if(dmabuf->type == CS_TYPE_ADC)
1266 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n"));
1268 * add in non-sg support for capture.
1270 spin_lock_irqsave(&state->card->lock, flags);
1271 /* add code to reset the rawbuf memory. TRW */
1272 resync_dma_ptrs(state);
1273 dmabuf->total_bytes = dmabuf->blocks = 0;
1274 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1276 dmabuf->SGok = 0;
1278 spin_unlock_irqrestore(&state->card->lock, flags);
1280 /* allocate DMA buffer if not allocated yet */
1281 if (!dmabuf->rawbuf || !dmabuf->tmpbuff)
1282 if ((ret = alloc_dmabuf(state)))
1283 return ret;
1285 * static image only supports 16Bit signed, stereo - hard code fmt
1287 fmt = CS_FMT_16BIT | CS_FMT_STEREO;
1289 dmabuf->numfrag = 2;
1290 dmabuf->fragsize = 2048;
1291 dmabuf->fragsamples = 2048 >> sample_shift[fmt];
1292 dmabuf->dmasize = 4096;
1293 dmabuf->fragshift = 11;
1295 memset(dmabuf->rawbuf, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1296 dmabuf->dmasize);
1297 memset(dmabuf->tmpbuff, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1298 PAGE_SIZE<<dmabuf->buforder_tmpbuff);
1301 * Now set up the ring
1304 spin_lock_irqsave(&state->card->lock, flags);
1305 cs_rec_setup(state);
1306 spin_unlock_irqrestore(&state->card->lock, flags);
1308 /* set the ready flag for the dma buffer */
1309 dmabuf->ready = 1;
1311 CS_DBGOUT(CS_PARMS, 4, printk(
1312 "cs46xx: prog_dmabuf(): CAPTURE rate=%d fmt=0x%x numfrag=%d "
1313 "fragsize=%d dmasize=%d\n",
1314 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1315 dmabuf->fragsize, dmabuf->dmasize) );
1317 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n"));
1318 return 0;
1320 else if (dmabuf->type == CS_TYPE_DAC)
1323 * Must be DAC
1325 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() DAC\n"));
1326 spin_lock_irqsave(&state->card->lock, flags);
1327 resync_dma_ptrs(state);
1328 dmabuf->total_bytes = dmabuf->blocks = 0;
1329 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1331 dmabuf->SGok = 0;
1333 spin_unlock_irqrestore(&state->card->lock, flags);
1335 /* allocate DMA buffer if not allocated yet */
1336 if (!dmabuf->rawbuf)
1337 if ((ret = alloc_dmabuf(state)))
1338 return ret;
1340 allocated_pages = 1 << dmabuf->buforder;
1341 allocated_bytes = allocated_pages*PAGE_SIZE;
1343 if(allocated_pages < 2)
1345 CS_DBGOUT(CS_FUNCTION, 4, printk(
1346 "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n",
1347 (unsigned)allocated_pages));
1348 return -ENOMEM;
1351 /* Use all the pages allocated, fragsize 4k. */
1352 /* Use 'pbuf' for S/G page map table. */
1353 dmabuf->SGok = 1; /* Use S/G. */
1355 nSGpages = allocated_bytes/4096; /* S/G pages always 4k. */
1357 /* Set up S/G variables. */
1358 *ptmp = virt_to_bus(dmabuf->rawbuf);
1359 *(ptmp+1) = 0x00000008;
1360 for(tmp1= 1; tmp1 < nSGpages; tmp1++) {
1361 *(ptmp+2*tmp1) = virt_to_bus( (dmabuf->rawbuf)+4096*tmp1);
1362 if( tmp1 == nSGpages-1)
1363 tmp2 = 0xbfff0000;
1364 else
1365 tmp2 = 0x80000000+8*(tmp1+1);
1366 *(ptmp+2*tmp1+1) = tmp2;
1368 SGarray[0] = 0x82c0200d;
1369 SGarray[1] = 0xffff0000;
1370 SGarray[2] = *ptmp;
1371 SGarray[3] = 0x00010600;
1372 SGarray[4] = *(ptmp+2);
1373 SGarray[5] = 0x80000010;
1374 SGarray[6] = *ptmp;
1375 SGarray[7] = *(ptmp+2);
1376 SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10;
1378 if (dmabuf->SGok) {
1379 dmabuf->numfrag = nSGpages;
1380 dmabuf->fragsize = 4096;
1381 dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt];
1382 dmabuf->fragshift = 12;
1383 dmabuf->dmasize = dmabuf->numfrag*4096;
1385 else {
1386 SGarray[0] = 0xf2c0000f;
1387 SGarray[1] = 0x00000200;
1388 SGarray[2] = 0;
1389 SGarray[3] = 0x00010600;
1390 SGarray[4]=SGarray[5]=SGarray[6]=SGarray[7]=SGarray[8] = 0;
1391 dmabuf->numfrag = 2;
1392 dmabuf->fragsize = 2048;
1393 dmabuf->fragsamples = 2048 >> sample_shift[dmabuf->fmt];
1394 dmabuf->dmasize = 4096;
1395 dmabuf->fragshift = 11;
1397 for(tmp1 = 0; tmp1 < sizeof(SGarray)/4; tmp1++)
1398 cs461x_poke( state->card, BA1_PDTC+tmp1*4, SGarray[tmp1]);
1400 memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1401 dmabuf->dmasize);
1404 * Now set up the ring
1407 spin_lock_irqsave(&state->card->lock, flags);
1408 cs_play_setup(state);
1409 spin_unlock_irqrestore(&state->card->lock, flags);
1411 /* set the ready flag for the dma buffer */
1412 dmabuf->ready = 1;
1414 CS_DBGOUT(CS_PARMS, 4, printk(
1415 "cs46xx: prog_dmabuf(): PLAYBACK rate=%d fmt=0x%x numfrag=%d "
1416 "fragsize=%d dmasize=%d\n",
1417 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1418 dmabuf->fragsize, dmabuf->dmasize) );
1420 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n"));
1421 return 0;
1423 else
1425 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n",
1426 dmabuf->type));
1428 return 1;
1431 static int prog_dmabuf(struct cs_state *state)
1433 int ret;
1435 down(&state->sem);
1436 ret = __prog_dmabuf(state);
1437 up(&state->sem);
1439 return ret;
1442 static void cs_clear_tail(struct cs_state *state)
1446 static int drain_dac(struct cs_state *state, int nonblock)
1448 DECLARE_WAITQUEUE(wait, current);
1449 struct dmabuf *dmabuf = &state->dmabuf;
1450 struct cs_card *card=state->card;
1451 unsigned long flags;
1452 unsigned long tmo;
1453 int count;
1455 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()+ \n"));
1456 if (dmabuf->mapped || !dmabuf->ready)
1458 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0, not ready\n"));
1459 return 0;
1462 add_wait_queue(&dmabuf->wait, &wait);
1463 for (;;) {
1464 /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1465 every time to make the process really go to sleep */
1466 current->state = TASK_INTERRUPTIBLE;
1468 spin_lock_irqsave(&state->card->lock, flags);
1469 count = dmabuf->count;
1470 spin_unlock_irqrestore(&state->card->lock, flags);
1472 if (count <= 0)
1473 break;
1475 if (signal_pending(current))
1476 break;
1478 if (nonblock) {
1479 remove_wait_queue(&dmabuf->wait, &wait);
1480 current->state = TASK_RUNNING;
1481 return -EBUSY;
1484 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1485 tmo >>= sample_shift[dmabuf->fmt];
1486 tmo += (2048*HZ)/dmabuf->rate;
1488 if (!schedule_timeout(tmo ? tmo : 1) && tmo){
1489 printk(KERN_ERR "cs46xx: drain_dac, dma timeout? %d\n", count);
1490 break;
1493 remove_wait_queue(&dmabuf->wait, &wait);
1494 current->state = TASK_RUNNING;
1495 if (signal_pending(current))
1497 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n"));
1499 * set to silence and let that clear the fifos.
1501 cs461x_clear_serial_FIFOs(card, CS_TYPE_DAC);
1502 return -ERESTARTSYS;
1505 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0\n"));
1506 return 0;
1510 /* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
1511 static void cs_update_ptr(struct cs_card *card, int wake)
1513 struct cs_state *state;
1514 struct dmabuf *dmabuf;
1515 unsigned hwptr;
1516 int diff;
1518 /* error handling and process wake up for ADC */
1519 state = card->states[0];
1520 if(state)
1522 dmabuf = &state->dmabuf;
1523 if (dmabuf->enable & ADC_RUNNING) {
1524 /* update hardware pointer */
1525 hwptr = cs_get_dma_addr(state);
1527 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1528 CS_DBGOUT(CS_PARMS, 9, printk(
1529 "cs46xx: cs_update_ptr()+ ADC hwptr=%d diff=%d\n",
1530 hwptr,diff) );
1531 dmabuf->hwptr = hwptr;
1532 dmabuf->total_bytes += diff;
1533 dmabuf->count += diff;
1534 if (dmabuf->count > dmabuf->dmasize)
1535 dmabuf->count = dmabuf->dmasize;
1537 if(dmabuf->mapped)
1539 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1540 wake_up(&dmabuf->wait);
1541 } else
1543 if (wake && dmabuf->count > 0)
1544 wake_up(&dmabuf->wait);
1550 * Now the DAC
1552 state = card->states[1];
1553 if(state)
1555 dmabuf = &state->dmabuf;
1556 /* error handling and process wake up for DAC */
1557 if (dmabuf->enable & DAC_RUNNING) {
1558 /* update hardware pointer */
1559 hwptr = cs_get_dma_addr(state);
1561 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1562 CS_DBGOUT(CS_PARMS, 9, printk(
1563 "cs46xx: cs_update_ptr()+ DAC hwptr=%d diff=%d\n",
1564 hwptr,diff) );
1565 dmabuf->hwptr = hwptr;
1566 dmabuf->total_bytes += diff;
1567 if (dmabuf->mapped) {
1568 dmabuf->count += diff;
1569 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1570 wake_up(&dmabuf->wait);
1572 * other drivers use fragsize, but don't see any sense
1573 * in that, since dmasize is the buffer asked for
1574 * via mmap.
1576 if( dmabuf->count > dmabuf->dmasize)
1577 dmabuf->count &= dmabuf->dmasize-1;
1578 } else {
1579 dmabuf->count -= diff;
1581 * backfill with silence and clear out the last
1582 * "diff" number of bytes.
1584 if(hwptr >= diff)
1586 memset(dmabuf->rawbuf + hwptr - diff,
1587 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff);
1589 else
1591 memset(dmabuf->rawbuf,
1592 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1593 (unsigned)hwptr);
1594 memset((char *)dmabuf->rawbuf +
1595 dmabuf->dmasize + hwptr - diff,
1596 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1597 diff - hwptr);
1600 if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
1601 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
1602 "cs46xx: ERROR DAC count<0 or count > dmasize (%d)\n",
1603 dmabuf->count));
1605 * buffer underrun or buffer overrun, reset the
1606 * count of bytes written back to 0.
1608 if(dmabuf->count < 0)
1609 dmabuf->underrun=1;
1610 dmabuf->count = 0;
1611 dmabuf->error++;
1613 if (wake && dmabuf->count < (signed)dmabuf->dmasize/2)
1614 wake_up(&dmabuf->wait);
1621 /* hold spinlock for the following! */
1622 static void cs_handle_midi(struct cs_card *card)
1624 unsigned char ch;
1625 int wake;
1626 unsigned temp1;
1628 wake = 0;
1629 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_RBE)) {
1630 ch = cs461x_peekBA0(card, BA0_MIDRP);
1631 if (card->midi.icnt < CS_MIDIINBUF) {
1632 card->midi.ibuf[card->midi.iwr] = ch;
1633 card->midi.iwr = (card->midi.iwr + 1) % CS_MIDIINBUF;
1634 card->midi.icnt++;
1636 wake = 1;
1638 if (wake)
1639 wake_up(&card->midi.iwait);
1640 wake = 0;
1641 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_TBF) && card->midi.ocnt > 0) {
1642 temp1 = ( card->midi.obuf[card->midi.ord] ) & 0x000000ff;
1643 cs461x_pokeBA0(card, BA0_MIDWP,temp1);
1644 card->midi.ord = (card->midi.ord + 1) % CS_MIDIOUTBUF;
1645 card->midi.ocnt--;
1646 if (card->midi.ocnt < CS_MIDIOUTBUF-16)
1647 wake = 1;
1649 if (wake)
1650 wake_up(&card->midi.owait);
1653 static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1655 struct cs_card *card = (struct cs_card *)dev_id;
1656 /* Single channel card */
1657 struct cs_state *recstate = card->channel[0].state;
1658 struct cs_state *playstate = card->channel[1].state;
1659 u32 status;
1661 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()+ \n"));
1663 spin_lock(&card->lock);
1665 status = cs461x_peekBA0(card, BA0_HISR);
1667 if ((status & 0x7fffffff) == 0)
1669 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1670 spin_unlock(&card->lock);
1671 return IRQ_HANDLED; /* Might be IRQ_NONE.. */
1675 * check for playback or capture interrupt only
1677 if( ((status & HISR_VC0) && playstate && playstate->dmabuf.ready) ||
1678 (((status & HISR_VC1) && recstate && recstate->dmabuf.ready)) )
1680 CS_DBGOUT(CS_INTERRUPT, 8, printk(
1681 "cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status));
1682 cs_update_ptr(card, CS_TRUE);
1685 if( status & HISR_MIDI )
1686 cs_handle_midi(card);
1688 /* clear 'em */
1689 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1690 spin_unlock(&card->lock);
1691 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n"));
1692 return IRQ_HANDLED;
1696 /**********************************************************************/
1698 static ssize_t cs_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
1700 struct cs_card *card = (struct cs_card *)file->private_data;
1701 ssize_t ret;
1702 unsigned long flags;
1703 unsigned ptr;
1704 int cnt;
1706 if (!access_ok(VERIFY_WRITE, buffer, count))
1707 return -EFAULT;
1708 ret = 0;
1709 while (count > 0) {
1710 spin_lock_irqsave(&card->lock, flags);
1711 ptr = card->midi.ird;
1712 cnt = CS_MIDIINBUF - ptr;
1713 if (card->midi.icnt < cnt)
1714 cnt = card->midi.icnt;
1715 spin_unlock_irqrestore(&card->lock, flags);
1716 if (cnt > count)
1717 cnt = count;
1718 if (cnt <= 0) {
1719 if (file->f_flags & O_NONBLOCK)
1720 return ret ? ret : -EAGAIN;
1721 interruptible_sleep_on(&card->midi.iwait);
1722 if (signal_pending(current))
1723 return ret ? ret : -ERESTARTSYS;
1724 continue;
1726 if (copy_to_user(buffer, card->midi.ibuf + ptr, cnt))
1727 return ret ? ret : -EFAULT;
1728 ptr = (ptr + cnt) % CS_MIDIINBUF;
1729 spin_lock_irqsave(&card->lock, flags);
1730 card->midi.ird = ptr;
1731 card->midi.icnt -= cnt;
1732 spin_unlock_irqrestore(&card->lock, flags);
1733 count -= cnt;
1734 buffer += cnt;
1735 ret += cnt;
1737 return ret;
1741 static ssize_t cs_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1743 struct cs_card *card = (struct cs_card *)file->private_data;
1744 ssize_t ret;
1745 unsigned long flags;
1746 unsigned ptr;
1747 int cnt;
1749 if (!access_ok(VERIFY_READ, buffer, count))
1750 return -EFAULT;
1751 ret = 0;
1752 while (count > 0) {
1753 spin_lock_irqsave(&card->lock, flags);
1754 ptr = card->midi.owr;
1755 cnt = CS_MIDIOUTBUF - ptr;
1756 if (card->midi.ocnt + cnt > CS_MIDIOUTBUF)
1757 cnt = CS_MIDIOUTBUF - card->midi.ocnt;
1758 if (cnt <= 0)
1759 cs_handle_midi(card);
1760 spin_unlock_irqrestore(&card->lock, flags);
1761 if (cnt > count)
1762 cnt = count;
1763 if (cnt <= 0) {
1764 if (file->f_flags & O_NONBLOCK)
1765 return ret ? ret : -EAGAIN;
1766 interruptible_sleep_on(&card->midi.owait);
1767 if (signal_pending(current))
1768 return ret ? ret : -ERESTARTSYS;
1769 continue;
1771 if (copy_from_user(card->midi.obuf + ptr, buffer, cnt))
1772 return ret ? ret : -EFAULT;
1773 ptr = (ptr + cnt) % CS_MIDIOUTBUF;
1774 spin_lock_irqsave(&card->lock, flags);
1775 card->midi.owr = ptr;
1776 card->midi.ocnt += cnt;
1777 spin_unlock_irqrestore(&card->lock, flags);
1778 count -= cnt;
1779 buffer += cnt;
1780 ret += cnt;
1781 spin_lock_irqsave(&card->lock, flags);
1782 cs_handle_midi(card);
1783 spin_unlock_irqrestore(&card->lock, flags);
1785 return ret;
1789 static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait)
1791 struct cs_card *card = (struct cs_card *)file->private_data;
1792 unsigned long flags;
1793 unsigned int mask = 0;
1795 if (file->f_flags & FMODE_WRITE)
1796 poll_wait(file, &card->midi.owait, wait);
1797 if (file->f_flags & FMODE_READ)
1798 poll_wait(file, &card->midi.iwait, wait);
1799 spin_lock_irqsave(&card->lock, flags);
1800 if (file->f_flags & FMODE_READ) {
1801 if (card->midi.icnt > 0)
1802 mask |= POLLIN | POLLRDNORM;
1804 if (file->f_flags & FMODE_WRITE) {
1805 if (card->midi.ocnt < CS_MIDIOUTBUF)
1806 mask |= POLLOUT | POLLWRNORM;
1808 spin_unlock_irqrestore(&card->lock, flags);
1809 return mask;
1813 static int cs_midi_open(struct inode *inode, struct file *file)
1815 unsigned int minor = iminor(inode);
1816 struct cs_card *card=NULL;
1817 unsigned long flags;
1818 struct list_head *entry;
1820 list_for_each(entry, &cs46xx_devs)
1822 card = list_entry(entry, struct cs_card, list);
1823 if (card->dev_midi == minor)
1824 break;
1827 if (entry == &cs46xx_devs)
1828 return -ENODEV;
1829 if (!card)
1831 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
1832 "cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n"));
1833 return -ENODEV;
1836 file->private_data = card;
1837 /* wait for device to become free */
1838 down(&card->midi.open_sem);
1839 while (card->midi.open_mode & file->f_mode) {
1840 if (file->f_flags & O_NONBLOCK) {
1841 up(&card->midi.open_sem);
1842 return -EBUSY;
1844 up(&card->midi.open_sem);
1845 interruptible_sleep_on(&card->midi.open_wait);
1846 if (signal_pending(current))
1847 return -ERESTARTSYS;
1848 down(&card->midi.open_sem);
1850 spin_lock_irqsave(&card->midi.lock, flags);
1851 if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) {
1852 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1853 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1854 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1855 cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f); /* Enable xmit, rcv. */
1856 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM); /* Enable interrupts */
1858 if (file->f_mode & FMODE_READ) {
1859 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1861 if (file->f_mode & FMODE_WRITE) {
1862 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1864 spin_unlock_irqrestore(&card->midi.lock, flags);
1865 card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
1866 up(&card->midi.open_sem);
1867 return 0;
1871 static int cs_midi_release(struct inode *inode, struct file *file)
1873 struct cs_card *card = (struct cs_card *)file->private_data;
1874 DECLARE_WAITQUEUE(wait, current);
1875 unsigned long flags;
1876 unsigned count, tmo;
1878 if (file->f_mode & FMODE_WRITE) {
1879 current->state = TASK_INTERRUPTIBLE;
1880 add_wait_queue(&card->midi.owait, &wait);
1881 for (;;) {
1882 spin_lock_irqsave(&card->midi.lock, flags);
1883 count = card->midi.ocnt;
1884 spin_unlock_irqrestore(&card->midi.lock, flags);
1885 if (count <= 0)
1886 break;
1887 if (signal_pending(current))
1888 break;
1889 if (file->f_flags & O_NONBLOCK)
1890 break;
1891 tmo = (count * HZ) / 3100;
1892 if (!schedule_timeout(tmo ? : 1) && tmo)
1893 printk(KERN_DEBUG "cs46xx: midi timed out??\n");
1895 remove_wait_queue(&card->midi.owait, &wait);
1896 current->state = TASK_RUNNING;
1898 down(&card->midi.open_sem);
1899 card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE)));
1900 up(&card->midi.open_sem);
1901 wake_up(&card->midi.open_wait);
1902 return 0;
1906 * Midi file operations struct.
1908 static /*const*/ struct file_operations cs_midi_fops = {
1909 CS_OWNER CS_THIS_MODULE
1910 .llseek = no_llseek,
1911 .read = cs_midi_read,
1912 .write = cs_midi_write,
1913 .poll = cs_midi_poll,
1914 .open = cs_midi_open,
1915 .release = cs_midi_release,
1920 * CopySamples copies 16-bit stereo signed samples from the source to the
1921 * destination, possibly converting down to unsigned 8-bit and/or mono.
1922 * count specifies the number of output bytes to write.
1924 * Arguments:
1926 * dst - Pointer to a destination buffer.
1927 * src - Pointer to a source buffer
1928 * count - The number of bytes to copy into the destination buffer.
1929 * fmt - CS_FMT_16BIT and/or CS_FMT_STEREO bits
1930 * dmabuf - pointer to the dma buffer structure
1932 * NOTES: only call this routine if the output desired is not 16 Signed Stereo
1936 static void CopySamples(char *dst, char *src, int count, unsigned fmt,
1937 struct dmabuf *dmabuf)
1940 s32 s32AudioSample;
1941 s16 *psSrc=(s16 *)src;
1942 s16 *psDst=(s16 *)dst;
1943 u8 *pucDst=(u8 *)dst;
1945 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") );
1946 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1947 " dst=%p src=%p count=%d fmt=0x%x\n",
1948 dst,src,count,fmt) );
1951 * See if the data should be output as 8-bit unsigned stereo.
1953 if((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1956 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1957 * stereo using rounding.
1959 psSrc = (s16 *)src;
1960 count = count/2;
1961 while(count--)
1963 *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8);
1967 * See if the data should be output at 8-bit unsigned mono.
1969 else if(!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1972 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1973 * mono using averaging and rounding.
1975 psSrc = (s16 *)src;
1976 count = count/2;
1977 while(count--)
1979 s32AudioSample = ((*psSrc)+(*(psSrc + 1)))/2 + (s32)0x80;
1980 if(s32AudioSample > 0x7fff)
1981 s32AudioSample = 0x7fff;
1982 *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8);
1983 psSrc += 2;
1987 * See if the data should be output at 16-bit signed mono.
1989 else if(!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT))
1992 * Convert each 16-bit signed stereo sample to 16-bit signed
1993 * mono using averaging.
1995 psSrc = (s16 *)src;
1996 count = count/2;
1997 while(count--)
1999 *(psDst++) = (s16)((*psSrc)+(*(psSrc + 1)))/2;
2000 psSrc += 2;
2006 * cs_copy_to_user()
2007 * replacement for the standard copy_to_user, to allow for a conversion from
2008 * 16 bit to 8 bit and from stereo to mono, if the record conversion is active.
2009 * The current CS46xx/CS4280 static image only records in 16bit unsigned Stereo,
2010 * so we convert from any of the other format combinations.
2012 static unsigned cs_copy_to_user(
2013 struct cs_state *s,
2014 void __user *dest,
2015 void *hwsrc,
2016 unsigned cnt,
2017 unsigned *copied)
2019 struct dmabuf *dmabuf = &s->dmabuf;
2020 void *src = hwsrc; /* default to the standard destination buffer addr */
2022 CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
2023 "cs_copy_to_user()+ fmt=0x%x cnt=%d dest=%p\n",
2024 dmabuf->fmt,(unsigned)cnt,dest) );
2026 if(cnt > dmabuf->dmasize)
2028 cnt = dmabuf->dmasize;
2030 if(!cnt)
2032 *copied = 0;
2033 return 0;
2035 if(dmabuf->divisor != 1)
2037 if(!dmabuf->tmpbuff)
2039 *copied = cnt/dmabuf->divisor;
2040 return 0;
2043 CopySamples((char *)dmabuf->tmpbuff, (char *)hwsrc, cnt,
2044 dmabuf->fmt, dmabuf);
2045 src = dmabuf->tmpbuff;
2046 cnt = cnt/dmabuf->divisor;
2048 if (copy_to_user(dest, src, cnt))
2050 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
2051 "cs46xx: cs_copy_to_user()- fault dest=%p src=%p cnt=%d\n",
2052 dest,src,cnt) );
2053 *copied = 0;
2054 return -EFAULT;
2056 *copied = cnt;
2057 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
2058 "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt) );
2059 return 0;
2062 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
2063 the user's buffer. it is filled by the dma machine and drained by this loop. */
2064 static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
2066 struct cs_card *card = (struct cs_card *) file->private_data;
2067 struct cs_state *state;
2068 DECLARE_WAITQUEUE(wait, current);
2069 struct dmabuf *dmabuf;
2070 ssize_t ret = 0;
2071 unsigned long flags;
2072 unsigned swptr;
2073 int cnt;
2074 unsigned copied=0;
2076 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2077 printk("cs46xx: cs_read()+ %zd\n",count) );
2078 state = (struct cs_state *)card->states[0];
2079 if(!state)
2080 return -ENODEV;
2081 dmabuf = &state->dmabuf;
2083 if (dmabuf->mapped)
2084 return -ENXIO;
2085 if (!access_ok(VERIFY_WRITE, buffer, count))
2086 return -EFAULT;
2088 down(&state->sem);
2089 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2090 goto out2;
2092 add_wait_queue(&state->dmabuf.wait, &wait);
2093 while (count > 0) {
2094 while(!(card->pm.flags & CS46XX_PM_IDLE))
2096 schedule();
2097 if (signal_pending(current)) {
2098 if(!ret) ret = -ERESTARTSYS;
2099 goto out;
2102 spin_lock_irqsave(&state->card->lock, flags);
2103 swptr = dmabuf->swptr;
2104 cnt = dmabuf->dmasize - swptr;
2105 if (dmabuf->count < cnt)
2106 cnt = dmabuf->count;
2107 if (cnt <= 0)
2108 __set_current_state(TASK_INTERRUPTIBLE);
2109 spin_unlock_irqrestore(&state->card->lock, flags);
2111 if (cnt > (count * dmabuf->divisor))
2112 cnt = count * dmabuf->divisor;
2113 if (cnt <= 0) {
2114 /* buffer is empty, start the dma machine and wait for data to be
2115 recorded */
2116 start_adc(state);
2117 if (file->f_flags & O_NONBLOCK) {
2118 if (!ret) ret = -EAGAIN;
2119 goto out;
2121 up(&state->sem);
2122 schedule();
2123 if (signal_pending(current)) {
2124 if(!ret) ret = -ERESTARTSYS;
2125 goto out;
2127 down(&state->sem);
2128 if (dmabuf->mapped)
2130 if(!ret)
2131 ret = -ENXIO;
2132 goto out;
2134 continue;
2137 CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
2138 "_read() copy_to cnt=%d count=%zd ", cnt,count) );
2139 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
2140 " .dmasize=%d .count=%d buffer=%p ret=%zd\n",
2141 dmabuf->dmasize,dmabuf->count,buffer,ret) );
2143 if (cs_copy_to_user(state, buffer,
2144 (char *)dmabuf->rawbuf + swptr, cnt, &copied))
2146 if (!ret) ret = -EFAULT;
2147 goto out;
2149 swptr = (swptr + cnt) % dmabuf->dmasize;
2150 spin_lock_irqsave(&card->lock, flags);
2151 dmabuf->swptr = swptr;
2152 dmabuf->count -= cnt;
2153 spin_unlock_irqrestore(&card->lock, flags);
2154 count -= copied;
2155 buffer += copied;
2156 ret += copied;
2157 start_adc(state);
2159 out:
2160 remove_wait_queue(&state->dmabuf.wait, &wait);
2161 out2:
2162 up(&state->sem);
2163 set_current_state(TASK_RUNNING);
2164 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2165 printk("cs46xx: cs_read()- %zd\n",ret) );
2166 return ret;
2169 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
2170 the soundcard. it is drained by the dma machine and filled by this loop. */
2171 static ssize_t cs_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
2173 struct cs_card *card = (struct cs_card *) file->private_data;
2174 struct cs_state *state;
2175 DECLARE_WAITQUEUE(wait, current);
2176 struct dmabuf *dmabuf;
2177 ssize_t ret;
2178 unsigned long flags;
2179 unsigned swptr;
2180 int cnt;
2182 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4,
2183 printk("cs46xx: cs_write called, count = %zd\n", count) );
2184 state = (struct cs_state *)card->states[1];
2185 if(!state)
2186 return -ENODEV;
2187 if (!access_ok(VERIFY_READ, buffer, count))
2188 return -EFAULT;
2189 dmabuf = &state->dmabuf;
2191 down(&state->sem);
2192 if (dmabuf->mapped)
2194 ret = -ENXIO;
2195 goto out;
2198 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2199 goto out;
2200 add_wait_queue(&state->dmabuf.wait, &wait);
2201 ret = 0;
2203 * Start the loop to read from the user's buffer and write to the dma buffer.
2204 * check for PM events and underrun/overrun in the loop.
2206 while (count > 0) {
2207 while(!(card->pm.flags & CS46XX_PM_IDLE))
2209 schedule();
2210 if (signal_pending(current)) {
2211 if(!ret) ret = -ERESTARTSYS;
2212 goto out;
2215 spin_lock_irqsave(&state->card->lock, flags);
2216 if (dmabuf->count < 0) {
2217 /* buffer underrun, we are recovering from sleep_on_timeout,
2218 resync hwptr and swptr */
2219 dmabuf->count = 0;
2220 dmabuf->swptr = dmabuf->hwptr;
2222 if (dmabuf->underrun)
2224 dmabuf->underrun = 0;
2225 dmabuf->hwptr = cs_get_dma_addr(state);
2226 dmabuf->swptr = dmabuf->hwptr;
2229 swptr = dmabuf->swptr;
2230 cnt = dmabuf->dmasize - swptr;
2231 if (dmabuf->count + cnt > dmabuf->dmasize)
2232 cnt = dmabuf->dmasize - dmabuf->count;
2233 if (cnt <= 0)
2234 __set_current_state(TASK_INTERRUPTIBLE);
2235 spin_unlock_irqrestore(&state->card->lock, flags);
2237 if (cnt > count)
2238 cnt = count;
2239 if (cnt <= 0) {
2240 /* buffer is full, start the dma machine and wait for data to be
2241 played */
2242 start_dac(state);
2243 if (file->f_flags & O_NONBLOCK) {
2244 if (!ret) ret = -EAGAIN;
2245 goto out;
2247 up(&state->sem);
2248 schedule();
2249 if (signal_pending(current)) {
2250 if(!ret) ret = -ERESTARTSYS;
2251 goto out;
2253 down(&state->sem);
2254 if (dmabuf->mapped)
2256 if(!ret)
2257 ret = -ENXIO;
2258 goto out;
2260 continue;
2262 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
2263 if (!ret) ret = -EFAULT;
2264 goto out;
2266 spin_lock_irqsave(&state->card->lock, flags);
2267 swptr = (swptr + cnt) % dmabuf->dmasize;
2268 dmabuf->swptr = swptr;
2269 dmabuf->count += cnt;
2270 if(dmabuf->count > dmabuf->dmasize)
2272 CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk(
2273 "cs46xx: cs_write() d->count > dmasize - resetting\n"));
2274 dmabuf->count = dmabuf->dmasize;
2276 dmabuf->endcleared = 0;
2277 spin_unlock_irqrestore(&state->card->lock, flags);
2279 count -= cnt;
2280 buffer += cnt;
2281 ret += cnt;
2282 start_dac(state);
2284 out:
2285 up(&state->sem);
2286 remove_wait_queue(&state->dmabuf.wait, &wait);
2287 set_current_state(TASK_RUNNING);
2289 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2,
2290 printk("cs46xx: cs_write()- ret=%zd\n", ret) );
2291 return ret;
2294 static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
2296 struct cs_card *card = (struct cs_card *)file->private_data;
2297 struct dmabuf *dmabuf;
2298 struct cs_state *state;
2300 unsigned long flags;
2301 unsigned int mask = 0;
2303 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n"));
2304 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
2306 return -EINVAL;
2308 if (file->f_mode & FMODE_WRITE)
2310 state = card->states[1];
2311 if(state)
2313 dmabuf = &state->dmabuf;
2314 poll_wait(file, &dmabuf->wait, wait);
2317 if (file->f_mode & FMODE_READ)
2319 state = card->states[0];
2320 if(state)
2322 dmabuf = &state->dmabuf;
2323 poll_wait(file, &dmabuf->wait, wait);
2327 spin_lock_irqsave(&card->lock, flags);
2328 cs_update_ptr(card, CS_FALSE);
2329 if (file->f_mode & FMODE_READ) {
2330 state = card->states[0];
2331 if(state)
2333 dmabuf = &state->dmabuf;
2334 if (dmabuf->count >= (signed)dmabuf->fragsize)
2335 mask |= POLLIN | POLLRDNORM;
2338 if (file->f_mode & FMODE_WRITE) {
2339 state = card->states[1];
2340 if(state)
2342 dmabuf = &state->dmabuf;
2343 if (dmabuf->mapped) {
2344 if (dmabuf->count >= (signed)dmabuf->fragsize)
2345 mask |= POLLOUT | POLLWRNORM;
2346 } else {
2347 if ((signed)dmabuf->dmasize >= dmabuf->count
2348 + (signed)dmabuf->fragsize)
2349 mask |= POLLOUT | POLLWRNORM;
2353 spin_unlock_irqrestore(&card->lock, flags);
2355 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()- (0x%x) \n",
2356 mask));
2357 return mask;
2361 * We let users mmap the ring buffer. Its not the real DMA buffer but
2362 * that side of the code is hidden in the IRQ handling. We do a software
2363 * emulation of DMA from a 64K or so buffer into a 2K FIFO.
2364 * (the hardware probably deserves a moan here but Crystal send me nice
2365 * toys ;)).
2368 static int cs_mmap(struct file *file, struct vm_area_struct *vma)
2370 struct cs_card *card = (struct cs_card *)file->private_data;
2371 struct cs_state *state;
2372 struct dmabuf *dmabuf;
2373 int ret = 0;
2374 unsigned long size;
2376 CS_DBGOUT(CS_FUNCTION | CS_PARMS, 2, printk("cs46xx: cs_mmap()+ file=%p %s %s\n",
2377 file, vma->vm_flags & VM_WRITE ? "VM_WRITE" : "",
2378 vma->vm_flags & VM_READ ? "VM_READ" : "") );
2380 if (vma->vm_flags & VM_WRITE) {
2381 state = card->states[1];
2382 if(state)
2384 CS_DBGOUT(CS_OPEN, 2, printk(
2385 "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") );
2386 if ((ret = prog_dmabuf(state)) != 0)
2387 return ret;
2389 } else if (vma->vm_flags & VM_READ) {
2390 state = card->states[0];
2391 if(state)
2393 CS_DBGOUT(CS_OPEN, 2, printk(
2394 "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") );
2395 if ((ret = prog_dmabuf(state)) != 0)
2396 return ret;
2398 } else {
2399 CS_DBGOUT(CS_ERROR, 2, printk(
2400 "cs46xx: cs_mmap() return -EINVAL\n") );
2401 return -EINVAL;
2405 * For now ONLY support playback, but seems like the only way to use
2406 * mmap() is to open an FD with RDWR, just read or just write access
2407 * does not function, get an error back from the kernel.
2408 * Also, QuakeIII opens with RDWR! So, there must be something
2409 * to needing read/write access mapping. So, allow read/write but
2410 * use the DAC only.
2412 state = card->states[1];
2413 if (!state) {
2414 ret = -EINVAL;
2415 goto out;
2418 down(&state->sem);
2419 dmabuf = &state->dmabuf;
2420 if (cs4x_pgoff(vma) != 0)
2422 ret = -EINVAL;
2423 goto out;
2425 size = vma->vm_end - vma->vm_start;
2427 CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) );
2429 if (size > (PAGE_SIZE << dmabuf->buforder))
2431 ret = -EINVAL;
2432 goto out;
2434 if (remap_pfn_range(vma, vma->vm_start,
2435 virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
2436 size, vma->vm_page_prot))
2438 ret = -EAGAIN;
2439 goto out;
2441 dmabuf->mapped = 1;
2443 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") );
2444 out:
2445 up(&state->sem);
2446 return ret;
2449 static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2451 struct cs_card *card = (struct cs_card *)file->private_data;
2452 struct cs_state *state;
2453 struct dmabuf *dmabuf=NULL;
2454 unsigned long flags;
2455 audio_buf_info abinfo;
2456 count_info cinfo;
2457 int val, valsave, mapped, ret;
2458 void __user *argp = (void __user *)arg;
2459 int __user *p = argp;
2461 state = (struct cs_state *)card->states[0];
2462 if(state)
2464 dmabuf = &state->dmabuf;
2465 mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped;
2467 state = (struct cs_state *)card->states[1];
2468 if(state)
2470 dmabuf = &state->dmabuf;
2471 mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped;
2474 #if CSDEBUG
2475 printioctl(cmd);
2476 #endif
2478 switch (cmd)
2480 case OSS_GETVERSION:
2481 return put_user(SOUND_VERSION, p);
2483 case SNDCTL_DSP_RESET:
2484 /* FIXME: spin_lock ? */
2485 if (file->f_mode & FMODE_WRITE) {
2486 state = (struct cs_state *)card->states[1];
2487 if(state)
2489 dmabuf = &state->dmabuf;
2490 stop_dac(state);
2491 synchronize_irq(card->irq);
2492 dmabuf->ready = 0;
2493 resync_dma_ptrs(state);
2494 dmabuf->swptr = dmabuf->hwptr = 0;
2495 dmabuf->count = dmabuf->total_bytes = 0;
2496 dmabuf->blocks = 0;
2497 dmabuf->SGok = 0;
2500 if (file->f_mode & FMODE_READ) {
2501 state = (struct cs_state *)card->states[0];
2502 if(state)
2504 dmabuf = &state->dmabuf;
2505 stop_adc(state);
2506 synchronize_irq(card->irq);
2507 resync_dma_ptrs(state);
2508 dmabuf->ready = 0;
2509 dmabuf->swptr = dmabuf->hwptr = 0;
2510 dmabuf->count = dmabuf->total_bytes = 0;
2511 dmabuf->blocks = 0;
2512 dmabuf->SGok = 0;
2515 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") );
2516 return 0;
2518 case SNDCTL_DSP_SYNC:
2519 if (file->f_mode & FMODE_WRITE)
2520 return drain_dac(state, file->f_flags & O_NONBLOCK);
2521 return 0;
2523 case SNDCTL_DSP_SPEED: /* set sample rate */
2524 if (get_user(val, p))
2525 return -EFAULT;
2526 if (val >= 0) {
2527 if (file->f_mode & FMODE_READ) {
2528 state = (struct cs_state *)card->states[0];
2529 if(state)
2531 dmabuf = &state->dmabuf;
2532 stop_adc(state);
2533 dmabuf->ready = 0;
2534 dmabuf->SGok = 0;
2535 cs_set_adc_rate(state, val);
2536 cs_set_divisor(dmabuf);
2539 if (file->f_mode & FMODE_WRITE) {
2540 state = (struct cs_state *)card->states[1];
2541 if(state)
2543 dmabuf = &state->dmabuf;
2544 stop_dac(state);
2545 dmabuf->ready = 0;
2546 dmabuf->SGok = 0;
2547 cs_set_dac_rate(state, val);
2548 cs_set_divisor(dmabuf);
2551 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2552 "cs46xx: cs_ioctl() DSP_SPEED %s %s %d\n",
2553 file->f_mode & FMODE_WRITE ? "DAC" : "",
2554 file->f_mode & FMODE_READ ? "ADC" : "",
2555 dmabuf->rate ) );
2556 return put_user(dmabuf->rate, p);
2558 return put_user(0, p);
2560 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2561 if (get_user(val, p))
2562 return -EFAULT;
2563 if (file->f_mode & FMODE_WRITE) {
2564 state = (struct cs_state *)card->states[1];
2565 if(state)
2567 dmabuf = &state->dmabuf;
2568 stop_dac(state);
2569 dmabuf->ready = 0;
2570 dmabuf->SGok = 0;
2571 if(val)
2572 dmabuf->fmt |= CS_FMT_STEREO;
2573 else
2574 dmabuf->fmt &= ~CS_FMT_STEREO;
2575 cs_set_divisor(dmabuf);
2576 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2577 "cs46xx: DSP_STEREO() DAC %s\n",
2578 (dmabuf->fmt & CS_FMT_STEREO) ?
2579 "STEREO":"MONO") );
2582 if (file->f_mode & FMODE_READ) {
2583 state = (struct cs_state *)card->states[0];
2584 if(state)
2586 dmabuf = &state->dmabuf;
2587 stop_adc(state);
2588 dmabuf->ready = 0;
2589 dmabuf->SGok = 0;
2590 if(val)
2591 dmabuf->fmt |= CS_FMT_STEREO;
2592 else
2593 dmabuf->fmt &= ~CS_FMT_STEREO;
2594 cs_set_divisor(dmabuf);
2595 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2596 "cs46xx: DSP_STEREO() ADC %s\n",
2597 (dmabuf->fmt & CS_FMT_STEREO) ?
2598 "STEREO":"MONO") );
2601 return 0;
2603 case SNDCTL_DSP_GETBLKSIZE:
2604 if (file->f_mode & FMODE_WRITE) {
2605 state = (struct cs_state *)card->states[1];
2606 if(state)
2608 dmabuf = &state->dmabuf;
2609 if ((val = prog_dmabuf(state)))
2610 return val;
2611 return put_user(dmabuf->fragsize, p);
2614 if (file->f_mode & FMODE_READ) {
2615 state = (struct cs_state *)card->states[0];
2616 if(state)
2618 dmabuf = &state->dmabuf;
2619 if ((val = prog_dmabuf(state)))
2620 return val;
2621 return put_user(dmabuf->fragsize/dmabuf->divisor,
2625 return put_user(0, p);
2627 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
2628 return put_user(AFMT_S16_LE | AFMT_U8, p);
2630 case SNDCTL_DSP_SETFMT: /* Select sample format */
2631 if (get_user(val, p))
2632 return -EFAULT;
2633 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2634 "cs46xx: cs_ioctl() DSP_SETFMT %s %s %s %s\n",
2635 file->f_mode & FMODE_WRITE ? "DAC" : "",
2636 file->f_mode & FMODE_READ ? "ADC" : "",
2637 val == AFMT_S16_LE ? "16Bit Signed" : "",
2638 val == AFMT_U8 ? "8Bit Unsigned" : "") );
2639 valsave = val;
2640 if (val != AFMT_QUERY) {
2641 if(val==AFMT_S16_LE || val==AFMT_U8)
2643 if (file->f_mode & FMODE_WRITE) {
2644 state = (struct cs_state *)card->states[1];
2645 if(state)
2647 dmabuf = &state->dmabuf;
2648 stop_dac(state);
2649 dmabuf->ready = 0;
2650 dmabuf->SGok = 0;
2651 if(val==AFMT_S16_LE)
2652 dmabuf->fmt |= CS_FMT_16BIT;
2653 else
2654 dmabuf->fmt &= ~CS_FMT_16BIT;
2655 cs_set_divisor(dmabuf);
2656 if((ret = prog_dmabuf(state)))
2657 return ret;
2660 if (file->f_mode & FMODE_READ) {
2661 val = valsave;
2662 state = (struct cs_state *)card->states[0];
2663 if(state)
2665 dmabuf = &state->dmabuf;
2666 stop_adc(state);
2667 dmabuf->ready = 0;
2668 dmabuf->SGok = 0;
2669 if(val==AFMT_S16_LE)
2670 dmabuf->fmt |= CS_FMT_16BIT;
2671 else
2672 dmabuf->fmt &= ~CS_FMT_16BIT;
2673 cs_set_divisor(dmabuf);
2674 if((ret = prog_dmabuf(state)))
2675 return ret;
2679 else
2681 CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk(
2682 "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n",
2683 valsave) );
2686 else
2688 if(file->f_mode & FMODE_WRITE)
2690 state = (struct cs_state *)card->states[1];
2691 if(state)
2692 dmabuf = &state->dmabuf;
2694 else if(file->f_mode & FMODE_READ)
2696 state = (struct cs_state *)card->states[0];
2697 if(state)
2698 dmabuf = &state->dmabuf;
2701 if(dmabuf)
2703 if(dmabuf->fmt & CS_FMT_16BIT)
2704 return put_user(AFMT_S16_LE, p);
2705 else
2706 return put_user(AFMT_U8, p);
2708 return put_user(0, p);
2710 case SNDCTL_DSP_CHANNELS:
2711 if (get_user(val, p))
2712 return -EFAULT;
2713 if (val != 0) {
2714 if (file->f_mode & FMODE_WRITE) {
2715 state = (struct cs_state *)card->states[1];
2716 if(state)
2718 dmabuf = &state->dmabuf;
2719 stop_dac(state);
2720 dmabuf->ready = 0;
2721 dmabuf->SGok = 0;
2722 if(val>1)
2723 dmabuf->fmt |= CS_FMT_STEREO;
2724 else
2725 dmabuf->fmt &= ~CS_FMT_STEREO;
2726 cs_set_divisor(dmabuf);
2727 if (prog_dmabuf(state))
2728 return 0;
2731 if (file->f_mode & FMODE_READ) {
2732 state = (struct cs_state *)card->states[0];
2733 if(state)
2735 dmabuf = &state->dmabuf;
2736 stop_adc(state);
2737 dmabuf->ready = 0;
2738 dmabuf->SGok = 0;
2739 if(val>1)
2740 dmabuf->fmt |= CS_FMT_STEREO;
2741 else
2742 dmabuf->fmt &= ~CS_FMT_STEREO;
2743 cs_set_divisor(dmabuf);
2744 if (prog_dmabuf(state))
2745 return 0;
2749 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
2752 case SNDCTL_DSP_POST:
2754 * There will be a longer than normal pause in the data.
2755 * so... do nothing, because there is nothing that we can do.
2757 return 0;
2759 case SNDCTL_DSP_SUBDIVIDE:
2760 if (file->f_mode & FMODE_WRITE) {
2761 state = (struct cs_state *)card->states[1];
2762 if(state)
2764 dmabuf = &state->dmabuf;
2765 if (dmabuf->subdivision)
2766 return -EINVAL;
2767 if (get_user(val, p))
2768 return -EFAULT;
2769 if (val != 1 && val != 2)
2770 return -EINVAL;
2771 dmabuf->subdivision = val;
2774 if (file->f_mode & FMODE_READ) {
2775 state = (struct cs_state *)card->states[0];
2776 if(state)
2778 dmabuf = &state->dmabuf;
2779 if (dmabuf->subdivision)
2780 return -EINVAL;
2781 if (get_user(val, p))
2782 return -EFAULT;
2783 if (val != 1 && val != 2)
2784 return -EINVAL;
2785 dmabuf->subdivision = val;
2788 return 0;
2790 case SNDCTL_DSP_SETFRAGMENT:
2791 if (get_user(val, p))
2792 return -EFAULT;
2794 if (file->f_mode & FMODE_WRITE) {
2795 state = (struct cs_state *)card->states[1];
2796 if(state)
2798 dmabuf = &state->dmabuf;
2799 dmabuf->ossfragshift = val & 0xffff;
2800 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2803 if (file->f_mode & FMODE_READ) {
2804 state = (struct cs_state *)card->states[0];
2805 if(state)
2807 dmabuf = &state->dmabuf;
2808 dmabuf->ossfragshift = val & 0xffff;
2809 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2812 return 0;
2814 case SNDCTL_DSP_GETOSPACE:
2815 if (!(file->f_mode & FMODE_WRITE))
2816 return -EINVAL;
2817 state = (struct cs_state *)card->states[1];
2818 if(state)
2820 dmabuf = &state->dmabuf;
2821 spin_lock_irqsave(&state->card->lock, flags);
2822 cs_update_ptr(card, CS_TRUE);
2823 abinfo.fragsize = dmabuf->fragsize;
2824 abinfo.fragstotal = dmabuf->numfrag;
2826 * for mmap we always have total space available
2828 if (dmabuf->mapped)
2829 abinfo.bytes = dmabuf->dmasize;
2830 else
2831 abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2833 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2834 spin_unlock_irqrestore(&state->card->lock, flags);
2835 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2837 return -ENODEV;
2839 case SNDCTL_DSP_GETISPACE:
2840 if (!(file->f_mode & FMODE_READ))
2841 return -EINVAL;
2842 state = (struct cs_state *)card->states[0];
2843 if(state)
2845 dmabuf = &state->dmabuf;
2846 spin_lock_irqsave(&state->card->lock, flags);
2847 cs_update_ptr(card, CS_TRUE);
2848 abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
2849 abinfo.bytes = dmabuf->count/dmabuf->divisor;
2850 abinfo.fragstotal = dmabuf->numfrag;
2851 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2852 spin_unlock_irqrestore(&state->card->lock, flags);
2853 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2855 return -ENODEV;
2857 case SNDCTL_DSP_NONBLOCK:
2858 file->f_flags |= O_NONBLOCK;
2859 return 0;
2861 case SNDCTL_DSP_GETCAPS:
2862 return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
2865 case SNDCTL_DSP_GETTRIGGER:
2866 val = 0;
2867 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") );
2868 if (file->f_mode & FMODE_WRITE)
2870 state = (struct cs_state *)card->states[1];
2871 if(state)
2873 dmabuf = &state->dmabuf;
2874 if(dmabuf->enable & DAC_RUNNING)
2875 val |= PCM_ENABLE_INPUT;
2878 if (file->f_mode & FMODE_READ)
2880 if(state)
2882 state = (struct cs_state *)card->states[0];
2883 dmabuf = &state->dmabuf;
2884 if(dmabuf->enable & ADC_RUNNING)
2885 val |= PCM_ENABLE_OUTPUT;
2888 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) );
2889 return put_user(val, p);
2891 case SNDCTL_DSP_SETTRIGGER:
2892 if (get_user(val, p))
2893 return -EFAULT;
2894 if (file->f_mode & FMODE_READ) {
2895 state = (struct cs_state *)card->states[0];
2896 if(state)
2898 dmabuf = &state->dmabuf;
2899 if (val & PCM_ENABLE_INPUT) {
2900 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2901 return ret;
2902 start_adc(state);
2903 } else
2904 stop_adc(state);
2907 if (file->f_mode & FMODE_WRITE) {
2908 state = (struct cs_state *)card->states[1];
2909 if(state)
2911 dmabuf = &state->dmabuf;
2912 if (val & PCM_ENABLE_OUTPUT) {
2913 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2914 return ret;
2915 start_dac(state);
2916 } else
2917 stop_dac(state);
2920 return 0;
2922 case SNDCTL_DSP_GETIPTR:
2923 if (!(file->f_mode & FMODE_READ))
2924 return -EINVAL;
2925 state = (struct cs_state *)card->states[0];
2926 if(state)
2928 dmabuf = &state->dmabuf;
2929 spin_lock_irqsave(&state->card->lock, flags);
2930 cs_update_ptr(card, CS_TRUE);
2931 cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
2932 cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
2933 cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
2934 spin_unlock_irqrestore(&state->card->lock, flags);
2935 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2936 return -EFAULT;
2937 return 0;
2939 return -ENODEV;
2941 case SNDCTL_DSP_GETOPTR:
2942 if (!(file->f_mode & FMODE_WRITE))
2943 return -EINVAL;
2944 state = (struct cs_state *)card->states[1];
2945 if(state)
2947 dmabuf = &state->dmabuf;
2948 spin_lock_irqsave(&state->card->lock, flags);
2949 cs_update_ptr(card, CS_TRUE);
2950 cinfo.bytes = dmabuf->total_bytes;
2951 if (dmabuf->mapped)
2953 cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift)
2954 - dmabuf->blocks;
2955 CS_DBGOUT(CS_PARMS, 8,
2956 printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n",
2957 cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
2958 dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
2960 else
2962 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2964 cinfo.ptr = dmabuf->hwptr;
2966 CS_DBGOUT(CS_PARMS, 4, printk(
2967 "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%d\n",
2968 cinfo.bytes,cinfo.blocks,cinfo.ptr) );
2969 spin_unlock_irqrestore(&state->card->lock, flags);
2970 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2971 return -EFAULT;
2972 return 0;
2974 return -ENODEV;
2976 case SNDCTL_DSP_SETDUPLEX:
2977 return 0;
2979 case SNDCTL_DSP_GETODELAY:
2980 if (!(file->f_mode & FMODE_WRITE))
2981 return -EINVAL;
2982 state = (struct cs_state *)card->states[1];
2983 if(state)
2985 dmabuf = &state->dmabuf;
2986 spin_lock_irqsave(&state->card->lock, flags);
2987 cs_update_ptr(card, CS_TRUE);
2988 val = dmabuf->count;
2989 spin_unlock_irqrestore(&state->card->lock, flags);
2991 else
2992 val = 0;
2993 return put_user(val, p);
2995 case SOUND_PCM_READ_RATE:
2996 if(file->f_mode & FMODE_READ)
2997 state = (struct cs_state *)card->states[0];
2998 else
2999 state = (struct cs_state *)card->states[1];
3000 if(state)
3002 dmabuf = &state->dmabuf;
3003 return put_user(dmabuf->rate, p);
3005 return put_user(0, p);
3008 case SOUND_PCM_READ_CHANNELS:
3009 if(file->f_mode & FMODE_READ)
3010 state = (struct cs_state *)card->states[0];
3011 else
3012 state = (struct cs_state *)card->states[1];
3013 if(state)
3015 dmabuf = &state->dmabuf;
3016 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
3019 return put_user(0, p);
3021 case SOUND_PCM_READ_BITS:
3022 if(file->f_mode & FMODE_READ)
3023 state = (struct cs_state *)card->states[0];
3024 else
3025 state = (struct cs_state *)card->states[1];
3026 if(state)
3028 dmabuf = &state->dmabuf;
3029 return put_user((dmabuf->fmt & CS_FMT_16BIT) ?
3030 AFMT_S16_LE : AFMT_U8, p);
3033 return put_user(0, p);
3035 case SNDCTL_DSP_MAPINBUF:
3036 case SNDCTL_DSP_MAPOUTBUF:
3037 case SNDCTL_DSP_SETSYNCRO:
3038 case SOUND_PCM_WRITE_FILTER:
3039 case SOUND_PCM_READ_FILTER:
3040 return -EINVAL;
3042 return -EINVAL;
3047 * AMP control - null AMP
3050 static void amp_none(struct cs_card *card, int change)
3055 * Crystal EAPD mode
3058 static void amp_voyetra(struct cs_card *card, int change)
3060 /* Manage the EAPD bit on the Crystal 4297
3061 and the Analog AD1885 */
3063 int old=card->amplifier;
3065 card->amplifier+=change;
3066 if(card->amplifier && !old)
3068 /* Turn the EAPD amp on */
3069 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3070 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
3071 0x8000);
3073 else if(old && !card->amplifier)
3075 /* Turn the EAPD amp off */
3076 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3077 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
3078 ~0x8000);
3084 * Game Theatre XP card - EGPIO[2] is used to enable the external amp.
3087 static void amp_hercules(struct cs_card *card, int change)
3089 int old=card->amplifier;
3090 if(!card)
3092 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
3093 "cs46xx: amp_hercules() called before initialized.\n"));
3094 return;
3096 card->amplifier+=change;
3097 if( (card->amplifier && !old) && !(hercules_egpio_disable))
3099 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3100 "cs46xx: amp_hercules() external amp enabled\n"));
3101 cs461x_pokeBA0(card, BA0_EGPIODR,
3102 EGPIODR_GPOE2); /* enable EGPIO2 output */
3103 cs461x_pokeBA0(card, BA0_EGPIOPTR,
3104 EGPIOPTR_GPPT2); /* open-drain on output */
3106 else if(old && !card->amplifier)
3108 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3109 "cs46xx: amp_hercules() external amp disabled\n"));
3110 cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
3111 cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
3116 * Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
3117 * whenever we need to beat on the chip.
3119 * The original idea and code for this hack comes from David Kaiser at
3120 * Linuxcare. Perhaps one day Crystal will document their chips well
3121 * enough to make them useful.
3124 static void clkrun_hack(struct cs_card *card, int change)
3126 struct pci_dev *acpi_dev;
3127 u16 control;
3128 u8 pp;
3129 unsigned long port;
3130 int old=card->active;
3132 card->active+=change;
3134 acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
3135 if(acpi_dev == NULL)
3136 return; /* Not a thinkpad thats for sure */
3138 /* Find the control port */
3139 pci_read_config_byte(acpi_dev, 0x41, &pp);
3140 port=pp<<8;
3142 /* Read ACPI port */
3143 control=inw(port+0x10);
3145 /* Flip CLKRUN off while running */
3146 if(!card->active && old)
3148 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3149 "cs46xx: clkrun() enable clkrun - change=%d active=%d\n",
3150 change,card->active));
3151 outw(control|0x2000, port+0x10);
3153 else
3156 * sometimes on a resume the bit is set, so always reset the bit.
3158 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3159 "cs46xx: clkrun() disable clkrun - change=%d active=%d\n",
3160 change,card->active));
3161 outw(control&~0x2000, port+0x10);
3166 static int cs_open(struct inode *inode, struct file *file)
3168 struct cs_card *card = (struct cs_card *)file->private_data;
3169 struct cs_state *state = NULL;
3170 struct dmabuf *dmabuf = NULL;
3171 struct list_head *entry;
3172 unsigned int minor = iminor(inode);
3173 int ret=0;
3174 unsigned int tmp;
3176 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=%p %s %s\n",
3177 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3178 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3180 list_for_each(entry, &cs46xx_devs)
3182 card = list_entry(entry, struct cs_card, list);
3184 if (!((card->dev_audio ^ minor) & ~0xf))
3185 break;
3187 if (entry == &cs46xx_devs)
3188 return -ENODEV;
3189 if (!card) {
3190 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
3191 "cs46xx: cs_open(): Error - unable to find audio card struct\n"));
3192 return -ENODEV;
3196 * hardcode state[0] for capture, [1] for playback
3198 if(file->f_mode & FMODE_READ)
3200 CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
3201 if (card->states[0] == NULL) {
3202 state = card->states[0] = (struct cs_state *)
3203 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3204 if (state == NULL)
3205 return -ENOMEM;
3206 memset(state, 0, sizeof(struct cs_state));
3207 init_MUTEX(&state->sem);
3208 dmabuf = &state->dmabuf;
3209 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3210 if(dmabuf->pbuf==NULL)
3212 kfree(state);
3213 card->states[0]=NULL;
3214 return -ENOMEM;
3217 else
3219 state = card->states[0];
3220 if(state->open_mode & FMODE_READ)
3221 return -EBUSY;
3223 dmabuf->channel = card->alloc_rec_pcm_channel(card);
3225 if (dmabuf->channel == NULL) {
3226 kfree (card->states[0]);
3227 card->states[0] = NULL;
3228 return -ENODEV;
3231 /* Now turn on external AMP if needed */
3232 state->card = card;
3233 state->card->active_ctrl(state->card,1);
3234 state->card->amplifier_ctrl(state->card,1);
3236 if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) )
3238 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3239 "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n",tmp) );
3240 return -EIO;
3243 dmabuf->channel->state = state;
3244 /* initialize the virtual channel */
3245 state->virt = 0;
3246 state->magic = CS_STATE_MAGIC;
3247 init_waitqueue_head(&dmabuf->wait);
3248 init_MUTEX(&state->open_sem);
3249 file->private_data = card;
3251 down(&state->open_sem);
3253 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3254 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3255 /dev/dspW will accept 16-bits sample */
3257 /* Default input is 8bit mono */
3258 dmabuf->fmt &= ~CS_FMT_MASK;
3259 dmabuf->type = CS_TYPE_ADC;
3260 dmabuf->ossfragshift = 0;
3261 dmabuf->ossmaxfrags = 0;
3262 dmabuf->subdivision = 0;
3263 cs_set_adc_rate(state, 8000);
3264 cs_set_divisor(dmabuf);
3266 state->open_mode |= FMODE_READ;
3267 up(&state->open_sem);
3269 if(file->f_mode & FMODE_WRITE)
3271 CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
3272 if (card->states[1] == NULL) {
3273 state = card->states[1] = (struct cs_state *)
3274 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3275 if (state == NULL)
3276 return -ENOMEM;
3277 memset(state, 0, sizeof(struct cs_state));
3278 init_MUTEX(&state->sem);
3279 dmabuf = &state->dmabuf;
3280 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3281 if(dmabuf->pbuf==NULL)
3283 kfree(state);
3284 card->states[1]=NULL;
3285 return -ENOMEM;
3288 else
3290 state = card->states[1];
3291 if(state->open_mode & FMODE_WRITE)
3292 return -EBUSY;
3294 dmabuf->channel = card->alloc_pcm_channel(card);
3296 if (dmabuf->channel == NULL) {
3297 kfree (card->states[1]);
3298 card->states[1] = NULL;
3299 return -ENODEV;
3302 /* Now turn on external AMP if needed */
3303 state->card = card;
3304 state->card->active_ctrl(state->card,1);
3305 state->card->amplifier_ctrl(state->card,1);
3307 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) )
3309 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3310 "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n",tmp) );
3311 return -EIO;
3314 dmabuf->channel->state = state;
3315 /* initialize the virtual channel */
3316 state->virt = 1;
3317 state->magic = CS_STATE_MAGIC;
3318 init_waitqueue_head(&dmabuf->wait);
3319 init_MUTEX(&state->open_sem);
3320 file->private_data = card;
3322 down(&state->open_sem);
3324 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3325 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3326 /dev/dspW will accept 16-bits sample */
3328 /* Default output is 8bit mono. */
3329 dmabuf->fmt &= ~CS_FMT_MASK;
3330 dmabuf->type = CS_TYPE_DAC;
3331 dmabuf->ossfragshift = 0;
3332 dmabuf->ossmaxfrags = 0;
3333 dmabuf->subdivision = 0;
3334 cs_set_dac_rate(state, 8000);
3335 cs_set_divisor(dmabuf);
3337 state->open_mode |= FMODE_WRITE;
3338 up(&state->open_sem);
3339 if((ret = prog_dmabuf(state)))
3340 return ret;
3342 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n") );
3343 return nonseekable_open(inode, file);
3346 static int cs_release(struct inode *inode, struct file *file)
3348 struct cs_card *card = (struct cs_card *)file->private_data;
3349 struct dmabuf *dmabuf;
3350 struct cs_state *state;
3351 unsigned int tmp;
3352 CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=%p %s %s\n",
3353 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3354 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3356 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
3358 return -EINVAL;
3360 state = card->states[1];
3361 if(state)
3363 if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) )
3365 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n") );
3366 dmabuf = &state->dmabuf;
3367 cs_clear_tail(state);
3368 drain_dac(state, file->f_flags & O_NONBLOCK);
3369 /* stop DMA state machine and free DMA buffers/channels */
3370 down(&state->open_sem);
3371 stop_dac(state);
3372 dealloc_dmabuf(state);
3373 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3374 free_page((unsigned long)state->dmabuf.pbuf);
3376 /* we're covered by the open_sem */
3377 up(&state->open_sem);
3378 state->card->states[state->virt] = NULL;
3379 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3381 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) )
3383 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3384 "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) );
3387 /* Now turn off external AMP if needed */
3388 state->card->amplifier_ctrl(state->card, -1);
3389 state->card->active_ctrl(state->card, -1);
3391 kfree(state);
3395 state = card->states[0];
3396 if(state)
3398 if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) )
3400 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n") );
3401 dmabuf = &state->dmabuf;
3402 down(&state->open_sem);
3403 stop_adc(state);
3404 dealloc_dmabuf(state);
3405 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3406 free_page((unsigned long)state->dmabuf.pbuf);
3408 /* we're covered by the open_sem */
3409 up(&state->open_sem);
3410 state->card->states[state->virt] = NULL;
3411 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3413 if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) )
3415 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3416 "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) );
3419 /* Now turn off external AMP if needed */
3420 state->card->amplifier_ctrl(state->card, -1);
3421 state->card->active_ctrl(state->card, -1);
3423 kfree(state);
3427 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n") );
3428 return 0;
3431 static void printpm(struct cs_card *s)
3433 CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
3434 CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
3435 (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
3436 CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
3437 s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
3438 CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
3439 s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
3440 CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
3441 s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
3442 CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
3443 s->pm.u32SSCR,s->pm.u32SRCSA));
3444 CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
3445 s->pm.u32DacASR,s->pm.u32AdcASR));
3446 CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
3447 s->pm.u32DacSR,s->pm.u32AdcSR));
3448 CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
3449 s->pm.u32MIDCR_Save));
3450 CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%x\n",
3451 s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
3452 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%x\n",
3453 s->pm.u32AC97_master_volume));
3454 CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%x\n",
3455 s->pm.u32AC97_headphone_volume));
3456 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%x\n",
3457 s->pm.u32AC97_master_volume_mono));
3458 CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%x\n",
3459 s->pm.u32AC97_pcm_out_volume));
3460 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %d\n",
3461 s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
3462 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %d\n",
3463 s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
3467 /****************************************************************************
3469 * Suspend - save the ac97 regs, mute the outputs and power down the part.
3471 ****************************************************************************/
3472 static void cs46xx_ac97_suspend(struct cs_card *card)
3474 int Count,i;
3475 struct ac97_codec *dev=card->ac97_codec[0];
3476 unsigned int tmp;
3478 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n"));
3480 if(card->states[1])
3482 stop_dac(card->states[1]);
3483 resync_dma_ptrs(card->states[1]);
3485 if(card->states[0])
3487 stop_adc(card->states[0]);
3488 resync_dma_ptrs(card->states[0]);
3491 for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3492 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3493 Count += 2, i++)
3495 card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
3498 * Save the ac97 volume registers as well as the current powerdown state.
3499 * Now, mute the all the outputs (master, headphone, and mono), as well
3500 * as the PCM volume, in preparation for powering down the entire part.
3501 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
3502 (u8)BA0_AC97_MASTER_VOLUME);
3503 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
3504 (u8)BA0_AC97_HEADPHONE_VOLUME);
3505 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
3506 (u8)BA0_AC97_MASTER_VOLUME_MONO);
3507 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
3508 (u8)BA0_AC97_PCM_OUT_VOLUME);
3511 * mute the outputs
3513 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
3514 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
3515 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
3516 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
3519 * save the registers that cause pops
3521 card->pm.u32AC97_powerdown = (u32)cs_ac97_get(dev, (u8)AC97_POWER_CONTROL);
3522 card->pm.u32AC97_general_purpose = (u32)cs_ac97_get(dev, (u8)BA0_AC97_GENERAL_PURPOSE);
3524 * And power down everything on the AC97 codec.
3525 * well, for now, only power down the DAC/ADC and MIXER VREFON components.
3526 * trouble with removing VREF.
3528 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
3529 CS_POWER_MIXVON, CS_TRUE )) )
3531 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3532 "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp) );
3535 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n"));
3538 /****************************************************************************
3540 * Resume - power up the part and restore its registers..
3542 ****************************************************************************/
3543 static void cs46xx_ac97_resume(struct cs_card *card)
3545 int Count,i;
3546 struct ac97_codec *dev=card->ac97_codec[0];
3548 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()+\n"));
3551 * First, we restore the state of the general purpose register. This
3552 * contains the mic select (mic1 or mic2) and if we restore this after
3553 * we restore the mic volume/boost state and mic2 was selected at
3554 * suspend time, we will end up with a brief period of time where mic1
3555 * is selected with the volume/boost settings for mic2, causing
3556 * acoustic feedback. So we restore the general purpose register
3557 * first, thereby getting the correct mic selected before we restore
3558 * the mic volume/boost.
3560 cs_ac97_set(dev, (u8)BA0_AC97_GENERAL_PURPOSE,
3561 (u16)card->pm.u32AC97_general_purpose);
3563 * Now, while the outputs are still muted, restore the state of power
3564 * on the AC97 part.
3566 cs_ac97_set(dev, (u8)BA0_AC97_POWERDOWN, (u16)card->pm.u32AC97_powerdown);
3567 mdelay(5 * cs_laptop_wait);
3569 * Restore just the first set of registers, from register number
3570 * 0x02 to the register number that ulHighestRegToRestore specifies.
3572 for( Count = 0x2, i=0;
3573 (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3574 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3575 Count += 2, i++)
3577 cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]);
3580 /* Check if we have to init the amplifier */
3581 if(card->amp_init)
3582 card->amp_init(card);
3584 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-\n"));
3588 static int cs46xx_restart_part(struct cs_card *card)
3590 struct dmabuf *dmabuf;
3591 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3592 printk( "cs46xx: cs46xx_restart_part()+\n"));
3593 if(card->states[1])
3595 dmabuf = &card->states[1]->dmabuf;
3596 dmabuf->ready = 0;
3597 resync_dma_ptrs(card->states[1]);
3598 cs_set_divisor(dmabuf);
3599 if(__prog_dmabuf(card->states[1]))
3601 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3602 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n"));
3603 return -1;
3605 cs_set_dac_rate(card->states[1], dmabuf->rate);
3607 if(card->states[0])
3609 dmabuf = &card->states[0]->dmabuf;
3610 dmabuf->ready = 0;
3611 resync_dma_ptrs(card->states[0]);
3612 cs_set_divisor(dmabuf);
3613 if(__prog_dmabuf(card->states[0]))
3615 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3616 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n"));
3617 return -1;
3619 cs_set_adc_rate(card->states[0], dmabuf->rate);
3621 card->pm.flags |= CS46XX_PM_RESUMED;
3622 if(card->states[0])
3623 start_adc(card->states[0]);
3624 if(card->states[1])
3625 start_dac(card->states[1]);
3627 card->pm.flags |= CS46XX_PM_IDLE;
3628 card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED
3629 | CS46XX_PM_RESUMING | CS46XX_PM_RESUMED);
3630 if(card->states[0])
3631 wake_up(&card->states[0]->dmabuf.wait);
3632 if(card->states[1])
3633 wake_up(&card->states[1]->dmabuf.wait);
3635 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3636 printk( "cs46xx: cs46xx_restart_part()-\n"));
3637 return 0;
3641 static void cs461x_reset(struct cs_card *card);
3642 static void cs461x_proc_stop(struct cs_card *card);
3643 static int cs46xx_suspend(struct cs_card *card, pm_message_t state)
3645 unsigned int tmp;
3646 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3647 printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=%p\n",
3648 (unsigned)card->pm.flags,card));
3650 * check the current state, only suspend if IDLE
3652 if(!(card->pm.flags & CS46XX_PM_IDLE))
3654 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3655 printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n"));
3656 return 1;
3658 card->pm.flags &= ~CS46XX_PM_IDLE;
3659 card->pm.flags |= CS46XX_PM_SUSPENDING;
3661 card->active_ctrl(card,1);
3663 tmp = cs461x_peek(card, BA1_PFIE);
3664 tmp &= ~0x0000f03f;
3665 tmp |= 0x00000010;
3666 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
3668 tmp = cs461x_peek(card, BA1_CIE);
3669 tmp &= ~0x0000003f;
3670 tmp |= 0x00000011;
3671 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
3674 * Stop playback DMA.
3676 tmp = cs461x_peek(card, BA1_PCTL);
3677 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
3680 * Stop capture DMA.
3682 tmp = cs461x_peek(card, BA1_CCTL);
3683 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
3685 if(card->states[1])
3687 card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr;
3688 card->pm.dmabuf_count_play = card->states[1]->dmabuf.count;
3690 if(card->states[0])
3692 card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr;
3693 card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count;
3696 cs46xx_ac97_suspend(card);
3699 * Reset the processor.
3701 cs461x_reset(card);
3703 cs461x_proc_stop(card);
3706 * Power down the DAC and ADC. For now leave the other areas on.
3708 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x0300);
3711 * Power down the PLL.
3713 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
3716 * Turn off the Processor by turning off the software clock enable flag in
3717 * the clock control register.
3719 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
3720 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
3722 card->active_ctrl(card,-1);
3724 card->pm.flags &= ~CS46XX_PM_SUSPENDING;
3725 card->pm.flags |= CS46XX_PM_SUSPENDED;
3727 printpm(card);
3729 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3730 printk("cs46xx: cs46xx_suspend()- flags=0x%x\n",
3731 (unsigned)card->pm.flags));
3732 return 0;
3735 static int cs46xx_resume(struct cs_card *card)
3737 int i;
3739 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3740 printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n",
3741 (unsigned)card->pm.flags));
3742 if(!(card->pm.flags & CS46XX_PM_SUSPENDED))
3744 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3745 printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n"));
3746 return 1;
3748 card->pm.flags |= CS46XX_PM_RESUMING;
3749 card->pm.flags &= ~CS46XX_PM_SUSPENDED;
3750 printpm(card);
3751 card->active_ctrl(card, 1);
3753 for(i=0;i<5;i++)
3755 if (cs_hardware_init(card) != 0)
3757 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3758 "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n"));
3759 mdelay(10 * cs_laptop_wait);
3760 cs461x_reset(card);
3761 continue;
3763 break;
3765 if(i>=4)
3767 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
3768 "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i));
3769 return 0;
3772 if(cs46xx_restart_part(card))
3774 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3775 "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n"));
3778 card->active_ctrl(card, -1);
3780 CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_resume()- flags=0x%x\n",
3781 (unsigned)card->pm.flags));
3782 return 0;
3785 static /*const*/ struct file_operations cs461x_fops = {
3786 CS_OWNER CS_THIS_MODULE
3787 .llseek = no_llseek,
3788 .read = cs_read,
3789 .write = cs_write,
3790 .poll = cs_poll,
3791 .ioctl = cs_ioctl,
3792 .mmap = cs_mmap,
3793 .open = cs_open,
3794 .release = cs_release,
3797 /* Write AC97 codec registers */
3800 static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg)
3802 struct cs_card *card = dev->private_data;
3803 int count,loopcnt;
3804 unsigned int tmp;
3805 u16 ret;
3808 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3809 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3810 * 3. Write ACCTL = Control Register = 460h for initiating the write
3811 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
3812 * 5. if DCV not cleared, break and return error
3813 * 6. Read ACSTS = Status Register = 464h, check VSTS bit
3816 cs461x_peekBA0(card, BA0_ACSDA);
3819 * Setup the AC97 control registers on the CS461x to send the
3820 * appropriate command to the AC97 to perform the read.
3821 * ACCAD = Command Address Register = 46Ch
3822 * ACCDA = Command Data Register = 470h
3823 * ACCTL = Control Register = 460h
3824 * set DCV - will clear when process completed
3825 * set CRW - Read command
3826 * set VFRM - valid frame enabled
3827 * set ESYN - ASYNC generation enabled
3828 * set RSTN - ARST# inactive, AC97 codec not reset
3831 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3832 cs461x_pokeBA0(card, BA0_ACCDA, 0);
3833 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
3834 ACCTL_VFRM | ACCTL_ESYN |
3835 ACCTL_RSTN);
3839 * Wait for the read to occur.
3841 if(!(card->pm.flags & CS46XX_PM_IDLE))
3842 loopcnt = 2000;
3843 else
3844 loopcnt = 500 * cs_laptop_wait;
3845 loopcnt *= cs_laptop_wait;
3846 for (count = 0; count < loopcnt; count++) {
3848 * First, we want to wait for a short time.
3850 udelay(10 * cs_laptop_wait);
3852 * Now, check to see if the read has completed.
3853 * ACCTL = 460h, DCV should be reset by now and 460h = 17h
3855 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3856 break;
3860 * Make sure the read completed.
3862 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
3863 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
3864 "cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffff\n", reg));
3865 return 0xffff;
3869 * Wait for the valid status bit to go active.
3872 if(!(card->pm.flags & CS46XX_PM_IDLE))
3873 loopcnt = 2000;
3874 else
3875 loopcnt = 1000;
3876 loopcnt *= cs_laptop_wait;
3877 for (count = 0; count < loopcnt; count++) {
3879 * Read the AC97 status register.
3880 * ACSTS = Status Register = 464h
3881 * VSTS - Valid Status
3883 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
3884 break;
3885 udelay(10 * cs_laptop_wait);
3889 * Make sure we got valid status.
3891 if (!( (tmp=cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) {
3892 CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING
3893 "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n",
3894 reg, tmp));
3895 return 0xffff;
3899 * Read the data returned from the AC97 register.
3900 * ACSDA = Status Data Register = 474h
3902 CS_DBGOUT(CS_FUNCTION, 9, printk(KERN_INFO
3903 "cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n",
3904 reg, cs461x_peekBA0(card, BA0_ACSDA),
3905 cs461x_peekBA0(card, BA0_ACCAD)));
3906 ret = cs461x_peekBA0(card, BA0_ACSDA);
3907 return ret;
3910 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
3912 u16 ret;
3913 struct cs_card *card = dev->private_data;
3915 spin_lock(&card->ac97_lock);
3916 ret = _cs_ac97_get(dev, reg);
3917 spin_unlock(&card->ac97_lock);
3918 return ret;
3921 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
3923 struct cs_card *card = dev->private_data;
3924 int count;
3925 int val2 = 0;
3927 spin_lock(&card->ac97_lock);
3929 if(reg == AC97_CD_VOL)
3931 val2 = _cs_ac97_get(dev, AC97_CD_VOL);
3936 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3937 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3938 * 3. Write ACCTL = Control Register = 460h for initiating the write
3939 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
3940 * 5. if DCV not cleared, break and return error
3944 * Setup the AC97 control registers on the CS461x to send the
3945 * appropriate command to the AC97 to perform the read.
3946 * ACCAD = Command Address Register = 46Ch
3947 * ACCDA = Command Data Register = 470h
3948 * ACCTL = Control Register = 460h
3949 * set DCV - will clear when process completed
3950 * reset CRW - Write command
3951 * set VFRM - valid frame enabled
3952 * set ESYN - ASYNC generation enabled
3953 * set RSTN - ARST# inactive, AC97 codec not reset
3955 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3956 cs461x_pokeBA0(card, BA0_ACCDA, val);
3957 cs461x_peekBA0(card, BA0_ACCTL);
3958 cs461x_pokeBA0(card, BA0_ACCTL, 0 | ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
3959 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
3960 ACCTL_ESYN | ACCTL_RSTN);
3961 for (count = 0; count < 1000; count++) {
3963 * First, we want to wait for a short time.
3965 udelay(10 * cs_laptop_wait);
3967 * Now, check to see if the write has completed.
3968 * ACCTL = 460h, DCV should be reset by now and 460h = 07h
3970 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3971 break;
3974 * Make sure the write completed.
3976 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV)
3978 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
3979 "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val));
3982 spin_unlock(&card->ac97_lock);
3985 * Adjust power if the mixer is selected/deselected according
3986 * to the CD.
3988 * IF the CD is a valid input source (mixer or direct) AND
3989 * the CD is not muted THEN power is needed
3991 * We do two things. When record select changes the input to
3992 * add/remove the CD we adjust the power count if the CD is
3993 * unmuted.
3995 * When the CD mute changes we adjust the power level if the
3996 * CD was a valid input.
3998 * We also check for CD volume != 0, as the CD mute isn't
3999 * normally tweaked from userspace.
4002 /* CD mute change ? */
4004 if(reg==AC97_CD_VOL)
4006 /* Mute bit change ? */
4007 if((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val))
4009 /* This is a hack but its cleaner than the alternatives.
4010 Right now card->ac97_codec[0] might be NULL as we are
4011 still doing codec setup. This does an early assignment
4012 to avoid the problem if it occurs */
4014 if(card->ac97_codec[0]==NULL)
4015 card->ac97_codec[0]=dev;
4017 /* Mute on */
4018 if(val&0x8000 || val == 0x1f1f)
4019 card->amplifier_ctrl(card, -1);
4020 else /* Mute off power on */
4022 if(card->amp_init)
4023 card->amp_init(card);
4024 card->amplifier_ctrl(card, 1);
4031 /* OSS /dev/mixer file operation methods */
4033 static int cs_open_mixdev(struct inode *inode, struct file *file)
4035 int i=0;
4036 unsigned int minor = iminor(inode);
4037 struct cs_card *card=NULL;
4038 struct list_head *entry;
4039 unsigned int tmp;
4041 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4042 printk(KERN_INFO "cs46xx: cs_open_mixdev()+\n"));
4044 list_for_each(entry, &cs46xx_devs)
4046 card = list_entry(entry, struct cs_card, list);
4047 for (i = 0; i < NR_AC97; i++)
4048 if (card->ac97_codec[i] != NULL &&
4049 card->ac97_codec[i]->dev_mixer == minor)
4050 goto match;
4052 if (!card)
4054 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4055 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4056 return -ENODEV;
4058 match:
4059 if(!card->ac97_codec[i])
4060 return -ENODEV;
4061 file->private_data = card->ac97_codec[i];
4063 card->active_ctrl(card,1);
4064 if(!CS_IN_USE(&card->mixer_use_cnt))
4066 if( (tmp = cs46xx_powerup(card, CS_POWER_MIXVON )) )
4068 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4069 "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n",tmp) );
4070 return -EIO;
4073 card->amplifier_ctrl(card, 1);
4074 CS_INC_USE_COUNT(&card->mixer_use_cnt);
4075 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4076 printk(KERN_INFO "cs46xx: cs_open_mixdev()- 0\n"));
4077 return nonseekable_open(inode, file);
4080 static int cs_release_mixdev(struct inode *inode, struct file *file)
4082 unsigned int minor = iminor(inode);
4083 struct cs_card *card=NULL;
4084 struct list_head *entry;
4085 int i;
4086 unsigned int tmp;
4088 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4089 printk(KERN_INFO "cs46xx: cs_release_mixdev()+\n"));
4090 list_for_each(entry, &cs46xx_devs)
4092 card = list_entry(entry, struct cs_card, list);
4093 for (i = 0; i < NR_AC97; i++)
4094 if (card->ac97_codec[i] != NULL &&
4095 card->ac97_codec[i]->dev_mixer == minor)
4096 goto match;
4098 if (!card)
4100 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4101 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4102 return -ENODEV;
4104 match:
4105 if(!CS_DEC_AND_TEST(&card->mixer_use_cnt))
4107 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4108 printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n"));
4109 card->active_ctrl(card, -1);
4110 card->amplifier_ctrl(card, -1);
4111 return 0;
4114 * ok, no outstanding mixer opens, so powerdown.
4116 if( (tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE )) )
4118 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4119 "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n",tmp) );
4120 card->active_ctrl(card, -1);
4121 card->amplifier_ctrl(card, -1);
4122 return -EIO;
4124 card->active_ctrl(card, -1);
4125 card->amplifier_ctrl(card, -1);
4126 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4127 printk(KERN_INFO "cs46xx: cs_release_mixdev()- 0\n"));
4128 return 0;
4131 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4132 unsigned long arg)
4134 struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
4135 struct cs_card *card=NULL;
4136 struct list_head *entry;
4137 unsigned long __user *p = (long __user *)arg;
4139 #if CSDEBUG_INTERFACE
4140 int val;
4142 if( (cmd == SOUND_MIXER_CS_GETDBGMASK) ||
4143 (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
4144 (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
4145 (cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
4146 (cmd == SOUND_MIXER_CS_APM))
4148 switch(cmd)
4151 case SOUND_MIXER_CS_GETDBGMASK:
4152 return put_user(cs_debugmask, p);
4154 case SOUND_MIXER_CS_GETDBGLEVEL:
4155 return put_user(cs_debuglevel, p);
4157 case SOUND_MIXER_CS_SETDBGMASK:
4158 if (get_user(val, p))
4159 return -EFAULT;
4160 cs_debugmask = val;
4161 return 0;
4163 case SOUND_MIXER_CS_SETDBGLEVEL:
4164 if (get_user(val, p))
4165 return -EFAULT;
4166 cs_debuglevel = val;
4167 return 0;
4169 case SOUND_MIXER_CS_APM:
4170 if (get_user(val, p))
4171 return -EFAULT;
4172 if(val == CS_IOCTL_CMD_SUSPEND)
4174 list_for_each(entry, &cs46xx_devs)
4176 card = list_entry(entry, struct cs_card, list);
4177 cs46xx_suspend(card, 0);
4181 else if(val == CS_IOCTL_CMD_RESUME)
4183 list_for_each(entry, &cs46xx_devs)
4185 card = list_entry(entry, struct cs_card, list);
4186 cs46xx_resume(card);
4189 else
4191 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4192 "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n",
4193 val));
4195 return 0;
4197 default:
4198 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4199 "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n") );
4200 return 0;
4203 #endif
4204 return codec->mixer_ioctl(codec, cmd, arg);
4207 static /*const*/ struct file_operations cs_mixer_fops = {
4208 CS_OWNER CS_THIS_MODULE
4209 .llseek = no_llseek,
4210 .ioctl = cs_ioctl_mixdev,
4211 .open = cs_open_mixdev,
4212 .release = cs_release_mixdev,
4215 /* AC97 codec initialisation. */
4216 static int __init cs_ac97_init(struct cs_card *card)
4218 int num_ac97 = 0;
4219 int ready_2nd = 0;
4220 struct ac97_codec *codec;
4221 u16 eid;
4223 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4224 "cs46xx: cs_ac97_init()+\n") );
4226 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4227 if ((codec = ac97_alloc_codec()) == NULL)
4228 return -ENOMEM;
4230 /* initialize some basic codec information, other fields will be filled
4231 in ac97_probe_codec */
4232 codec->private_data = card;
4233 codec->id = num_ac97;
4235 codec->codec_read = cs_ac97_get;
4236 codec->codec_write = cs_ac97_set;
4238 if (ac97_probe_codec(codec) == 0)
4240 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4241 "cs46xx: cs_ac97_init()- codec number %d not found\n",
4242 num_ac97) );
4243 card->ac97_codec[num_ac97] = NULL;
4244 break;
4246 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4247 "cs46xx: cs_ac97_init() found codec %d\n",num_ac97) );
4249 eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
4251 if(eid==0xFFFF)
4253 printk(KERN_WARNING "cs46xx: codec %d not present\n",num_ac97);
4254 ac97_release_codec(codec);
4255 break;
4258 card->ac97_features = eid;
4260 if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
4261 printk(KERN_ERR "cs46xx: couldn't register mixer!\n");
4262 ac97_release_codec(codec);
4263 break;
4265 card->ac97_codec[num_ac97] = codec;
4267 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4268 "cs46xx: cs_ac97_init() ac97_codec[%d] set to %p\n",
4269 (unsigned int)num_ac97,
4270 codec));
4271 /* if there is no secondary codec at all, don't probe any more */
4272 if (!ready_2nd)
4274 num_ac97 += 1;
4275 break;
4278 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4279 "cs46xx: cs_ac97_init()- %d\n", (unsigned int)num_ac97));
4280 return num_ac97;
4284 * load the static image into the DSP
4286 #include "cs461x_image.h"
4287 static void cs461x_download_image(struct cs_card *card)
4289 unsigned i, j, temp1, temp2, offset, count;
4290 unsigned char __iomem *pBA1 = ioremap(card->ba1_addr, 0x40000);
4291 for( i=0; i < CLEAR__COUNT; i++)
4293 offset = ClrStat[i].BA1__DestByteOffset;
4294 count = ClrStat[i].BA1__SourceSize;
4295 for( temp1 = offset; temp1<(offset+count); temp1+=4 )
4296 writel(0, pBA1+temp1);
4299 for(i=0; i<FILL__COUNT; i++)
4301 temp2 = FillStat[i].Offset;
4302 for(j=0; j<(FillStat[i].Size)/4; j++)
4304 temp1 = (FillStat[i]).pFill[j];
4305 writel(temp1, pBA1+temp2+j*4);
4308 iounmap(pBA1);
4313 * Chip reset
4316 static void cs461x_reset(struct cs_card *card)
4318 int idx;
4321 * Write the reset bit of the SP control register.
4323 cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
4326 * Write the control register.
4328 cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
4331 * Clear the trap registers.
4333 for (idx = 0; idx < 8; idx++) {
4334 cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
4335 cs461x_poke(card, BA1_TWPR, 0xFFFF);
4337 cs461x_poke(card, BA1_DREG, 0);
4340 * Set the frame timer to reflect the number of cycles per frame.
4342 cs461x_poke(card, BA1_FRMT, 0xadf);
4345 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type)
4347 int idx, loop, startfifo=0, endfifo=0, powerdown1 = 0;
4348 unsigned int tmp;
4351 * See if the devices are powered down. If so, we must power them up first
4352 * or they will not respond.
4354 if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
4355 cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
4356 powerdown1 = 1;
4360 * We want to clear out the serial port FIFOs so we don't end up playing
4361 * whatever random garbage happens to be in them. We fill the sample FIFOS
4362 * with zero (silence).
4364 cs461x_pokeBA0(card, BA0_SERBWP, 0);
4367 * Check for which FIFO locations to clear, if we are currently
4368 * playing or capturing then we don't want to put in 128 bytes of
4369 * "noise".
4371 if(type & CS_TYPE_DAC)
4373 startfifo = 128;
4374 endfifo = 256;
4376 if(type & CS_TYPE_ADC)
4378 startfifo = 0;
4379 if(!endfifo)
4380 endfifo = 128;
4383 * Fill sample FIFO locations (256 locations total).
4385 for (idx = startfifo; idx < endfifo; idx++) {
4387 * Make sure the previous FIFO write operation has completed.
4389 for (loop = 0; loop < 5; loop++) {
4390 udelay(50);
4391 if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
4392 break;
4394 if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
4395 if (powerdown1)
4396 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4399 * Write the serial port FIFO index.
4401 cs461x_pokeBA0(card, BA0_SERBAD, idx);
4403 * Tell the serial port to load the new value into the FIFO location.
4405 cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
4408 * Now, if we powered up the devices, then power them back down again.
4409 * This is kinda ugly, but should never happen.
4411 if (powerdown1)
4412 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4416 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag)
4418 int count;
4419 unsigned int tmp=0,muted=0;
4421 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4422 "cs46xx: cs461x_powerdown()+ type=0x%x\n",type));
4423 if(!cs_powerdown && !suspendflag)
4425 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4426 "cs46xx: cs461x_powerdown() DISABLED exiting\n"));
4427 return 0;
4429 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4430 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4431 "cs46xx: cs461x_powerdown() powerdown reg=0x%x\n",tmp));
4433 * if powering down only the VREF, and not powering down the DAC/ADC,
4434 * then do not power down the VREF, UNLESS both the DAC and ADC are not
4435 * currently powered down. If powering down DAC and ADC, then
4436 * it is possible to power down the VREF (ON).
4438 if ( ((type & CS_POWER_MIXVON) &&
4439 (!(type & CS_POWER_ADC) || (!(type & CS_POWER_DAC))) )
4441 ((tmp & CS_AC97_POWER_CONTROL_ADC_ON) ||
4442 (tmp & CS_AC97_POWER_CONTROL_DAC_ON) ) )
4444 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4445 "cs46xx: cs461x_powerdown()- 0 unable to powerdown. tmp=0x%x\n",tmp));
4446 return 0;
4449 * for now, always keep power to the mixer block.
4450 * not sure why it's a problem but it seems to be if we power off.
4452 type &= ~CS_POWER_MIXVON;
4453 type &= ~CS_POWER_MIXVOFF;
4456 * Power down indicated areas.
4458 if(type & CS_POWER_MIXVOFF)
4461 CS_DBGOUT(CS_FUNCTION, 4,
4462 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVOFF\n"));
4464 * Power down the MIXER (VREF ON) on the AC97 card.
4466 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4467 if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4469 if(!muted)
4471 cs_mute(card, CS_TRUE);
4472 muted=1;
4474 tmp |= CS_AC97_POWER_CONTROL_MIXVOFF;
4475 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4477 * Now, we wait until we sample a ready state.
4479 for (count = 0; count < 32; count++) {
4481 * First, lets wait a short while to let things settle out a
4482 * bit, and to prevent retrying the read too quickly.
4484 udelay(500);
4487 * Read the current state of the power control register.
4489 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4490 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4491 break;
4495 * Check the status..
4497 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4498 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4500 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4501 "cs46xx: powerdown MIXVOFF failed\n"));
4502 return 1;
4506 if(type & CS_POWER_MIXVON)
4509 CS_DBGOUT(CS_FUNCTION, 4,
4510 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVON\n"));
4512 * Power down the MIXER (VREF ON) on the AC97 card.
4514 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4515 if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)
4517 if(!muted)
4519 cs_mute(card, CS_TRUE);
4520 muted=1;
4522 tmp |= CS_AC97_POWER_CONTROL_MIXVON;
4523 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4525 * Now, we wait until we sample a ready state.
4527 for (count = 0; count < 32; count++) {
4529 * First, lets wait a short while to let things settle out a
4530 * bit, and to prevent retrying the read too quickly.
4532 udelay(500);
4535 * Read the current state of the power control register.
4537 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4538 CS_AC97_POWER_CONTROL_MIXVON_ON))
4539 break;
4543 * Check the status..
4545 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4546 CS_AC97_POWER_CONTROL_MIXVON_ON)
4548 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4549 "cs46xx: powerdown MIXVON failed\n"));
4550 return 1;
4554 if(type & CS_POWER_ADC)
4557 * Power down the ADC on the AC97 card.
4559 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADC\n"));
4560 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4561 if (tmp & CS_AC97_POWER_CONTROL_ADC_ON)
4563 if(!muted)
4565 cs_mute(card, CS_TRUE);
4566 muted=1;
4568 tmp |= CS_AC97_POWER_CONTROL_ADC;
4569 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4572 * Now, we wait until we sample a ready state.
4574 for (count = 0; count < 32; count++) {
4576 * First, lets wait a short while to let things settle out a
4577 * bit, and to prevent retrying the read too quickly.
4579 udelay(500);
4582 * Read the current state of the power control register.
4584 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4585 CS_AC97_POWER_CONTROL_ADC_ON))
4586 break;
4590 * Check the status..
4592 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4593 CS_AC97_POWER_CONTROL_ADC_ON)
4595 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4596 "cs46xx: powerdown ADC failed\n"));
4597 return 1;
4601 if(type & CS_POWER_DAC)
4604 * Power down the DAC on the AC97 card.
4607 CS_DBGOUT(CS_FUNCTION, 4,
4608 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DAC\n"));
4609 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4610 if (tmp & CS_AC97_POWER_CONTROL_DAC_ON)
4612 if(!muted)
4614 cs_mute(card, CS_TRUE);
4615 muted=1;
4617 tmp |= CS_AC97_POWER_CONTROL_DAC;
4618 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4620 * Now, we wait until we sample a ready state.
4622 for (count = 0; count < 32; count++) {
4624 * First, lets wait a short while to let things settle out a
4625 * bit, and to prevent retrying the read too quickly.
4627 udelay(500);
4630 * Read the current state of the power control register.
4632 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4633 CS_AC97_POWER_CONTROL_DAC_ON))
4634 break;
4638 * Check the status..
4640 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4641 CS_AC97_POWER_CONTROL_DAC_ON)
4643 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4644 "cs46xx: powerdown DAC failed\n"));
4645 return 1;
4649 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4650 if(muted)
4651 cs_mute(card, CS_FALSE);
4652 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4653 "cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp));
4654 return 0;
4657 static int cs46xx_powerup(struct cs_card *card, unsigned int type)
4659 int count;
4660 unsigned int tmp=0,muted=0;
4662 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4663 "cs46xx: cs46xx_powerup()+ type=0x%x\n",type));
4665 * check for VREF and powerup if need to.
4667 if(type & CS_POWER_MIXVON)
4668 type |= CS_POWER_MIXVOFF;
4669 if(type & (CS_POWER_DAC | CS_POWER_ADC))
4670 type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF;
4673 * Power up indicated areas.
4675 if(type & CS_POWER_MIXVOFF)
4678 CS_DBGOUT(CS_FUNCTION, 4,
4679 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFF\n"));
4681 * Power up the MIXER (VREF ON) on the AC97 card.
4683 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4684 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4686 if(!muted)
4688 cs_mute(card, CS_TRUE);
4689 muted=1;
4691 tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF;
4692 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4694 * Now, we wait until we sample a ready state.
4696 for (count = 0; count < 32; count++) {
4698 * First, lets wait a short while to let things settle out a
4699 * bit, and to prevent retrying the read too quickly.
4701 udelay(500);
4704 * Read the current state of the power control register.
4706 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4707 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4708 break;
4712 * Check the status..
4714 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4715 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4717 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4718 "cs46xx: powerup MIXVOFF failed\n"));
4719 return 1;
4723 if(type & CS_POWER_MIXVON)
4726 CS_DBGOUT(CS_FUNCTION, 4,
4727 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVON\n"));
4729 * Power up the MIXER (VREF ON) on the AC97 card.
4731 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4732 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON))
4734 if(!muted)
4736 cs_mute(card, CS_TRUE);
4737 muted=1;
4739 tmp &= ~CS_AC97_POWER_CONTROL_MIXVON;
4740 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4742 * Now, we wait until we sample a ready state.
4744 for (count = 0; count < 32; count++) {
4746 * First, lets wait a short while to let things settle out a
4747 * bit, and to prevent retrying the read too quickly.
4749 udelay(500);
4752 * Read the current state of the power control register.
4754 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4755 CS_AC97_POWER_CONTROL_MIXVON_ON)
4756 break;
4760 * Check the status..
4762 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4763 CS_AC97_POWER_CONTROL_MIXVON_ON))
4765 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4766 "cs46xx: powerup MIXVON failed\n"));
4767 return 1;
4771 if(type & CS_POWER_ADC)
4774 * Power up the ADC on the AC97 card.
4776 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADC\n"));
4777 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4778 if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON))
4780 if(!muted)
4782 cs_mute(card, CS_TRUE);
4783 muted=1;
4785 tmp &= ~CS_AC97_POWER_CONTROL_ADC;
4786 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4789 * Now, we wait until we sample a ready state.
4791 for (count = 0; count < 32; count++) {
4793 * First, lets wait a short while to let things settle out a
4794 * bit, and to prevent retrying the read too quickly.
4796 udelay(500);
4799 * Read the current state of the power control register.
4801 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4802 CS_AC97_POWER_CONTROL_ADC_ON)
4803 break;
4807 * Check the status..
4809 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4810 CS_AC97_POWER_CONTROL_ADC_ON))
4812 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4813 "cs46xx: powerup ADC failed\n"));
4814 return 1;
4818 if(type & CS_POWER_DAC)
4821 * Power up the DAC on the AC97 card.
4824 CS_DBGOUT(CS_FUNCTION, 4,
4825 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DAC\n"));
4826 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4827 if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON))
4829 if(!muted)
4831 cs_mute(card, CS_TRUE);
4832 muted=1;
4834 tmp &= ~CS_AC97_POWER_CONTROL_DAC;
4835 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4837 * Now, we wait until we sample a ready state.
4839 for (count = 0; count < 32; count++) {
4841 * First, lets wait a short while to let things settle out a
4842 * bit, and to prevent retrying the read too quickly.
4844 udelay(500);
4847 * Read the current state of the power control register.
4849 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4850 CS_AC97_POWER_CONTROL_DAC_ON)
4851 break;
4855 * Check the status..
4857 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4858 CS_AC97_POWER_CONTROL_DAC_ON))
4860 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4861 "cs46xx: powerup DAC failed\n"));
4862 return 1;
4866 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4867 if(muted)
4868 cs_mute(card, CS_FALSE);
4869 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4870 "cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp));
4871 return 0;
4875 static void cs461x_proc_start(struct cs_card *card)
4877 int cnt;
4880 * Set the frame timer to reflect the number of cycles per frame.
4882 cs461x_poke(card, BA1_FRMT, 0xadf);
4884 * Turn on the run, run at frame, and DMA enable bits in the local copy of
4885 * the SP control register.
4887 cs461x_poke(card, BA1_SPCR, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
4889 * Wait until the run at frame bit resets itself in the SP control
4890 * register.
4892 for (cnt = 0; cnt < 25; cnt++) {
4893 udelay(50);
4894 if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
4895 break;
4898 if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
4899 printk(KERN_WARNING "cs46xx: SPCR_RUNFR never reset\n");
4902 static void cs461x_proc_stop(struct cs_card *card)
4905 * Turn off the run, run at frame, and DMA enable bits in the local copy of
4906 * the SP control register.
4908 cs461x_poke(card, BA1_SPCR, 0);
4911 static int cs_hardware_init(struct cs_card *card)
4913 unsigned long end_time;
4914 unsigned int tmp,count;
4916 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4917 "cs46xx: cs_hardware_init()+\n") );
4919 * First, blast the clock control register to zero so that the PLL starts
4920 * out in a known state, and blast the master serial port control register
4921 * to zero so that the serial ports also start out in a known state.
4923 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
4924 cs461x_pokeBA0(card, BA0_SERMC1, 0);
4927 * If we are in AC97 mode, then we must set the part to a host controlled
4928 * AC-link. Otherwise, we won't be able to bring up the link.
4930 cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03); /* 1.03 card */
4931 /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
4934 * Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
4935 * spec) and then drive it high. This is done for non AC97 modes since
4936 * there might be logic external to the CS461x that uses the ARST# line
4937 * for a reset.
4939 cs461x_pokeBA0(card, BA0_ACCTL, 1);
4940 udelay(50);
4941 cs461x_pokeBA0(card, BA0_ACCTL, 0);
4942 udelay(50);
4943 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
4946 * The first thing we do here is to enable sync generation. As soon
4947 * as we start receiving bit clock, we'll start producing the SYNC
4948 * signal.
4950 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
4953 * Now wait for a short while to allow the AC97 part to start
4954 * generating bit clock (so we don't try to start the PLL without an
4955 * input clock).
4957 mdelay(5 * cs_laptop_wait); /* 1 should be enough ?? (and pigs might fly) */
4960 * Set the serial port timing configuration, so that
4961 * the clock control circuit gets its clock from the correct place.
4963 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
4966 * The part seems to not be ready for a while after a resume.
4967 * so, if we are resuming, then wait for 700 mils. Note that 600 mils
4968 * is not enough for some platforms! tested on an IBM Thinkpads and
4969 * reference cards.
4971 if(!(card->pm.flags & CS46XX_PM_IDLE))
4972 mdelay(initdelay);
4974 * Write the selected clock control setup to the hardware. Do not turn on
4975 * SWCE yet (if requested), so that the devices clocked by the output of
4976 * PLL are not clocked until the PLL is stable.
4978 cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
4979 cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
4980 cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
4983 * Power up the PLL.
4985 cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
4988 * Wait until the PLL has stabilized.
4990 mdelay(5 * cs_laptop_wait); /* Again 1 should be enough ?? */
4993 * Turn on clocking of the core so that we can setup the serial ports.
4995 tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
4996 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4999 * Fill the serial port FIFOs with silence.
5001 cs461x_clear_serial_FIFOs(card,CS_TYPE_DAC | CS_TYPE_ADC);
5004 * Set the serial port FIFO pointer to the first sample in the FIFO.
5006 /* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
5009 * Write the serial port configuration to the part. The master
5010 * enable bit is not set until all other values have been written.
5012 cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
5013 cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
5014 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
5017 mdelay(5 * cs_laptop_wait); /* Shouldnt be needed ?? */
5020 * If we are resuming under 2.2.x then we can not schedule a timeout.
5021 * so, just spin the CPU.
5023 if(card->pm.flags & CS46XX_PM_IDLE)
5026 * Wait for the card ready signal from the AC97 card.
5028 end_time = jiffies + 3 * (HZ >> 2);
5029 do {
5031 * Read the AC97 status register to see if we've seen a CODEC READY
5032 * signal from the AC97 card.
5034 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5035 break;
5036 current->state = TASK_UNINTERRUPTIBLE;
5037 schedule_timeout(1);
5038 } while (time_before(jiffies, end_time));
5040 else
5042 for (count = 0; count < 100; count++) {
5043 // First, we want to wait for a short time.
5044 udelay(25 * cs_laptop_wait);
5046 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5047 break;
5052 * Make sure CODEC is READY.
5054 if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
5055 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5056 "cs46xx: create - never read card ready from AC'97\n"));
5057 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5058 "cs46xx: probably not a bug, try using the CS4232 driver,\n"));
5059 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5060 "cs46xx: or turn off any automatic Power Management support in the BIOS.\n"));
5061 return -EIO;
5065 * Assert the vaid frame signal so that we can start sending commands
5066 * to the AC97 card.
5068 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
5070 if(card->pm.flags & CS46XX_PM_IDLE)
5073 * Wait until we've sampled input slots 3 and 4 as valid, meaning that
5074 * the card is pumping ADC data across the AC-link.
5076 end_time = jiffies + 3 * (HZ >> 2);
5077 do {
5079 * Read the input slot valid register and see if input slots 3 and
5080 * 4 are valid yet.
5082 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5083 break;
5084 current->state = TASK_UNINTERRUPTIBLE;
5085 schedule_timeout(1);
5086 } while (time_before(jiffies, end_time));
5088 else
5090 for (count = 0; count < 100; count++) {
5091 // First, we want to wait for a short time.
5092 udelay(25 * cs_laptop_wait);
5094 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5095 break;
5099 * Make sure input slots 3 and 4 are valid. If not, then return
5100 * an error.
5102 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
5103 printk(KERN_WARNING "cs46xx: create - never read ISV3 & ISV4 from AC'97\n");
5104 return -EIO;
5108 * Now, assert valid frame and the slot 3 and 4 valid bits. This will
5109 * commense the transfer of digital audio data to the AC97 card.
5111 cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
5114 * Turn off the Processor by turning off the software clock enable flag in
5115 * the clock control register.
5117 /* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
5118 /* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
5121 * Reset the processor.
5123 cs461x_reset(card);
5126 * Download the image to the processor.
5129 cs461x_download_image(card);
5132 * Stop playback DMA.
5134 tmp = cs461x_peek(card, BA1_PCTL);
5135 card->pctl = tmp & 0xffff0000;
5136 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5139 * Stop capture DMA.
5141 tmp = cs461x_peek(card, BA1_CCTL);
5142 card->cctl = tmp & 0x0000ffff;
5143 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5145 /* initialize AC97 codec and register /dev/mixer */
5146 if(card->pm.flags & CS46XX_PM_IDLE)
5148 if (cs_ac97_init(card) <= 0)
5150 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5151 "cs46xx: cs_ac97_init() failure\n") );
5152 return -EIO;
5155 else
5157 cs46xx_ac97_resume(card);
5160 cs461x_proc_start(card);
5163 * Enable interrupts on the part.
5165 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
5167 tmp = cs461x_peek(card, BA1_PFIE);
5168 tmp &= ~0x0000f03f;
5169 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt enable */
5171 tmp = cs461x_peek(card, BA1_CIE);
5172 tmp &= ~0x0000003f;
5173 tmp |= 0x00000001;
5174 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt enable */
5177 * If IDLE then Power down the part. We will power components up
5178 * when we need them.
5180 if(card->pm.flags & CS46XX_PM_IDLE)
5182 if(!cs_powerdown)
5184 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC |
5185 CS_POWER_MIXVON )) )
5187 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5188 "cs46xx: cs461x_powerup() failure (0x%x)\n",tmp) );
5189 return -EIO;
5192 else
5194 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5195 CS_POWER_MIXVON, CS_FALSE )) )
5197 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5198 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5199 return -EIO;
5203 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
5204 "cs46xx: cs_hardware_init()- 0\n"));
5205 return 0;
5208 /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered
5209 until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
5212 * Card subid table
5215 struct cs_card_type
5217 u16 vendor;
5218 u16 id;
5219 char *name;
5220 void (*amp)(struct cs_card *, int);
5221 void (*amp_init)(struct cs_card *);
5222 void (*active)(struct cs_card *, int);
5225 static struct cs_card_type cards[] = {
5227 .vendor = 0x1489,
5228 .id = 0x7001,
5229 .name = "Genius Soundmaker 128 value",
5230 .amp = amp_none,
5233 .vendor = 0x5053,
5234 .id = 0x3357,
5235 .name = "Voyetra",
5236 .amp = amp_voyetra,
5239 .vendor = 0x1071,
5240 .id = 0x6003,
5241 .name = "Mitac MI6020/21",
5242 .amp = amp_voyetra,
5245 .vendor = 0x14AF,
5246 .id = 0x0050,
5247 .name = "Hercules Game Theatre XP",
5248 .amp = amp_hercules,
5251 .vendor = 0x1681,
5252 .id = 0x0050,
5253 .name = "Hercules Game Theatre XP",
5254 .amp = amp_hercules,
5257 .vendor = 0x1681,
5258 .id = 0x0051,
5259 .name = "Hercules Game Theatre XP",
5260 .amp = amp_hercules,
5263 .vendor = 0x1681,
5264 .id = 0x0052,
5265 .name = "Hercules Game Theatre XP",
5266 .amp = amp_hercules,
5269 .vendor = 0x1681,
5270 .id = 0x0053,
5271 .name = "Hercules Game Theatre XP",
5272 .amp = amp_hercules,
5275 .vendor = 0x1681,
5276 .id = 0x0054,
5277 .name = "Hercules Game Theatre XP",
5278 .amp = amp_hercules,
5281 .vendor = 0x1681,
5282 .id = 0xa010,
5283 .name = "Hercules Fortissimo II",
5284 .amp = amp_none,
5286 /* Not sure if the 570 needs the clkrun hack */
5288 .vendor = PCI_VENDOR_ID_IBM,
5289 .id = 0x0132,
5290 .name = "Thinkpad 570",
5291 .amp = amp_none,
5292 .active = clkrun_hack,
5295 .vendor = PCI_VENDOR_ID_IBM,
5296 .id = 0x0153,
5297 .name = "Thinkpad 600X/A20/T20",
5298 .amp = amp_none,
5299 .active = clkrun_hack,
5302 .vendor = PCI_VENDOR_ID_IBM,
5303 .id = 0x1010,
5304 .name = "Thinkpad 600E (unsupported)",
5307 .name = "Card without SSID set",
5309 { 0, },
5312 MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
5313 MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
5314 MODULE_LICENSE("GPL");
5317 static const char cs46xx_banner[] = KERN_INFO "Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION "." CS46XX_MINOR_VERSION "." CS46XX_ARCH ", " __TIME__ " " __DATE__ "\n";
5318 static const char fndmsg[] = KERN_INFO "cs46xx: Found %d audio device(s).\n";
5320 static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
5321 const struct pci_device_id *pciid)
5323 struct pm_dev *pmdev;
5324 int i,j;
5325 u16 ss_card, ss_vendor;
5326 struct cs_card *card;
5327 dma_addr_t dma_mask;
5328 struct cs_card_type *cp = &cards[0];
5330 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
5331 printk(KERN_INFO "cs46xx: probe()+\n"));
5333 dma_mask = 0xffffffff; /* this enables playback and recording */
5334 if (pci_enable_device(pci_dev)) {
5335 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
5336 "cs46xx: pci_enable_device() failed\n"));
5337 return -1;
5339 if (!RSRCISMEMORYREGION(pci_dev, 0) ||
5340 !RSRCISMEMORYREGION(pci_dev, 1)) {
5341 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5342 "cs46xx: probe()- Memory region not assigned\n"));
5343 return -1;
5345 if (pci_dev->irq == 0) {
5346 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5347 "cs46xx: probe() IRQ not assigned\n"));
5348 return -1;
5350 if (!pci_dma_supported(pci_dev, 0xffffffff)) {
5351 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5352 "cs46xx: probe() architecture does not support 32bit PCI busmaster DMA\n"));
5353 return -1;
5355 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
5356 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
5358 if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
5359 printk(KERN_ERR "cs46xx: out of memory\n");
5360 return -ENOMEM;
5362 memset(card, 0, sizeof(*card));
5363 card->ba0_addr = RSRCADDRESS(pci_dev, 0);
5364 card->ba1_addr = RSRCADDRESS(pci_dev, 1);
5365 card->pci_dev = pci_dev;
5366 card->irq = pci_dev->irq;
5367 card->magic = CS_CARD_MAGIC;
5368 spin_lock_init(&card->lock);
5369 spin_lock_init(&card->ac97_lock);
5371 pci_set_master(pci_dev);
5373 printk(cs46xx_banner);
5374 printk(KERN_INFO "cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %d\n",
5375 card->ba0_addr, card->ba1_addr, card->irq);
5377 card->alloc_pcm_channel = cs_alloc_pcm_channel;
5378 card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
5379 card->free_pcm_channel = cs_free_pcm_channel;
5380 card->amplifier_ctrl = amp_none;
5381 card->active_ctrl = amp_none;
5383 while (cp->name)
5385 if(cp->vendor == ss_vendor && cp->id == ss_card)
5387 card->amplifier_ctrl = cp->amp;
5388 if(cp->active)
5389 card->active_ctrl = cp->active;
5390 if(cp->amp_init)
5391 card->amp_init = cp->amp_init;
5392 break;
5394 cp++;
5396 if (cp->name==NULL)
5398 printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5399 ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5401 else
5403 printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5404 cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5407 if (card->amplifier_ctrl==NULL)
5409 card->amplifier_ctrl = amp_none;
5410 card->active_ctrl = clkrun_hack;
5413 if (external_amp == 1)
5415 printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.\n");
5416 card->amplifier_ctrl = amp_voyetra;
5419 if (thinkpad == 1)
5421 printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.\n");
5422 card->active_ctrl = clkrun_hack;
5425 * The thinkpads don't work well without runtime updating on their kernel
5426 * delay values (or any laptop with variable CPU speeds really).
5427 * so, just to be safe set the init delay to 2100. Eliminates
5428 * failures on T21 Thinkpads. remove this code when the udelay
5429 * and mdelay kernel code is replaced by a pm timer, or the delays
5430 * work well for battery and/or AC power both.
5432 if(card->active_ctrl == clkrun_hack)
5434 initdelay = 2100;
5435 cs_laptop_wait = 5;
5437 if((card->active_ctrl == clkrun_hack) && !(powerdown == 1))
5440 * for some currently unknown reason, powering down the DAC and ADC component
5441 * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97
5442 * codec access problems. probably the serial clock becomes unsynced.
5443 * added code to sync the chips back up, but only helped about 70% the time.
5445 cs_powerdown = 0;
5447 if(powerdown == 0)
5448 cs_powerdown = 0;
5449 card->active_ctrl(card, 1);
5451 /* claim our iospace and irq */
5453 card->ba0 = ioremap_nocache(card->ba0_addr, CS461X_BA0_SIZE);
5454 card->ba1.name.data0 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
5455 card->ba1.name.data1 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
5456 card->ba1.name.pmem = ioremap_nocache(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
5457 card->ba1.name.reg = ioremap_nocache(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
5459 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5460 "cs46xx: card=%p card->ba0=%p\n",card,card->ba0) );
5461 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5462 "cs46xx: card->ba1=%p %p %p %p\n",
5463 card->ba1.name.data0,
5464 card->ba1.name.data1,
5465 card->ba1.name.pmem,
5466 card->ba1.name.reg) );
5468 if(card->ba0 == 0 || card->ba1.name.data0 == 0 ||
5469 card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
5470 card->ba1.name.reg == 0)
5471 goto fail2;
5473 if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) {
5474 printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq);
5475 goto fail2;
5477 /* register /dev/dsp */
5478 if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
5479 printk(KERN_ERR "cs46xx: unable to register dsp\n");
5480 goto fail;
5483 /* register /dev/midi */
5484 if((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0)
5485 printk(KERN_ERR "cs46xx: unable to register midi\n");
5487 card->pm.flags |= CS46XX_PM_IDLE;
5488 for(i=0;i<5;i++)
5490 if (cs_hardware_init(card) != 0)
5492 CS_DBGOUT(CS_ERROR, 4, printk(
5493 "cs46xx: ERROR in cs_hardware_init()... retrying\n"));
5494 for (j = 0; j < NR_AC97; j++)
5495 if (card->ac97_codec[j] != NULL) {
5496 unregister_sound_mixer(card->ac97_codec[j]->dev_mixer);
5497 ac97_release_codec(card->ac97_codec[j]);
5499 mdelay(10 * cs_laptop_wait);
5500 continue;
5502 break;
5504 if(i>=4)
5506 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
5507 "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i));
5508 unregister_sound_dsp(card->dev_audio);
5509 if(card->dev_midi)
5510 unregister_sound_midi(card->dev_midi);
5511 goto fail;
5514 init_waitqueue_head(&card->midi.open_wait);
5515 init_MUTEX(&card->midi.open_sem);
5516 init_waitqueue_head(&card->midi.iwait);
5517 init_waitqueue_head(&card->midi.owait);
5518 cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST);
5519 cs461x_pokeBA0(card, BA0_MIDCR, 0);
5522 * Check if we have to init the amplifier, but probably already done
5523 * since the CD logic in the ac97 init code will turn on the ext amp.
5525 if(cp->amp_init)
5526 cp->amp_init(card);
5527 card->active_ctrl(card, -1);
5529 PCI_SET_DRIVER_DATA(pci_dev, card);
5530 PCI_SET_DMA_MASK(pci_dev, dma_mask);
5531 list_add(&card->list, &cs46xx_devs);
5533 pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), cs46xx_pm_callback);
5534 if (pmdev)
5536 CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
5537 "cs46xx: probe() pm_register() succeeded (%p).\n",
5538 pmdev));
5539 pmdev->data = card;
5541 else
5543 CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 2, printk(KERN_INFO
5544 "cs46xx: probe() pm_register() failed (%p).\n",
5545 pmdev));
5546 card->pm.flags |= CS46XX_PM_NOT_REGISTERED;
5549 CS_DBGOUT(CS_PM, 9, printk(KERN_INFO "cs46xx: pm.flags=0x%x card=%p\n",
5550 (unsigned)card->pm.flags,card));
5552 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5553 "cs46xx: probe()- device allocated successfully\n"));
5554 return 0;
5556 fail:
5557 free_irq(card->irq, card);
5558 fail2:
5559 if(card->ba0)
5560 iounmap(card->ba0);
5561 if(card->ba1.name.data0)
5562 iounmap(card->ba1.name.data0);
5563 if(card->ba1.name.data1)
5564 iounmap(card->ba1.name.data1);
5565 if(card->ba1.name.pmem)
5566 iounmap(card->ba1.name.pmem);
5567 if(card->ba1.name.reg)
5568 iounmap(card->ba1.name.reg);
5569 kfree(card);
5570 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
5571 "cs46xx: probe()- no device allocated\n"));
5572 return -ENODEV;
5573 } // probe_cs46xx
5575 // ---------------------------------------------------------------------
5577 static void __devexit cs46xx_remove(struct pci_dev *pci_dev)
5579 struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
5580 int i;
5581 unsigned int tmp;
5583 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5584 "cs46xx: cs46xx_remove()+\n"));
5586 card->active_ctrl(card,1);
5588 tmp = cs461x_peek(card, BA1_PFIE);
5589 tmp &= ~0x0000f03f;
5590 tmp |= 0x00000010;
5591 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
5593 tmp = cs461x_peek(card, BA1_CIE);
5594 tmp &= ~0x0000003f;
5595 tmp |= 0x00000011;
5596 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
5599 * Stop playback DMA.
5601 tmp = cs461x_peek(card, BA1_PCTL);
5602 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5605 * Stop capture DMA.
5607 tmp = cs461x_peek(card, BA1_CCTL);
5608 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5611 * Reset the processor.
5613 cs461x_reset(card);
5615 cs461x_proc_stop(card);
5618 * Power down the DAC and ADC. We will power them up (if) when we need
5619 * them.
5621 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5622 CS_POWER_MIXVON, CS_TRUE )) )
5624 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5625 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5629 * Power down the PLL.
5631 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
5634 * Turn off the Processor by turning off the software clock enable flag in
5635 * the clock control register.
5637 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
5638 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5640 card->active_ctrl(card,-1);
5642 /* free hardware resources */
5643 free_irq(card->irq, card);
5644 iounmap(card->ba0);
5645 iounmap(card->ba1.name.data0);
5646 iounmap(card->ba1.name.data1);
5647 iounmap(card->ba1.name.pmem);
5648 iounmap(card->ba1.name.reg);
5650 /* unregister audio devices */
5651 for (i = 0; i < NR_AC97; i++)
5652 if (card->ac97_codec[i] != NULL) {
5653 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
5654 ac97_release_codec(card->ac97_codec[i]);
5656 unregister_sound_dsp(card->dev_audio);
5657 if(card->dev_midi)
5658 unregister_sound_midi(card->dev_midi);
5659 list_del(&card->list);
5660 kfree(card);
5661 PCI_SET_DRIVER_DATA(pci_dev,NULL);
5663 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5664 "cs46xx: cs46xx_remove()-: remove successful\n"));
5667 enum {
5668 CS46XX_4610 = 0,
5669 CS46XX_4612, /* same as 4630 */
5670 CS46XX_4615, /* same as 4624 */
5673 static struct pci_device_id cs46xx_pci_tbl[] = {
5675 .vendor = PCI_VENDOR_ID_CIRRUS,
5676 .device = PCI_DEVICE_ID_CIRRUS_4610,
5677 .subvendor = PCI_ANY_ID,
5678 .subdevice = PCI_ANY_ID,
5679 .driver_data = CS46XX_4610,
5682 .vendor = PCI_VENDOR_ID_CIRRUS,
5683 .device = PCI_DEVICE_ID_CIRRUS_4612,
5684 .subvendor = PCI_ANY_ID,
5685 .subdevice = PCI_ANY_ID,
5686 .driver_data = CS46XX_4612,
5689 .vendor = PCI_VENDOR_ID_CIRRUS,
5690 .device = PCI_DEVICE_ID_CIRRUS_4615,
5691 .subvendor = PCI_ANY_ID,
5692 .subdevice = PCI_ANY_ID,
5693 .driver_data = CS46XX_4615,
5695 { 0, },
5698 MODULE_DEVICE_TABLE(pci, cs46xx_pci_tbl);
5700 static struct pci_driver cs46xx_pci_driver = {
5701 .name = "cs46xx",
5702 .id_table = cs46xx_pci_tbl,
5703 .probe = cs46xx_probe,
5704 .remove = __devexit_p(cs46xx_remove),
5705 .suspend = CS46XX_SUSPEND_TBL,
5706 .resume = CS46XX_RESUME_TBL,
5709 static int __init cs46xx_init_module(void)
5711 int rtn = 0;
5712 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5713 "cs46xx: cs46xx_init_module()+ \n"));
5714 rtn = pci_module_init(&cs46xx_pci_driver);
5716 if(rtn == -ENODEV)
5718 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(
5719 "cs46xx: Unable to detect valid cs46xx device\n"));
5722 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5723 printk(KERN_INFO "cs46xx: cs46xx_init_module()- (%d)\n",rtn));
5724 return rtn;
5727 static void __exit cs46xx_cleanup_module(void)
5729 pci_unregister_driver(&cs46xx_pci_driver);
5730 cs_pm_unregister_all(cs46xx_pm_callback);
5731 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5732 printk(KERN_INFO "cs46xx: cleanup_cs46xx() finished\n"));
5735 module_init(cs46xx_init_module);
5736 module_exit(cs46xx_cleanup_module);
5738 #ifndef CS46XX_ACPI_SUPPORT
5739 static int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
5741 struct cs_card *card;
5743 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5744 "cs46xx: cs46xx_pm_callback dev=%p rqst=0x%x card=%p\n",
5745 dev,(unsigned)rqst,data));
5746 card = (struct cs_card *) dev->data;
5747 if (card) {
5748 switch(rqst) {
5749 case PM_SUSPEND:
5750 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5751 "cs46xx: PM suspend request\n"));
5752 if(cs46xx_suspend(card, 0))
5754 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5755 "cs46xx: PM suspend request refused\n"));
5756 return 1;
5758 break;
5759 case PM_RESUME:
5760 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5761 "cs46xx: PM resume request\n"));
5762 if(cs46xx_resume(card))
5764 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5765 "cs46xx: PM resume request refused\n"));
5766 return 1;
5768 break;
5772 return 0;
5774 #endif
5776 #if CS46XX_ACPI_SUPPORT
5777 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, pm_message_t state)
5779 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5780 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5781 printk(KERN_INFO "cs46xx: cs46xx_suspend_tbl request\n"));
5782 cs46xx_suspend(s, 0);
5783 return 0;
5786 static int cs46xx_resume_tbl(struct pci_dev *pcidev)
5788 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5789 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5790 printk(KERN_INFO "cs46xx: cs46xx_resume_tbl request\n"));
5791 cs46xx_resume(s);
5792 return 0;
5794 #endif