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>
30 * <nils@kernelconcepts.de>
31 * Thanks to David Pollard for testing.
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.
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
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.
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
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
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>
96 #include <asm/uaccess.h>
98 #include "cs46xxpm-24.h"
99 #include "cs46xx_wrapper-24.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
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");}
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
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.
149 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;}
151 #define CS_DBGOUT(mask,level,x)
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
177 static unsigned long cs_debuglevel=1; /* levels range from 1-9 */
178 MODULE_PARM(cs_debuglevel, "i");
179 static unsigned long cs_debugmask=CS_INIT | CS_ERROR; /* use CS_DBGOUT with various mask values */
180 MODULE_PARM(cs_debugmask, "i");
182 static unsigned long hercules_egpio_disable; /* if non-zero set all EGPIO to 0 */
183 MODULE_PARM(hercules_egpio_disable, "i");
184 static unsigned long initdelay=700; /* PM delay in millisecs */
185 MODULE_PARM(initdelay, "i");
186 static unsigned long powerdown=-1; /* turn on/off powerdown processing in driver */
187 MODULE_PARM(powerdown, "i");
188 #define DMABUF_DEFAULTORDER 3
189 static unsigned long defaultorder=DMABUF_DEFAULTORDER;
190 MODULE_PARM(defaultorder, "i");
192 static int external_amp;
193 MODULE_PARM(external_amp, "i");
195 MODULE_PARM(thinkpad, "i");
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 */
213 #define CS46XX_MAJOR_VERSION "1"
214 #define CS46XX_MINOR_VERSION "28"
217 #define CS46XX_ARCH "64" //architecture key
219 #define CS46XX_ARCH "32" //architecture key
222 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" */
229 /* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
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 */
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;
247 /* virtual channel number */
251 /* wave sample stuff */
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 */
262 dma_addr_t dma_handle;
268 void *tmpbuff; /* tmp buffer for sample conversions */
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 */
287 unsigned fragsamples;
292 unsigned endcleared:1;
294 unsigned update_flag;
295 unsigned ossfragshift;
297 unsigned subdivision;
299 /* Guard against mmap/write/read races */
300 struct semaphore sem;
304 struct cs_channel channel[2];
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 */
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 */
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];
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;
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 */
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;
375 unsigned char ibuf[CS_MIDIINBUF];
376 unsigned char obuf[CS_MIDIOUTBUF];
378 struct semaphore open_sem;
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,
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, u32 state);
392 static int cs46xx_resume_tbl(struct pci_dev *pcidev);
394 static inline unsigned ld2(unsigned int x)
423 #define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
424 #define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
425 #define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
426 #define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
427 #define SOUND_MIXER_CS_APM _SIOWR('M',124, int)
429 void printioctl(unsigned int x)
433 /* these values are incorrect for the ac97 driver, fix.
434 * Index of mixtable1[] member is Device ID
435 * and must be <= SOUND_MIXER_NRDEVICES.
436 * Value of array member is index into s->mix.vol[]
438 static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
439 [SOUND_MIXER_PCM] = 1, /* voice */
440 [SOUND_MIXER_LINE1] = 2, /* AUX */
441 [SOUND_MIXER_CD] = 3, /* CD */
442 [SOUND_MIXER_LINE] = 4, /* Line */
443 [SOUND_MIXER_SYNTH] = 5, /* FM */
444 [SOUND_MIXER_MIC] = 6, /* Mic */
445 [SOUND_MIXER_SPEAKER] = 7, /* Speaker */
446 [SOUND_MIXER_RECLEV] = 8, /* Recording level */
447 [SOUND_MIXER_VOLUME] = 9 /* Master Volume */
452 case SOUND_MIXER_CS_GETDBGMASK:
453 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") );
455 case SOUND_MIXER_CS_GETDBGLEVEL:
456 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGLEVEL: ") );
458 case SOUND_MIXER_CS_SETDBGMASK:
459 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGMASK: ") );
461 case SOUND_MIXER_CS_SETDBGLEVEL:
462 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGLEVEL: ") );
465 CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION: ") );
467 case SNDCTL_DSP_SYNC:
468 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC: ") );
470 case SNDCTL_DSP_SETDUPLEX:
471 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX: ") );
473 case SNDCTL_DSP_GETCAPS:
474 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS: ") );
476 case SNDCTL_DSP_RESET:
477 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET: ") );
479 case SNDCTL_DSP_SPEED:
480 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED: ") );
482 case SNDCTL_DSP_STEREO:
483 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO: ") );
485 case SNDCTL_DSP_CHANNELS:
486 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS: ") );
488 case SNDCTL_DSP_GETFMTS:
489 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS: ") );
491 case SNDCTL_DSP_SETFMT:
492 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT: ") );
494 case SNDCTL_DSP_POST:
495 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST: ") );
497 case SNDCTL_DSP_GETTRIGGER:
498 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER: ") );
500 case SNDCTL_DSP_SETTRIGGER:
501 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER: ") );
503 case SNDCTL_DSP_GETOSPACE:
504 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE: ") );
506 case SNDCTL_DSP_GETISPACE:
507 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE: ") );
509 case SNDCTL_DSP_NONBLOCK:
510 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK: ") );
512 case SNDCTL_DSP_GETODELAY:
513 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY: ") );
515 case SNDCTL_DSP_GETIPTR:
516 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR: ") );
518 case SNDCTL_DSP_GETOPTR:
519 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR: ") );
521 case SNDCTL_DSP_GETBLKSIZE:
522 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE: ") );
524 case SNDCTL_DSP_SETFRAGMENT:
525 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFRAGMENT: ") );
527 case SNDCTL_DSP_SUBDIVIDE:
528 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE: ") );
530 case SOUND_PCM_READ_RATE:
531 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE: ") );
533 case SOUND_PCM_READ_CHANNELS:
534 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_CHANNELS: ") );
536 case SOUND_PCM_READ_BITS:
537 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS: ") );
539 case SOUND_PCM_WRITE_FILTER:
540 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_WRITE_FILTER: ") );
542 case SNDCTL_DSP_SETSYNCRO:
543 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO: ") );
545 case SOUND_PCM_READ_FILTER:
546 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") );
549 case SOUND_MIXER_PRIVATE1:
550 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") );
552 case SOUND_MIXER_PRIVATE2:
553 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2: ") );
555 case SOUND_MIXER_PRIVATE3:
556 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3: ") );
558 case SOUND_MIXER_PRIVATE4:
559 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4: ") );
561 case SOUND_MIXER_PRIVATE5:
562 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5: ") );
564 case SOUND_MIXER_INFO:
565 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO: ") );
567 case SOUND_OLD_MIXER_INFO:
568 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") );
574 case SOUND_MIXER_VOLUME:
575 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") );
577 case SOUND_MIXER_SPEAKER:
578 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SPEAKER: ") );
580 case SOUND_MIXER_RECLEV:
581 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECLEV: ") );
583 case SOUND_MIXER_MIC:
584 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_MIC: ") );
586 case SOUND_MIXER_SYNTH:
587 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SYNTH: ") );
589 case SOUND_MIXER_RECSRC:
590 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECSRC: ") );
592 case SOUND_MIXER_DEVMASK:
593 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_DEVMASK: ") );
595 case SOUND_MIXER_RECMASK:
596 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECMASK: ") );
598 case SOUND_MIXER_STEREODEVS:
599 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_STEREODEVS: ") );
601 case SOUND_MIXER_CAPS:
602 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:") );
606 if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
608 CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) );
612 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ",
618 CS_DBGOUT(CS_IOCTL, 4, printk("command = 0x%x IOC_NR=%d\n",x, _IOC_NR(x)) );
623 * common I/O routines
626 static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
628 writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
631 static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
633 return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
636 static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
638 writel(val, codec->ba0+reg);
641 static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
643 return readl(codec->ba0+reg);
647 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
648 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
650 static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
652 if(card->channel[1].used==1)
654 card->channel[1].used=1;
655 card->channel[1].num=1;
656 return &card->channel[1];
659 static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
661 if(card->channel[0].used==1)
663 card->channel[0].used=1;
664 card->channel[0].num=0;
665 return &card->channel[0];
668 static void cs_free_pcm_channel(struct cs_card *card, int channel)
670 card->channel[channel].state = NULL;
671 card->channel[channel].used=0;
675 * setup a divisor value to help with conversion from
676 * 16bit Stereo, down to 8bit stereo/mono or 16bit mono.
677 * assign a divisor of 1 if using 16bit Stereo as that is
678 * the only format that the static image will capture.
680 static void cs_set_divisor(struct dmabuf *dmabuf)
682 if(dmabuf->type == CS_TYPE_DAC)
684 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
685 (dmabuf->fmt & CS_FMT_16BIT))
687 else if( (dmabuf->fmt & CS_FMT_STEREO) &&
688 !(dmabuf->fmt & CS_FMT_16BIT))
690 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
691 !(dmabuf->fmt & CS_FMT_16BIT))
696 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, printk(
697 "cs46xx: cs_set_divisor()- %s %d\n",
698 (dmabuf->type == CS_TYPE_ADC) ? "ADC" : "DAC",
703 * mute some of the more prevalent registers to avoid popping.
705 static void cs_mute(struct cs_card *card, int state)
707 struct ac97_codec *dev=card->ac97_codec[0];
709 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n",
710 (state == CS_TRUE) ? "Muting" : "UnMuting") );
715 * fix pops when powering up on thinkpads
717 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
718 (u8)BA0_AC97_MASTER_VOLUME);
719 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
720 (u8)BA0_AC97_HEADPHONE_VOLUME);
721 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
722 (u8)BA0_AC97_MASTER_VOLUME_MONO);
723 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
724 (u8)BA0_AC97_PCM_OUT_VOLUME);
726 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
727 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
728 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
729 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
733 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume);
734 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume);
735 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono);
736 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, card->pm.u32AC97_pcm_out_volume);
738 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()-\n"));
741 /* set playback sample rate */
742 static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
744 struct dmabuf *dmabuf = &state->dmabuf;
745 unsigned int tmp1, tmp2;
746 unsigned int phiIncr;
747 unsigned int correctionPerGOF, correctionPerSec;
750 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()+ %d\n",rate) );
753 * Compute the values used to drive the actual sample rate conversion.
754 * The following formulas are being computed, using inline assembly
755 * since we need to use 64 bit arithmetic to compute the values:
757 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
758 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
760 * ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
761 * GOF_PER_SEC * correctionPerGOF
765 * phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
766 * correctionPerGOF:correctionPerSec =
767 * dividend:remainder(ulOther / GOF_PER_SEC)
770 phiIncr = tmp1 / 48000;
771 tmp1 -= phiIncr * 48000;
776 tmp1 -= tmp2 * 48000;
777 correctionPerGOF = tmp1 / GOF_PER_SEC;
778 tmp1 -= correctionPerGOF * GOF_PER_SEC;
779 correctionPerSec = tmp1;
782 * Fill in the SampleRateConverter control block.
785 spin_lock_irqsave(&state->card->lock, flags);
786 cs461x_poke(state->card, BA1_PSRC,
787 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
788 cs461x_poke(state->card, BA1_PPI, phiIncr);
789 spin_unlock_irqrestore(&state->card->lock, flags);
792 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()- %d\n",rate) );
796 /* set recording sample rate */
797 static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate)
799 struct dmabuf *dmabuf = &state->dmabuf;
800 struct cs_card *card = state->card;
801 unsigned int phiIncr, coeffIncr, tmp1, tmp2;
802 unsigned int correctionPerGOF, correctionPerSec, initialDelay;
803 unsigned int frameGroupLength, cnt;
805 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()+ %d\n",rate) );
808 * We can only decimate by up to a factor of 1/9th the hardware rate.
809 * Correct the value if an attempt is made to stray outside that limit.
811 if ((rate * 9) < 48000)
815 * We can not capture at at rate greater than the Input Rate (48000).
816 * Return an error if an attempt is made to stray outside that limit.
822 * Compute the values used to drive the actual sample rate conversion.
823 * The following formulas are being computed, using inline assembly
824 * since we need to use 64 bit arithmetic to compute the values:
826 * coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
827 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
828 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
830 * correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
831 * GOF_PER_SEC * correctionPerGOF
832 * initialDelay = ceil((24 * Fs,in) / Fs,out)
836 * coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
837 * phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
838 * correctionPerGOF:correctionPerSec =
839 * dividend:remainder(ulOther / GOF_PER_SEC)
840 * initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
844 coeffIncr = tmp1 / 48000;
845 tmp1 -= coeffIncr * 48000;
848 coeffIncr += tmp1 / 48000;
849 coeffIncr ^= 0xFFFFFFFF;
852 phiIncr = tmp1 / rate;
853 tmp1 -= phiIncr * rate;
859 correctionPerGOF = tmp1 / GOF_PER_SEC;
860 tmp1 -= correctionPerGOF * GOF_PER_SEC;
861 correctionPerSec = tmp1;
862 initialDelay = ((48000 * 24) + rate - 1) / rate;
865 * Fill in the VariDecimate control block.
867 spin_lock_irqsave(&card->lock, flags);
868 cs461x_poke(card, BA1_CSRC,
869 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
870 cs461x_poke(card, BA1_CCI, coeffIncr);
871 cs461x_poke(card, BA1_CD,
872 (((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
873 cs461x_poke(card, BA1_CPI, phiIncr);
874 spin_unlock_irqrestore(&card->lock, flags);
877 * Figure out the frame group length for the write back task. Basically,
878 * this is just the factors of 24000 (2^6*3*5^3) that are not present in
879 * the output sample rate.
881 frameGroupLength = 1;
882 for (cnt = 2; cnt <= 64; cnt *= 2) {
883 if (((rate / cnt) * cnt) != rate)
884 frameGroupLength *= 2;
886 if (((rate / 3) * 3) != rate) {
887 frameGroupLength *= 3;
889 for (cnt = 5; cnt <= 125; cnt *= 5) {
890 if (((rate / cnt) * cnt) != rate)
891 frameGroupLength *= 5;
895 * Fill in the WriteBack control block.
897 spin_lock_irqsave(&card->lock, flags);
898 cs461x_poke(card, BA1_CFG1, frameGroupLength);
899 cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
900 cs461x_poke(card, BA1_CCST, 0x0000FFFF);
901 cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
902 cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
903 spin_unlock_irqrestore(&card->lock, flags);
905 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()- %d\n",rate) );
909 /* prepare channel attributes for playback */
910 static void cs_play_setup(struct cs_state *state)
912 struct dmabuf *dmabuf = &state->dmabuf;
913 struct cs_card *card = state->card;
914 unsigned int tmp, Count, playFormat;
916 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") );
917 cs461x_poke(card, BA1_PVOL, 0x80008000);
919 cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
922 playFormat=cs461x_peek(card, BA1_PFIE);
923 if ((dmabuf->fmt & CS_FMT_STEREO)) {
924 playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO;
928 playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO;
930 if ((dmabuf->fmt & CS_FMT_16BIT)) {
931 playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT
932 | DMA_RQ_C2_AC_SIGNED_CONVERT);
936 playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT
937 | DMA_RQ_C2_AC_SIGNED_CONVERT);
939 cs461x_poke(card, BA1_PFIE, playFormat);
941 tmp = cs461x_peek(card, BA1_PDTC);
943 cs461x_poke(card, BA1_PDTC, tmp | --Count);
945 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") );
949 static struct InitStruct
953 } InitArray[] = { {0x00000040, 0x3fc0000f},
954 {0x0000004c, 0x04800000},
956 {0x000000b3, 0x00000780},
957 {0x000000b7, 0x00000000},
958 {0x000000bc, 0x07800000},
960 {0x000000cd, 0x00800000},
964 * "SetCaptureSPValues()" -- Initialize record task values before each
967 void SetCaptureSPValues(struct cs_card *card)
970 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") );
971 for(i=0; i<sizeof(InitArray)/sizeof(struct InitStruct); i++)
973 offset = InitArray[i].off*4; /* 8bit to 32bit offset value */
974 cs461x_poke(card, offset, InitArray[i].val );
976 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()-\n") );
979 /* prepare channel attributes for recording */
980 static void cs_rec_setup(struct cs_state *state)
982 struct cs_card *card = state->card;
983 struct dmabuf *dmabuf = &state->dmabuf;
984 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n") );
986 SetCaptureSPValues(card);
989 * set the attenuation to 0dB
991 cs461x_poke(card, BA1_CVOL, 0x80008000);
994 * set the physical address of the capture buffer into the SP
996 cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->rawbuf));
998 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()-\n") );
1002 /* get current playback/recording dma buffer pointer (byte offset from LBA),
1003 called with spinlock held! */
1005 static inline unsigned cs_get_dma_addr(struct cs_state *state)
1007 struct dmabuf *dmabuf = &state->dmabuf;
1010 if ( (!(dmabuf->enable & DAC_RUNNING)) &&
1011 (!(dmabuf->enable & ADC_RUNNING) ) )
1013 CS_DBGOUT(CS_ERROR, 2, printk(
1014 "cs46xx: ERROR cs_get_dma_addr(): not enabled \n") );
1019 * granularity is byte boundary, good part.
1021 if(dmabuf->enable & DAC_RUNNING)
1023 offset = cs461x_peek(state->card, BA1_PBA);
1025 else /* ADC_RUNNING must be set */
1027 offset = cs461x_peek(state->card, BA1_CBA);
1029 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9,
1030 printk("cs46xx: cs_get_dma_addr() %d\n",offset) );
1031 offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf;
1032 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8,
1033 printk("cs46xx: cs_get_dma_addr()- %d\n",offset) );
1037 static void resync_dma_ptrs(struct cs_state *state)
1039 struct dmabuf *dmabuf;
1041 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") );
1044 dmabuf = &state->dmabuf;
1045 dmabuf->hwptr=dmabuf->swptr = 0;
1046 dmabuf->pringbuf = 0;
1048 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()- \n") );
1051 /* Stop recording (lock held) */
1052 static inline void __stop_adc(struct cs_state *state)
1054 struct dmabuf *dmabuf = &state->dmabuf;
1055 struct cs_card *card = state->card;
1058 dmabuf->enable &= ~ADC_RUNNING;
1060 tmp = cs461x_peek(card, BA1_CCTL);
1062 cs461x_poke(card, BA1_CCTL, tmp );
1065 static void stop_adc(struct cs_state *state)
1067 unsigned long flags;
1069 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()+ \n") );
1070 spin_lock_irqsave(&state->card->lock, flags);
1072 spin_unlock_irqrestore(&state->card->lock, flags);
1073 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()- \n") );
1076 static void start_adc(struct cs_state *state)
1078 struct dmabuf *dmabuf = &state->dmabuf;
1079 struct cs_card *card = state->card;
1080 unsigned long flags;
1083 spin_lock_irqsave(&card->lock, flags);
1084 if (!(dmabuf->enable & ADC_RUNNING) &&
1085 ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize)
1086 && dmabuf->ready) &&
1087 ((card->pm.flags & CS46XX_PM_IDLE) ||
1088 (card->pm.flags & CS46XX_PM_RESUMED)) )
1090 dmabuf->enable |= ADC_RUNNING;
1091 cs_set_divisor(dmabuf);
1092 tmp = cs461x_peek(card, BA1_CCTL);
1095 CS_DBGOUT(CS_FUNCTION, 2, printk(
1096 "cs46xx: start_adc() poke 0x%x \n",tmp) );
1097 cs461x_poke(card, BA1_CCTL, tmp);
1099 spin_unlock_irqrestore(&card->lock, flags);
1102 /* stop playback (lock held) */
1103 static inline void __stop_dac(struct cs_state *state)
1105 struct dmabuf *dmabuf = &state->dmabuf;
1106 struct cs_card *card = state->card;
1109 dmabuf->enable &= ~DAC_RUNNING;
1111 tmp=cs461x_peek(card, BA1_PCTL);
1113 cs461x_poke(card, BA1_PCTL, tmp);
1116 static void stop_dac(struct cs_state *state)
1118 unsigned long flags;
1120 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()+ \n") );
1121 spin_lock_irqsave(&state->card->lock, flags);
1123 spin_unlock_irqrestore(&state->card->lock, flags);
1124 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()- \n") );
1127 static void start_dac(struct cs_state *state)
1129 struct dmabuf *dmabuf = &state->dmabuf;
1130 struct cs_card *card = state->card;
1131 unsigned long flags;
1134 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()+ \n") );
1135 spin_lock_irqsave(&card->lock, flags);
1136 if (!(dmabuf->enable & DAC_RUNNING) &&
1137 ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) &&
1138 ((card->pm.flags & CS46XX_PM_IDLE) ||
1139 (card->pm.flags & CS46XX_PM_RESUMED)) )
1141 dmabuf->enable |= DAC_RUNNING;
1142 tmp = cs461x_peek(card, BA1_PCTL);
1145 CS_DBGOUT(CS_PARMS, 6, printk(
1146 "cs46xx: start_dac() poke card=%p tmp=0x%.08x addr=%p \n",
1147 card, (unsigned)tmp,
1148 card->ba1.idx[(BA1_PCTL >> 16) & 3]+(BA1_PCTL&0xffff) ) );
1149 cs461x_poke(card, BA1_PCTL, tmp);
1151 spin_unlock_irqrestore(&card->lock, flags);
1152 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()- \n") );
1155 #define DMABUF_MINORDER 1
1158 * allocate DMA buffer, playback and recording buffers are separate.
1160 static int alloc_dmabuf(struct cs_state *state)
1163 struct cs_card *card=state->card;
1164 struct dmabuf *dmabuf = &state->dmabuf;
1165 void *rawbuf = NULL;
1166 void *tmpbuff = NULL;
1168 struct page *map, *mapend;
1171 dmabuf->ready = dmabuf->mapped = 0;
1174 * check for order within limits, but do not overwrite value.
1176 if((defaultorder > 1) && (defaultorder < 12))
1181 for (order = df; order >= DMABUF_MINORDER; order--)
1182 if ( (rawbuf = (void *) pci_alloc_consistent(
1183 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr)))
1186 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
1187 "cs46xx: alloc_dmabuf(): unable to allocate rawbuf\n"));
1190 dmabuf->buforder = order;
1191 dmabuf->rawbuf = rawbuf;
1192 // Now mark the pages as reserved; otherwise the
1193 // remap_page_range() in cs46xx_mmap doesn't work.
1194 // 1. get index to last page in mem_map array for rawbuf.
1195 mapend = virt_to_page(dmabuf->rawbuf +
1196 (PAGE_SIZE << dmabuf->buforder) - 1);
1198 // 2. mark each physical page in range as 'reserved'.
1199 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1200 cs4x_mem_map_reserve(map);
1202 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: alloc_dmabuf(): allocated %ld (order = %d) bytes at %p\n",
1203 PAGE_SIZE << order, order, rawbuf) );
1206 * only allocate the conversion buffer for the ADC
1208 if(dmabuf->type == CS_TYPE_DAC)
1210 dmabuf->tmpbuff = NULL;
1211 dmabuf->buforder_tmpbuff = 0;
1215 * now the temp buffer for 16/8 conversions
1218 tmpbuff = (void *) pci_alloc_consistent(
1219 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr_tmpbuff);
1223 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: allocated %ld (order = %d) bytes at %p\n",
1224 PAGE_SIZE << order, order, tmpbuff) );
1226 dmabuf->tmpbuff = tmpbuff;
1227 dmabuf->buforder_tmpbuff = order;
1229 // Now mark the pages as reserved; otherwise the
1230 // remap_page_range() in cs46xx_mmap doesn't work.
1231 // 1. get index to last page in mem_map array for rawbuf.
1232 mapend = virt_to_page(dmabuf->tmpbuff +
1233 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1235 // 2. mark each physical page in range as 'reserved'.
1236 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1237 cs4x_mem_map_reserve(map);
1241 /* free DMA buffer */
1242 static void dealloc_dmabuf(struct cs_state *state)
1244 struct dmabuf *dmabuf = &state->dmabuf;
1245 struct page *map, *mapend;
1247 if (dmabuf->rawbuf) {
1248 // Undo prog_dmabuf()'s marking the pages as reserved
1249 mapend = virt_to_page(dmabuf->rawbuf +
1250 (PAGE_SIZE << dmabuf->buforder) - 1);
1251 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1252 cs4x_mem_map_unreserve(map);
1253 free_dmabuf(state->card, dmabuf);
1256 if (dmabuf->tmpbuff) {
1257 // Undo prog_dmabuf()'s marking the pages as reserved
1258 mapend = virt_to_page(dmabuf->tmpbuff +
1259 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1260 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1261 cs4x_mem_map_unreserve(map);
1262 free_dmabuf2(state->card, dmabuf);
1265 dmabuf->rawbuf = NULL;
1266 dmabuf->tmpbuff = NULL;
1267 dmabuf->mapped = dmabuf->ready = 0;
1271 static int __prog_dmabuf(struct cs_state *state)
1273 struct dmabuf *dmabuf = &state->dmabuf;
1274 unsigned long flags;
1275 unsigned long allocated_pages, allocated_bytes;
1276 unsigned long tmp1, tmp2, fmt=0;
1277 unsigned long *ptmp = (unsigned long *) dmabuf->pbuf;
1278 unsigned long SGarray[9], nSGpages=0;
1281 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()+ \n"));
1283 * check for CAPTURE and use only non-sg for initial release
1285 if(dmabuf->type == CS_TYPE_ADC)
1287 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n"));
1289 * add in non-sg support for capture.
1291 spin_lock_irqsave(&state->card->lock, flags);
1292 /* add code to reset the rawbuf memory. TRW */
1293 resync_dma_ptrs(state);
1294 dmabuf->total_bytes = dmabuf->blocks = 0;
1295 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1299 spin_unlock_irqrestore(&state->card->lock, flags);
1301 /* allocate DMA buffer if not allocated yet */
1302 if (!dmabuf->rawbuf || !dmabuf->tmpbuff)
1303 if ((ret = alloc_dmabuf(state)))
1306 * static image only supports 16Bit signed, stereo - hard code fmt
1308 fmt = CS_FMT_16BIT | CS_FMT_STEREO;
1310 dmabuf->numfrag = 2;
1311 dmabuf->fragsize = 2048;
1312 dmabuf->fragsamples = 2048 >> sample_shift[fmt];
1313 dmabuf->dmasize = 4096;
1314 dmabuf->fragshift = 11;
1316 memset(dmabuf->rawbuf, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1318 memset(dmabuf->tmpbuff, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1319 PAGE_SIZE<<dmabuf->buforder_tmpbuff);
1322 * Now set up the ring
1325 spin_lock_irqsave(&state->card->lock, flags);
1326 cs_rec_setup(state);
1327 spin_unlock_irqrestore(&state->card->lock, flags);
1329 /* set the ready flag for the dma buffer */
1332 CS_DBGOUT(CS_PARMS, 4, printk(
1333 "cs46xx: prog_dmabuf(): CAPTURE rate=%d fmt=0x%x numfrag=%d "
1334 "fragsize=%d dmasize=%d\n",
1335 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1336 dmabuf->fragsize, dmabuf->dmasize) );
1338 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n"));
1341 else if (dmabuf->type == CS_TYPE_DAC)
1346 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() DAC\n"));
1347 spin_lock_irqsave(&state->card->lock, flags);
1348 resync_dma_ptrs(state);
1349 dmabuf->total_bytes = dmabuf->blocks = 0;
1350 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1354 spin_unlock_irqrestore(&state->card->lock, flags);
1356 /* allocate DMA buffer if not allocated yet */
1357 if (!dmabuf->rawbuf)
1358 if ((ret = alloc_dmabuf(state)))
1361 allocated_pages = 1 << dmabuf->buforder;
1362 allocated_bytes = allocated_pages*PAGE_SIZE;
1364 if(allocated_pages < 2)
1366 CS_DBGOUT(CS_FUNCTION, 4, printk(
1367 "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n",
1368 (unsigned)allocated_pages));
1372 /* Use all the pages allocated, fragsize 4k. */
1373 /* Use 'pbuf' for S/G page map table. */
1374 dmabuf->SGok = 1; /* Use S/G. */
1376 nSGpages = allocated_bytes/4096; /* S/G pages always 4k. */
1378 /* Set up S/G variables. */
1379 *ptmp = virt_to_bus(dmabuf->rawbuf);
1380 *(ptmp+1) = 0x00000008;
1381 for(tmp1= 1; tmp1 < nSGpages; tmp1++) {
1382 *(ptmp+2*tmp1) = virt_to_bus( (dmabuf->rawbuf)+4096*tmp1);
1383 if( tmp1 == nSGpages-1)
1386 tmp2 = 0x80000000+8*(tmp1+1);
1387 *(ptmp+2*tmp1+1) = tmp2;
1389 SGarray[0] = 0x82c0200d;
1390 SGarray[1] = 0xffff0000;
1392 SGarray[3] = 0x00010600;
1393 SGarray[4] = *(ptmp+2);
1394 SGarray[5] = 0x80000010;
1396 SGarray[7] = *(ptmp+2);
1397 SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10;
1400 dmabuf->numfrag = nSGpages;
1401 dmabuf->fragsize = 4096;
1402 dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt];
1403 dmabuf->fragshift = 12;
1404 dmabuf->dmasize = dmabuf->numfrag*4096;
1407 SGarray[0] = 0xf2c0000f;
1408 SGarray[1] = 0x00000200;
1410 SGarray[3] = 0x00010600;
1411 SGarray[4]=SGarray[5]=SGarray[6]=SGarray[7]=SGarray[8] = 0;
1412 dmabuf->numfrag = 2;
1413 dmabuf->fragsize = 2048;
1414 dmabuf->fragsamples = 2048 >> sample_shift[dmabuf->fmt];
1415 dmabuf->dmasize = 4096;
1416 dmabuf->fragshift = 11;
1418 for(tmp1 = 0; tmp1 < sizeof(SGarray)/4; tmp1++)
1419 cs461x_poke( state->card, BA1_PDTC+tmp1*4, SGarray[tmp1]);
1421 memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1425 * Now set up the ring
1428 spin_lock_irqsave(&state->card->lock, flags);
1429 cs_play_setup(state);
1430 spin_unlock_irqrestore(&state->card->lock, flags);
1432 /* set the ready flag for the dma buffer */
1435 CS_DBGOUT(CS_PARMS, 4, printk(
1436 "cs46xx: prog_dmabuf(): PLAYBACK rate=%d fmt=0x%x numfrag=%d "
1437 "fragsize=%d dmasize=%d\n",
1438 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1439 dmabuf->fragsize, dmabuf->dmasize) );
1441 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n"));
1446 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n",
1452 static int prog_dmabuf(struct cs_state *state)
1457 ret = __prog_dmabuf(state);
1463 static void cs_clear_tail(struct cs_state *state)
1467 static int drain_dac(struct cs_state *state, int nonblock)
1469 DECLARE_WAITQUEUE(wait, current);
1470 struct dmabuf *dmabuf = &state->dmabuf;
1471 struct cs_card *card=state->card;
1472 unsigned long flags;
1476 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()+ \n"));
1477 if (dmabuf->mapped || !dmabuf->ready)
1479 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0, not ready\n"));
1483 add_wait_queue(&dmabuf->wait, &wait);
1485 /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1486 every time to make the process really go to sleep */
1487 current->state = TASK_INTERRUPTIBLE;
1489 spin_lock_irqsave(&state->card->lock, flags);
1490 count = dmabuf->count;
1491 spin_unlock_irqrestore(&state->card->lock, flags);
1496 if (signal_pending(current))
1500 remove_wait_queue(&dmabuf->wait, &wait);
1501 current->state = TASK_RUNNING;
1505 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1506 tmo >>= sample_shift[dmabuf->fmt];
1507 tmo += (2048*HZ)/dmabuf->rate;
1509 if (!schedule_timeout(tmo ? tmo : 1) && tmo){
1510 printk(KERN_ERR "cs46xx: drain_dac, dma timeout? %d\n", count);
1514 remove_wait_queue(&dmabuf->wait, &wait);
1515 current->state = TASK_RUNNING;
1516 if (signal_pending(current))
1518 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n"));
1520 * set to silence and let that clear the fifos.
1522 cs461x_clear_serial_FIFOs(card, CS_TYPE_DAC);
1523 return -ERESTARTSYS;
1526 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0\n"));
1531 /* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
1532 static void cs_update_ptr(struct cs_card *card, int wake)
1534 struct cs_state *state;
1535 struct dmabuf *dmabuf;
1539 /* error handling and process wake up for ADC */
1540 state = card->states[0];
1543 dmabuf = &state->dmabuf;
1544 if (dmabuf->enable & ADC_RUNNING) {
1545 /* update hardware pointer */
1546 hwptr = cs_get_dma_addr(state);
1548 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1549 CS_DBGOUT(CS_PARMS, 9, printk(
1550 "cs46xx: cs_update_ptr()+ ADC hwptr=%d diff=%d\n",
1552 dmabuf->hwptr = hwptr;
1553 dmabuf->total_bytes += diff;
1554 dmabuf->count += diff;
1555 if (dmabuf->count > dmabuf->dmasize)
1556 dmabuf->count = dmabuf->dmasize;
1560 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1561 wake_up(&dmabuf->wait);
1564 if (wake && dmabuf->count > 0)
1565 wake_up(&dmabuf->wait);
1573 state = card->states[1];
1576 dmabuf = &state->dmabuf;
1577 /* error handling and process wake up for DAC */
1578 if (dmabuf->enable & DAC_RUNNING) {
1579 /* update hardware pointer */
1580 hwptr = cs_get_dma_addr(state);
1582 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1583 CS_DBGOUT(CS_PARMS, 9, printk(
1584 "cs46xx: cs_update_ptr()+ DAC hwptr=%d diff=%d\n",
1586 dmabuf->hwptr = hwptr;
1587 dmabuf->total_bytes += diff;
1588 if (dmabuf->mapped) {
1589 dmabuf->count += diff;
1590 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1591 wake_up(&dmabuf->wait);
1593 * other drivers use fragsize, but don't see any sense
1594 * in that, since dmasize is the buffer asked for
1597 if( dmabuf->count > dmabuf->dmasize)
1598 dmabuf->count &= dmabuf->dmasize-1;
1600 dmabuf->count -= diff;
1602 * backfill with silence and clear out the last
1603 * "diff" number of bytes.
1607 memset(dmabuf->rawbuf + hwptr - diff,
1608 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff);
1612 memset(dmabuf->rawbuf,
1613 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1615 memset((char *)dmabuf->rawbuf +
1616 dmabuf->dmasize + hwptr - diff,
1617 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1621 if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
1622 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
1623 "cs46xx: ERROR DAC count<0 or count > dmasize (%d)\n",
1626 * buffer underrun or buffer overrun, reset the
1627 * count of bytes written back to 0.
1629 if(dmabuf->count < 0)
1634 if (wake && dmabuf->count < (signed)dmabuf->dmasize/2)
1635 wake_up(&dmabuf->wait);
1642 /* hold spinlock for the following! */
1643 static void cs_handle_midi(struct cs_card *card)
1650 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_RBE)) {
1651 ch = cs461x_peekBA0(card, BA0_MIDRP);
1652 if (card->midi.icnt < CS_MIDIINBUF) {
1653 card->midi.ibuf[card->midi.iwr] = ch;
1654 card->midi.iwr = (card->midi.iwr + 1) % CS_MIDIINBUF;
1660 wake_up(&card->midi.iwait);
1662 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_TBF) && card->midi.ocnt > 0) {
1663 temp1 = ( card->midi.obuf[card->midi.ord] ) & 0x000000ff;
1664 cs461x_pokeBA0(card, BA0_MIDWP,temp1);
1665 card->midi.ord = (card->midi.ord + 1) % CS_MIDIOUTBUF;
1667 if (card->midi.ocnt < CS_MIDIOUTBUF-16)
1671 wake_up(&card->midi.owait);
1674 static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1676 struct cs_card *card = (struct cs_card *)dev_id;
1677 /* Single channel card */
1678 struct cs_state *recstate = card->channel[0].state;
1679 struct cs_state *playstate = card->channel[1].state;
1682 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()+ \n"));
1684 spin_lock(&card->lock);
1686 status = cs461x_peekBA0(card, BA0_HISR);
1688 if ((status & 0x7fffffff) == 0)
1690 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1691 spin_unlock(&card->lock);
1692 return IRQ_HANDLED; /* Might be IRQ_NONE.. */
1696 * check for playback or capture interrupt only
1698 if( ((status & HISR_VC0) && playstate && playstate->dmabuf.ready) ||
1699 (((status & HISR_VC1) && recstate && recstate->dmabuf.ready)) )
1701 CS_DBGOUT(CS_INTERRUPT, 8, printk(
1702 "cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status));
1703 cs_update_ptr(card, CS_TRUE);
1706 if( status & HISR_MIDI )
1707 cs_handle_midi(card);
1710 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1711 spin_unlock(&card->lock);
1712 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n"));
1717 /**********************************************************************/
1719 static ssize_t cs_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
1721 struct cs_card *card = (struct cs_card *)file->private_data;
1723 unsigned long flags;
1727 if (!access_ok(VERIFY_WRITE, buffer, count))
1731 spin_lock_irqsave(&card->lock, flags);
1732 ptr = card->midi.ird;
1733 cnt = CS_MIDIINBUF - ptr;
1734 if (card->midi.icnt < cnt)
1735 cnt = card->midi.icnt;
1736 spin_unlock_irqrestore(&card->lock, flags);
1740 if (file->f_flags & O_NONBLOCK)
1741 return ret ? ret : -EAGAIN;
1742 interruptible_sleep_on(&card->midi.iwait);
1743 if (signal_pending(current))
1744 return ret ? ret : -ERESTARTSYS;
1747 if (copy_to_user(buffer, card->midi.ibuf + ptr, cnt))
1748 return ret ? ret : -EFAULT;
1749 ptr = (ptr + cnt) % CS_MIDIINBUF;
1750 spin_lock_irqsave(&card->lock, flags);
1751 card->midi.ird = ptr;
1752 card->midi.icnt -= cnt;
1753 spin_unlock_irqrestore(&card->lock, flags);
1762 static ssize_t cs_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1764 struct cs_card *card = (struct cs_card *)file->private_data;
1766 unsigned long flags;
1770 if (!access_ok(VERIFY_READ, buffer, count))
1774 spin_lock_irqsave(&card->lock, flags);
1775 ptr = card->midi.owr;
1776 cnt = CS_MIDIOUTBUF - ptr;
1777 if (card->midi.ocnt + cnt > CS_MIDIOUTBUF)
1778 cnt = CS_MIDIOUTBUF - card->midi.ocnt;
1780 cs_handle_midi(card);
1781 spin_unlock_irqrestore(&card->lock, flags);
1785 if (file->f_flags & O_NONBLOCK)
1786 return ret ? ret : -EAGAIN;
1787 interruptible_sleep_on(&card->midi.owait);
1788 if (signal_pending(current))
1789 return ret ? ret : -ERESTARTSYS;
1792 if (copy_from_user(card->midi.obuf + ptr, buffer, cnt))
1793 return ret ? ret : -EFAULT;
1794 ptr = (ptr + cnt) % CS_MIDIOUTBUF;
1795 spin_lock_irqsave(&card->lock, flags);
1796 card->midi.owr = ptr;
1797 card->midi.ocnt += cnt;
1798 spin_unlock_irqrestore(&card->lock, flags);
1802 spin_lock_irqsave(&card->lock, flags);
1803 cs_handle_midi(card);
1804 spin_unlock_irqrestore(&card->lock, flags);
1810 static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait)
1812 struct cs_card *card = (struct cs_card *)file->private_data;
1813 unsigned long flags;
1814 unsigned int mask = 0;
1816 if (file->f_flags & FMODE_WRITE)
1817 poll_wait(file, &card->midi.owait, wait);
1818 if (file->f_flags & FMODE_READ)
1819 poll_wait(file, &card->midi.iwait, wait);
1820 spin_lock_irqsave(&card->lock, flags);
1821 if (file->f_flags & FMODE_READ) {
1822 if (card->midi.icnt > 0)
1823 mask |= POLLIN | POLLRDNORM;
1825 if (file->f_flags & FMODE_WRITE) {
1826 if (card->midi.ocnt < CS_MIDIOUTBUF)
1827 mask |= POLLOUT | POLLWRNORM;
1829 spin_unlock_irqrestore(&card->lock, flags);
1834 static int cs_midi_open(struct inode *inode, struct file *file)
1836 unsigned int minor = iminor(inode);
1837 struct cs_card *card=NULL;
1838 unsigned long flags;
1839 struct list_head *entry;
1841 list_for_each(entry, &cs46xx_devs)
1843 card = list_entry(entry, struct cs_card, list);
1844 if (card->dev_midi == minor)
1848 if (entry == &cs46xx_devs)
1852 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
1853 "cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n"));
1857 file->private_data = card;
1858 /* wait for device to become free */
1859 down(&card->midi.open_sem);
1860 while (card->midi.open_mode & file->f_mode) {
1861 if (file->f_flags & O_NONBLOCK) {
1862 up(&card->midi.open_sem);
1865 up(&card->midi.open_sem);
1866 interruptible_sleep_on(&card->midi.open_wait);
1867 if (signal_pending(current))
1868 return -ERESTARTSYS;
1869 down(&card->midi.open_sem);
1871 spin_lock_irqsave(&card->midi.lock, flags);
1872 if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) {
1873 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1874 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1875 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1876 cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f); /* Enable xmit, rcv. */
1877 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM); /* Enable interrupts */
1879 if (file->f_mode & FMODE_READ) {
1880 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1882 if (file->f_mode & FMODE_WRITE) {
1883 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1885 spin_unlock_irqrestore(&card->midi.lock, flags);
1886 card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
1887 up(&card->midi.open_sem);
1892 static int cs_midi_release(struct inode *inode, struct file *file)
1894 struct cs_card *card = (struct cs_card *)file->private_data;
1895 DECLARE_WAITQUEUE(wait, current);
1896 unsigned long flags;
1897 unsigned count, tmo;
1899 if (file->f_mode & FMODE_WRITE) {
1900 current->state = TASK_INTERRUPTIBLE;
1901 add_wait_queue(&card->midi.owait, &wait);
1903 spin_lock_irqsave(&card->midi.lock, flags);
1904 count = card->midi.ocnt;
1905 spin_unlock_irqrestore(&card->midi.lock, flags);
1908 if (signal_pending(current))
1910 if (file->f_flags & O_NONBLOCK)
1912 tmo = (count * HZ) / 3100;
1913 if (!schedule_timeout(tmo ? : 1) && tmo)
1914 printk(KERN_DEBUG "cs46xx: midi timed out??\n");
1916 remove_wait_queue(&card->midi.owait, &wait);
1917 current->state = TASK_RUNNING;
1919 down(&card->midi.open_sem);
1920 card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE)));
1921 up(&card->midi.open_sem);
1922 wake_up(&card->midi.open_wait);
1927 * Midi file operations struct.
1929 static /*const*/ struct file_operations cs_midi_fops = {
1930 CS_OWNER CS_THIS_MODULE
1931 .llseek = no_llseek,
1932 .read = cs_midi_read,
1933 .write = cs_midi_write,
1934 .poll = cs_midi_poll,
1935 .open = cs_midi_open,
1936 .release = cs_midi_release,
1941 * CopySamples copies 16-bit stereo signed samples from the source to the
1942 * destination, possibly converting down to unsigned 8-bit and/or mono.
1943 * count specifies the number of output bytes to write.
1947 * dst - Pointer to a destination buffer.
1948 * src - Pointer to a source buffer
1949 * count - The number of bytes to copy into the destination buffer.
1950 * fmt - CS_FMT_16BIT and/or CS_FMT_STEREO bits
1951 * dmabuf - pointer to the dma buffer structure
1953 * NOTES: only call this routine if the output desired is not 16 Signed Stereo
1957 static void CopySamples(char *dst, char *src, int count, unsigned fmt,
1958 struct dmabuf *dmabuf)
1962 s16 *psSrc=(s16 *)src;
1963 s16 *psDst=(s16 *)dst;
1964 u8 *pucDst=(u8 *)dst;
1966 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") );
1967 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1968 " dst=%p src=%p count=%d fmt=0x%x\n",
1969 dst,src,count,fmt) );
1972 * See if the data should be output as 8-bit unsigned stereo.
1974 if((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1977 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1978 * stereo using rounding.
1984 *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8);
1988 * See if the data should be output at 8-bit unsigned mono.
1990 else if(!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1993 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1994 * mono using averaging and rounding.
2000 s32AudioSample = ((*psSrc)+(*(psSrc + 1)))/2 + (s32)0x80;
2001 if(s32AudioSample > 0x7fff)
2002 s32AudioSample = 0x7fff;
2003 *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8);
2008 * See if the data should be output at 16-bit signed mono.
2010 else if(!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT))
2013 * Convert each 16-bit signed stereo sample to 16-bit signed
2014 * mono using averaging.
2020 *(psDst++) = (s16)((*psSrc)+(*(psSrc + 1)))/2;
2028 * replacement for the standard copy_to_user, to allow for a conversion from
2029 * 16 bit to 8 bit and from stereo to mono, if the record conversion is active.
2030 * The current CS46xx/CS4280 static image only records in 16bit unsigned Stereo,
2031 * so we convert from any of the other format combinations.
2033 static unsigned cs_copy_to_user(
2040 struct dmabuf *dmabuf = &s->dmabuf;
2041 void *src = hwsrc; /* default to the standard destination buffer addr */
2043 CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
2044 "cs_copy_to_user()+ fmt=0x%x cnt=%d dest=%p\n",
2045 dmabuf->fmt,(unsigned)cnt,dest) );
2047 if(cnt > dmabuf->dmasize)
2049 cnt = dmabuf->dmasize;
2056 if(dmabuf->divisor != 1)
2058 if(!dmabuf->tmpbuff)
2060 *copied = cnt/dmabuf->divisor;
2064 CopySamples((char *)dmabuf->tmpbuff, (char *)hwsrc, cnt,
2065 dmabuf->fmt, dmabuf);
2066 src = dmabuf->tmpbuff;
2067 cnt = cnt/dmabuf->divisor;
2069 if (copy_to_user(dest, src, cnt))
2071 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
2072 "cs46xx: cs_copy_to_user()- fault dest=%p src=%p cnt=%d\n",
2078 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
2079 "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt) );
2083 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
2084 the user's buffer. it is filled by the dma machine and drained by this loop. */
2085 static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
2087 struct cs_card *card = (struct cs_card *) file->private_data;
2088 struct cs_state *state;
2089 DECLARE_WAITQUEUE(wait, current);
2090 struct dmabuf *dmabuf;
2092 unsigned long flags;
2097 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2098 printk("cs46xx: cs_read()+ %zd\n",count) );
2099 state = (struct cs_state *)card->states[0];
2102 dmabuf = &state->dmabuf;
2106 if (!access_ok(VERIFY_WRITE, buffer, count))
2110 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2113 add_wait_queue(&state->dmabuf.wait, &wait);
2115 while(!(card->pm.flags & CS46XX_PM_IDLE))
2118 if (signal_pending(current)) {
2119 if(!ret) ret = -ERESTARTSYS;
2123 spin_lock_irqsave(&state->card->lock, flags);
2124 swptr = dmabuf->swptr;
2125 cnt = dmabuf->dmasize - swptr;
2126 if (dmabuf->count < cnt)
2127 cnt = dmabuf->count;
2129 __set_current_state(TASK_INTERRUPTIBLE);
2130 spin_unlock_irqrestore(&state->card->lock, flags);
2132 if (cnt > (count * dmabuf->divisor))
2133 cnt = count * dmabuf->divisor;
2135 /* buffer is empty, start the dma machine and wait for data to be
2138 if (file->f_flags & O_NONBLOCK) {
2139 if (!ret) ret = -EAGAIN;
2144 if (signal_pending(current)) {
2145 if(!ret) ret = -ERESTARTSYS;
2158 CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
2159 "_read() copy_to cnt=%d count=%zd ", cnt,count) );
2160 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
2161 " .dmasize=%d .count=%d buffer=%p ret=%zd\n",
2162 dmabuf->dmasize,dmabuf->count,buffer,ret) );
2164 if (cs_copy_to_user(state, buffer,
2165 (char *)dmabuf->rawbuf + swptr, cnt, &copied))
2167 if (!ret) ret = -EFAULT;
2170 swptr = (swptr + cnt) % dmabuf->dmasize;
2171 spin_lock_irqsave(&card->lock, flags);
2172 dmabuf->swptr = swptr;
2173 dmabuf->count -= cnt;
2174 spin_unlock_irqrestore(&card->lock, flags);
2181 remove_wait_queue(&state->dmabuf.wait, &wait);
2184 set_current_state(TASK_RUNNING);
2185 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2186 printk("cs46xx: cs_read()- %zd\n",ret) );
2190 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
2191 the soundcard. it is drained by the dma machine and filled by this loop. */
2192 static ssize_t cs_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
2194 struct cs_card *card = (struct cs_card *) file->private_data;
2195 struct cs_state *state;
2196 DECLARE_WAITQUEUE(wait, current);
2197 struct dmabuf *dmabuf;
2199 unsigned long flags;
2203 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4,
2204 printk("cs46xx: cs_write called, count = %zd\n", count) );
2205 state = (struct cs_state *)card->states[1];
2208 if (!access_ok(VERIFY_READ, buffer, count))
2210 dmabuf = &state->dmabuf;
2219 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2221 add_wait_queue(&state->dmabuf.wait, &wait);
2224 * Start the loop to read from the user's buffer and write to the dma buffer.
2225 * check for PM events and underrun/overrun in the loop.
2228 while(!(card->pm.flags & CS46XX_PM_IDLE))
2231 if (signal_pending(current)) {
2232 if(!ret) ret = -ERESTARTSYS;
2236 spin_lock_irqsave(&state->card->lock, flags);
2237 if (dmabuf->count < 0) {
2238 /* buffer underrun, we are recovering from sleep_on_timeout,
2239 resync hwptr and swptr */
2241 dmabuf->swptr = dmabuf->hwptr;
2243 if (dmabuf->underrun)
2245 dmabuf->underrun = 0;
2246 dmabuf->hwptr = cs_get_dma_addr(state);
2247 dmabuf->swptr = dmabuf->hwptr;
2250 swptr = dmabuf->swptr;
2251 cnt = dmabuf->dmasize - swptr;
2252 if (dmabuf->count + cnt > dmabuf->dmasize)
2253 cnt = dmabuf->dmasize - dmabuf->count;
2255 __set_current_state(TASK_INTERRUPTIBLE);
2256 spin_unlock_irqrestore(&state->card->lock, flags);
2261 /* buffer is full, start the dma machine and wait for data to be
2264 if (file->f_flags & O_NONBLOCK) {
2265 if (!ret) ret = -EAGAIN;
2270 if (signal_pending(current)) {
2271 if(!ret) ret = -ERESTARTSYS;
2283 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
2284 if (!ret) ret = -EFAULT;
2287 spin_lock_irqsave(&state->card->lock, flags);
2288 swptr = (swptr + cnt) % dmabuf->dmasize;
2289 dmabuf->swptr = swptr;
2290 dmabuf->count += cnt;
2291 if(dmabuf->count > dmabuf->dmasize)
2293 CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk(
2294 "cs46xx: cs_write() d->count > dmasize - resetting\n"));
2295 dmabuf->count = dmabuf->dmasize;
2297 dmabuf->endcleared = 0;
2298 spin_unlock_irqrestore(&state->card->lock, flags);
2307 remove_wait_queue(&state->dmabuf.wait, &wait);
2308 set_current_state(TASK_RUNNING);
2310 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2,
2311 printk("cs46xx: cs_write()- ret=%zd\n", ret) );
2315 static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
2317 struct cs_card *card = (struct cs_card *)file->private_data;
2318 struct dmabuf *dmabuf;
2319 struct cs_state *state;
2321 unsigned long flags;
2322 unsigned int mask = 0;
2324 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n"));
2325 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
2329 if (file->f_mode & FMODE_WRITE)
2331 state = card->states[1];
2334 dmabuf = &state->dmabuf;
2335 poll_wait(file, &dmabuf->wait, wait);
2338 if (file->f_mode & FMODE_READ)
2340 state = card->states[0];
2343 dmabuf = &state->dmabuf;
2344 poll_wait(file, &dmabuf->wait, wait);
2348 spin_lock_irqsave(&card->lock, flags);
2349 cs_update_ptr(card, CS_FALSE);
2350 if (file->f_mode & FMODE_READ) {
2351 state = card->states[0];
2354 dmabuf = &state->dmabuf;
2355 if (dmabuf->count >= (signed)dmabuf->fragsize)
2356 mask |= POLLIN | POLLRDNORM;
2359 if (file->f_mode & FMODE_WRITE) {
2360 state = card->states[1];
2363 dmabuf = &state->dmabuf;
2364 if (dmabuf->mapped) {
2365 if (dmabuf->count >= (signed)dmabuf->fragsize)
2366 mask |= POLLOUT | POLLWRNORM;
2368 if ((signed)dmabuf->dmasize >= dmabuf->count
2369 + (signed)dmabuf->fragsize)
2370 mask |= POLLOUT | POLLWRNORM;
2374 spin_unlock_irqrestore(&card->lock, flags);
2376 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()- (0x%x) \n",
2382 * We let users mmap the ring buffer. Its not the real DMA buffer but
2383 * that side of the code is hidden in the IRQ handling. We do a software
2384 * emulation of DMA from a 64K or so buffer into a 2K FIFO.
2385 * (the hardware probably deserves a moan here but Crystal send me nice
2389 static int cs_mmap(struct file *file, struct vm_area_struct *vma)
2391 struct cs_card *card = (struct cs_card *)file->private_data;
2392 struct cs_state *state;
2393 struct dmabuf *dmabuf;
2397 CS_DBGOUT(CS_FUNCTION | CS_PARMS, 2, printk("cs46xx: cs_mmap()+ file=%p %s %s\n",
2398 file, vma->vm_flags & VM_WRITE ? "VM_WRITE" : "",
2399 vma->vm_flags & VM_READ ? "VM_READ" : "") );
2401 if (vma->vm_flags & VM_WRITE) {
2402 state = card->states[1];
2405 CS_DBGOUT(CS_OPEN, 2, printk(
2406 "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") );
2407 if ((ret = prog_dmabuf(state)) != 0)
2410 } else if (vma->vm_flags & VM_READ) {
2411 state = card->states[0];
2414 CS_DBGOUT(CS_OPEN, 2, printk(
2415 "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") );
2416 if ((ret = prog_dmabuf(state)) != 0)
2420 CS_DBGOUT(CS_ERROR, 2, printk(
2421 "cs46xx: cs_mmap() return -EINVAL\n") );
2426 * For now ONLY support playback, but seems like the only way to use
2427 * mmap() is to open an FD with RDWR, just read or just write access
2428 * does not function, get an error back from the kernel.
2429 * Also, QuakeIII opens with RDWR! So, there must be something
2430 * to needing read/write access mapping. So, allow read/write but
2433 state = card->states[1];
2440 dmabuf = &state->dmabuf;
2441 if (cs4x_pgoff(vma) != 0)
2446 size = vma->vm_end - vma->vm_start;
2448 CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) );
2450 if (size > (PAGE_SIZE << dmabuf->buforder))
2455 if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
2456 size, vma->vm_page_prot))
2463 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") );
2469 static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2471 struct cs_card *card = (struct cs_card *)file->private_data;
2472 struct cs_state *state;
2473 struct dmabuf *dmabuf=NULL;
2474 unsigned long flags;
2475 audio_buf_info abinfo;
2477 int val, valsave, mapped, ret;
2478 void __user *argp = (void __user *)arg;
2479 int __user *p = argp;
2481 state = (struct cs_state *)card->states[0];
2484 dmabuf = &state->dmabuf;
2485 mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped;
2487 state = (struct cs_state *)card->states[1];
2490 dmabuf = &state->dmabuf;
2491 mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped;
2500 case OSS_GETVERSION:
2501 return put_user(SOUND_VERSION, p);
2503 case SNDCTL_DSP_RESET:
2504 /* FIXME: spin_lock ? */
2505 if (file->f_mode & FMODE_WRITE) {
2506 state = (struct cs_state *)card->states[1];
2509 dmabuf = &state->dmabuf;
2511 synchronize_irq(card->irq);
2513 resync_dma_ptrs(state);
2514 dmabuf->swptr = dmabuf->hwptr = 0;
2515 dmabuf->count = dmabuf->total_bytes = 0;
2520 if (file->f_mode & FMODE_READ) {
2521 state = (struct cs_state *)card->states[0];
2524 dmabuf = &state->dmabuf;
2526 synchronize_irq(card->irq);
2527 resync_dma_ptrs(state);
2529 dmabuf->swptr = dmabuf->hwptr = 0;
2530 dmabuf->count = dmabuf->total_bytes = 0;
2535 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") );
2538 case SNDCTL_DSP_SYNC:
2539 if (file->f_mode & FMODE_WRITE)
2540 return drain_dac(state, file->f_flags & O_NONBLOCK);
2543 case SNDCTL_DSP_SPEED: /* set sample rate */
2544 if (get_user(val, p))
2547 if (file->f_mode & FMODE_READ) {
2548 state = (struct cs_state *)card->states[0];
2551 dmabuf = &state->dmabuf;
2555 cs_set_adc_rate(state, val);
2556 cs_set_divisor(dmabuf);
2559 if (file->f_mode & FMODE_WRITE) {
2560 state = (struct cs_state *)card->states[1];
2563 dmabuf = &state->dmabuf;
2567 cs_set_dac_rate(state, val);
2568 cs_set_divisor(dmabuf);
2571 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2572 "cs46xx: cs_ioctl() DSP_SPEED %s %s %d\n",
2573 file->f_mode & FMODE_WRITE ? "DAC" : "",
2574 file->f_mode & FMODE_READ ? "ADC" : "",
2576 return put_user(dmabuf->rate, p);
2578 return put_user(0, p);
2580 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2581 if (get_user(val, p))
2583 if (file->f_mode & FMODE_WRITE) {
2584 state = (struct cs_state *)card->states[1];
2587 dmabuf = &state->dmabuf;
2592 dmabuf->fmt |= CS_FMT_STEREO;
2594 dmabuf->fmt &= ~CS_FMT_STEREO;
2595 cs_set_divisor(dmabuf);
2596 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2597 "cs46xx: DSP_STEREO() DAC %s\n",
2598 (dmabuf->fmt & CS_FMT_STEREO) ?
2602 if (file->f_mode & FMODE_READ) {
2603 state = (struct cs_state *)card->states[0];
2606 dmabuf = &state->dmabuf;
2611 dmabuf->fmt |= CS_FMT_STEREO;
2613 dmabuf->fmt &= ~CS_FMT_STEREO;
2614 cs_set_divisor(dmabuf);
2615 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2616 "cs46xx: DSP_STEREO() ADC %s\n",
2617 (dmabuf->fmt & CS_FMT_STEREO) ?
2623 case SNDCTL_DSP_GETBLKSIZE:
2624 if (file->f_mode & FMODE_WRITE) {
2625 state = (struct cs_state *)card->states[1];
2628 dmabuf = &state->dmabuf;
2629 if ((val = prog_dmabuf(state)))
2631 return put_user(dmabuf->fragsize, p);
2634 if (file->f_mode & FMODE_READ) {
2635 state = (struct cs_state *)card->states[0];
2638 dmabuf = &state->dmabuf;
2639 if ((val = prog_dmabuf(state)))
2641 return put_user(dmabuf->fragsize/dmabuf->divisor,
2645 return put_user(0, p);
2647 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
2648 return put_user(AFMT_S16_LE | AFMT_U8, p);
2650 case SNDCTL_DSP_SETFMT: /* Select sample format */
2651 if (get_user(val, p))
2653 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2654 "cs46xx: cs_ioctl() DSP_SETFMT %s %s %s %s\n",
2655 file->f_mode & FMODE_WRITE ? "DAC" : "",
2656 file->f_mode & FMODE_READ ? "ADC" : "",
2657 val == AFMT_S16_LE ? "16Bit Signed" : "",
2658 val == AFMT_U8 ? "8Bit Unsigned" : "") );
2660 if (val != AFMT_QUERY) {
2661 if(val==AFMT_S16_LE || val==AFMT_U8)
2663 if (file->f_mode & FMODE_WRITE) {
2664 state = (struct cs_state *)card->states[1];
2667 dmabuf = &state->dmabuf;
2671 if(val==AFMT_S16_LE)
2672 dmabuf->fmt |= CS_FMT_16BIT;
2674 dmabuf->fmt &= ~CS_FMT_16BIT;
2675 cs_set_divisor(dmabuf);
2676 if((ret = prog_dmabuf(state)))
2680 if (file->f_mode & FMODE_READ) {
2682 state = (struct cs_state *)card->states[0];
2685 dmabuf = &state->dmabuf;
2689 if(val==AFMT_S16_LE)
2690 dmabuf->fmt |= CS_FMT_16BIT;
2692 dmabuf->fmt &= ~CS_FMT_16BIT;
2693 cs_set_divisor(dmabuf);
2694 if((ret = prog_dmabuf(state)))
2701 CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk(
2702 "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n",
2708 if(file->f_mode & FMODE_WRITE)
2710 state = (struct cs_state *)card->states[1];
2712 dmabuf = &state->dmabuf;
2714 else if(file->f_mode & FMODE_READ)
2716 state = (struct cs_state *)card->states[0];
2718 dmabuf = &state->dmabuf;
2723 if(dmabuf->fmt & CS_FMT_16BIT)
2724 return put_user(AFMT_S16_LE, p);
2726 return put_user(AFMT_U8, p);
2728 return put_user(0, p);
2730 case SNDCTL_DSP_CHANNELS:
2731 if (get_user(val, p))
2734 if (file->f_mode & FMODE_WRITE) {
2735 state = (struct cs_state *)card->states[1];
2738 dmabuf = &state->dmabuf;
2743 dmabuf->fmt |= CS_FMT_STEREO;
2745 dmabuf->fmt &= ~CS_FMT_STEREO;
2746 cs_set_divisor(dmabuf);
2747 if (prog_dmabuf(state))
2751 if (file->f_mode & FMODE_READ) {
2752 state = (struct cs_state *)card->states[0];
2755 dmabuf = &state->dmabuf;
2760 dmabuf->fmt |= CS_FMT_STEREO;
2762 dmabuf->fmt &= ~CS_FMT_STEREO;
2763 cs_set_divisor(dmabuf);
2764 if (prog_dmabuf(state))
2769 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
2772 case SNDCTL_DSP_POST:
2774 * There will be a longer than normal pause in the data.
2775 * so... do nothing, because there is nothing that we can do.
2779 case SNDCTL_DSP_SUBDIVIDE:
2780 if (file->f_mode & FMODE_WRITE) {
2781 state = (struct cs_state *)card->states[1];
2784 dmabuf = &state->dmabuf;
2785 if (dmabuf->subdivision)
2787 if (get_user(val, p))
2789 if (val != 1 && val != 2)
2791 dmabuf->subdivision = val;
2794 if (file->f_mode & FMODE_READ) {
2795 state = (struct cs_state *)card->states[0];
2798 dmabuf = &state->dmabuf;
2799 if (dmabuf->subdivision)
2801 if (get_user(val, p))
2803 if (val != 1 && val != 2)
2805 dmabuf->subdivision = val;
2810 case SNDCTL_DSP_SETFRAGMENT:
2811 if (get_user(val, p))
2814 if (file->f_mode & FMODE_WRITE) {
2815 state = (struct cs_state *)card->states[1];
2818 dmabuf = &state->dmabuf;
2819 dmabuf->ossfragshift = val & 0xffff;
2820 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2823 if (file->f_mode & FMODE_READ) {
2824 state = (struct cs_state *)card->states[0];
2827 dmabuf = &state->dmabuf;
2828 dmabuf->ossfragshift = val & 0xffff;
2829 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2834 case SNDCTL_DSP_GETOSPACE:
2835 if (!(file->f_mode & FMODE_WRITE))
2837 state = (struct cs_state *)card->states[1];
2840 dmabuf = &state->dmabuf;
2841 spin_lock_irqsave(&state->card->lock, flags);
2842 cs_update_ptr(card, CS_TRUE);
2843 abinfo.fragsize = dmabuf->fragsize;
2844 abinfo.fragstotal = dmabuf->numfrag;
2846 * for mmap we always have total space available
2849 abinfo.bytes = dmabuf->dmasize;
2851 abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2853 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2854 spin_unlock_irqrestore(&state->card->lock, flags);
2855 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2859 case SNDCTL_DSP_GETISPACE:
2860 if (!(file->f_mode & FMODE_READ))
2862 state = (struct cs_state *)card->states[0];
2865 dmabuf = &state->dmabuf;
2866 spin_lock_irqsave(&state->card->lock, flags);
2867 cs_update_ptr(card, CS_TRUE);
2868 abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
2869 abinfo.bytes = dmabuf->count/dmabuf->divisor;
2870 abinfo.fragstotal = dmabuf->numfrag;
2871 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2872 spin_unlock_irqrestore(&state->card->lock, flags);
2873 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2877 case SNDCTL_DSP_NONBLOCK:
2878 file->f_flags |= O_NONBLOCK;
2881 case SNDCTL_DSP_GETCAPS:
2882 return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
2885 case SNDCTL_DSP_GETTRIGGER:
2887 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") );
2888 if (file->f_mode & FMODE_WRITE)
2890 state = (struct cs_state *)card->states[1];
2893 dmabuf = &state->dmabuf;
2894 if(dmabuf->enable & DAC_RUNNING)
2895 val |= PCM_ENABLE_INPUT;
2898 if (file->f_mode & FMODE_READ)
2902 state = (struct cs_state *)card->states[0];
2903 dmabuf = &state->dmabuf;
2904 if(dmabuf->enable & ADC_RUNNING)
2905 val |= PCM_ENABLE_OUTPUT;
2908 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) );
2909 return put_user(val, p);
2911 case SNDCTL_DSP_SETTRIGGER:
2912 if (get_user(val, p))
2914 if (file->f_mode & FMODE_READ) {
2915 state = (struct cs_state *)card->states[0];
2918 dmabuf = &state->dmabuf;
2919 if (val & PCM_ENABLE_INPUT) {
2920 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2927 if (file->f_mode & FMODE_WRITE) {
2928 state = (struct cs_state *)card->states[1];
2931 dmabuf = &state->dmabuf;
2932 if (val & PCM_ENABLE_OUTPUT) {
2933 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2942 case SNDCTL_DSP_GETIPTR:
2943 if (!(file->f_mode & FMODE_READ))
2945 state = (struct cs_state *)card->states[0];
2948 dmabuf = &state->dmabuf;
2949 spin_lock_irqsave(&state->card->lock, flags);
2950 cs_update_ptr(card, CS_TRUE);
2951 cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
2952 cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
2953 cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
2954 spin_unlock_irqrestore(&state->card->lock, flags);
2955 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2961 case SNDCTL_DSP_GETOPTR:
2962 if (!(file->f_mode & FMODE_WRITE))
2964 state = (struct cs_state *)card->states[1];
2967 dmabuf = &state->dmabuf;
2968 spin_lock_irqsave(&state->card->lock, flags);
2969 cs_update_ptr(card, CS_TRUE);
2970 cinfo.bytes = dmabuf->total_bytes;
2973 cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift)
2975 CS_DBGOUT(CS_PARMS, 8,
2976 printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n",
2977 cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
2978 dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
2982 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2984 cinfo.ptr = dmabuf->hwptr;
2986 CS_DBGOUT(CS_PARMS, 4, printk(
2987 "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%d\n",
2988 cinfo.bytes,cinfo.blocks,cinfo.ptr) );
2989 spin_unlock_irqrestore(&state->card->lock, flags);
2990 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2996 case SNDCTL_DSP_SETDUPLEX:
2999 case SNDCTL_DSP_GETODELAY:
3000 if (!(file->f_mode & FMODE_WRITE))
3002 state = (struct cs_state *)card->states[1];
3005 dmabuf = &state->dmabuf;
3006 spin_lock_irqsave(&state->card->lock, flags);
3007 cs_update_ptr(card, CS_TRUE);
3008 val = dmabuf->count;
3009 spin_unlock_irqrestore(&state->card->lock, flags);
3013 return put_user(val, p);
3015 case SOUND_PCM_READ_RATE:
3016 if(file->f_mode & FMODE_READ)
3017 state = (struct cs_state *)card->states[0];
3019 state = (struct cs_state *)card->states[1];
3022 dmabuf = &state->dmabuf;
3023 return put_user(dmabuf->rate, p);
3025 return put_user(0, p);
3028 case SOUND_PCM_READ_CHANNELS:
3029 if(file->f_mode & FMODE_READ)
3030 state = (struct cs_state *)card->states[0];
3032 state = (struct cs_state *)card->states[1];
3035 dmabuf = &state->dmabuf;
3036 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
3039 return put_user(0, p);
3041 case SOUND_PCM_READ_BITS:
3042 if(file->f_mode & FMODE_READ)
3043 state = (struct cs_state *)card->states[0];
3045 state = (struct cs_state *)card->states[1];
3048 dmabuf = &state->dmabuf;
3049 return put_user((dmabuf->fmt & CS_FMT_16BIT) ?
3050 AFMT_S16_LE : AFMT_U8, p);
3053 return put_user(0, p);
3055 case SNDCTL_DSP_MAPINBUF:
3056 case SNDCTL_DSP_MAPOUTBUF:
3057 case SNDCTL_DSP_SETSYNCRO:
3058 case SOUND_PCM_WRITE_FILTER:
3059 case SOUND_PCM_READ_FILTER:
3067 * AMP control - null AMP
3070 static void amp_none(struct cs_card *card, int change)
3078 static void amp_voyetra(struct cs_card *card, int change)
3080 /* Manage the EAPD bit on the Crystal 4297
3081 and the Analog AD1885 */
3083 int old=card->amplifier;
3085 card->amplifier+=change;
3086 if(card->amplifier && !old)
3088 /* Turn the EAPD amp on */
3089 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3090 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
3093 else if(old && !card->amplifier)
3095 /* Turn the EAPD amp off */
3096 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3097 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
3104 * Game Theatre XP card - EGPIO[2] is used to enable the external amp.
3107 static void amp_hercules(struct cs_card *card, int change)
3109 int old=card->amplifier;
3112 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
3113 "cs46xx: amp_hercules() called before initialized.\n"));
3116 card->amplifier+=change;
3117 if( (card->amplifier && !old) && !(hercules_egpio_disable))
3119 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3120 "cs46xx: amp_hercules() external amp enabled\n"));
3121 cs461x_pokeBA0(card, BA0_EGPIODR,
3122 EGPIODR_GPOE2); /* enable EGPIO2 output */
3123 cs461x_pokeBA0(card, BA0_EGPIOPTR,
3124 EGPIOPTR_GPPT2); /* open-drain on output */
3126 else if(old && !card->amplifier)
3128 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3129 "cs46xx: amp_hercules() external amp disabled\n"));
3130 cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
3131 cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
3136 * Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
3137 * whenever we need to beat on the chip.
3139 * The original idea and code for this hack comes from David Kaiser at
3140 * Linuxcare. Perhaps one day Crystal will document their chips well
3141 * enough to make them useful.
3144 static void clkrun_hack(struct cs_card *card, int change)
3146 struct pci_dev *acpi_dev;
3150 int old=card->active;
3152 card->active+=change;
3154 acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
3155 if(acpi_dev == NULL)
3156 return; /* Not a thinkpad thats for sure */
3158 /* Find the control port */
3159 pci_read_config_byte(acpi_dev, 0x41, &pp);
3162 /* Read ACPI port */
3163 control=inw(port+0x10);
3165 /* Flip CLKRUN off while running */
3166 if(!card->active && old)
3168 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3169 "cs46xx: clkrun() enable clkrun - change=%d active=%d\n",
3170 change,card->active));
3171 outw(control|0x2000, port+0x10);
3176 * sometimes on a resume the bit is set, so always reset the bit.
3178 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3179 "cs46xx: clkrun() disable clkrun - change=%d active=%d\n",
3180 change,card->active));
3181 outw(control&~0x2000, port+0x10);
3186 static int cs_open(struct inode *inode, struct file *file)
3188 struct cs_card *card = (struct cs_card *)file->private_data;
3189 struct cs_state *state = NULL;
3190 struct dmabuf *dmabuf = NULL;
3191 struct list_head *entry;
3192 unsigned int minor = iminor(inode);
3196 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=%p %s %s\n",
3197 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3198 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3200 list_for_each(entry, &cs46xx_devs)
3202 card = list_entry(entry, struct cs_card, list);
3204 if (!((card->dev_audio ^ minor) & ~0xf))
3207 if (entry == &cs46xx_devs)
3210 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
3211 "cs46xx: cs_open(): Error - unable to find audio card struct\n"));
3216 * hardcode state[0] for capture, [1] for playback
3218 if(file->f_mode & FMODE_READ)
3220 CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
3221 if (card->states[0] == NULL) {
3222 state = card->states[0] = (struct cs_state *)
3223 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3226 memset(state, 0, sizeof(struct cs_state));
3227 init_MUTEX(&state->sem);
3228 dmabuf = &state->dmabuf;
3229 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3230 if(dmabuf->pbuf==NULL)
3233 card->states[0]=NULL;
3239 state = card->states[0];
3240 if(state->open_mode & FMODE_READ)
3243 dmabuf->channel = card->alloc_rec_pcm_channel(card);
3245 if (dmabuf->channel == NULL) {
3246 kfree (card->states[0]);
3247 card->states[0] = NULL;
3251 /* Now turn on external AMP if needed */
3253 state->card->active_ctrl(state->card,1);
3254 state->card->amplifier_ctrl(state->card,1);
3256 if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) )
3258 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3259 "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n",tmp) );
3263 dmabuf->channel->state = state;
3264 /* initialize the virtual channel */
3266 state->magic = CS_STATE_MAGIC;
3267 init_waitqueue_head(&dmabuf->wait);
3268 init_MUTEX(&state->open_sem);
3269 file->private_data = card;
3271 down(&state->open_sem);
3273 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3274 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3275 /dev/dspW will accept 16-bits sample */
3277 /* Default input is 8bit mono */
3278 dmabuf->fmt &= ~CS_FMT_MASK;
3279 dmabuf->type = CS_TYPE_ADC;
3280 dmabuf->ossfragshift = 0;
3281 dmabuf->ossmaxfrags = 0;
3282 dmabuf->subdivision = 0;
3283 cs_set_adc_rate(state, 8000);
3284 cs_set_divisor(dmabuf);
3286 state->open_mode |= FMODE_READ;
3287 up(&state->open_sem);
3289 if(file->f_mode & FMODE_WRITE)
3291 CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
3292 if (card->states[1] == NULL) {
3293 state = card->states[1] = (struct cs_state *)
3294 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3297 memset(state, 0, sizeof(struct cs_state));
3298 init_MUTEX(&state->sem);
3299 dmabuf = &state->dmabuf;
3300 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3301 if(dmabuf->pbuf==NULL)
3304 card->states[1]=NULL;
3310 state = card->states[1];
3311 if(state->open_mode & FMODE_WRITE)
3314 dmabuf->channel = card->alloc_pcm_channel(card);
3316 if (dmabuf->channel == NULL) {
3317 kfree (card->states[1]);
3318 card->states[1] = NULL;
3322 /* Now turn on external AMP if needed */
3324 state->card->active_ctrl(state->card,1);
3325 state->card->amplifier_ctrl(state->card,1);
3327 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) )
3329 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3330 "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n",tmp) );
3334 dmabuf->channel->state = state;
3335 /* initialize the virtual channel */
3337 state->magic = CS_STATE_MAGIC;
3338 init_waitqueue_head(&dmabuf->wait);
3339 init_MUTEX(&state->open_sem);
3340 file->private_data = card;
3342 down(&state->open_sem);
3344 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3345 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3346 /dev/dspW will accept 16-bits sample */
3348 /* Default output is 8bit mono. */
3349 dmabuf->fmt &= ~CS_FMT_MASK;
3350 dmabuf->type = CS_TYPE_DAC;
3351 dmabuf->ossfragshift = 0;
3352 dmabuf->ossmaxfrags = 0;
3353 dmabuf->subdivision = 0;
3354 cs_set_dac_rate(state, 8000);
3355 cs_set_divisor(dmabuf);
3357 state->open_mode |= FMODE_WRITE;
3358 up(&state->open_sem);
3359 if((ret = prog_dmabuf(state)))
3362 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n") );
3363 return nonseekable_open(inode, file);
3366 static int cs_release(struct inode *inode, struct file *file)
3368 struct cs_card *card = (struct cs_card *)file->private_data;
3369 struct dmabuf *dmabuf;
3370 struct cs_state *state;
3372 CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=%p %s %s\n",
3373 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3374 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3376 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
3380 state = card->states[1];
3383 if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) )
3385 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n") );
3386 dmabuf = &state->dmabuf;
3387 cs_clear_tail(state);
3388 drain_dac(state, file->f_flags & O_NONBLOCK);
3389 /* stop DMA state machine and free DMA buffers/channels */
3390 down(&state->open_sem);
3392 dealloc_dmabuf(state);
3393 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3394 free_page((unsigned long)state->dmabuf.pbuf);
3396 /* we're covered by the open_sem */
3397 up(&state->open_sem);
3398 state->card->states[state->virt] = NULL;
3399 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3401 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) )
3403 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3404 "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) );
3407 /* Now turn off external AMP if needed */
3408 state->card->amplifier_ctrl(state->card, -1);
3409 state->card->active_ctrl(state->card, -1);
3415 state = card->states[0];
3418 if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) )
3420 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n") );
3421 dmabuf = &state->dmabuf;
3422 down(&state->open_sem);
3424 dealloc_dmabuf(state);
3425 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3426 free_page((unsigned long)state->dmabuf.pbuf);
3428 /* we're covered by the open_sem */
3429 up(&state->open_sem);
3430 state->card->states[state->virt] = NULL;
3431 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3433 if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) )
3435 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3436 "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) );
3439 /* Now turn off external AMP if needed */
3440 state->card->amplifier_ctrl(state->card, -1);
3441 state->card->active_ctrl(state->card, -1);
3447 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n") );
3451 static void printpm(struct cs_card *s)
3453 CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
3454 CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
3455 (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
3456 CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
3457 s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
3458 CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
3459 s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
3460 CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
3461 s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
3462 CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
3463 s->pm.u32SSCR,s->pm.u32SRCSA));
3464 CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
3465 s->pm.u32DacASR,s->pm.u32AdcASR));
3466 CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
3467 s->pm.u32DacSR,s->pm.u32AdcSR));
3468 CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
3469 s->pm.u32MIDCR_Save));
3470 CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%x\n",
3471 s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
3472 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%x\n",
3473 s->pm.u32AC97_master_volume));
3474 CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%x\n",
3475 s->pm.u32AC97_headphone_volume));
3476 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%x\n",
3477 s->pm.u32AC97_master_volume_mono));
3478 CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%x\n",
3479 s->pm.u32AC97_pcm_out_volume));
3480 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %d\n",
3481 s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
3482 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %d\n",
3483 s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
3487 /****************************************************************************
3489 * Suspend - save the ac97 regs, mute the outputs and power down the part.
3491 ****************************************************************************/
3492 void cs46xx_ac97_suspend(struct cs_card *card)
3495 struct ac97_codec *dev=card->ac97_codec[0];
3498 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n"));
3502 stop_dac(card->states[1]);
3503 resync_dma_ptrs(card->states[1]);
3507 stop_adc(card->states[0]);
3508 resync_dma_ptrs(card->states[0]);
3511 for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3512 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3515 card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
3518 * Save the ac97 volume registers as well as the current powerdown state.
3519 * Now, mute the all the outputs (master, headphone, and mono), as well
3520 * as the PCM volume, in preparation for powering down the entire part.
3521 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
3522 (u8)BA0_AC97_MASTER_VOLUME);
3523 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
3524 (u8)BA0_AC97_HEADPHONE_VOLUME);
3525 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
3526 (u8)BA0_AC97_MASTER_VOLUME_MONO);
3527 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
3528 (u8)BA0_AC97_PCM_OUT_VOLUME);
3533 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
3534 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
3535 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
3536 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
3539 * save the registers that cause pops
3541 card->pm.u32AC97_powerdown = (u32)cs_ac97_get(dev, (u8)AC97_POWER_CONTROL);
3542 card->pm.u32AC97_general_purpose = (u32)cs_ac97_get(dev, (u8)BA0_AC97_GENERAL_PURPOSE);
3544 * And power down everything on the AC97 codec.
3545 * well, for now, only power down the DAC/ADC and MIXER VREFON components.
3546 * trouble with removing VREF.
3548 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
3549 CS_POWER_MIXVON, CS_TRUE )) )
3551 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3552 "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp) );
3555 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n"));
3558 /****************************************************************************
3560 * Resume - power up the part and restore its registers..
3562 ****************************************************************************/
3563 void cs46xx_ac97_resume(struct cs_card *card)
3566 struct ac97_codec *dev=card->ac97_codec[0];
3568 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()+\n"));
3571 * First, we restore the state of the general purpose register. This
3572 * contains the mic select (mic1 or mic2) and if we restore this after
3573 * we restore the mic volume/boost state and mic2 was selected at
3574 * suspend time, we will end up with a brief period of time where mic1
3575 * is selected with the volume/boost settings for mic2, causing
3576 * acoustic feedback. So we restore the general purpose register
3577 * first, thereby getting the correct mic selected before we restore
3578 * the mic volume/boost.
3580 cs_ac97_set(dev, (u8)BA0_AC97_GENERAL_PURPOSE,
3581 (u16)card->pm.u32AC97_general_purpose);
3583 * Now, while the outputs are still muted, restore the state of power
3586 cs_ac97_set(dev, (u8)BA0_AC97_POWERDOWN, (u16)card->pm.u32AC97_powerdown);
3587 mdelay(5 * cs_laptop_wait);
3589 * Restore just the first set of registers, from register number
3590 * 0x02 to the register number that ulHighestRegToRestore specifies.
3592 for( Count = 0x2, i=0;
3593 (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3594 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3597 cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]);
3600 /* Check if we have to init the amplifier */
3602 card->amp_init(card);
3604 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-\n"));
3608 static int cs46xx_restart_part(struct cs_card *card)
3610 struct dmabuf *dmabuf;
3611 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3612 printk( "cs46xx: cs46xx_restart_part()+\n"));
3615 dmabuf = &card->states[1]->dmabuf;
3617 resync_dma_ptrs(card->states[1]);
3618 cs_set_divisor(dmabuf);
3619 if(__prog_dmabuf(card->states[1]))
3621 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3622 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n"));
3625 cs_set_dac_rate(card->states[1], dmabuf->rate);
3629 dmabuf = &card->states[0]->dmabuf;
3631 resync_dma_ptrs(card->states[0]);
3632 cs_set_divisor(dmabuf);
3633 if(__prog_dmabuf(card->states[0]))
3635 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3636 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n"));
3639 cs_set_adc_rate(card->states[0], dmabuf->rate);
3641 card->pm.flags |= CS46XX_PM_RESUMED;
3643 start_adc(card->states[0]);
3645 start_dac(card->states[1]);
3647 card->pm.flags |= CS46XX_PM_IDLE;
3648 card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED
3649 | CS46XX_PM_RESUMING | CS46XX_PM_RESUMED);
3651 wake_up(&card->states[0]->dmabuf.wait);
3653 wake_up(&card->states[1]->dmabuf.wait);
3655 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3656 printk( "cs46xx: cs46xx_restart_part()-\n"));
3661 static void cs461x_reset(struct cs_card *card);
3662 static void cs461x_proc_stop(struct cs_card *card);
3663 static int cs46xx_suspend(struct cs_card *card, u32 state)
3666 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3667 printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=%p\n",
3668 (unsigned)card->pm.flags,card));
3670 * check the current state, only suspend if IDLE
3672 if(!(card->pm.flags & CS46XX_PM_IDLE))
3674 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3675 printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n"));
3678 card->pm.flags &= ~CS46XX_PM_IDLE;
3679 card->pm.flags |= CS46XX_PM_SUSPENDING;
3681 card->active_ctrl(card,1);
3683 tmp = cs461x_peek(card, BA1_PFIE);
3686 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
3688 tmp = cs461x_peek(card, BA1_CIE);
3691 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
3694 * Stop playback DMA.
3696 tmp = cs461x_peek(card, BA1_PCTL);
3697 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
3702 tmp = cs461x_peek(card, BA1_CCTL);
3703 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
3707 card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr;
3708 card->pm.dmabuf_count_play = card->states[1]->dmabuf.count;
3712 card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr;
3713 card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count;
3716 cs46xx_ac97_suspend(card);
3719 * Reset the processor.
3723 cs461x_proc_stop(card);
3726 * Power down the DAC and ADC. For now leave the other areas on.
3728 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x0300);
3731 * Power down the PLL.
3733 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
3736 * Turn off the Processor by turning off the software clock enable flag in
3737 * the clock control register.
3739 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
3740 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
3742 card->active_ctrl(card,-1);
3744 card->pm.flags &= ~CS46XX_PM_SUSPENDING;
3745 card->pm.flags |= CS46XX_PM_SUSPENDED;
3749 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3750 printk("cs46xx: cs46xx_suspend()- flags=0x%x\n",
3751 (unsigned)card->pm.flags));
3755 static int cs46xx_resume(struct cs_card *card)
3759 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3760 printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n",
3761 (unsigned)card->pm.flags));
3762 if(!(card->pm.flags & CS46XX_PM_SUSPENDED))
3764 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3765 printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n"));
3768 card->pm.flags |= CS46XX_PM_RESUMING;
3769 card->pm.flags &= ~CS46XX_PM_SUSPENDED;
3771 card->active_ctrl(card, 1);
3775 if (cs_hardware_init(card) != 0)
3777 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3778 "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n"));
3779 mdelay(10 * cs_laptop_wait);
3787 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
3788 "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i));
3792 if(cs46xx_restart_part(card))
3794 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3795 "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n"));
3798 card->active_ctrl(card, -1);
3800 CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_resume()- flags=0x%x\n",
3801 (unsigned)card->pm.flags));
3805 static /*const*/ struct file_operations cs461x_fops = {
3806 CS_OWNER CS_THIS_MODULE
3807 .llseek = no_llseek,
3814 .release = cs_release,
3817 /* Write AC97 codec registers */
3820 static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg)
3822 struct cs_card *card = dev->private_data;
3828 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3829 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3830 * 3. Write ACCTL = Control Register = 460h for initiating the write
3831 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
3832 * 5. if DCV not cleared, break and return error
3833 * 6. Read ACSTS = Status Register = 464h, check VSTS bit
3836 cs461x_peekBA0(card, BA0_ACSDA);
3839 * Setup the AC97 control registers on the CS461x to send the
3840 * appropriate command to the AC97 to perform the read.
3841 * ACCAD = Command Address Register = 46Ch
3842 * ACCDA = Command Data Register = 470h
3843 * ACCTL = Control Register = 460h
3844 * set DCV - will clear when process completed
3845 * set CRW - Read command
3846 * set VFRM - valid frame enabled
3847 * set ESYN - ASYNC generation enabled
3848 * set RSTN - ARST# inactive, AC97 codec not reset
3851 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3852 cs461x_pokeBA0(card, BA0_ACCDA, 0);
3853 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
3854 ACCTL_VFRM | ACCTL_ESYN |
3859 * Wait for the read to occur.
3861 if(!(card->pm.flags & CS46XX_PM_IDLE))
3864 loopcnt = 500 * cs_laptop_wait;
3865 loopcnt *= cs_laptop_wait;
3866 for (count = 0; count < loopcnt; count++) {
3868 * First, we want to wait for a short time.
3870 udelay(10 * cs_laptop_wait);
3872 * Now, check to see if the read has completed.
3873 * ACCTL = 460h, DCV should be reset by now and 460h = 17h
3875 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3880 * Make sure the read completed.
3882 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
3883 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
3884 "cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffff\n", reg));
3889 * Wait for the valid status bit to go active.
3892 if(!(card->pm.flags & CS46XX_PM_IDLE))
3896 loopcnt *= cs_laptop_wait;
3897 for (count = 0; count < loopcnt; count++) {
3899 * Read the AC97 status register.
3900 * ACSTS = Status Register = 464h
3901 * VSTS - Valid Status
3903 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
3905 udelay(10 * cs_laptop_wait);
3909 * Make sure we got valid status.
3911 if (!( (tmp=cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) {
3912 CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING
3913 "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n",
3919 * Read the data returned from the AC97 register.
3920 * ACSDA = Status Data Register = 474h
3922 CS_DBGOUT(CS_FUNCTION, 9, printk(KERN_INFO
3923 "cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n",
3924 reg, cs461x_peekBA0(card, BA0_ACSDA),
3925 cs461x_peekBA0(card, BA0_ACCAD)));
3926 ret = cs461x_peekBA0(card, BA0_ACSDA);
3930 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
3933 struct cs_card *card = dev->private_data;
3935 spin_lock(&card->ac97_lock);
3936 ret = _cs_ac97_get(dev, reg);
3937 spin_unlock(&card->ac97_lock);
3941 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
3943 struct cs_card *card = dev->private_data;
3947 spin_lock(&card->ac97_lock);
3949 if(reg == AC97_CD_VOL)
3951 val2 = _cs_ac97_get(dev, AC97_CD_VOL);
3956 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3957 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3958 * 3. Write ACCTL = Control Register = 460h for initiating the write
3959 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
3960 * 5. if DCV not cleared, break and return error
3964 * Setup the AC97 control registers on the CS461x to send the
3965 * appropriate command to the AC97 to perform the read.
3966 * ACCAD = Command Address Register = 46Ch
3967 * ACCDA = Command Data Register = 470h
3968 * ACCTL = Control Register = 460h
3969 * set DCV - will clear when process completed
3970 * reset CRW - Write command
3971 * set VFRM - valid frame enabled
3972 * set ESYN - ASYNC generation enabled
3973 * set RSTN - ARST# inactive, AC97 codec not reset
3975 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3976 cs461x_pokeBA0(card, BA0_ACCDA, val);
3977 cs461x_peekBA0(card, BA0_ACCTL);
3978 cs461x_pokeBA0(card, BA0_ACCTL, 0 | ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
3979 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
3980 ACCTL_ESYN | ACCTL_RSTN);
3981 for (count = 0; count < 1000; count++) {
3983 * First, we want to wait for a short time.
3985 udelay(10 * cs_laptop_wait);
3987 * Now, check to see if the write has completed.
3988 * ACCTL = 460h, DCV should be reset by now and 460h = 07h
3990 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3994 * Make sure the write completed.
3996 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV)
3998 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
3999 "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val));
4002 spin_unlock(&card->ac97_lock);
4005 * Adjust power if the mixer is selected/deselected according
4008 * IF the CD is a valid input source (mixer or direct) AND
4009 * the CD is not muted THEN power is needed
4011 * We do two things. When record select changes the input to
4012 * add/remove the CD we adjust the power count if the CD is
4015 * When the CD mute changes we adjust the power level if the
4016 * CD was a valid input.
4018 * We also check for CD volume != 0, as the CD mute isn't
4019 * normally tweaked from userspace.
4022 /* CD mute change ? */
4024 if(reg==AC97_CD_VOL)
4026 /* Mute bit change ? */
4027 if((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val))
4029 /* This is a hack but its cleaner than the alternatives.
4030 Right now card->ac97_codec[0] might be NULL as we are
4031 still doing codec setup. This does an early assignment
4032 to avoid the problem if it occurs */
4034 if(card->ac97_codec[0]==NULL)
4035 card->ac97_codec[0]=dev;
4038 if(val&0x8000 || val == 0x1f1f)
4039 card->amplifier_ctrl(card, -1);
4040 else /* Mute off power on */
4043 card->amp_init(card);
4044 card->amplifier_ctrl(card, 1);
4051 /* OSS /dev/mixer file operation methods */
4053 static int cs_open_mixdev(struct inode *inode, struct file *file)
4056 unsigned int minor = iminor(inode);
4057 struct cs_card *card=NULL;
4058 struct list_head *entry;
4061 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4062 printk(KERN_INFO "cs46xx: cs_open_mixdev()+\n"));
4064 list_for_each(entry, &cs46xx_devs)
4066 card = list_entry(entry, struct cs_card, list);
4067 for (i = 0; i < NR_AC97; i++)
4068 if (card->ac97_codec[i] != NULL &&
4069 card->ac97_codec[i]->dev_mixer == minor)
4074 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4075 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4079 if(!card->ac97_codec[i])
4081 file->private_data = card->ac97_codec[i];
4083 card->active_ctrl(card,1);
4084 if(!CS_IN_USE(&card->mixer_use_cnt))
4086 if( (tmp = cs46xx_powerup(card, CS_POWER_MIXVON )) )
4088 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4089 "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n",tmp) );
4093 card->amplifier_ctrl(card, 1);
4094 CS_INC_USE_COUNT(&card->mixer_use_cnt);
4095 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4096 printk(KERN_INFO "cs46xx: cs_open_mixdev()- 0\n"));
4097 return nonseekable_open(inode, file);
4100 static int cs_release_mixdev(struct inode *inode, struct file *file)
4102 unsigned int minor = iminor(inode);
4103 struct cs_card *card=NULL;
4104 struct list_head *entry;
4108 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4109 printk(KERN_INFO "cs46xx: cs_release_mixdev()+\n"));
4110 list_for_each(entry, &cs46xx_devs)
4112 card = list_entry(entry, struct cs_card, list);
4113 for (i = 0; i < NR_AC97; i++)
4114 if (card->ac97_codec[i] != NULL &&
4115 card->ac97_codec[i]->dev_mixer == minor)
4120 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4121 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4125 if(!CS_DEC_AND_TEST(&card->mixer_use_cnt))
4127 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4128 printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n"));
4129 card->active_ctrl(card, -1);
4130 card->amplifier_ctrl(card, -1);
4134 * ok, no outstanding mixer opens, so powerdown.
4136 if( (tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE )) )
4138 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4139 "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n",tmp) );
4140 card->active_ctrl(card, -1);
4141 card->amplifier_ctrl(card, -1);
4144 card->active_ctrl(card, -1);
4145 card->amplifier_ctrl(card, -1);
4146 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4147 printk(KERN_INFO "cs46xx: cs_release_mixdev()- 0\n"));
4151 void __exit cs46xx_cleanup_module(void);
4152 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4155 struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
4156 struct cs_card *card=NULL;
4157 struct list_head *entry;
4158 unsigned long __user *p = (long __user *)arg;
4160 #if CSDEBUG_INTERFACE
4163 if( (cmd == SOUND_MIXER_CS_GETDBGMASK) ||
4164 (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
4165 (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
4166 (cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
4167 (cmd == SOUND_MIXER_CS_APM))
4172 case SOUND_MIXER_CS_GETDBGMASK:
4173 return put_user(cs_debugmask, p);
4175 case SOUND_MIXER_CS_GETDBGLEVEL:
4176 return put_user(cs_debuglevel, p);
4178 case SOUND_MIXER_CS_SETDBGMASK:
4179 if (get_user(val, p))
4184 case SOUND_MIXER_CS_SETDBGLEVEL:
4185 if (get_user(val, p))
4187 cs_debuglevel = val;
4190 case SOUND_MIXER_CS_APM:
4191 if (get_user(val, p))
4193 if(val == CS_IOCTL_CMD_SUSPEND)
4195 list_for_each(entry, &cs46xx_devs)
4197 card = list_entry(entry, struct cs_card, list);
4198 cs46xx_suspend(card, 0);
4202 else if(val == CS_IOCTL_CMD_RESUME)
4204 list_for_each(entry, &cs46xx_devs)
4206 card = list_entry(entry, struct cs_card, list);
4207 cs46xx_resume(card);
4212 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4213 "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n",
4219 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4220 "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n") );
4225 return codec->mixer_ioctl(codec, cmd, arg);
4228 static /*const*/ struct file_operations cs_mixer_fops = {
4229 CS_OWNER CS_THIS_MODULE
4230 .llseek = no_llseek,
4231 .ioctl = cs_ioctl_mixdev,
4232 .open = cs_open_mixdev,
4233 .release = cs_release_mixdev,
4236 /* AC97 codec initialisation. */
4237 static int __init cs_ac97_init(struct cs_card *card)
4241 struct ac97_codec *codec;
4244 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4245 "cs46xx: cs_ac97_init()+\n") );
4247 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4248 if ((codec = ac97_alloc_codec()) == NULL)
4251 /* initialize some basic codec information, other fields will be filled
4252 in ac97_probe_codec */
4253 codec->private_data = card;
4254 codec->id = num_ac97;
4256 codec->codec_read = cs_ac97_get;
4257 codec->codec_write = cs_ac97_set;
4259 if (ac97_probe_codec(codec) == 0)
4261 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4262 "cs46xx: cs_ac97_init()- codec number %d not found\n",
4264 card->ac97_codec[num_ac97] = NULL;
4267 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4268 "cs46xx: cs_ac97_init() found codec %d\n",num_ac97) );
4270 eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
4274 printk(KERN_WARNING "cs46xx: codec %d not present\n",num_ac97);
4275 ac97_release_codec(codec);
4279 card->ac97_features = eid;
4281 if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
4282 printk(KERN_ERR "cs46xx: couldn't register mixer!\n");
4283 ac97_release_codec(codec);
4286 card->ac97_codec[num_ac97] = codec;
4288 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4289 "cs46xx: cs_ac97_init() ac97_codec[%d] set to %p\n",
4290 (unsigned int)num_ac97,
4292 /* if there is no secondary codec at all, don't probe any more */
4299 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4300 "cs46xx: cs_ac97_init()- %d\n", (unsigned int)num_ac97));
4305 * load the static image into the DSP
4307 #include "cs461x_image.h"
4308 static void cs461x_download_image(struct cs_card *card)
4310 unsigned i, j, temp1, temp2, offset, count;
4311 unsigned char *pBA1 = ioremap(card->ba1_addr, 0x40000);
4312 for( i=0; i < CLEAR__COUNT; i++)
4314 offset = ClrStat[i].BA1__DestByteOffset;
4315 count = ClrStat[i].BA1__SourceSize;
4316 for( temp1 = offset; temp1<(offset+count); temp1+=4 )
4317 writel(0, pBA1+temp1);
4320 for(i=0; i<FILL__COUNT; i++)
4322 temp2 = FillStat[i].Offset;
4323 for(j=0; j<(FillStat[i].Size)/4; j++)
4325 temp1 = (FillStat[i]).pFill[j];
4326 writel(temp1, pBA1+temp2+j*4);
4337 static void cs461x_reset(struct cs_card *card)
4342 * Write the reset bit of the SP control register.
4344 cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
4347 * Write the control register.
4349 cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
4352 * Clear the trap registers.
4354 for (idx = 0; idx < 8; idx++) {
4355 cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
4356 cs461x_poke(card, BA1_TWPR, 0xFFFF);
4358 cs461x_poke(card, BA1_DREG, 0);
4361 * Set the frame timer to reflect the number of cycles per frame.
4363 cs461x_poke(card, BA1_FRMT, 0xadf);
4366 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type)
4368 int idx, loop, startfifo=0, endfifo=0, powerdown1 = 0;
4372 * See if the devices are powered down. If so, we must power them up first
4373 * or they will not respond.
4375 if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
4376 cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
4381 * We want to clear out the serial port FIFOs so we don't end up playing
4382 * whatever random garbage happens to be in them. We fill the sample FIFOS
4383 * with zero (silence).
4385 cs461x_pokeBA0(card, BA0_SERBWP, 0);
4388 * Check for which FIFO locations to clear, if we are currently
4389 * playing or capturing then we don't want to put in 128 bytes of
4392 if(type & CS_TYPE_DAC)
4397 if(type & CS_TYPE_ADC)
4404 * Fill sample FIFO locations (256 locations total).
4406 for (idx = startfifo; idx < endfifo; idx++) {
4408 * Make sure the previous FIFO write operation has completed.
4410 for (loop = 0; loop < 5; loop++) {
4412 if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
4415 if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
4417 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4420 * Write the serial port FIFO index.
4422 cs461x_pokeBA0(card, BA0_SERBAD, idx);
4424 * Tell the serial port to load the new value into the FIFO location.
4426 cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
4429 * Now, if we powered up the devices, then power them back down again.
4430 * This is kinda ugly, but should never happen.
4433 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4437 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag)
4440 unsigned int tmp=0,muted=0;
4442 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4443 "cs46xx: cs461x_powerdown()+ type=0x%x\n",type));
4444 if(!cs_powerdown && !suspendflag)
4446 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4447 "cs46xx: cs461x_powerdown() DISABLED exiting\n"));
4450 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4451 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4452 "cs46xx: cs461x_powerdown() powerdown reg=0x%x\n",tmp));
4454 * if powering down only the VREF, and not powering down the DAC/ADC,
4455 * then do not power down the VREF, UNLESS both the DAC and ADC are not
4456 * currently powered down. If powering down DAC and ADC, then
4457 * it is possible to power down the VREF (ON).
4459 if ( ((type & CS_POWER_MIXVON) &&
4460 (!(type & CS_POWER_ADC) || (!(type & CS_POWER_DAC))) )
4462 ((tmp & CS_AC97_POWER_CONTROL_ADC_ON) ||
4463 (tmp & CS_AC97_POWER_CONTROL_DAC_ON) ) )
4465 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4466 "cs46xx: cs461x_powerdown()- 0 unable to powerdown. tmp=0x%x\n",tmp));
4470 * for now, always keep power to the mixer block.
4471 * not sure why it's a problem but it seems to be if we power off.
4473 type &= ~CS_POWER_MIXVON;
4474 type &= ~CS_POWER_MIXVOFF;
4477 * Power down indicated areas.
4479 if(type & CS_POWER_MIXVOFF)
4482 CS_DBGOUT(CS_FUNCTION, 4,
4483 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVOFF\n"));
4485 * Power down the MIXER (VREF ON) on the AC97 card.
4487 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4488 if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4492 cs_mute(card, CS_TRUE);
4495 tmp |= CS_AC97_POWER_CONTROL_MIXVOFF;
4496 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4498 * Now, we wait until we sample a ready state.
4500 for (count = 0; count < 32; count++) {
4502 * First, lets wait a short while to let things settle out a
4503 * bit, and to prevent retrying the read too quickly.
4508 * Read the current state of the power control register.
4510 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4511 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4516 * Check the status..
4518 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4519 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4521 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4522 "cs46xx: powerdown MIXVOFF failed\n"));
4527 if(type & CS_POWER_MIXVON)
4530 CS_DBGOUT(CS_FUNCTION, 4,
4531 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVON\n"));
4533 * Power down the MIXER (VREF ON) on the AC97 card.
4535 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4536 if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)
4540 cs_mute(card, CS_TRUE);
4543 tmp |= CS_AC97_POWER_CONTROL_MIXVON;
4544 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4546 * Now, we wait until we sample a ready state.
4548 for (count = 0; count < 32; count++) {
4550 * First, lets wait a short while to let things settle out a
4551 * bit, and to prevent retrying the read too quickly.
4556 * Read the current state of the power control register.
4558 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4559 CS_AC97_POWER_CONTROL_MIXVON_ON))
4564 * Check the status..
4566 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4567 CS_AC97_POWER_CONTROL_MIXVON_ON)
4569 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4570 "cs46xx: powerdown MIXVON failed\n"));
4575 if(type & CS_POWER_ADC)
4578 * Power down the ADC on the AC97 card.
4580 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADC\n"));
4581 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4582 if (tmp & CS_AC97_POWER_CONTROL_ADC_ON)
4586 cs_mute(card, CS_TRUE);
4589 tmp |= CS_AC97_POWER_CONTROL_ADC;
4590 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4593 * Now, we wait until we sample a ready state.
4595 for (count = 0; count < 32; count++) {
4597 * First, lets wait a short while to let things settle out a
4598 * bit, and to prevent retrying the read too quickly.
4603 * Read the current state of the power control register.
4605 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4606 CS_AC97_POWER_CONTROL_ADC_ON))
4611 * Check the status..
4613 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4614 CS_AC97_POWER_CONTROL_ADC_ON)
4616 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4617 "cs46xx: powerdown ADC failed\n"));
4622 if(type & CS_POWER_DAC)
4625 * Power down the DAC on the AC97 card.
4628 CS_DBGOUT(CS_FUNCTION, 4,
4629 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DAC\n"));
4630 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4631 if (tmp & CS_AC97_POWER_CONTROL_DAC_ON)
4635 cs_mute(card, CS_TRUE);
4638 tmp |= CS_AC97_POWER_CONTROL_DAC;
4639 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4641 * Now, we wait until we sample a ready state.
4643 for (count = 0; count < 32; count++) {
4645 * First, lets wait a short while to let things settle out a
4646 * bit, and to prevent retrying the read too quickly.
4651 * Read the current state of the power control register.
4653 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4654 CS_AC97_POWER_CONTROL_DAC_ON))
4659 * Check the status..
4661 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4662 CS_AC97_POWER_CONTROL_DAC_ON)
4664 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4665 "cs46xx: powerdown DAC failed\n"));
4670 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4672 cs_mute(card, CS_FALSE);
4673 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4674 "cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp));
4678 static int cs46xx_powerup(struct cs_card *card, unsigned int type)
4681 unsigned int tmp=0,muted=0;
4683 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4684 "cs46xx: cs46xx_powerup()+ type=0x%x\n",type));
4686 * check for VREF and powerup if need to.
4688 if(type & CS_POWER_MIXVON)
4689 type |= CS_POWER_MIXVOFF;
4690 if(type & (CS_POWER_DAC | CS_POWER_ADC))
4691 type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF;
4694 * Power up indicated areas.
4696 if(type & CS_POWER_MIXVOFF)
4699 CS_DBGOUT(CS_FUNCTION, 4,
4700 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFF\n"));
4702 * Power up the MIXER (VREF ON) on the AC97 card.
4704 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4705 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4709 cs_mute(card, CS_TRUE);
4712 tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF;
4713 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4715 * Now, we wait until we sample a ready state.
4717 for (count = 0; count < 32; count++) {
4719 * First, lets wait a short while to let things settle out a
4720 * bit, and to prevent retrying the read too quickly.
4725 * Read the current state of the power control register.
4727 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4728 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4733 * Check the status..
4735 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4736 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4738 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4739 "cs46xx: powerup MIXVOFF failed\n"));
4744 if(type & CS_POWER_MIXVON)
4747 CS_DBGOUT(CS_FUNCTION, 4,
4748 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVON\n"));
4750 * Power up the MIXER (VREF ON) on the AC97 card.
4752 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4753 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON))
4757 cs_mute(card, CS_TRUE);
4760 tmp &= ~CS_AC97_POWER_CONTROL_MIXVON;
4761 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4763 * Now, we wait until we sample a ready state.
4765 for (count = 0; count < 32; count++) {
4767 * First, lets wait a short while to let things settle out a
4768 * bit, and to prevent retrying the read too quickly.
4773 * Read the current state of the power control register.
4775 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4776 CS_AC97_POWER_CONTROL_MIXVON_ON)
4781 * Check the status..
4783 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4784 CS_AC97_POWER_CONTROL_MIXVON_ON))
4786 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4787 "cs46xx: powerup MIXVON failed\n"));
4792 if(type & CS_POWER_ADC)
4795 * Power up the ADC on the AC97 card.
4797 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADC\n"));
4798 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4799 if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON))
4803 cs_mute(card, CS_TRUE);
4806 tmp &= ~CS_AC97_POWER_CONTROL_ADC;
4807 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4810 * Now, we wait until we sample a ready state.
4812 for (count = 0; count < 32; count++) {
4814 * First, lets wait a short while to let things settle out a
4815 * bit, and to prevent retrying the read too quickly.
4820 * Read the current state of the power control register.
4822 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4823 CS_AC97_POWER_CONTROL_ADC_ON)
4828 * Check the status..
4830 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4831 CS_AC97_POWER_CONTROL_ADC_ON))
4833 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4834 "cs46xx: powerup ADC failed\n"));
4839 if(type & CS_POWER_DAC)
4842 * Power up the DAC on the AC97 card.
4845 CS_DBGOUT(CS_FUNCTION, 4,
4846 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DAC\n"));
4847 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4848 if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON))
4852 cs_mute(card, CS_TRUE);
4855 tmp &= ~CS_AC97_POWER_CONTROL_DAC;
4856 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4858 * Now, we wait until we sample a ready state.
4860 for (count = 0; count < 32; count++) {
4862 * First, lets wait a short while to let things settle out a
4863 * bit, and to prevent retrying the read too quickly.
4868 * Read the current state of the power control register.
4870 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4871 CS_AC97_POWER_CONTROL_DAC_ON)
4876 * Check the status..
4878 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4879 CS_AC97_POWER_CONTROL_DAC_ON))
4881 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4882 "cs46xx: powerup DAC failed\n"));
4887 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4889 cs_mute(card, CS_FALSE);
4890 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4891 "cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp));
4896 static void cs461x_proc_start(struct cs_card *card)
4901 * Set the frame timer to reflect the number of cycles per frame.
4903 cs461x_poke(card, BA1_FRMT, 0xadf);
4905 * Turn on 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, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
4910 * Wait until the run at frame bit resets itself in the SP control
4913 for (cnt = 0; cnt < 25; cnt++) {
4915 if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
4919 if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
4920 printk(KERN_WARNING "cs46xx: SPCR_RUNFR never reset\n");
4923 static void cs461x_proc_stop(struct cs_card *card)
4926 * Turn off the run, run at frame, and DMA enable bits in the local copy of
4927 * the SP control register.
4929 cs461x_poke(card, BA1_SPCR, 0);
4932 static int cs_hardware_init(struct cs_card *card)
4934 unsigned long end_time;
4935 unsigned int tmp,count;
4937 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4938 "cs46xx: cs_hardware_init()+\n") );
4940 * First, blast the clock control register to zero so that the PLL starts
4941 * out in a known state, and blast the master serial port control register
4942 * to zero so that the serial ports also start out in a known state.
4944 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
4945 cs461x_pokeBA0(card, BA0_SERMC1, 0);
4948 * If we are in AC97 mode, then we must set the part to a host controlled
4949 * AC-link. Otherwise, we won't be able to bring up the link.
4951 cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03); /* 1.03 card */
4952 /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
4955 * Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
4956 * spec) and then drive it high. This is done for non AC97 modes since
4957 * there might be logic external to the CS461x that uses the ARST# line
4960 cs461x_pokeBA0(card, BA0_ACCTL, 1);
4962 cs461x_pokeBA0(card, BA0_ACCTL, 0);
4964 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
4967 * The first thing we do here is to enable sync generation. As soon
4968 * as we start receiving bit clock, we'll start producing the SYNC
4971 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
4974 * Now wait for a short while to allow the AC97 part to start
4975 * generating bit clock (so we don't try to start the PLL without an
4978 mdelay(5 * cs_laptop_wait); /* 1 should be enough ?? (and pigs might fly) */
4981 * Set the serial port timing configuration, so that
4982 * the clock control circuit gets its clock from the correct place.
4984 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
4987 * The part seems to not be ready for a while after a resume.
4988 * so, if we are resuming, then wait for 700 mils. Note that 600 mils
4989 * is not enough for some platforms! tested on an IBM Thinkpads and
4992 if(!(card->pm.flags & CS46XX_PM_IDLE))
4995 * Write the selected clock control setup to the hardware. Do not turn on
4996 * SWCE yet (if requested), so that the devices clocked by the output of
4997 * PLL are not clocked until the PLL is stable.
4999 cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
5000 cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
5001 cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
5006 cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
5009 * Wait until the PLL has stabilized.
5011 mdelay(5 * cs_laptop_wait); /* Again 1 should be enough ?? */
5014 * Turn on clocking of the core so that we can setup the serial ports.
5016 tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
5017 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5020 * Fill the serial port FIFOs with silence.
5022 cs461x_clear_serial_FIFOs(card,CS_TYPE_DAC | CS_TYPE_ADC);
5025 * Set the serial port FIFO pointer to the first sample in the FIFO.
5027 /* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
5030 * Write the serial port configuration to the part. The master
5031 * enable bit is not set until all other values have been written.
5033 cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
5034 cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
5035 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
5038 mdelay(5 * cs_laptop_wait); /* Shouldnt be needed ?? */
5041 * If we are resuming under 2.2.x then we can not schedule a timeout.
5042 * so, just spin the CPU.
5044 if(card->pm.flags & CS46XX_PM_IDLE)
5047 * Wait for the card ready signal from the AC97 card.
5049 end_time = jiffies + 3 * (HZ >> 2);
5052 * Read the AC97 status register to see if we've seen a CODEC READY
5053 * signal from the AC97 card.
5055 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5057 current->state = TASK_UNINTERRUPTIBLE;
5058 schedule_timeout(1);
5059 } while (time_before(jiffies, end_time));
5063 for (count = 0; count < 100; count++) {
5064 // First, we want to wait for a short time.
5065 udelay(25 * cs_laptop_wait);
5067 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5073 * Make sure CODEC is READY.
5075 if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
5076 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5077 "cs46xx: create - never read card ready from AC'97\n"));
5078 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5079 "cs46xx: probably not a bug, try using the CS4232 driver,\n"));
5080 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5081 "cs46xx: or turn off any automatic Power Management support in the BIOS.\n"));
5086 * Assert the vaid frame signal so that we can start sending commands
5089 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
5091 if(card->pm.flags & CS46XX_PM_IDLE)
5094 * Wait until we've sampled input slots 3 and 4 as valid, meaning that
5095 * the card is pumping ADC data across the AC-link.
5097 end_time = jiffies + 3 * (HZ >> 2);
5100 * Read the input slot valid register and see if input slots 3 and
5103 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5105 current->state = TASK_UNINTERRUPTIBLE;
5106 schedule_timeout(1);
5107 } while (time_before(jiffies, end_time));
5111 for (count = 0; count < 100; count++) {
5112 // First, we want to wait for a short time.
5113 udelay(25 * cs_laptop_wait);
5115 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5120 * Make sure input slots 3 and 4 are valid. If not, then return
5123 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
5124 printk(KERN_WARNING "cs46xx: create - never read ISV3 & ISV4 from AC'97\n");
5129 * Now, assert valid frame and the slot 3 and 4 valid bits. This will
5130 * commense the transfer of digital audio data to the AC97 card.
5132 cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
5135 * Turn off the Processor by turning off the software clock enable flag in
5136 * the clock control register.
5138 /* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
5139 /* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
5142 * Reset the processor.
5147 * Download the image to the processor.
5150 cs461x_download_image(card);
5153 * Stop playback DMA.
5155 tmp = cs461x_peek(card, BA1_PCTL);
5156 card->pctl = tmp & 0xffff0000;
5157 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5162 tmp = cs461x_peek(card, BA1_CCTL);
5163 card->cctl = tmp & 0x0000ffff;
5164 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5166 /* initialize AC97 codec and register /dev/mixer */
5167 if(card->pm.flags & CS46XX_PM_IDLE)
5169 if (cs_ac97_init(card) <= 0)
5171 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5172 "cs46xx: cs_ac97_init() failure\n") );
5178 cs46xx_ac97_resume(card);
5181 cs461x_proc_start(card);
5184 * Enable interrupts on the part.
5186 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
5188 tmp = cs461x_peek(card, BA1_PFIE);
5190 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt enable */
5192 tmp = cs461x_peek(card, BA1_CIE);
5195 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt enable */
5198 * If IDLE then Power down the part. We will power components up
5199 * when we need them.
5201 if(card->pm.flags & CS46XX_PM_IDLE)
5205 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC |
5206 CS_POWER_MIXVON )) )
5208 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5209 "cs46xx: cs461x_powerup() failure (0x%x)\n",tmp) );
5215 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5216 CS_POWER_MIXVON, CS_FALSE )) )
5218 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5219 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5224 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
5225 "cs46xx: cs_hardware_init()- 0\n"));
5229 /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered
5230 until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
5241 void (*amp)(struct cs_card *, int);
5242 void (*amp_init)(struct cs_card *);
5243 void (*active)(struct cs_card *, int);
5246 static struct cs_card_type cards[] = {
5250 .name = "Genius Soundmaker 128 value",
5262 .name = "Mitac MI6020/21",
5268 .name = "Hercules Game Theatre XP",
5269 .amp = amp_hercules,
5274 .name = "Hercules Game Theatre XP",
5275 .amp = amp_hercules,
5280 .name = "Hercules Game Theatre XP",
5281 .amp = amp_hercules,
5286 .name = "Hercules Game Theatre XP",
5287 .amp = amp_hercules,
5292 .name = "Hercules Game Theatre XP",
5293 .amp = amp_hercules,
5298 .name = "Hercules Game Theatre XP",
5299 .amp = amp_hercules,
5304 .name = "Hercules Fortissimo II",
5307 /* Not sure if the 570 needs the clkrun hack */
5309 .vendor = PCI_VENDOR_ID_IBM,
5311 .name = "Thinkpad 570",
5313 .active = clkrun_hack,
5316 .vendor = PCI_VENDOR_ID_IBM,
5318 .name = "Thinkpad 600X/A20/T20",
5320 .active = clkrun_hack,
5323 .vendor = PCI_VENDOR_ID_IBM,
5325 .name = "Thinkpad 600E (unsupported)",
5328 .name = "Card without SSID set",
5333 MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
5334 MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
5335 MODULE_LICENSE("GPL");
5338 static const char cs46xx_banner[] = KERN_INFO "Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION "." CS46XX_MINOR_VERSION "." CS46XX_ARCH ", " __TIME__ " " __DATE__ "\n";
5339 static const char fndmsg[] = KERN_INFO "cs46xx: Found %d audio device(s).\n";
5341 static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
5342 const struct pci_device_id *pciid)
5344 struct pm_dev *pmdev;
5346 u16 ss_card, ss_vendor;
5347 struct cs_card *card;
5348 dma_addr_t dma_mask;
5349 struct cs_card_type *cp = &cards[0];
5351 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
5352 printk(KERN_INFO "cs46xx: probe()+\n"));
5354 dma_mask = 0xffffffff; /* this enables playback and recording */
5355 if (pci_enable_device(pci_dev)) {
5356 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
5357 "cs46xx: pci_enable_device() failed\n"));
5360 if (!RSRCISMEMORYREGION(pci_dev, 0) ||
5361 !RSRCISMEMORYREGION(pci_dev, 1)) {
5362 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5363 "cs46xx: probe()- Memory region not assigned\n"));
5366 if (pci_dev->irq == 0) {
5367 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5368 "cs46xx: probe() IRQ not assigned\n"));
5371 if (!pci_dma_supported(pci_dev, 0xffffffff)) {
5372 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5373 "cs46xx: probe() architecture does not support 32bit PCI busmaster DMA\n"));
5376 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
5377 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
5379 if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
5380 printk(KERN_ERR "cs46xx: out of memory\n");
5383 memset(card, 0, sizeof(*card));
5384 card->ba0_addr = RSRCADDRESS(pci_dev, 0);
5385 card->ba1_addr = RSRCADDRESS(pci_dev, 1);
5386 card->pci_dev = pci_dev;
5387 card->irq = pci_dev->irq;
5388 card->magic = CS_CARD_MAGIC;
5389 spin_lock_init(&card->lock);
5390 spin_lock_init(&card->ac97_lock);
5392 pci_set_master(pci_dev);
5394 printk(cs46xx_banner);
5395 printk(KERN_INFO "cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %d\n",
5396 card->ba0_addr, card->ba1_addr, card->irq);
5398 card->alloc_pcm_channel = cs_alloc_pcm_channel;
5399 card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
5400 card->free_pcm_channel = cs_free_pcm_channel;
5401 card->amplifier_ctrl = amp_none;
5402 card->active_ctrl = amp_none;
5406 if(cp->vendor == ss_vendor && cp->id == ss_card)
5408 card->amplifier_ctrl = cp->amp;
5410 card->active_ctrl = cp->active;
5412 card->amp_init = cp->amp_init;
5419 printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5420 ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5424 printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5425 cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5428 if (card->amplifier_ctrl==NULL)
5430 card->amplifier_ctrl = amp_none;
5431 card->active_ctrl = clkrun_hack;
5434 if (external_amp == 1)
5436 printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.\n");
5437 card->amplifier_ctrl = amp_voyetra;
5442 printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.\n");
5443 card->active_ctrl = clkrun_hack;
5446 * The thinkpads don't work well without runtime updating on their kernel
5447 * delay values (or any laptop with variable CPU speeds really).
5448 * so, just to be safe set the init delay to 2100. Eliminates
5449 * failures on T21 Thinkpads. remove this code when the udelay
5450 * and mdelay kernel code is replaced by a pm timer, or the delays
5451 * work well for battery and/or AC power both.
5453 if(card->active_ctrl == clkrun_hack)
5458 if((card->active_ctrl == clkrun_hack) && !(powerdown == 1))
5461 * for some currently unknown reason, powering down the DAC and ADC component
5462 * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97
5463 * codec access problems. probably the serial clock becomes unsynced.
5464 * added code to sync the chips back up, but only helped about 70% the time.
5470 card->active_ctrl(card, 1);
5472 /* claim our iospace and irq */
5474 card->ba0 = ioremap_nocache(card->ba0_addr, CS461X_BA0_SIZE);
5475 card->ba1.name.data0 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
5476 card->ba1.name.data1 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
5477 card->ba1.name.pmem = ioremap_nocache(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
5478 card->ba1.name.reg = ioremap_nocache(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
5480 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5481 "cs46xx: card=%p card->ba0=%p\n",card,card->ba0) );
5482 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5483 "cs46xx: card->ba1=%p %p %p %p\n",
5484 card->ba1.name.data0,
5485 card->ba1.name.data1,
5486 card->ba1.name.pmem,
5487 card->ba1.name.reg) );
5489 if(card->ba0 == 0 || card->ba1.name.data0 == 0 ||
5490 card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
5491 card->ba1.name.reg == 0)
5494 if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) {
5495 printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq);
5498 /* register /dev/dsp */
5499 if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
5500 printk(KERN_ERR "cs46xx: unable to register dsp\n");
5504 /* register /dev/midi */
5505 if((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0)
5506 printk(KERN_ERR "cs46xx: unable to register midi\n");
5508 card->pm.flags |= CS46XX_PM_IDLE;
5511 if (cs_hardware_init(card) != 0)
5513 CS_DBGOUT(CS_ERROR, 4, printk(
5514 "cs46xx: ERROR in cs_hardware_init()... retrying\n"));
5515 for (j = 0; j < NR_AC97; j++)
5516 if (card->ac97_codec[j] != NULL) {
5517 unregister_sound_mixer(card->ac97_codec[j]->dev_mixer);
5518 ac97_release_codec(card->ac97_codec[j]);
5520 mdelay(10 * cs_laptop_wait);
5527 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
5528 "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i));
5529 unregister_sound_dsp(card->dev_audio);
5531 unregister_sound_midi(card->dev_midi);
5535 init_waitqueue_head(&card->midi.open_wait);
5536 init_MUTEX(&card->midi.open_sem);
5537 init_waitqueue_head(&card->midi.iwait);
5538 init_waitqueue_head(&card->midi.owait);
5539 cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST);
5540 cs461x_pokeBA0(card, BA0_MIDCR, 0);
5543 * Check if we have to init the amplifier, but probably already done
5544 * since the CD logic in the ac97 init code will turn on the ext amp.
5548 card->active_ctrl(card, -1);
5550 PCI_SET_DRIVER_DATA(pci_dev, card);
5551 PCI_SET_DMA_MASK(pci_dev, dma_mask);
5552 list_add(&card->list, &cs46xx_devs);
5554 pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), cs46xx_pm_callback);
5557 CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
5558 "cs46xx: probe() pm_register() succeeded (%p).\n",
5564 CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 2, printk(KERN_INFO
5565 "cs46xx: probe() pm_register() failed (%p).\n",
5567 card->pm.flags |= CS46XX_PM_NOT_REGISTERED;
5570 CS_DBGOUT(CS_PM, 9, printk(KERN_INFO "cs46xx: pm.flags=0x%x card=%p\n",
5571 (unsigned)card->pm.flags,card));
5573 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5574 "cs46xx: probe()- device allocated successfully\n"));
5578 free_irq(card->irq, card);
5582 if(card->ba1.name.data0)
5583 iounmap(card->ba1.name.data0);
5584 if(card->ba1.name.data1)
5585 iounmap(card->ba1.name.data1);
5586 if(card->ba1.name.pmem)
5587 iounmap(card->ba1.name.pmem);
5588 if(card->ba1.name.reg)
5589 iounmap(card->ba1.name.reg);
5591 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
5592 "cs46xx: probe()- no device allocated\n"));
5596 // ---------------------------------------------------------------------
5598 static void __devexit cs46xx_remove(struct pci_dev *pci_dev)
5600 struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
5604 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5605 "cs46xx: cs46xx_remove()+\n"));
5607 card->active_ctrl(card,1);
5609 tmp = cs461x_peek(card, BA1_PFIE);
5612 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
5614 tmp = cs461x_peek(card, BA1_CIE);
5617 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
5620 * Stop playback DMA.
5622 tmp = cs461x_peek(card, BA1_PCTL);
5623 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5628 tmp = cs461x_peek(card, BA1_CCTL);
5629 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5632 * Reset the processor.
5636 cs461x_proc_stop(card);
5639 * Power down the DAC and ADC. We will power them up (if) when we need
5642 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5643 CS_POWER_MIXVON, CS_TRUE )) )
5645 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5646 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5650 * Power down the PLL.
5652 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
5655 * Turn off the Processor by turning off the software clock enable flag in
5656 * the clock control register.
5658 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
5659 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5661 card->active_ctrl(card,-1);
5663 /* free hardware resources */
5664 free_irq(card->irq, card);
5666 iounmap(card->ba1.name.data0);
5667 iounmap(card->ba1.name.data1);
5668 iounmap(card->ba1.name.pmem);
5669 iounmap(card->ba1.name.reg);
5671 /* unregister audio devices */
5672 for (i = 0; i < NR_AC97; i++)
5673 if (card->ac97_codec[i] != NULL) {
5674 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
5675 ac97_release_codec(card->ac97_codec[i]);
5677 unregister_sound_dsp(card->dev_audio);
5679 unregister_sound_midi(card->dev_midi);
5680 list_del(&card->list);
5682 PCI_SET_DRIVER_DATA(pci_dev,NULL);
5684 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5685 "cs46xx: cs46xx_remove()-: remove successful\n"));
5690 CS46XX_4612, /* same as 4630 */
5691 CS46XX_4615, /* same as 4624 */
5694 static struct pci_device_id cs46xx_pci_tbl[] = {
5696 .vendor = PCI_VENDOR_ID_CIRRUS,
5697 .device = PCI_DEVICE_ID_CIRRUS_4610,
5698 .subvendor = PCI_ANY_ID,
5699 .subdevice = PCI_ANY_ID,
5700 .driver_data = CS46XX_4610,
5703 .vendor = PCI_VENDOR_ID_CIRRUS,
5704 .device = PCI_DEVICE_ID_CIRRUS_4612,
5705 .subvendor = PCI_ANY_ID,
5706 .subdevice = PCI_ANY_ID,
5707 .driver_data = CS46XX_4612,
5710 .vendor = PCI_VENDOR_ID_CIRRUS,
5711 .device = PCI_DEVICE_ID_CIRRUS_4615,
5712 .subvendor = PCI_ANY_ID,
5713 .subdevice = PCI_ANY_ID,
5714 .driver_data = CS46XX_4615,
5719 MODULE_DEVICE_TABLE(pci, cs46xx_pci_tbl);
5721 struct pci_driver cs46xx_pci_driver = {
5723 .id_table = cs46xx_pci_tbl,
5724 .probe = cs46xx_probe,
5725 .remove = __devexit_p(cs46xx_remove),
5726 .suspend = CS46XX_SUSPEND_TBL,
5727 .resume = CS46XX_RESUME_TBL,
5730 int __init cs46xx_init_module(void)
5733 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5734 "cs46xx: cs46xx_init_module()+ \n"));
5735 rtn = pci_module_init(&cs46xx_pci_driver);
5739 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(
5740 "cs46xx: Unable to detect valid cs46xx device\n"));
5743 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5744 printk(KERN_INFO "cs46xx: cs46xx_init_module()- (%d)\n",rtn));
5748 void __exit cs46xx_cleanup_module(void)
5750 pci_unregister_driver(&cs46xx_pci_driver);
5751 cs_pm_unregister_all(cs46xx_pm_callback);
5752 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5753 printk(KERN_INFO "cs46xx: cleanup_cs46xx() finished\n"));
5756 module_init(cs46xx_init_module);
5757 module_exit(cs46xx_cleanup_module);
5759 int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
5761 struct cs_card *card;
5763 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5764 "cs46xx: cs46xx_pm_callback dev=%p rqst=0x%x card=%p\n",
5765 dev,(unsigned)rqst,data));
5766 card = (struct cs_card *) dev->data;
5770 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5771 "cs46xx: PM suspend request\n"));
5772 if(cs46xx_suspend(card, 0))
5774 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5775 "cs46xx: PM suspend request refused\n"));
5780 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5781 "cs46xx: PM resume request\n"));
5782 if(cs46xx_resume(card))
5784 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5785 "cs46xx: PM resume request refused\n"));
5795 #if CS46XX_ACPI_SUPPORT
5796 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state)
5798 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5799 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5800 printk(KERN_INFO "cs46xx: cs46xx_suspend_tbl request\n"));
5801 cs46xx_suspend(s, 0);
5805 static int cs46xx_resume_tbl(struct pci_dev *pcidev)
5807 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5808 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5809 printk(KERN_INFO "cs46xx: cs46xx_resume_tbl request\n"));