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_pfn_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_pfn_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_pfn_range(vma, vma->vm_start,
2456 virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
2457 size, vma->vm_page_prot))
2464 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") );
2470 static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2472 struct cs_card *card = (struct cs_card *)file->private_data;
2473 struct cs_state *state;
2474 struct dmabuf *dmabuf=NULL;
2475 unsigned long flags;
2476 audio_buf_info abinfo;
2478 int val, valsave, mapped, ret;
2479 void __user *argp = (void __user *)arg;
2480 int __user *p = argp;
2482 state = (struct cs_state *)card->states[0];
2485 dmabuf = &state->dmabuf;
2486 mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped;
2488 state = (struct cs_state *)card->states[1];
2491 dmabuf = &state->dmabuf;
2492 mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped;
2501 case OSS_GETVERSION:
2502 return put_user(SOUND_VERSION, p);
2504 case SNDCTL_DSP_RESET:
2505 /* FIXME: spin_lock ? */
2506 if (file->f_mode & FMODE_WRITE) {
2507 state = (struct cs_state *)card->states[1];
2510 dmabuf = &state->dmabuf;
2512 synchronize_irq(card->irq);
2514 resync_dma_ptrs(state);
2515 dmabuf->swptr = dmabuf->hwptr = 0;
2516 dmabuf->count = dmabuf->total_bytes = 0;
2521 if (file->f_mode & FMODE_READ) {
2522 state = (struct cs_state *)card->states[0];
2525 dmabuf = &state->dmabuf;
2527 synchronize_irq(card->irq);
2528 resync_dma_ptrs(state);
2530 dmabuf->swptr = dmabuf->hwptr = 0;
2531 dmabuf->count = dmabuf->total_bytes = 0;
2536 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") );
2539 case SNDCTL_DSP_SYNC:
2540 if (file->f_mode & FMODE_WRITE)
2541 return drain_dac(state, file->f_flags & O_NONBLOCK);
2544 case SNDCTL_DSP_SPEED: /* set sample rate */
2545 if (get_user(val, p))
2548 if (file->f_mode & FMODE_READ) {
2549 state = (struct cs_state *)card->states[0];
2552 dmabuf = &state->dmabuf;
2556 cs_set_adc_rate(state, val);
2557 cs_set_divisor(dmabuf);
2560 if (file->f_mode & FMODE_WRITE) {
2561 state = (struct cs_state *)card->states[1];
2564 dmabuf = &state->dmabuf;
2568 cs_set_dac_rate(state, val);
2569 cs_set_divisor(dmabuf);
2572 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2573 "cs46xx: cs_ioctl() DSP_SPEED %s %s %d\n",
2574 file->f_mode & FMODE_WRITE ? "DAC" : "",
2575 file->f_mode & FMODE_READ ? "ADC" : "",
2577 return put_user(dmabuf->rate, p);
2579 return put_user(0, p);
2581 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2582 if (get_user(val, p))
2584 if (file->f_mode & FMODE_WRITE) {
2585 state = (struct cs_state *)card->states[1];
2588 dmabuf = &state->dmabuf;
2593 dmabuf->fmt |= CS_FMT_STEREO;
2595 dmabuf->fmt &= ~CS_FMT_STEREO;
2596 cs_set_divisor(dmabuf);
2597 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2598 "cs46xx: DSP_STEREO() DAC %s\n",
2599 (dmabuf->fmt & CS_FMT_STEREO) ?
2603 if (file->f_mode & FMODE_READ) {
2604 state = (struct cs_state *)card->states[0];
2607 dmabuf = &state->dmabuf;
2612 dmabuf->fmt |= CS_FMT_STEREO;
2614 dmabuf->fmt &= ~CS_FMT_STEREO;
2615 cs_set_divisor(dmabuf);
2616 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2617 "cs46xx: DSP_STEREO() ADC %s\n",
2618 (dmabuf->fmt & CS_FMT_STEREO) ?
2624 case SNDCTL_DSP_GETBLKSIZE:
2625 if (file->f_mode & FMODE_WRITE) {
2626 state = (struct cs_state *)card->states[1];
2629 dmabuf = &state->dmabuf;
2630 if ((val = prog_dmabuf(state)))
2632 return put_user(dmabuf->fragsize, p);
2635 if (file->f_mode & FMODE_READ) {
2636 state = (struct cs_state *)card->states[0];
2639 dmabuf = &state->dmabuf;
2640 if ((val = prog_dmabuf(state)))
2642 return put_user(dmabuf->fragsize/dmabuf->divisor,
2646 return put_user(0, p);
2648 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
2649 return put_user(AFMT_S16_LE | AFMT_U8, p);
2651 case SNDCTL_DSP_SETFMT: /* Select sample format */
2652 if (get_user(val, p))
2654 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2655 "cs46xx: cs_ioctl() DSP_SETFMT %s %s %s %s\n",
2656 file->f_mode & FMODE_WRITE ? "DAC" : "",
2657 file->f_mode & FMODE_READ ? "ADC" : "",
2658 val == AFMT_S16_LE ? "16Bit Signed" : "",
2659 val == AFMT_U8 ? "8Bit Unsigned" : "") );
2661 if (val != AFMT_QUERY) {
2662 if(val==AFMT_S16_LE || val==AFMT_U8)
2664 if (file->f_mode & FMODE_WRITE) {
2665 state = (struct cs_state *)card->states[1];
2668 dmabuf = &state->dmabuf;
2672 if(val==AFMT_S16_LE)
2673 dmabuf->fmt |= CS_FMT_16BIT;
2675 dmabuf->fmt &= ~CS_FMT_16BIT;
2676 cs_set_divisor(dmabuf);
2677 if((ret = prog_dmabuf(state)))
2681 if (file->f_mode & FMODE_READ) {
2683 state = (struct cs_state *)card->states[0];
2686 dmabuf = &state->dmabuf;
2690 if(val==AFMT_S16_LE)
2691 dmabuf->fmt |= CS_FMT_16BIT;
2693 dmabuf->fmt &= ~CS_FMT_16BIT;
2694 cs_set_divisor(dmabuf);
2695 if((ret = prog_dmabuf(state)))
2702 CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk(
2703 "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n",
2709 if(file->f_mode & FMODE_WRITE)
2711 state = (struct cs_state *)card->states[1];
2713 dmabuf = &state->dmabuf;
2715 else if(file->f_mode & FMODE_READ)
2717 state = (struct cs_state *)card->states[0];
2719 dmabuf = &state->dmabuf;
2724 if(dmabuf->fmt & CS_FMT_16BIT)
2725 return put_user(AFMT_S16_LE, p);
2727 return put_user(AFMT_U8, p);
2729 return put_user(0, p);
2731 case SNDCTL_DSP_CHANNELS:
2732 if (get_user(val, p))
2735 if (file->f_mode & FMODE_WRITE) {
2736 state = (struct cs_state *)card->states[1];
2739 dmabuf = &state->dmabuf;
2744 dmabuf->fmt |= CS_FMT_STEREO;
2746 dmabuf->fmt &= ~CS_FMT_STEREO;
2747 cs_set_divisor(dmabuf);
2748 if (prog_dmabuf(state))
2752 if (file->f_mode & FMODE_READ) {
2753 state = (struct cs_state *)card->states[0];
2756 dmabuf = &state->dmabuf;
2761 dmabuf->fmt |= CS_FMT_STEREO;
2763 dmabuf->fmt &= ~CS_FMT_STEREO;
2764 cs_set_divisor(dmabuf);
2765 if (prog_dmabuf(state))
2770 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
2773 case SNDCTL_DSP_POST:
2775 * There will be a longer than normal pause in the data.
2776 * so... do nothing, because there is nothing that we can do.
2780 case SNDCTL_DSP_SUBDIVIDE:
2781 if (file->f_mode & FMODE_WRITE) {
2782 state = (struct cs_state *)card->states[1];
2785 dmabuf = &state->dmabuf;
2786 if (dmabuf->subdivision)
2788 if (get_user(val, p))
2790 if (val != 1 && val != 2)
2792 dmabuf->subdivision = val;
2795 if (file->f_mode & FMODE_READ) {
2796 state = (struct cs_state *)card->states[0];
2799 dmabuf = &state->dmabuf;
2800 if (dmabuf->subdivision)
2802 if (get_user(val, p))
2804 if (val != 1 && val != 2)
2806 dmabuf->subdivision = val;
2811 case SNDCTL_DSP_SETFRAGMENT:
2812 if (get_user(val, p))
2815 if (file->f_mode & FMODE_WRITE) {
2816 state = (struct cs_state *)card->states[1];
2819 dmabuf = &state->dmabuf;
2820 dmabuf->ossfragshift = val & 0xffff;
2821 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2824 if (file->f_mode & FMODE_READ) {
2825 state = (struct cs_state *)card->states[0];
2828 dmabuf = &state->dmabuf;
2829 dmabuf->ossfragshift = val & 0xffff;
2830 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2835 case SNDCTL_DSP_GETOSPACE:
2836 if (!(file->f_mode & FMODE_WRITE))
2838 state = (struct cs_state *)card->states[1];
2841 dmabuf = &state->dmabuf;
2842 spin_lock_irqsave(&state->card->lock, flags);
2843 cs_update_ptr(card, CS_TRUE);
2844 abinfo.fragsize = dmabuf->fragsize;
2845 abinfo.fragstotal = dmabuf->numfrag;
2847 * for mmap we always have total space available
2850 abinfo.bytes = dmabuf->dmasize;
2852 abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2854 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2855 spin_unlock_irqrestore(&state->card->lock, flags);
2856 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2860 case SNDCTL_DSP_GETISPACE:
2861 if (!(file->f_mode & FMODE_READ))
2863 state = (struct cs_state *)card->states[0];
2866 dmabuf = &state->dmabuf;
2867 spin_lock_irqsave(&state->card->lock, flags);
2868 cs_update_ptr(card, CS_TRUE);
2869 abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
2870 abinfo.bytes = dmabuf->count/dmabuf->divisor;
2871 abinfo.fragstotal = dmabuf->numfrag;
2872 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2873 spin_unlock_irqrestore(&state->card->lock, flags);
2874 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2878 case SNDCTL_DSP_NONBLOCK:
2879 file->f_flags |= O_NONBLOCK;
2882 case SNDCTL_DSP_GETCAPS:
2883 return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
2886 case SNDCTL_DSP_GETTRIGGER:
2888 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") );
2889 if (file->f_mode & FMODE_WRITE)
2891 state = (struct cs_state *)card->states[1];
2894 dmabuf = &state->dmabuf;
2895 if(dmabuf->enable & DAC_RUNNING)
2896 val |= PCM_ENABLE_INPUT;
2899 if (file->f_mode & FMODE_READ)
2903 state = (struct cs_state *)card->states[0];
2904 dmabuf = &state->dmabuf;
2905 if(dmabuf->enable & ADC_RUNNING)
2906 val |= PCM_ENABLE_OUTPUT;
2909 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) );
2910 return put_user(val, p);
2912 case SNDCTL_DSP_SETTRIGGER:
2913 if (get_user(val, p))
2915 if (file->f_mode & FMODE_READ) {
2916 state = (struct cs_state *)card->states[0];
2919 dmabuf = &state->dmabuf;
2920 if (val & PCM_ENABLE_INPUT) {
2921 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2928 if (file->f_mode & FMODE_WRITE) {
2929 state = (struct cs_state *)card->states[1];
2932 dmabuf = &state->dmabuf;
2933 if (val & PCM_ENABLE_OUTPUT) {
2934 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2943 case SNDCTL_DSP_GETIPTR:
2944 if (!(file->f_mode & FMODE_READ))
2946 state = (struct cs_state *)card->states[0];
2949 dmabuf = &state->dmabuf;
2950 spin_lock_irqsave(&state->card->lock, flags);
2951 cs_update_ptr(card, CS_TRUE);
2952 cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
2953 cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
2954 cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
2955 spin_unlock_irqrestore(&state->card->lock, flags);
2956 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2962 case SNDCTL_DSP_GETOPTR:
2963 if (!(file->f_mode & FMODE_WRITE))
2965 state = (struct cs_state *)card->states[1];
2968 dmabuf = &state->dmabuf;
2969 spin_lock_irqsave(&state->card->lock, flags);
2970 cs_update_ptr(card, CS_TRUE);
2971 cinfo.bytes = dmabuf->total_bytes;
2974 cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift)
2976 CS_DBGOUT(CS_PARMS, 8,
2977 printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n",
2978 cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
2979 dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
2983 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2985 cinfo.ptr = dmabuf->hwptr;
2987 CS_DBGOUT(CS_PARMS, 4, printk(
2988 "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%d\n",
2989 cinfo.bytes,cinfo.blocks,cinfo.ptr) );
2990 spin_unlock_irqrestore(&state->card->lock, flags);
2991 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2997 case SNDCTL_DSP_SETDUPLEX:
3000 case SNDCTL_DSP_GETODELAY:
3001 if (!(file->f_mode & FMODE_WRITE))
3003 state = (struct cs_state *)card->states[1];
3006 dmabuf = &state->dmabuf;
3007 spin_lock_irqsave(&state->card->lock, flags);
3008 cs_update_ptr(card, CS_TRUE);
3009 val = dmabuf->count;
3010 spin_unlock_irqrestore(&state->card->lock, flags);
3014 return put_user(val, p);
3016 case SOUND_PCM_READ_RATE:
3017 if(file->f_mode & FMODE_READ)
3018 state = (struct cs_state *)card->states[0];
3020 state = (struct cs_state *)card->states[1];
3023 dmabuf = &state->dmabuf;
3024 return put_user(dmabuf->rate, p);
3026 return put_user(0, p);
3029 case SOUND_PCM_READ_CHANNELS:
3030 if(file->f_mode & FMODE_READ)
3031 state = (struct cs_state *)card->states[0];
3033 state = (struct cs_state *)card->states[1];
3036 dmabuf = &state->dmabuf;
3037 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
3040 return put_user(0, p);
3042 case SOUND_PCM_READ_BITS:
3043 if(file->f_mode & FMODE_READ)
3044 state = (struct cs_state *)card->states[0];
3046 state = (struct cs_state *)card->states[1];
3049 dmabuf = &state->dmabuf;
3050 return put_user((dmabuf->fmt & CS_FMT_16BIT) ?
3051 AFMT_S16_LE : AFMT_U8, p);
3054 return put_user(0, p);
3056 case SNDCTL_DSP_MAPINBUF:
3057 case SNDCTL_DSP_MAPOUTBUF:
3058 case SNDCTL_DSP_SETSYNCRO:
3059 case SOUND_PCM_WRITE_FILTER:
3060 case SOUND_PCM_READ_FILTER:
3068 * AMP control - null AMP
3071 static void amp_none(struct cs_card *card, int change)
3079 static void amp_voyetra(struct cs_card *card, int change)
3081 /* Manage the EAPD bit on the Crystal 4297
3082 and the Analog AD1885 */
3084 int old=card->amplifier;
3086 card->amplifier+=change;
3087 if(card->amplifier && !old)
3089 /* Turn the EAPD amp on */
3090 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3091 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
3094 else if(old && !card->amplifier)
3096 /* Turn the EAPD amp off */
3097 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3098 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
3105 * Game Theatre XP card - EGPIO[2] is used to enable the external amp.
3108 static void amp_hercules(struct cs_card *card, int change)
3110 int old=card->amplifier;
3113 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
3114 "cs46xx: amp_hercules() called before initialized.\n"));
3117 card->amplifier+=change;
3118 if( (card->amplifier && !old) && !(hercules_egpio_disable))
3120 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3121 "cs46xx: amp_hercules() external amp enabled\n"));
3122 cs461x_pokeBA0(card, BA0_EGPIODR,
3123 EGPIODR_GPOE2); /* enable EGPIO2 output */
3124 cs461x_pokeBA0(card, BA0_EGPIOPTR,
3125 EGPIOPTR_GPPT2); /* open-drain on output */
3127 else if(old && !card->amplifier)
3129 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3130 "cs46xx: amp_hercules() external amp disabled\n"));
3131 cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
3132 cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
3137 * Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
3138 * whenever we need to beat on the chip.
3140 * The original idea and code for this hack comes from David Kaiser at
3141 * Linuxcare. Perhaps one day Crystal will document their chips well
3142 * enough to make them useful.
3145 static void clkrun_hack(struct cs_card *card, int change)
3147 struct pci_dev *acpi_dev;
3151 int old=card->active;
3153 card->active+=change;
3155 acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
3156 if(acpi_dev == NULL)
3157 return; /* Not a thinkpad thats for sure */
3159 /* Find the control port */
3160 pci_read_config_byte(acpi_dev, 0x41, &pp);
3163 /* Read ACPI port */
3164 control=inw(port+0x10);
3166 /* Flip CLKRUN off while running */
3167 if(!card->active && old)
3169 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3170 "cs46xx: clkrun() enable clkrun - change=%d active=%d\n",
3171 change,card->active));
3172 outw(control|0x2000, port+0x10);
3177 * sometimes on a resume the bit is set, so always reset the bit.
3179 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3180 "cs46xx: clkrun() disable clkrun - change=%d active=%d\n",
3181 change,card->active));
3182 outw(control&~0x2000, port+0x10);
3187 static int cs_open(struct inode *inode, struct file *file)
3189 struct cs_card *card = (struct cs_card *)file->private_data;
3190 struct cs_state *state = NULL;
3191 struct dmabuf *dmabuf = NULL;
3192 struct list_head *entry;
3193 unsigned int minor = iminor(inode);
3197 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=%p %s %s\n",
3198 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3199 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3201 list_for_each(entry, &cs46xx_devs)
3203 card = list_entry(entry, struct cs_card, list);
3205 if (!((card->dev_audio ^ minor) & ~0xf))
3208 if (entry == &cs46xx_devs)
3211 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
3212 "cs46xx: cs_open(): Error - unable to find audio card struct\n"));
3217 * hardcode state[0] for capture, [1] for playback
3219 if(file->f_mode & FMODE_READ)
3221 CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
3222 if (card->states[0] == NULL) {
3223 state = card->states[0] = (struct cs_state *)
3224 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3227 memset(state, 0, sizeof(struct cs_state));
3228 init_MUTEX(&state->sem);
3229 dmabuf = &state->dmabuf;
3230 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3231 if(dmabuf->pbuf==NULL)
3234 card->states[0]=NULL;
3240 state = card->states[0];
3241 if(state->open_mode & FMODE_READ)
3244 dmabuf->channel = card->alloc_rec_pcm_channel(card);
3246 if (dmabuf->channel == NULL) {
3247 kfree (card->states[0]);
3248 card->states[0] = NULL;
3252 /* Now turn on external AMP if needed */
3254 state->card->active_ctrl(state->card,1);
3255 state->card->amplifier_ctrl(state->card,1);
3257 if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) )
3259 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3260 "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n",tmp) );
3264 dmabuf->channel->state = state;
3265 /* initialize the virtual channel */
3267 state->magic = CS_STATE_MAGIC;
3268 init_waitqueue_head(&dmabuf->wait);
3269 init_MUTEX(&state->open_sem);
3270 file->private_data = card;
3272 down(&state->open_sem);
3274 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3275 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3276 /dev/dspW will accept 16-bits sample */
3278 /* Default input is 8bit mono */
3279 dmabuf->fmt &= ~CS_FMT_MASK;
3280 dmabuf->type = CS_TYPE_ADC;
3281 dmabuf->ossfragshift = 0;
3282 dmabuf->ossmaxfrags = 0;
3283 dmabuf->subdivision = 0;
3284 cs_set_adc_rate(state, 8000);
3285 cs_set_divisor(dmabuf);
3287 state->open_mode |= FMODE_READ;
3288 up(&state->open_sem);
3290 if(file->f_mode & FMODE_WRITE)
3292 CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
3293 if (card->states[1] == NULL) {
3294 state = card->states[1] = (struct cs_state *)
3295 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3298 memset(state, 0, sizeof(struct cs_state));
3299 init_MUTEX(&state->sem);
3300 dmabuf = &state->dmabuf;
3301 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3302 if(dmabuf->pbuf==NULL)
3305 card->states[1]=NULL;
3311 state = card->states[1];
3312 if(state->open_mode & FMODE_WRITE)
3315 dmabuf->channel = card->alloc_pcm_channel(card);
3317 if (dmabuf->channel == NULL) {
3318 kfree (card->states[1]);
3319 card->states[1] = NULL;
3323 /* Now turn on external AMP if needed */
3325 state->card->active_ctrl(state->card,1);
3326 state->card->amplifier_ctrl(state->card,1);
3328 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) )
3330 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3331 "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n",tmp) );
3335 dmabuf->channel->state = state;
3336 /* initialize the virtual channel */
3338 state->magic = CS_STATE_MAGIC;
3339 init_waitqueue_head(&dmabuf->wait);
3340 init_MUTEX(&state->open_sem);
3341 file->private_data = card;
3343 down(&state->open_sem);
3345 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3346 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3347 /dev/dspW will accept 16-bits sample */
3349 /* Default output is 8bit mono. */
3350 dmabuf->fmt &= ~CS_FMT_MASK;
3351 dmabuf->type = CS_TYPE_DAC;
3352 dmabuf->ossfragshift = 0;
3353 dmabuf->ossmaxfrags = 0;
3354 dmabuf->subdivision = 0;
3355 cs_set_dac_rate(state, 8000);
3356 cs_set_divisor(dmabuf);
3358 state->open_mode |= FMODE_WRITE;
3359 up(&state->open_sem);
3360 if((ret = prog_dmabuf(state)))
3363 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n") );
3364 return nonseekable_open(inode, file);
3367 static int cs_release(struct inode *inode, struct file *file)
3369 struct cs_card *card = (struct cs_card *)file->private_data;
3370 struct dmabuf *dmabuf;
3371 struct cs_state *state;
3373 CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=%p %s %s\n",
3374 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3375 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3377 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
3381 state = card->states[1];
3384 if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) )
3386 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n") );
3387 dmabuf = &state->dmabuf;
3388 cs_clear_tail(state);
3389 drain_dac(state, file->f_flags & O_NONBLOCK);
3390 /* stop DMA state machine and free DMA buffers/channels */
3391 down(&state->open_sem);
3393 dealloc_dmabuf(state);
3394 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3395 free_page((unsigned long)state->dmabuf.pbuf);
3397 /* we're covered by the open_sem */
3398 up(&state->open_sem);
3399 state->card->states[state->virt] = NULL;
3400 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3402 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) )
3404 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3405 "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) );
3408 /* Now turn off external AMP if needed */
3409 state->card->amplifier_ctrl(state->card, -1);
3410 state->card->active_ctrl(state->card, -1);
3416 state = card->states[0];
3419 if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) )
3421 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n") );
3422 dmabuf = &state->dmabuf;
3423 down(&state->open_sem);
3425 dealloc_dmabuf(state);
3426 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3427 free_page((unsigned long)state->dmabuf.pbuf);
3429 /* we're covered by the open_sem */
3430 up(&state->open_sem);
3431 state->card->states[state->virt] = NULL;
3432 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3434 if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) )
3436 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3437 "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) );
3440 /* Now turn off external AMP if needed */
3441 state->card->amplifier_ctrl(state->card, -1);
3442 state->card->active_ctrl(state->card, -1);
3448 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n") );
3452 static void printpm(struct cs_card *s)
3454 CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
3455 CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
3456 (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
3457 CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
3458 s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
3459 CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
3460 s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
3461 CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
3462 s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
3463 CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
3464 s->pm.u32SSCR,s->pm.u32SRCSA));
3465 CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
3466 s->pm.u32DacASR,s->pm.u32AdcASR));
3467 CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
3468 s->pm.u32DacSR,s->pm.u32AdcSR));
3469 CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
3470 s->pm.u32MIDCR_Save));
3471 CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%x\n",
3472 s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
3473 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%x\n",
3474 s->pm.u32AC97_master_volume));
3475 CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%x\n",
3476 s->pm.u32AC97_headphone_volume));
3477 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%x\n",
3478 s->pm.u32AC97_master_volume_mono));
3479 CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%x\n",
3480 s->pm.u32AC97_pcm_out_volume));
3481 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %d\n",
3482 s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
3483 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %d\n",
3484 s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
3488 /****************************************************************************
3490 * Suspend - save the ac97 regs, mute the outputs and power down the part.
3492 ****************************************************************************/
3493 void cs46xx_ac97_suspend(struct cs_card *card)
3496 struct ac97_codec *dev=card->ac97_codec[0];
3499 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n"));
3503 stop_dac(card->states[1]);
3504 resync_dma_ptrs(card->states[1]);
3508 stop_adc(card->states[0]);
3509 resync_dma_ptrs(card->states[0]);
3512 for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3513 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3516 card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
3519 * Save the ac97 volume registers as well as the current powerdown state.
3520 * Now, mute the all the outputs (master, headphone, and mono), as well
3521 * as the PCM volume, in preparation for powering down the entire part.
3522 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
3523 (u8)BA0_AC97_MASTER_VOLUME);
3524 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
3525 (u8)BA0_AC97_HEADPHONE_VOLUME);
3526 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
3527 (u8)BA0_AC97_MASTER_VOLUME_MONO);
3528 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
3529 (u8)BA0_AC97_PCM_OUT_VOLUME);
3534 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
3535 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
3536 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
3537 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
3540 * save the registers that cause pops
3542 card->pm.u32AC97_powerdown = (u32)cs_ac97_get(dev, (u8)AC97_POWER_CONTROL);
3543 card->pm.u32AC97_general_purpose = (u32)cs_ac97_get(dev, (u8)BA0_AC97_GENERAL_PURPOSE);
3545 * And power down everything on the AC97 codec.
3546 * well, for now, only power down the DAC/ADC and MIXER VREFON components.
3547 * trouble with removing VREF.
3549 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
3550 CS_POWER_MIXVON, CS_TRUE )) )
3552 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3553 "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp) );
3556 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n"));
3559 /****************************************************************************
3561 * Resume - power up the part and restore its registers..
3563 ****************************************************************************/
3564 void cs46xx_ac97_resume(struct cs_card *card)
3567 struct ac97_codec *dev=card->ac97_codec[0];
3569 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()+\n"));
3572 * First, we restore the state of the general purpose register. This
3573 * contains the mic select (mic1 or mic2) and if we restore this after
3574 * we restore the mic volume/boost state and mic2 was selected at
3575 * suspend time, we will end up with a brief period of time where mic1
3576 * is selected with the volume/boost settings for mic2, causing
3577 * acoustic feedback. So we restore the general purpose register
3578 * first, thereby getting the correct mic selected before we restore
3579 * the mic volume/boost.
3581 cs_ac97_set(dev, (u8)BA0_AC97_GENERAL_PURPOSE,
3582 (u16)card->pm.u32AC97_general_purpose);
3584 * Now, while the outputs are still muted, restore the state of power
3587 cs_ac97_set(dev, (u8)BA0_AC97_POWERDOWN, (u16)card->pm.u32AC97_powerdown);
3588 mdelay(5 * cs_laptop_wait);
3590 * Restore just the first set of registers, from register number
3591 * 0x02 to the register number that ulHighestRegToRestore specifies.
3593 for( Count = 0x2, i=0;
3594 (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3595 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3598 cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]);
3601 /* Check if we have to init the amplifier */
3603 card->amp_init(card);
3605 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-\n"));
3609 static int cs46xx_restart_part(struct cs_card *card)
3611 struct dmabuf *dmabuf;
3612 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3613 printk( "cs46xx: cs46xx_restart_part()+\n"));
3616 dmabuf = &card->states[1]->dmabuf;
3618 resync_dma_ptrs(card->states[1]);
3619 cs_set_divisor(dmabuf);
3620 if(__prog_dmabuf(card->states[1]))
3622 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3623 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n"));
3626 cs_set_dac_rate(card->states[1], dmabuf->rate);
3630 dmabuf = &card->states[0]->dmabuf;
3632 resync_dma_ptrs(card->states[0]);
3633 cs_set_divisor(dmabuf);
3634 if(__prog_dmabuf(card->states[0]))
3636 CS_DBGOUT(CS_PM | CS_ERROR, 1,
3637 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n"));
3640 cs_set_adc_rate(card->states[0], dmabuf->rate);
3642 card->pm.flags |= CS46XX_PM_RESUMED;
3644 start_adc(card->states[0]);
3646 start_dac(card->states[1]);
3648 card->pm.flags |= CS46XX_PM_IDLE;
3649 card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED
3650 | CS46XX_PM_RESUMING | CS46XX_PM_RESUMED);
3652 wake_up(&card->states[0]->dmabuf.wait);
3654 wake_up(&card->states[1]->dmabuf.wait);
3656 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3657 printk( "cs46xx: cs46xx_restart_part()-\n"));
3662 static void cs461x_reset(struct cs_card *card);
3663 static void cs461x_proc_stop(struct cs_card *card);
3664 static int cs46xx_suspend(struct cs_card *card, u32 state)
3667 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3668 printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=%p\n",
3669 (unsigned)card->pm.flags,card));
3671 * check the current state, only suspend if IDLE
3673 if(!(card->pm.flags & CS46XX_PM_IDLE))
3675 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3676 printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n"));
3679 card->pm.flags &= ~CS46XX_PM_IDLE;
3680 card->pm.flags |= CS46XX_PM_SUSPENDING;
3682 card->active_ctrl(card,1);
3684 tmp = cs461x_peek(card, BA1_PFIE);
3687 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
3689 tmp = cs461x_peek(card, BA1_CIE);
3692 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
3695 * Stop playback DMA.
3697 tmp = cs461x_peek(card, BA1_PCTL);
3698 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
3703 tmp = cs461x_peek(card, BA1_CCTL);
3704 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
3708 card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr;
3709 card->pm.dmabuf_count_play = card->states[1]->dmabuf.count;
3713 card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr;
3714 card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count;
3717 cs46xx_ac97_suspend(card);
3720 * Reset the processor.
3724 cs461x_proc_stop(card);
3727 * Power down the DAC and ADC. For now leave the other areas on.
3729 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x0300);
3732 * Power down the PLL.
3734 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
3737 * Turn off the Processor by turning off the software clock enable flag in
3738 * the clock control register.
3740 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
3741 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
3743 card->active_ctrl(card,-1);
3745 card->pm.flags &= ~CS46XX_PM_SUSPENDING;
3746 card->pm.flags |= CS46XX_PM_SUSPENDED;
3750 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3751 printk("cs46xx: cs46xx_suspend()- flags=0x%x\n",
3752 (unsigned)card->pm.flags));
3756 static int cs46xx_resume(struct cs_card *card)
3760 CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3761 printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n",
3762 (unsigned)card->pm.flags));
3763 if(!(card->pm.flags & CS46XX_PM_SUSPENDED))
3765 CS_DBGOUT(CS_PM | CS_ERROR, 2,
3766 printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n"));
3769 card->pm.flags |= CS46XX_PM_RESUMING;
3770 card->pm.flags &= ~CS46XX_PM_SUSPENDED;
3772 card->active_ctrl(card, 1);
3776 if (cs_hardware_init(card) != 0)
3778 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3779 "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n"));
3780 mdelay(10 * cs_laptop_wait);
3788 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
3789 "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i));
3793 if(cs46xx_restart_part(card))
3795 CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3796 "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n"));
3799 card->active_ctrl(card, -1);
3801 CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_resume()- flags=0x%x\n",
3802 (unsigned)card->pm.flags));
3806 static /*const*/ struct file_operations cs461x_fops = {
3807 CS_OWNER CS_THIS_MODULE
3808 .llseek = no_llseek,
3815 .release = cs_release,
3818 /* Write AC97 codec registers */
3821 static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg)
3823 struct cs_card *card = dev->private_data;
3829 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3830 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3831 * 3. Write ACCTL = Control Register = 460h for initiating the write
3832 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
3833 * 5. if DCV not cleared, break and return error
3834 * 6. Read ACSTS = Status Register = 464h, check VSTS bit
3837 cs461x_peekBA0(card, BA0_ACSDA);
3840 * Setup the AC97 control registers on the CS461x to send the
3841 * appropriate command to the AC97 to perform the read.
3842 * ACCAD = Command Address Register = 46Ch
3843 * ACCDA = Command Data Register = 470h
3844 * ACCTL = Control Register = 460h
3845 * set DCV - will clear when process completed
3846 * set CRW - Read command
3847 * set VFRM - valid frame enabled
3848 * set ESYN - ASYNC generation enabled
3849 * set RSTN - ARST# inactive, AC97 codec not reset
3852 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3853 cs461x_pokeBA0(card, BA0_ACCDA, 0);
3854 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
3855 ACCTL_VFRM | ACCTL_ESYN |
3860 * Wait for the read to occur.
3862 if(!(card->pm.flags & CS46XX_PM_IDLE))
3865 loopcnt = 500 * cs_laptop_wait;
3866 loopcnt *= cs_laptop_wait;
3867 for (count = 0; count < loopcnt; count++) {
3869 * First, we want to wait for a short time.
3871 udelay(10 * cs_laptop_wait);
3873 * Now, check to see if the read has completed.
3874 * ACCTL = 460h, DCV should be reset by now and 460h = 17h
3876 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3881 * Make sure the read completed.
3883 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
3884 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
3885 "cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffff\n", reg));
3890 * Wait for the valid status bit to go active.
3893 if(!(card->pm.flags & CS46XX_PM_IDLE))
3897 loopcnt *= cs_laptop_wait;
3898 for (count = 0; count < loopcnt; count++) {
3900 * Read the AC97 status register.
3901 * ACSTS = Status Register = 464h
3902 * VSTS - Valid Status
3904 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
3906 udelay(10 * cs_laptop_wait);
3910 * Make sure we got valid status.
3912 if (!( (tmp=cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) {
3913 CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING
3914 "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n",
3920 * Read the data returned from the AC97 register.
3921 * ACSDA = Status Data Register = 474h
3923 CS_DBGOUT(CS_FUNCTION, 9, printk(KERN_INFO
3924 "cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n",
3925 reg, cs461x_peekBA0(card, BA0_ACSDA),
3926 cs461x_peekBA0(card, BA0_ACCAD)));
3927 ret = cs461x_peekBA0(card, BA0_ACSDA);
3931 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
3934 struct cs_card *card = dev->private_data;
3936 spin_lock(&card->ac97_lock);
3937 ret = _cs_ac97_get(dev, reg);
3938 spin_unlock(&card->ac97_lock);
3942 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
3944 struct cs_card *card = dev->private_data;
3948 spin_lock(&card->ac97_lock);
3950 if(reg == AC97_CD_VOL)
3952 val2 = _cs_ac97_get(dev, AC97_CD_VOL);
3957 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3958 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3959 * 3. Write ACCTL = Control Register = 460h for initiating the write
3960 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
3961 * 5. if DCV not cleared, break and return error
3965 * Setup the AC97 control registers on the CS461x to send the
3966 * appropriate command to the AC97 to perform the read.
3967 * ACCAD = Command Address Register = 46Ch
3968 * ACCDA = Command Data Register = 470h
3969 * ACCTL = Control Register = 460h
3970 * set DCV - will clear when process completed
3971 * reset CRW - Write command
3972 * set VFRM - valid frame enabled
3973 * set ESYN - ASYNC generation enabled
3974 * set RSTN - ARST# inactive, AC97 codec not reset
3976 cs461x_pokeBA0(card, BA0_ACCAD, reg);
3977 cs461x_pokeBA0(card, BA0_ACCDA, val);
3978 cs461x_peekBA0(card, BA0_ACCTL);
3979 cs461x_pokeBA0(card, BA0_ACCTL, 0 | ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
3980 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
3981 ACCTL_ESYN | ACCTL_RSTN);
3982 for (count = 0; count < 1000; count++) {
3984 * First, we want to wait for a short time.
3986 udelay(10 * cs_laptop_wait);
3988 * Now, check to see if the write has completed.
3989 * ACCTL = 460h, DCV should be reset by now and 460h = 07h
3991 if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3995 * Make sure the write completed.
3997 if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV)
3999 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4000 "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val));
4003 spin_unlock(&card->ac97_lock);
4006 * Adjust power if the mixer is selected/deselected according
4009 * IF the CD is a valid input source (mixer or direct) AND
4010 * the CD is not muted THEN power is needed
4012 * We do two things. When record select changes the input to
4013 * add/remove the CD we adjust the power count if the CD is
4016 * When the CD mute changes we adjust the power level if the
4017 * CD was a valid input.
4019 * We also check for CD volume != 0, as the CD mute isn't
4020 * normally tweaked from userspace.
4023 /* CD mute change ? */
4025 if(reg==AC97_CD_VOL)
4027 /* Mute bit change ? */
4028 if((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val))
4030 /* This is a hack but its cleaner than the alternatives.
4031 Right now card->ac97_codec[0] might be NULL as we are
4032 still doing codec setup. This does an early assignment
4033 to avoid the problem if it occurs */
4035 if(card->ac97_codec[0]==NULL)
4036 card->ac97_codec[0]=dev;
4039 if(val&0x8000 || val == 0x1f1f)
4040 card->amplifier_ctrl(card, -1);
4041 else /* Mute off power on */
4044 card->amp_init(card);
4045 card->amplifier_ctrl(card, 1);
4052 /* OSS /dev/mixer file operation methods */
4054 static int cs_open_mixdev(struct inode *inode, struct file *file)
4057 unsigned int minor = iminor(inode);
4058 struct cs_card *card=NULL;
4059 struct list_head *entry;
4062 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4063 printk(KERN_INFO "cs46xx: cs_open_mixdev()+\n"));
4065 list_for_each(entry, &cs46xx_devs)
4067 card = list_entry(entry, struct cs_card, list);
4068 for (i = 0; i < NR_AC97; i++)
4069 if (card->ac97_codec[i] != NULL &&
4070 card->ac97_codec[i]->dev_mixer == minor)
4075 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4076 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4080 if(!card->ac97_codec[i])
4082 file->private_data = card->ac97_codec[i];
4084 card->active_ctrl(card,1);
4085 if(!CS_IN_USE(&card->mixer_use_cnt))
4087 if( (tmp = cs46xx_powerup(card, CS_POWER_MIXVON )) )
4089 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4090 "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n",tmp) );
4094 card->amplifier_ctrl(card, 1);
4095 CS_INC_USE_COUNT(&card->mixer_use_cnt);
4096 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4097 printk(KERN_INFO "cs46xx: cs_open_mixdev()- 0\n"));
4098 return nonseekable_open(inode, file);
4101 static int cs_release_mixdev(struct inode *inode, struct file *file)
4103 unsigned int minor = iminor(inode);
4104 struct cs_card *card=NULL;
4105 struct list_head *entry;
4109 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4110 printk(KERN_INFO "cs46xx: cs_release_mixdev()+\n"));
4111 list_for_each(entry, &cs46xx_devs)
4113 card = list_entry(entry, struct cs_card, list);
4114 for (i = 0; i < NR_AC97; i++)
4115 if (card->ac97_codec[i] != NULL &&
4116 card->ac97_codec[i]->dev_mixer == minor)
4121 CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4122 printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4126 if(!CS_DEC_AND_TEST(&card->mixer_use_cnt))
4128 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4129 printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n"));
4130 card->active_ctrl(card, -1);
4131 card->amplifier_ctrl(card, -1);
4135 * ok, no outstanding mixer opens, so powerdown.
4137 if( (tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE )) )
4139 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4140 "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n",tmp) );
4141 card->active_ctrl(card, -1);
4142 card->amplifier_ctrl(card, -1);
4145 card->active_ctrl(card, -1);
4146 card->amplifier_ctrl(card, -1);
4147 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4148 printk(KERN_INFO "cs46xx: cs_release_mixdev()- 0\n"));
4152 void __exit cs46xx_cleanup_module(void);
4153 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4156 struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
4157 struct cs_card *card=NULL;
4158 struct list_head *entry;
4159 unsigned long __user *p = (long __user *)arg;
4161 #if CSDEBUG_INTERFACE
4164 if( (cmd == SOUND_MIXER_CS_GETDBGMASK) ||
4165 (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
4166 (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
4167 (cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
4168 (cmd == SOUND_MIXER_CS_APM))
4173 case SOUND_MIXER_CS_GETDBGMASK:
4174 return put_user(cs_debugmask, p);
4176 case SOUND_MIXER_CS_GETDBGLEVEL:
4177 return put_user(cs_debuglevel, p);
4179 case SOUND_MIXER_CS_SETDBGMASK:
4180 if (get_user(val, p))
4185 case SOUND_MIXER_CS_SETDBGLEVEL:
4186 if (get_user(val, p))
4188 cs_debuglevel = val;
4191 case SOUND_MIXER_CS_APM:
4192 if (get_user(val, p))
4194 if(val == CS_IOCTL_CMD_SUSPEND)
4196 list_for_each(entry, &cs46xx_devs)
4198 card = list_entry(entry, struct cs_card, list);
4199 cs46xx_suspend(card, 0);
4203 else if(val == CS_IOCTL_CMD_RESUME)
4205 list_for_each(entry, &cs46xx_devs)
4207 card = list_entry(entry, struct cs_card, list);
4208 cs46xx_resume(card);
4213 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4214 "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n",
4220 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4221 "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n") );
4226 return codec->mixer_ioctl(codec, cmd, arg);
4229 static /*const*/ struct file_operations cs_mixer_fops = {
4230 CS_OWNER CS_THIS_MODULE
4231 .llseek = no_llseek,
4232 .ioctl = cs_ioctl_mixdev,
4233 .open = cs_open_mixdev,
4234 .release = cs_release_mixdev,
4237 /* AC97 codec initialisation. */
4238 static int __init cs_ac97_init(struct cs_card *card)
4242 struct ac97_codec *codec;
4245 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4246 "cs46xx: cs_ac97_init()+\n") );
4248 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4249 if ((codec = ac97_alloc_codec()) == NULL)
4252 /* initialize some basic codec information, other fields will be filled
4253 in ac97_probe_codec */
4254 codec->private_data = card;
4255 codec->id = num_ac97;
4257 codec->codec_read = cs_ac97_get;
4258 codec->codec_write = cs_ac97_set;
4260 if (ac97_probe_codec(codec) == 0)
4262 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4263 "cs46xx: cs_ac97_init()- codec number %d not found\n",
4265 card->ac97_codec[num_ac97] = NULL;
4268 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4269 "cs46xx: cs_ac97_init() found codec %d\n",num_ac97) );
4271 eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
4275 printk(KERN_WARNING "cs46xx: codec %d not present\n",num_ac97);
4276 ac97_release_codec(codec);
4280 card->ac97_features = eid;
4282 if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
4283 printk(KERN_ERR "cs46xx: couldn't register mixer!\n");
4284 ac97_release_codec(codec);
4287 card->ac97_codec[num_ac97] = codec;
4289 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4290 "cs46xx: cs_ac97_init() ac97_codec[%d] set to %p\n",
4291 (unsigned int)num_ac97,
4293 /* if there is no secondary codec at all, don't probe any more */
4300 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4301 "cs46xx: cs_ac97_init()- %d\n", (unsigned int)num_ac97));
4306 * load the static image into the DSP
4308 #include "cs461x_image.h"
4309 static void cs461x_download_image(struct cs_card *card)
4311 unsigned i, j, temp1, temp2, offset, count;
4312 unsigned char __iomem *pBA1 = ioremap(card->ba1_addr, 0x40000);
4313 for( i=0; i < CLEAR__COUNT; i++)
4315 offset = ClrStat[i].BA1__DestByteOffset;
4316 count = ClrStat[i].BA1__SourceSize;
4317 for( temp1 = offset; temp1<(offset+count); temp1+=4 )
4318 writel(0, pBA1+temp1);
4321 for(i=0; i<FILL__COUNT; i++)
4323 temp2 = FillStat[i].Offset;
4324 for(j=0; j<(FillStat[i].Size)/4; j++)
4326 temp1 = (FillStat[i]).pFill[j];
4327 writel(temp1, pBA1+temp2+j*4);
4338 static void cs461x_reset(struct cs_card *card)
4343 * Write the reset bit of the SP control register.
4345 cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
4348 * Write the control register.
4350 cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
4353 * Clear the trap registers.
4355 for (idx = 0; idx < 8; idx++) {
4356 cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
4357 cs461x_poke(card, BA1_TWPR, 0xFFFF);
4359 cs461x_poke(card, BA1_DREG, 0);
4362 * Set the frame timer to reflect the number of cycles per frame.
4364 cs461x_poke(card, BA1_FRMT, 0xadf);
4367 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type)
4369 int idx, loop, startfifo=0, endfifo=0, powerdown1 = 0;
4373 * See if the devices are powered down. If so, we must power them up first
4374 * or they will not respond.
4376 if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
4377 cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
4382 * We want to clear out the serial port FIFOs so we don't end up playing
4383 * whatever random garbage happens to be in them. We fill the sample FIFOS
4384 * with zero (silence).
4386 cs461x_pokeBA0(card, BA0_SERBWP, 0);
4389 * Check for which FIFO locations to clear, if we are currently
4390 * playing or capturing then we don't want to put in 128 bytes of
4393 if(type & CS_TYPE_DAC)
4398 if(type & CS_TYPE_ADC)
4405 * Fill sample FIFO locations (256 locations total).
4407 for (idx = startfifo; idx < endfifo; idx++) {
4409 * Make sure the previous FIFO write operation has completed.
4411 for (loop = 0; loop < 5; loop++) {
4413 if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
4416 if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
4418 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4421 * Write the serial port FIFO index.
4423 cs461x_pokeBA0(card, BA0_SERBAD, idx);
4425 * Tell the serial port to load the new value into the FIFO location.
4427 cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
4430 * Now, if we powered up the devices, then power them back down again.
4431 * This is kinda ugly, but should never happen.
4434 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4438 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag)
4441 unsigned int tmp=0,muted=0;
4443 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4444 "cs46xx: cs461x_powerdown()+ type=0x%x\n",type));
4445 if(!cs_powerdown && !suspendflag)
4447 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4448 "cs46xx: cs461x_powerdown() DISABLED exiting\n"));
4451 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4452 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4453 "cs46xx: cs461x_powerdown() powerdown reg=0x%x\n",tmp));
4455 * if powering down only the VREF, and not powering down the DAC/ADC,
4456 * then do not power down the VREF, UNLESS both the DAC and ADC are not
4457 * currently powered down. If powering down DAC and ADC, then
4458 * it is possible to power down the VREF (ON).
4460 if ( ((type & CS_POWER_MIXVON) &&
4461 (!(type & CS_POWER_ADC) || (!(type & CS_POWER_DAC))) )
4463 ((tmp & CS_AC97_POWER_CONTROL_ADC_ON) ||
4464 (tmp & CS_AC97_POWER_CONTROL_DAC_ON) ) )
4466 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4467 "cs46xx: cs461x_powerdown()- 0 unable to powerdown. tmp=0x%x\n",tmp));
4471 * for now, always keep power to the mixer block.
4472 * not sure why it's a problem but it seems to be if we power off.
4474 type &= ~CS_POWER_MIXVON;
4475 type &= ~CS_POWER_MIXVOFF;
4478 * Power down indicated areas.
4480 if(type & CS_POWER_MIXVOFF)
4483 CS_DBGOUT(CS_FUNCTION, 4,
4484 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVOFF\n"));
4486 * Power down the MIXER (VREF ON) on the AC97 card.
4488 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4489 if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4493 cs_mute(card, CS_TRUE);
4496 tmp |= CS_AC97_POWER_CONTROL_MIXVOFF;
4497 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4499 * Now, we wait until we sample a ready state.
4501 for (count = 0; count < 32; count++) {
4503 * First, lets wait a short while to let things settle out a
4504 * bit, and to prevent retrying the read too quickly.
4509 * Read the current state of the power control register.
4511 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4512 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4517 * Check the status..
4519 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4520 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4522 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4523 "cs46xx: powerdown MIXVOFF failed\n"));
4528 if(type & CS_POWER_MIXVON)
4531 CS_DBGOUT(CS_FUNCTION, 4,
4532 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVON\n"));
4534 * Power down the MIXER (VREF ON) on the AC97 card.
4536 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4537 if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)
4541 cs_mute(card, CS_TRUE);
4544 tmp |= CS_AC97_POWER_CONTROL_MIXVON;
4545 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4547 * Now, we wait until we sample a ready state.
4549 for (count = 0; count < 32; count++) {
4551 * First, lets wait a short while to let things settle out a
4552 * bit, and to prevent retrying the read too quickly.
4557 * Read the current state of the power control register.
4559 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4560 CS_AC97_POWER_CONTROL_MIXVON_ON))
4565 * Check the status..
4567 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4568 CS_AC97_POWER_CONTROL_MIXVON_ON)
4570 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4571 "cs46xx: powerdown MIXVON failed\n"));
4576 if(type & CS_POWER_ADC)
4579 * Power down the ADC on the AC97 card.
4581 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADC\n"));
4582 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4583 if (tmp & CS_AC97_POWER_CONTROL_ADC_ON)
4587 cs_mute(card, CS_TRUE);
4590 tmp |= CS_AC97_POWER_CONTROL_ADC;
4591 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4594 * Now, we wait until we sample a ready state.
4596 for (count = 0; count < 32; count++) {
4598 * First, lets wait a short while to let things settle out a
4599 * bit, and to prevent retrying the read too quickly.
4604 * Read the current state of the power control register.
4606 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4607 CS_AC97_POWER_CONTROL_ADC_ON))
4612 * Check the status..
4614 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4615 CS_AC97_POWER_CONTROL_ADC_ON)
4617 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4618 "cs46xx: powerdown ADC failed\n"));
4623 if(type & CS_POWER_DAC)
4626 * Power down the DAC on the AC97 card.
4629 CS_DBGOUT(CS_FUNCTION, 4,
4630 printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DAC\n"));
4631 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4632 if (tmp & CS_AC97_POWER_CONTROL_DAC_ON)
4636 cs_mute(card, CS_TRUE);
4639 tmp |= CS_AC97_POWER_CONTROL_DAC;
4640 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4642 * Now, we wait until we sample a ready state.
4644 for (count = 0; count < 32; count++) {
4646 * First, lets wait a short while to let things settle out a
4647 * bit, and to prevent retrying the read too quickly.
4652 * Read the current state of the power control register.
4654 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4655 CS_AC97_POWER_CONTROL_DAC_ON))
4660 * Check the status..
4662 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4663 CS_AC97_POWER_CONTROL_DAC_ON)
4665 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4666 "cs46xx: powerdown DAC failed\n"));
4671 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4673 cs_mute(card, CS_FALSE);
4674 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4675 "cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp));
4679 static int cs46xx_powerup(struct cs_card *card, unsigned int type)
4682 unsigned int tmp=0,muted=0;
4684 CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4685 "cs46xx: cs46xx_powerup()+ type=0x%x\n",type));
4687 * check for VREF and powerup if need to.
4689 if(type & CS_POWER_MIXVON)
4690 type |= CS_POWER_MIXVOFF;
4691 if(type & (CS_POWER_DAC | CS_POWER_ADC))
4692 type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF;
4695 * Power up indicated areas.
4697 if(type & CS_POWER_MIXVOFF)
4700 CS_DBGOUT(CS_FUNCTION, 4,
4701 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFF\n"));
4703 * Power up the MIXER (VREF ON) on the AC97 card.
4705 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4706 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4710 cs_mute(card, CS_TRUE);
4713 tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF;
4714 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4716 * Now, we wait until we sample a ready state.
4718 for (count = 0; count < 32; count++) {
4720 * First, lets wait a short while to let things settle out a
4721 * bit, and to prevent retrying the read too quickly.
4726 * Read the current state of the power control register.
4728 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4729 CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4734 * Check the status..
4736 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4737 CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4739 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4740 "cs46xx: powerup MIXVOFF failed\n"));
4745 if(type & CS_POWER_MIXVON)
4748 CS_DBGOUT(CS_FUNCTION, 4,
4749 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVON\n"));
4751 * Power up the MIXER (VREF ON) on the AC97 card.
4753 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4754 if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON))
4758 cs_mute(card, CS_TRUE);
4761 tmp &= ~CS_AC97_POWER_CONTROL_MIXVON;
4762 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4764 * Now, we wait until we sample a ready state.
4766 for (count = 0; count < 32; count++) {
4768 * First, lets wait a short while to let things settle out a
4769 * bit, and to prevent retrying the read too quickly.
4774 * Read the current state of the power control register.
4776 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4777 CS_AC97_POWER_CONTROL_MIXVON_ON)
4782 * Check the status..
4784 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4785 CS_AC97_POWER_CONTROL_MIXVON_ON))
4787 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4788 "cs46xx: powerup MIXVON failed\n"));
4793 if(type & CS_POWER_ADC)
4796 * Power up the ADC on the AC97 card.
4798 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADC\n"));
4799 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4800 if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON))
4804 cs_mute(card, CS_TRUE);
4807 tmp &= ~CS_AC97_POWER_CONTROL_ADC;
4808 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4811 * Now, we wait until we sample a ready state.
4813 for (count = 0; count < 32; count++) {
4815 * First, lets wait a short while to let things settle out a
4816 * bit, and to prevent retrying the read too quickly.
4821 * Read the current state of the power control register.
4823 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4824 CS_AC97_POWER_CONTROL_ADC_ON)
4829 * Check the status..
4831 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4832 CS_AC97_POWER_CONTROL_ADC_ON))
4834 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4835 "cs46xx: powerup ADC failed\n"));
4840 if(type & CS_POWER_DAC)
4843 * Power up the DAC on the AC97 card.
4846 CS_DBGOUT(CS_FUNCTION, 4,
4847 printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DAC\n"));
4848 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4849 if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON))
4853 cs_mute(card, CS_TRUE);
4856 tmp &= ~CS_AC97_POWER_CONTROL_DAC;
4857 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4859 * Now, we wait until we sample a ready state.
4861 for (count = 0; count < 32; count++) {
4863 * First, lets wait a short while to let things settle out a
4864 * bit, and to prevent retrying the read too quickly.
4869 * Read the current state of the power control register.
4871 if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4872 CS_AC97_POWER_CONTROL_DAC_ON)
4877 * Check the status..
4879 if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4880 CS_AC97_POWER_CONTROL_DAC_ON))
4882 CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4883 "cs46xx: powerup DAC failed\n"));
4888 tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4890 cs_mute(card, CS_FALSE);
4891 CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4892 "cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp));
4897 static void cs461x_proc_start(struct cs_card *card)
4902 * Set the frame timer to reflect the number of cycles per frame.
4904 cs461x_poke(card, BA1_FRMT, 0xadf);
4906 * Turn on the run, run at frame, and DMA enable bits in the local copy of
4907 * the SP control register.
4909 cs461x_poke(card, BA1_SPCR, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
4911 * Wait until the run at frame bit resets itself in the SP control
4914 for (cnt = 0; cnt < 25; cnt++) {
4916 if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
4920 if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
4921 printk(KERN_WARNING "cs46xx: SPCR_RUNFR never reset\n");
4924 static void cs461x_proc_stop(struct cs_card *card)
4927 * Turn off the run, run at frame, and DMA enable bits in the local copy of
4928 * the SP control register.
4930 cs461x_poke(card, BA1_SPCR, 0);
4933 static int cs_hardware_init(struct cs_card *card)
4935 unsigned long end_time;
4936 unsigned int tmp,count;
4938 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4939 "cs46xx: cs_hardware_init()+\n") );
4941 * First, blast the clock control register to zero so that the PLL starts
4942 * out in a known state, and blast the master serial port control register
4943 * to zero so that the serial ports also start out in a known state.
4945 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
4946 cs461x_pokeBA0(card, BA0_SERMC1, 0);
4949 * If we are in AC97 mode, then we must set the part to a host controlled
4950 * AC-link. Otherwise, we won't be able to bring up the link.
4952 cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03); /* 1.03 card */
4953 /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
4956 * Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
4957 * spec) and then drive it high. This is done for non AC97 modes since
4958 * there might be logic external to the CS461x that uses the ARST# line
4961 cs461x_pokeBA0(card, BA0_ACCTL, 1);
4963 cs461x_pokeBA0(card, BA0_ACCTL, 0);
4965 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
4968 * The first thing we do here is to enable sync generation. As soon
4969 * as we start receiving bit clock, we'll start producing the SYNC
4972 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
4975 * Now wait for a short while to allow the AC97 part to start
4976 * generating bit clock (so we don't try to start the PLL without an
4979 mdelay(5 * cs_laptop_wait); /* 1 should be enough ?? (and pigs might fly) */
4982 * Set the serial port timing configuration, so that
4983 * the clock control circuit gets its clock from the correct place.
4985 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
4988 * The part seems to not be ready for a while after a resume.
4989 * so, if we are resuming, then wait for 700 mils. Note that 600 mils
4990 * is not enough for some platforms! tested on an IBM Thinkpads and
4993 if(!(card->pm.flags & CS46XX_PM_IDLE))
4996 * Write the selected clock control setup to the hardware. Do not turn on
4997 * SWCE yet (if requested), so that the devices clocked by the output of
4998 * PLL are not clocked until the PLL is stable.
5000 cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
5001 cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
5002 cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
5007 cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
5010 * Wait until the PLL has stabilized.
5012 mdelay(5 * cs_laptop_wait); /* Again 1 should be enough ?? */
5015 * Turn on clocking of the core so that we can setup the serial ports.
5017 tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
5018 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5021 * Fill the serial port FIFOs with silence.
5023 cs461x_clear_serial_FIFOs(card,CS_TYPE_DAC | CS_TYPE_ADC);
5026 * Set the serial port FIFO pointer to the first sample in the FIFO.
5028 /* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
5031 * Write the serial port configuration to the part. The master
5032 * enable bit is not set until all other values have been written.
5034 cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
5035 cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
5036 cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
5039 mdelay(5 * cs_laptop_wait); /* Shouldnt be needed ?? */
5042 * If we are resuming under 2.2.x then we can not schedule a timeout.
5043 * so, just spin the CPU.
5045 if(card->pm.flags & CS46XX_PM_IDLE)
5048 * Wait for the card ready signal from the AC97 card.
5050 end_time = jiffies + 3 * (HZ >> 2);
5053 * Read the AC97 status register to see if we've seen a CODEC READY
5054 * signal from the AC97 card.
5056 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5058 current->state = TASK_UNINTERRUPTIBLE;
5059 schedule_timeout(1);
5060 } while (time_before(jiffies, end_time));
5064 for (count = 0; count < 100; count++) {
5065 // First, we want to wait for a short time.
5066 udelay(25 * cs_laptop_wait);
5068 if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5074 * Make sure CODEC is READY.
5076 if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
5077 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5078 "cs46xx: create - never read card ready from AC'97\n"));
5079 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5080 "cs46xx: probably not a bug, try using the CS4232 driver,\n"));
5081 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5082 "cs46xx: or turn off any automatic Power Management support in the BIOS.\n"));
5087 * Assert the vaid frame signal so that we can start sending commands
5090 cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
5092 if(card->pm.flags & CS46XX_PM_IDLE)
5095 * Wait until we've sampled input slots 3 and 4 as valid, meaning that
5096 * the card is pumping ADC data across the AC-link.
5098 end_time = jiffies + 3 * (HZ >> 2);
5101 * Read the input slot valid register and see if input slots 3 and
5104 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5106 current->state = TASK_UNINTERRUPTIBLE;
5107 schedule_timeout(1);
5108 } while (time_before(jiffies, end_time));
5112 for (count = 0; count < 100; count++) {
5113 // First, we want to wait for a short time.
5114 udelay(25 * cs_laptop_wait);
5116 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5121 * Make sure input slots 3 and 4 are valid. If not, then return
5124 if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
5125 printk(KERN_WARNING "cs46xx: create - never read ISV3 & ISV4 from AC'97\n");
5130 * Now, assert valid frame and the slot 3 and 4 valid bits. This will
5131 * commense the transfer of digital audio data to the AC97 card.
5133 cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
5136 * Turn off the Processor by turning off the software clock enable flag in
5137 * the clock control register.
5139 /* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
5140 /* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
5143 * Reset the processor.
5148 * Download the image to the processor.
5151 cs461x_download_image(card);
5154 * Stop playback DMA.
5156 tmp = cs461x_peek(card, BA1_PCTL);
5157 card->pctl = tmp & 0xffff0000;
5158 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5163 tmp = cs461x_peek(card, BA1_CCTL);
5164 card->cctl = tmp & 0x0000ffff;
5165 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5167 /* initialize AC97 codec and register /dev/mixer */
5168 if(card->pm.flags & CS46XX_PM_IDLE)
5170 if (cs_ac97_init(card) <= 0)
5172 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5173 "cs46xx: cs_ac97_init() failure\n") );
5179 cs46xx_ac97_resume(card);
5182 cs461x_proc_start(card);
5185 * Enable interrupts on the part.
5187 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
5189 tmp = cs461x_peek(card, BA1_PFIE);
5191 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt enable */
5193 tmp = cs461x_peek(card, BA1_CIE);
5196 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt enable */
5199 * If IDLE then Power down the part. We will power components up
5200 * when we need them.
5202 if(card->pm.flags & CS46XX_PM_IDLE)
5206 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC |
5207 CS_POWER_MIXVON )) )
5209 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5210 "cs46xx: cs461x_powerup() failure (0x%x)\n",tmp) );
5216 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5217 CS_POWER_MIXVON, CS_FALSE )) )
5219 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5220 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5225 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
5226 "cs46xx: cs_hardware_init()- 0\n"));
5230 /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered
5231 until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
5242 void (*amp)(struct cs_card *, int);
5243 void (*amp_init)(struct cs_card *);
5244 void (*active)(struct cs_card *, int);
5247 static struct cs_card_type cards[] = {
5251 .name = "Genius Soundmaker 128 value",
5263 .name = "Mitac MI6020/21",
5269 .name = "Hercules Game Theatre XP",
5270 .amp = amp_hercules,
5275 .name = "Hercules Game Theatre XP",
5276 .amp = amp_hercules,
5281 .name = "Hercules Game Theatre XP",
5282 .amp = amp_hercules,
5287 .name = "Hercules Game Theatre XP",
5288 .amp = amp_hercules,
5293 .name = "Hercules Game Theatre XP",
5294 .amp = amp_hercules,
5299 .name = "Hercules Game Theatre XP",
5300 .amp = amp_hercules,
5305 .name = "Hercules Fortissimo II",
5308 /* Not sure if the 570 needs the clkrun hack */
5310 .vendor = PCI_VENDOR_ID_IBM,
5312 .name = "Thinkpad 570",
5314 .active = clkrun_hack,
5317 .vendor = PCI_VENDOR_ID_IBM,
5319 .name = "Thinkpad 600X/A20/T20",
5321 .active = clkrun_hack,
5324 .vendor = PCI_VENDOR_ID_IBM,
5326 .name = "Thinkpad 600E (unsupported)",
5329 .name = "Card without SSID set",
5334 MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
5335 MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
5336 MODULE_LICENSE("GPL");
5339 static const char cs46xx_banner[] = KERN_INFO "Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION "." CS46XX_MINOR_VERSION "." CS46XX_ARCH ", " __TIME__ " " __DATE__ "\n";
5340 static const char fndmsg[] = KERN_INFO "cs46xx: Found %d audio device(s).\n";
5342 static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
5343 const struct pci_device_id *pciid)
5345 struct pm_dev *pmdev;
5347 u16 ss_card, ss_vendor;
5348 struct cs_card *card;
5349 dma_addr_t dma_mask;
5350 struct cs_card_type *cp = &cards[0];
5352 CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
5353 printk(KERN_INFO "cs46xx: probe()+\n"));
5355 dma_mask = 0xffffffff; /* this enables playback and recording */
5356 if (pci_enable_device(pci_dev)) {
5357 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
5358 "cs46xx: pci_enable_device() failed\n"));
5361 if (!RSRCISMEMORYREGION(pci_dev, 0) ||
5362 !RSRCISMEMORYREGION(pci_dev, 1)) {
5363 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5364 "cs46xx: probe()- Memory region not assigned\n"));
5367 if (pci_dev->irq == 0) {
5368 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5369 "cs46xx: probe() IRQ not assigned\n"));
5372 if (!pci_dma_supported(pci_dev, 0xffffffff)) {
5373 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5374 "cs46xx: probe() architecture does not support 32bit PCI busmaster DMA\n"));
5377 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
5378 pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
5380 if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
5381 printk(KERN_ERR "cs46xx: out of memory\n");
5384 memset(card, 0, sizeof(*card));
5385 card->ba0_addr = RSRCADDRESS(pci_dev, 0);
5386 card->ba1_addr = RSRCADDRESS(pci_dev, 1);
5387 card->pci_dev = pci_dev;
5388 card->irq = pci_dev->irq;
5389 card->magic = CS_CARD_MAGIC;
5390 spin_lock_init(&card->lock);
5391 spin_lock_init(&card->ac97_lock);
5393 pci_set_master(pci_dev);
5395 printk(cs46xx_banner);
5396 printk(KERN_INFO "cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %d\n",
5397 card->ba0_addr, card->ba1_addr, card->irq);
5399 card->alloc_pcm_channel = cs_alloc_pcm_channel;
5400 card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
5401 card->free_pcm_channel = cs_free_pcm_channel;
5402 card->amplifier_ctrl = amp_none;
5403 card->active_ctrl = amp_none;
5407 if(cp->vendor == ss_vendor && cp->id == ss_card)
5409 card->amplifier_ctrl = cp->amp;
5411 card->active_ctrl = cp->active;
5413 card->amp_init = cp->amp_init;
5420 printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5421 ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5425 printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5426 cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5429 if (card->amplifier_ctrl==NULL)
5431 card->amplifier_ctrl = amp_none;
5432 card->active_ctrl = clkrun_hack;
5435 if (external_amp == 1)
5437 printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.\n");
5438 card->amplifier_ctrl = amp_voyetra;
5443 printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.\n");
5444 card->active_ctrl = clkrun_hack;
5447 * The thinkpads don't work well without runtime updating on their kernel
5448 * delay values (or any laptop with variable CPU speeds really).
5449 * so, just to be safe set the init delay to 2100. Eliminates
5450 * failures on T21 Thinkpads. remove this code when the udelay
5451 * and mdelay kernel code is replaced by a pm timer, or the delays
5452 * work well for battery and/or AC power both.
5454 if(card->active_ctrl == clkrun_hack)
5459 if((card->active_ctrl == clkrun_hack) && !(powerdown == 1))
5462 * for some currently unknown reason, powering down the DAC and ADC component
5463 * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97
5464 * codec access problems. probably the serial clock becomes unsynced.
5465 * added code to sync the chips back up, but only helped about 70% the time.
5471 card->active_ctrl(card, 1);
5473 /* claim our iospace and irq */
5475 card->ba0 = ioremap_nocache(card->ba0_addr, CS461X_BA0_SIZE);
5476 card->ba1.name.data0 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
5477 card->ba1.name.data1 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
5478 card->ba1.name.pmem = ioremap_nocache(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
5479 card->ba1.name.reg = ioremap_nocache(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
5481 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5482 "cs46xx: card=%p card->ba0=%p\n",card,card->ba0) );
5483 CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5484 "cs46xx: card->ba1=%p %p %p %p\n",
5485 card->ba1.name.data0,
5486 card->ba1.name.data1,
5487 card->ba1.name.pmem,
5488 card->ba1.name.reg) );
5490 if(card->ba0 == 0 || card->ba1.name.data0 == 0 ||
5491 card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
5492 card->ba1.name.reg == 0)
5495 if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) {
5496 printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq);
5499 /* register /dev/dsp */
5500 if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
5501 printk(KERN_ERR "cs46xx: unable to register dsp\n");
5505 /* register /dev/midi */
5506 if((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0)
5507 printk(KERN_ERR "cs46xx: unable to register midi\n");
5509 card->pm.flags |= CS46XX_PM_IDLE;
5512 if (cs_hardware_init(card) != 0)
5514 CS_DBGOUT(CS_ERROR, 4, printk(
5515 "cs46xx: ERROR in cs_hardware_init()... retrying\n"));
5516 for (j = 0; j < NR_AC97; j++)
5517 if (card->ac97_codec[j] != NULL) {
5518 unregister_sound_mixer(card->ac97_codec[j]->dev_mixer);
5519 ac97_release_codec(card->ac97_codec[j]);
5521 mdelay(10 * cs_laptop_wait);
5528 CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
5529 "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i));
5530 unregister_sound_dsp(card->dev_audio);
5532 unregister_sound_midi(card->dev_midi);
5536 init_waitqueue_head(&card->midi.open_wait);
5537 init_MUTEX(&card->midi.open_sem);
5538 init_waitqueue_head(&card->midi.iwait);
5539 init_waitqueue_head(&card->midi.owait);
5540 cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST);
5541 cs461x_pokeBA0(card, BA0_MIDCR, 0);
5544 * Check if we have to init the amplifier, but probably already done
5545 * since the CD logic in the ac97 init code will turn on the ext amp.
5549 card->active_ctrl(card, -1);
5551 PCI_SET_DRIVER_DATA(pci_dev, card);
5552 PCI_SET_DMA_MASK(pci_dev, dma_mask);
5553 list_add(&card->list, &cs46xx_devs);
5555 pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), cs46xx_pm_callback);
5558 CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
5559 "cs46xx: probe() pm_register() succeeded (%p).\n",
5565 CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 2, printk(KERN_INFO
5566 "cs46xx: probe() pm_register() failed (%p).\n",
5568 card->pm.flags |= CS46XX_PM_NOT_REGISTERED;
5571 CS_DBGOUT(CS_PM, 9, printk(KERN_INFO "cs46xx: pm.flags=0x%x card=%p\n",
5572 (unsigned)card->pm.flags,card));
5574 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5575 "cs46xx: probe()- device allocated successfully\n"));
5579 free_irq(card->irq, card);
5583 if(card->ba1.name.data0)
5584 iounmap(card->ba1.name.data0);
5585 if(card->ba1.name.data1)
5586 iounmap(card->ba1.name.data1);
5587 if(card->ba1.name.pmem)
5588 iounmap(card->ba1.name.pmem);
5589 if(card->ba1.name.reg)
5590 iounmap(card->ba1.name.reg);
5592 CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
5593 "cs46xx: probe()- no device allocated\n"));
5597 // ---------------------------------------------------------------------
5599 static void __devexit cs46xx_remove(struct pci_dev *pci_dev)
5601 struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
5605 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5606 "cs46xx: cs46xx_remove()+\n"));
5608 card->active_ctrl(card,1);
5610 tmp = cs461x_peek(card, BA1_PFIE);
5613 cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
5615 tmp = cs461x_peek(card, BA1_CIE);
5618 cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
5621 * Stop playback DMA.
5623 tmp = cs461x_peek(card, BA1_PCTL);
5624 cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5629 tmp = cs461x_peek(card, BA1_CCTL);
5630 cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5633 * Reset the processor.
5637 cs461x_proc_stop(card);
5640 * Power down the DAC and ADC. We will power them up (if) when we need
5643 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5644 CS_POWER_MIXVON, CS_TRUE )) )
5646 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5647 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5651 * Power down the PLL.
5653 cs461x_pokeBA0(card, BA0_CLKCR1, 0);
5656 * Turn off the Processor by turning off the software clock enable flag in
5657 * the clock control register.
5659 tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
5660 cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5662 card->active_ctrl(card,-1);
5664 /* free hardware resources */
5665 free_irq(card->irq, card);
5667 iounmap(card->ba1.name.data0);
5668 iounmap(card->ba1.name.data1);
5669 iounmap(card->ba1.name.pmem);
5670 iounmap(card->ba1.name.reg);
5672 /* unregister audio devices */
5673 for (i = 0; i < NR_AC97; i++)
5674 if (card->ac97_codec[i] != NULL) {
5675 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
5676 ac97_release_codec(card->ac97_codec[i]);
5678 unregister_sound_dsp(card->dev_audio);
5680 unregister_sound_midi(card->dev_midi);
5681 list_del(&card->list);
5683 PCI_SET_DRIVER_DATA(pci_dev,NULL);
5685 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5686 "cs46xx: cs46xx_remove()-: remove successful\n"));
5691 CS46XX_4612, /* same as 4630 */
5692 CS46XX_4615, /* same as 4624 */
5695 static struct pci_device_id cs46xx_pci_tbl[] = {
5697 .vendor = PCI_VENDOR_ID_CIRRUS,
5698 .device = PCI_DEVICE_ID_CIRRUS_4610,
5699 .subvendor = PCI_ANY_ID,
5700 .subdevice = PCI_ANY_ID,
5701 .driver_data = CS46XX_4610,
5704 .vendor = PCI_VENDOR_ID_CIRRUS,
5705 .device = PCI_DEVICE_ID_CIRRUS_4612,
5706 .subvendor = PCI_ANY_ID,
5707 .subdevice = PCI_ANY_ID,
5708 .driver_data = CS46XX_4612,
5711 .vendor = PCI_VENDOR_ID_CIRRUS,
5712 .device = PCI_DEVICE_ID_CIRRUS_4615,
5713 .subvendor = PCI_ANY_ID,
5714 .subdevice = PCI_ANY_ID,
5715 .driver_data = CS46XX_4615,
5720 MODULE_DEVICE_TABLE(pci, cs46xx_pci_tbl);
5722 struct pci_driver cs46xx_pci_driver = {
5724 .id_table = cs46xx_pci_tbl,
5725 .probe = cs46xx_probe,
5726 .remove = __devexit_p(cs46xx_remove),
5727 .suspend = CS46XX_SUSPEND_TBL,
5728 .resume = CS46XX_RESUME_TBL,
5731 int __init cs46xx_init_module(void)
5734 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5735 "cs46xx: cs46xx_init_module()+ \n"));
5736 rtn = pci_module_init(&cs46xx_pci_driver);
5740 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(
5741 "cs46xx: Unable to detect valid cs46xx device\n"));
5744 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5745 printk(KERN_INFO "cs46xx: cs46xx_init_module()- (%d)\n",rtn));
5749 void __exit cs46xx_cleanup_module(void)
5751 pci_unregister_driver(&cs46xx_pci_driver);
5752 cs_pm_unregister_all(cs46xx_pm_callback);
5753 CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5754 printk(KERN_INFO "cs46xx: cleanup_cs46xx() finished\n"));
5757 module_init(cs46xx_init_module);
5758 module_exit(cs46xx_cleanup_module);
5760 int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
5762 struct cs_card *card;
5764 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5765 "cs46xx: cs46xx_pm_callback dev=%p rqst=0x%x card=%p\n",
5766 dev,(unsigned)rqst,data));
5767 card = (struct cs_card *) dev->data;
5771 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5772 "cs46xx: PM suspend request\n"));
5773 if(cs46xx_suspend(card, 0))
5775 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5776 "cs46xx: PM suspend request refused\n"));
5781 CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5782 "cs46xx: PM resume request\n"));
5783 if(cs46xx_resume(card))
5785 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5786 "cs46xx: PM resume request refused\n"));
5796 #if CS46XX_ACPI_SUPPORT
5797 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state)
5799 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5800 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5801 printk(KERN_INFO "cs46xx: cs46xx_suspend_tbl request\n"));
5802 cs46xx_suspend(s, 0);
5806 static int cs46xx_resume_tbl(struct pci_dev *pcidev)
5808 struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5809 CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5810 printk(KERN_INFO "cs46xx: cs46xx_resume_tbl request\n"));