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>
97 #include <asm/hardirq.h>
99 #include "cs46xxpm-24.h"
100 #include "cs46xx_wrapper-24.h"
103 /* MIDI buffer sizes */
104 #define CS_MIDIINBUF 500
105 #define CS_MIDIOUTBUF 500
107 #define ADC_RUNNING 1
108 #define DAC_RUNNING 2
110 #define CS_FMT_16BIT 1 /* These are fixed in fact */
111 #define CS_FMT_STEREO 2
112 #define CS_FMT_MASK 3
114 #define CS_TYPE_ADC 1
115 #define CS_TYPE_DAC 2
120 #define CS_INC_USE_COUNT(m) (atomic_inc(m))
121 #define CS_DEC_USE_COUNT(m) (atomic_dec(m))
122 #define CS_DEC_AND_TEST(m) (atomic_dec_and_test(m))
123 #define CS_IN_USE(m) (atomic_read(m) != 0)
125 #define CS_DBGBREAKPOINT {__asm__("INT $3");}
130 #define CS461X_BA0_SIZE 0x2000
131 #define CS461X_BA1_DATA0_SIZE 0x3000
132 #define CS461X_BA1_DATA1_SIZE 0x3800
133 #define CS461X_BA1_PRG_SIZE 0x7000
134 #define CS461X_BA1_REG_SIZE 0x0100
136 #define GOF_PER_SEC 200
138 #define CSDEBUG_INTERFACE 1
141 * Turn on/off debugging compilation by using 1/0 respectively for CSDEBUG
144 * CSDEBUG is usual mode is set to 1, then use the
145 * cs_debuglevel and cs_debugmask to turn on or off debugging.
146 * Debug level of 1 has been defined to be kernel errors and info
147 * that should be printed on any released driver.
150 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;}
152 #define CS_DBGOUT(mask,level,x)
157 #define CS_INIT 0x00000001 /* initialization and probe functions */
158 #define CS_ERROR 0x00000002 /* tmp debugging bit placeholder */
159 #define CS_INTERRUPT 0x00000004 /* interrupt handler (separate from all other) */
160 #define CS_FUNCTION 0x00000008 /* enter/leave functions */
161 #define CS_WAVE_WRITE 0x00000010 /* write information for wave */
162 #define CS_WAVE_READ 0x00000020 /* read information for wave */
163 #define CS_MIDI_WRITE 0x00000040 /* write information for midi */
164 #define CS_MIDI_READ 0x00000080 /* read information for midi */
165 #define CS_MPU401_WRITE 0x00000100 /* write information for mpu401 */
166 #define CS_MPU401_READ 0x00000200 /* read information for mpu401 */
167 #define CS_OPEN 0x00000400 /* all open functions in the driver */
168 #define CS_RELEASE 0x00000800 /* all release functions in the driver */
169 #define CS_PARMS 0x00001000 /* functional and operational parameters */
170 #define CS_IOCTL 0x00002000 /* ioctl (non-mixer) */
171 #define CS_PM 0x00004000 /* PM */
172 #define CS_TMP 0x10000000 /* tmp debug mask bit */
174 #define CS_IOCTL_CMD_SUSPEND 0x1 // suspend
175 #define CS_IOCTL_CMD_RESUME 0x2 // resume
178 static unsigned long cs_debuglevel=1; /* levels range from 1-9 */
179 MODULE_PARM(cs_debuglevel, "i");
180 static unsigned long cs_debugmask=CS_INIT | CS_ERROR; /* use CS_DBGOUT with various mask values */
181 MODULE_PARM(cs_debugmask, "i");
183 static unsigned long hercules_egpio_disable; /* if non-zero set all EGPIO to 0 */
184 MODULE_PARM(hercules_egpio_disable, "i");
185 static unsigned long initdelay=700; /* PM delay in millisecs */
186 MODULE_PARM(initdelay, "i");
187 static unsigned long powerdown=-1; /* turn on/off powerdown processing in driver */
188 MODULE_PARM(powerdown, "i");
189 #define DMABUF_DEFAULTORDER 3
190 static unsigned long defaultorder=DMABUF_DEFAULTORDER;
191 MODULE_PARM(defaultorder, "i");
193 static int external_amp;
194 MODULE_PARM(external_amp, "i");
196 MODULE_PARM(thinkpad, "i");
199 * set the powerdown module parm to 0 to disable all
200 * powerdown. also set thinkpad to 1 to disable powerdown,
201 * but also to enable the clkrun functionality.
203 static unsigned cs_powerdown=1;
204 static unsigned cs_laptop_wait=1;
206 /* An instance of the 4610 channel */
214 #define CS46XX_MAJOR_VERSION "1"
215 #define CS46XX_MINOR_VERSION "28"
218 #define CS46XX_ARCH "64" //architecture key
220 #define CS46XX_ARCH "32" //architecture key
223 struct list_head cs46xx_devs = { &cs46xx_devs, &cs46xx_devs };
225 /* magic numbers to protect our data structures */
226 #define CS_CARD_MAGIC 0x43525553 /* "CRUS" */
227 #define CS_STATE_MAGIC 0x4c4f4749 /* "LOGI" */
230 /* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
233 static const unsigned sample_size[] = { 1, 2, 2, 4 };
234 static const unsigned sample_shift[] = { 0, 1, 1, 2 };
236 /* "software" or virtual channel, an instance of opened /dev/dsp */
239 struct cs_card *card; /* Card info */
241 /* single open lock mechanism, only used for recording */
242 struct semaphore open_sem;
243 wait_queue_head_t open_wait;
248 /* virtual channel number */
252 /* wave sample stuff */
254 unsigned char fmt, enable;
256 /* hardware channel */
257 struct cs_channel *channel;
258 int pringbuf; /* Software ring slot */
259 void *pbuf; /* 4K hardware DMA buffer */
261 /* OSS buffer management stuff */
263 dma_addr_t dma_handle;
269 void *tmpbuff; /* tmp buffer for sample conversions */
271 dma_addr_t dmaaddr_tmpbuff;
272 unsigned buforder_tmpbuff; /* Log base 2 of size in bytes.. */
274 /* our buffer acts like a circular ring */
275 unsigned hwptr; /* where dma last started, updated by update_ptr */
276 unsigned swptr; /* where driver last clear/filled, updated by read/write */
277 int count; /* bytes to be comsumed or been generated by dma machine */
278 unsigned total_bytes; /* total bytes dmaed by hardware */
279 unsigned blocks; /* total blocks */
281 unsigned error; /* number of over/underruns */
282 unsigned underrun; /* underrun pending before next write has occurred */
283 wait_queue_head_t wait; /* put process on wait queue when no more space in buffer */
285 /* redundant, but makes calculations easier */
288 unsigned fragsamples;
293 unsigned endcleared:1;
295 unsigned update_flag;
296 unsigned ossfragshift;
298 unsigned subdivision;
300 /* Guard against mmap/write/read races */
301 struct semaphore sem;
305 struct cs_channel channel[2];
308 /* We keep cs461x cards in a linked list */
309 struct cs_card *next;
311 /* The cs461x has a certain amount of cross channel interaction
312 so we use a single per card lock */
316 spinlock_t ac97_lock;
318 /* mixer use count */
319 atomic_t mixer_use_cnt;
321 /* PCI device stuff */
322 struct pci_dev * pci_dev;
323 struct list_head list;
325 unsigned int pctl, cctl; /* Hardware DMA flag sets */
327 /* soundcore stuff */
331 /* structures for abstraction of hardware facilities, codecs, banks and channels*/
332 struct ac97_codec *ac97_codec[NR_AC97];
333 struct cs_state *states[2];
337 int amplifier; /* Amplifier control */
338 void (*amplifier_ctrl)(struct cs_card *, int);
339 void (*amp_init)(struct cs_card *);
341 int active; /* Active clocking */
342 void (*active_ctrl)(struct cs_card *, int);
344 /* hardware resources */
345 unsigned long ba0_addr;
346 unsigned long ba1_addr;
363 /* Function support */
364 struct cs_channel *(*alloc_pcm_channel)(struct cs_card *);
365 struct cs_channel *(*alloc_rec_pcm_channel)(struct cs_card *);
366 void (*free_pcm_channel)(struct cs_card *, int chan);
368 /* /dev/midi stuff */
370 unsigned ird, iwr, icnt;
371 unsigned ord, owr, ocnt;
372 wait_queue_head_t open_wait;
373 wait_queue_head_t iwait;
374 wait_queue_head_t owait;
376 unsigned char ibuf[CS_MIDIINBUF];
377 unsigned char obuf[CS_MIDIOUTBUF];
379 struct semaphore open_sem;
384 static int cs_open_mixdev(struct inode *inode, struct file *file);
385 static int cs_release_mixdev(struct inode *inode, struct file *file);
386 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
388 static int cs_hardware_init(struct cs_card *card);
389 static int cs46xx_powerup(struct cs_card *card, unsigned int type);
390 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag);
391 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type);
392 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state);
393 static int cs46xx_resume_tbl(struct pci_dev *pcidev);
395 static inline unsigned ld2(unsigned int x)
424 #define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
425 #define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
426 #define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
427 #define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
428 #define SOUND_MIXER_CS_APM _SIOWR('M',124, int)
430 void printioctl(unsigned int x)
434 /* these values are incorrect for the ac97 driver, fix.
435 * Index of mixtable1[] member is Device ID
436 * and must be <= SOUND_MIXER_NRDEVICES.
437 * Value of array member is index into s->mix.vol[]
439 static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
440 [SOUND_MIXER_PCM] = 1, /* voice */
441 [SOUND_MIXER_LINE1] = 2, /* AUX */
442 [SOUND_MIXER_CD] = 3, /* CD */
443 [SOUND_MIXER_LINE] = 4, /* Line */
444 [SOUND_MIXER_SYNTH] = 5, /* FM */
445 [SOUND_MIXER_MIC] = 6, /* Mic */
446 [SOUND_MIXER_SPEAKER] = 7, /* Speaker */
447 [SOUND_MIXER_RECLEV] = 8, /* Recording level */
448 [SOUND_MIXER_VOLUME] = 9 /* Master Volume */
453 case SOUND_MIXER_CS_GETDBGMASK:
454 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") );
456 case SOUND_MIXER_CS_GETDBGLEVEL:
457 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGLEVEL: ") );
459 case SOUND_MIXER_CS_SETDBGMASK:
460 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGMASK: ") );
462 case SOUND_MIXER_CS_SETDBGLEVEL:
463 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGLEVEL: ") );
466 CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION: ") );
468 case SNDCTL_DSP_SYNC:
469 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC: ") );
471 case SNDCTL_DSP_SETDUPLEX:
472 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX: ") );
474 case SNDCTL_DSP_GETCAPS:
475 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS: ") );
477 case SNDCTL_DSP_RESET:
478 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET: ") );
480 case SNDCTL_DSP_SPEED:
481 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED: ") );
483 case SNDCTL_DSP_STEREO:
484 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO: ") );
486 case SNDCTL_DSP_CHANNELS:
487 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS: ") );
489 case SNDCTL_DSP_GETFMTS:
490 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS: ") );
492 case SNDCTL_DSP_SETFMT:
493 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT: ") );
495 case SNDCTL_DSP_POST:
496 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST: ") );
498 case SNDCTL_DSP_GETTRIGGER:
499 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER: ") );
501 case SNDCTL_DSP_SETTRIGGER:
502 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER: ") );
504 case SNDCTL_DSP_GETOSPACE:
505 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE: ") );
507 case SNDCTL_DSP_GETISPACE:
508 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE: ") );
510 case SNDCTL_DSP_NONBLOCK:
511 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK: ") );
513 case SNDCTL_DSP_GETODELAY:
514 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY: ") );
516 case SNDCTL_DSP_GETIPTR:
517 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR: ") );
519 case SNDCTL_DSP_GETOPTR:
520 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR: ") );
522 case SNDCTL_DSP_GETBLKSIZE:
523 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE: ") );
525 case SNDCTL_DSP_SETFRAGMENT:
526 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFRAGMENT: ") );
528 case SNDCTL_DSP_SUBDIVIDE:
529 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE: ") );
531 case SOUND_PCM_READ_RATE:
532 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE: ") );
534 case SOUND_PCM_READ_CHANNELS:
535 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_CHANNELS: ") );
537 case SOUND_PCM_READ_BITS:
538 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS: ") );
540 case SOUND_PCM_WRITE_FILTER:
541 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_WRITE_FILTER: ") );
543 case SNDCTL_DSP_SETSYNCRO:
544 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO: ") );
546 case SOUND_PCM_READ_FILTER:
547 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") );
550 case SOUND_MIXER_PRIVATE1:
551 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") );
553 case SOUND_MIXER_PRIVATE2:
554 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2: ") );
556 case SOUND_MIXER_PRIVATE3:
557 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3: ") );
559 case SOUND_MIXER_PRIVATE4:
560 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4: ") );
562 case SOUND_MIXER_PRIVATE5:
563 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5: ") );
565 case SOUND_MIXER_INFO:
566 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO: ") );
568 case SOUND_OLD_MIXER_INFO:
569 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") );
575 case SOUND_MIXER_VOLUME:
576 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") );
578 case SOUND_MIXER_SPEAKER:
579 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SPEAKER: ") );
581 case SOUND_MIXER_RECLEV:
582 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECLEV: ") );
584 case SOUND_MIXER_MIC:
585 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_MIC: ") );
587 case SOUND_MIXER_SYNTH:
588 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SYNTH: ") );
590 case SOUND_MIXER_RECSRC:
591 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECSRC: ") );
593 case SOUND_MIXER_DEVMASK:
594 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_DEVMASK: ") );
596 case SOUND_MIXER_RECMASK:
597 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECMASK: ") );
599 case SOUND_MIXER_STEREODEVS:
600 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_STEREODEVS: ") );
602 case SOUND_MIXER_CAPS:
603 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:") );
607 if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
609 CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) );
613 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ",
619 CS_DBGOUT(CS_IOCTL, 4, printk("command = 0x%x IOC_NR=%d\n",x, _IOC_NR(x)) );
624 * common I/O routines
627 static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
629 writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
632 static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
634 return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
637 static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
639 writel(val, codec->ba0+reg);
642 static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
644 return readl(codec->ba0+reg);
648 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
649 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
651 static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
653 if(card->channel[1].used==1)
655 card->channel[1].used=1;
656 card->channel[1].num=1;
657 return &card->channel[1];
660 static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
662 if(card->channel[0].used==1)
664 card->channel[0].used=1;
665 card->channel[0].num=0;
666 return &card->channel[0];
669 static void cs_free_pcm_channel(struct cs_card *card, int channel)
671 card->channel[channel].state = NULL;
672 card->channel[channel].used=0;
676 * setup a divisor value to help with conversion from
677 * 16bit Stereo, down to 8bit stereo/mono or 16bit mono.
678 * assign a divisor of 1 if using 16bit Stereo as that is
679 * the only format that the static image will capture.
681 static void cs_set_divisor(struct dmabuf *dmabuf)
683 if(dmabuf->type == CS_TYPE_DAC)
685 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
686 (dmabuf->fmt & CS_FMT_16BIT))
688 else if( (dmabuf->fmt & CS_FMT_STEREO) &&
689 !(dmabuf->fmt & CS_FMT_16BIT))
691 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
692 !(dmabuf->fmt & CS_FMT_16BIT))
697 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, printk(
698 "cs46xx: cs_set_divisor()- %s %d\n",
699 (dmabuf->type == CS_TYPE_ADC) ? "ADC" : "DAC",
704 * mute some of the more prevalent registers to avoid popping.
706 static void cs_mute(struct cs_card *card, int state)
708 struct ac97_codec *dev=card->ac97_codec[0];
710 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n",
711 (state == CS_TRUE) ? "Muting" : "UnMuting") );
716 * fix pops when powering up on thinkpads
718 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
719 (u8)BA0_AC97_MASTER_VOLUME);
720 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
721 (u8)BA0_AC97_HEADPHONE_VOLUME);
722 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
723 (u8)BA0_AC97_MASTER_VOLUME_MONO);
724 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
725 (u8)BA0_AC97_PCM_OUT_VOLUME);
727 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
728 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
729 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
730 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
734 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume);
735 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume);
736 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono);
737 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, card->pm.u32AC97_pcm_out_volume);
739 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()-\n"));
742 /* set playback sample rate */
743 static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
745 struct dmabuf *dmabuf = &state->dmabuf;
746 unsigned int tmp1, tmp2;
747 unsigned int phiIncr;
748 unsigned int correctionPerGOF, correctionPerSec;
751 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()+ %d\n",rate) );
754 * Compute the values used to drive the actual sample rate conversion.
755 * The following formulas are being computed, using inline assembly
756 * since we need to use 64 bit arithmetic to compute the values:
758 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
759 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
761 * ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
762 * GOF_PER_SEC * correctionPerGOF
766 * phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
767 * correctionPerGOF:correctionPerSec =
768 * dividend:remainder(ulOther / GOF_PER_SEC)
771 phiIncr = tmp1 / 48000;
772 tmp1 -= phiIncr * 48000;
777 tmp1 -= tmp2 * 48000;
778 correctionPerGOF = tmp1 / GOF_PER_SEC;
779 tmp1 -= correctionPerGOF * GOF_PER_SEC;
780 correctionPerSec = tmp1;
783 * Fill in the SampleRateConverter control block.
786 spin_lock_irqsave(&state->card->lock, flags);
787 cs461x_poke(state->card, BA1_PSRC,
788 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
789 cs461x_poke(state->card, BA1_PPI, phiIncr);
790 spin_unlock_irqrestore(&state->card->lock, flags);
793 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()- %d\n",rate) );
797 /* set recording sample rate */
798 static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate)
800 struct dmabuf *dmabuf = &state->dmabuf;
801 struct cs_card *card = state->card;
802 unsigned int phiIncr, coeffIncr, tmp1, tmp2;
803 unsigned int correctionPerGOF, correctionPerSec, initialDelay;
804 unsigned int frameGroupLength, cnt;
806 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()+ %d\n",rate) );
809 * We can only decimate by up to a factor of 1/9th the hardware rate.
810 * Correct the value if an attempt is made to stray outside that limit.
812 if ((rate * 9) < 48000)
816 * We can not capture at at rate greater than the Input Rate (48000).
817 * Return an error if an attempt is made to stray outside that limit.
823 * Compute the values used to drive the actual sample rate conversion.
824 * The following formulas are being computed, using inline assembly
825 * since we need to use 64 bit arithmetic to compute the values:
827 * coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
828 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
829 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
831 * correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
832 * GOF_PER_SEC * correctionPerGOF
833 * initialDelay = ceil((24 * Fs,in) / Fs,out)
837 * coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
838 * phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
839 * correctionPerGOF:correctionPerSec =
840 * dividend:remainder(ulOther / GOF_PER_SEC)
841 * initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
845 coeffIncr = tmp1 / 48000;
846 tmp1 -= coeffIncr * 48000;
849 coeffIncr += tmp1 / 48000;
850 coeffIncr ^= 0xFFFFFFFF;
853 phiIncr = tmp1 / rate;
854 tmp1 -= phiIncr * rate;
860 correctionPerGOF = tmp1 / GOF_PER_SEC;
861 tmp1 -= correctionPerGOF * GOF_PER_SEC;
862 correctionPerSec = tmp1;
863 initialDelay = ((48000 * 24) + rate - 1) / rate;
866 * Fill in the VariDecimate control block.
868 spin_lock_irqsave(&card->lock, flags);
869 cs461x_poke(card, BA1_CSRC,
870 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
871 cs461x_poke(card, BA1_CCI, coeffIncr);
872 cs461x_poke(card, BA1_CD,
873 (((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
874 cs461x_poke(card, BA1_CPI, phiIncr);
875 spin_unlock_irqrestore(&card->lock, flags);
878 * Figure out the frame group length for the write back task. Basically,
879 * this is just the factors of 24000 (2^6*3*5^3) that are not present in
880 * the output sample rate.
882 frameGroupLength = 1;
883 for (cnt = 2; cnt <= 64; cnt *= 2) {
884 if (((rate / cnt) * cnt) != rate)
885 frameGroupLength *= 2;
887 if (((rate / 3) * 3) != rate) {
888 frameGroupLength *= 3;
890 for (cnt = 5; cnt <= 125; cnt *= 5) {
891 if (((rate / cnt) * cnt) != rate)
892 frameGroupLength *= 5;
896 * Fill in the WriteBack control block.
898 spin_lock_irqsave(&card->lock, flags);
899 cs461x_poke(card, BA1_CFG1, frameGroupLength);
900 cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
901 cs461x_poke(card, BA1_CCST, 0x0000FFFF);
902 cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
903 cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
904 spin_unlock_irqrestore(&card->lock, flags);
906 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()- %d\n",rate) );
910 /* prepare channel attributes for playback */
911 static void cs_play_setup(struct cs_state *state)
913 struct dmabuf *dmabuf = &state->dmabuf;
914 struct cs_card *card = state->card;
915 unsigned int tmp, Count, playFormat;
917 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") );
918 cs461x_poke(card, BA1_PVOL, 0x80008000);
920 cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
923 playFormat=cs461x_peek(card, BA1_PFIE);
924 if ((dmabuf->fmt & CS_FMT_STEREO)) {
925 playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO;
929 playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO;
931 if ((dmabuf->fmt & CS_FMT_16BIT)) {
932 playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT
933 | DMA_RQ_C2_AC_SIGNED_CONVERT);
937 playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT
938 | DMA_RQ_C2_AC_SIGNED_CONVERT);
940 cs461x_poke(card, BA1_PFIE, playFormat);
942 tmp = cs461x_peek(card, BA1_PDTC);
944 cs461x_poke(card, BA1_PDTC, tmp | --Count);
946 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") );
950 static struct InitStruct
954 } InitArray[] = { {0x00000040, 0x3fc0000f},
955 {0x0000004c, 0x04800000},
957 {0x000000b3, 0x00000780},
958 {0x000000b7, 0x00000000},
959 {0x000000bc, 0x07800000},
961 {0x000000cd, 0x00800000},
965 * "SetCaptureSPValues()" -- Initialize record task values before each
968 void SetCaptureSPValues(struct cs_card *card)
971 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") );
972 for(i=0; i<sizeof(InitArray)/sizeof(struct InitStruct); i++)
974 offset = InitArray[i].off*4; /* 8bit to 32bit offset value */
975 cs461x_poke(card, offset, InitArray[i].val );
977 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()-\n") );
980 /* prepare channel attributes for recording */
981 static void cs_rec_setup(struct cs_state *state)
983 struct cs_card *card = state->card;
984 struct dmabuf *dmabuf = &state->dmabuf;
985 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n") );
987 SetCaptureSPValues(card);
990 * set the attenuation to 0dB
992 cs461x_poke(card, BA1_CVOL, 0x80008000);
995 * set the physical address of the capture buffer into the SP
997 cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->rawbuf));
999 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()-\n") );
1003 /* get current playback/recording dma buffer pointer (byte offset from LBA),
1004 called with spinlock held! */
1006 static inline unsigned cs_get_dma_addr(struct cs_state *state)
1008 struct dmabuf *dmabuf = &state->dmabuf;
1011 if ( (!(dmabuf->enable & DAC_RUNNING)) &&
1012 (!(dmabuf->enable & ADC_RUNNING) ) )
1014 CS_DBGOUT(CS_ERROR, 2, printk(
1015 "cs46xx: ERROR cs_get_dma_addr(): not enabled \n") );
1020 * granularity is byte boundary, good part.
1022 if(dmabuf->enable & DAC_RUNNING)
1024 offset = cs461x_peek(state->card, BA1_PBA);
1026 else /* ADC_RUNNING must be set */
1028 offset = cs461x_peek(state->card, BA1_CBA);
1030 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9,
1031 printk("cs46xx: cs_get_dma_addr() %d\n",offset) );
1032 offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf;
1033 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8,
1034 printk("cs46xx: cs_get_dma_addr()- %d\n",offset) );
1038 static void resync_dma_ptrs(struct cs_state *state)
1040 struct dmabuf *dmabuf;
1042 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") );
1045 dmabuf = &state->dmabuf;
1046 dmabuf->hwptr=dmabuf->swptr = 0;
1047 dmabuf->pringbuf = 0;
1049 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()- \n") );
1052 /* Stop recording (lock held) */
1053 static inline void __stop_adc(struct cs_state *state)
1055 struct dmabuf *dmabuf = &state->dmabuf;
1056 struct cs_card *card = state->card;
1059 dmabuf->enable &= ~ADC_RUNNING;
1061 tmp = cs461x_peek(card, BA1_CCTL);
1063 cs461x_poke(card, BA1_CCTL, tmp );
1066 static void stop_adc(struct cs_state *state)
1068 unsigned long flags;
1070 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()+ \n") );
1071 spin_lock_irqsave(&state->card->lock, flags);
1073 spin_unlock_irqrestore(&state->card->lock, flags);
1074 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()- \n") );
1077 static void start_adc(struct cs_state *state)
1079 struct dmabuf *dmabuf = &state->dmabuf;
1080 struct cs_card *card = state->card;
1081 unsigned long flags;
1084 spin_lock_irqsave(&card->lock, flags);
1085 if (!(dmabuf->enable & ADC_RUNNING) &&
1086 ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize)
1087 && dmabuf->ready) &&
1088 ((card->pm.flags & CS46XX_PM_IDLE) ||
1089 (card->pm.flags & CS46XX_PM_RESUMED)) )
1091 dmabuf->enable |= ADC_RUNNING;
1092 cs_set_divisor(dmabuf);
1093 tmp = cs461x_peek(card, BA1_CCTL);
1096 CS_DBGOUT(CS_FUNCTION, 2, printk(
1097 "cs46xx: start_adc() poke 0x%x \n",tmp) );
1098 cs461x_poke(card, BA1_CCTL, tmp);
1100 spin_unlock_irqrestore(&card->lock, flags);
1103 /* stop playback (lock held) */
1104 static inline void __stop_dac(struct cs_state *state)
1106 struct dmabuf *dmabuf = &state->dmabuf;
1107 struct cs_card *card = state->card;
1110 dmabuf->enable &= ~DAC_RUNNING;
1112 tmp=cs461x_peek(card, BA1_PCTL);
1114 cs461x_poke(card, BA1_PCTL, tmp);
1117 static void stop_dac(struct cs_state *state)
1119 unsigned long flags;
1121 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()+ \n") );
1122 spin_lock_irqsave(&state->card->lock, flags);
1124 spin_unlock_irqrestore(&state->card->lock, flags);
1125 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()- \n") );
1128 static void start_dac(struct cs_state *state)
1130 struct dmabuf *dmabuf = &state->dmabuf;
1131 struct cs_card *card = state->card;
1132 unsigned long flags;
1135 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()+ \n") );
1136 spin_lock_irqsave(&card->lock, flags);
1137 if (!(dmabuf->enable & DAC_RUNNING) &&
1138 ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) &&
1139 ((card->pm.flags & CS46XX_PM_IDLE) ||
1140 (card->pm.flags & CS46XX_PM_RESUMED)) )
1142 dmabuf->enable |= DAC_RUNNING;
1143 tmp = cs461x_peek(card, BA1_PCTL);
1146 CS_DBGOUT(CS_PARMS, 6, printk(
1147 "cs46xx: start_dac() poke card=%p tmp=0x%.08x addr=%p \n",
1148 card, (unsigned)tmp,
1149 card->ba1.idx[(BA1_PCTL >> 16) & 3]+(BA1_PCTL&0xffff) ) );
1150 cs461x_poke(card, BA1_PCTL, tmp);
1152 spin_unlock_irqrestore(&card->lock, flags);
1153 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()- \n") );
1156 #define DMABUF_MINORDER 1
1159 * allocate DMA buffer, playback and recording buffers are separate.
1161 static int alloc_dmabuf(struct cs_state *state)
1164 struct cs_card *card=state->card;
1165 struct dmabuf *dmabuf = &state->dmabuf;
1166 void *rawbuf = NULL;
1167 void *tmpbuff = NULL;
1169 struct page *map, *mapend;
1172 dmabuf->ready = dmabuf->mapped = 0;
1175 * check for order within limits, but do not overwrite value.
1177 if((defaultorder > 1) && (defaultorder < 12))
1182 for (order = df; order >= DMABUF_MINORDER; order--)
1183 if ( (rawbuf = (void *) pci_alloc_consistent(
1184 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr)))
1187 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
1188 "cs46xx: alloc_dmabuf(): unable to allocate rawbuf\n"));
1191 dmabuf->buforder = order;
1192 dmabuf->rawbuf = rawbuf;
1193 // Now mark the pages as reserved; otherwise the
1194 // remap_page_range() in cs46xx_mmap doesn't work.
1195 // 1. get index to last page in mem_map array for rawbuf.
1196 mapend = virt_to_page(dmabuf->rawbuf +
1197 (PAGE_SIZE << dmabuf->buforder) - 1);
1199 // 2. mark each physical page in range as 'reserved'.
1200 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1201 cs4x_mem_map_reserve(map);
1203 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: alloc_dmabuf(): allocated %ld (order = %d) bytes at %p\n",
1204 PAGE_SIZE << order, order, rawbuf) );
1207 * only allocate the conversion buffer for the ADC
1209 if(dmabuf->type == CS_TYPE_DAC)
1211 dmabuf->tmpbuff = NULL;
1212 dmabuf->buforder_tmpbuff = 0;
1216 * now the temp buffer for 16/8 conversions
1219 tmpbuff = (void *) pci_alloc_consistent(
1220 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr_tmpbuff);
1224 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: allocated %ld (order = %d) bytes at %p\n",
1225 PAGE_SIZE << order, order, tmpbuff) );
1227 dmabuf->tmpbuff = tmpbuff;
1228 dmabuf->buforder_tmpbuff = order;
1230 // Now mark the pages as reserved; otherwise the
1231 // remap_page_range() in cs46xx_mmap doesn't work.
1232 // 1. get index to last page in mem_map array for rawbuf.
1233 mapend = virt_to_page(dmabuf->tmpbuff +
1234 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1236 // 2. mark each physical page in range as 'reserved'.
1237 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1238 cs4x_mem_map_reserve(map);
1242 /* free DMA buffer */
1243 static void dealloc_dmabuf(struct cs_state *state)
1245 struct dmabuf *dmabuf = &state->dmabuf;
1246 struct page *map, *mapend;
1248 if (dmabuf->rawbuf) {
1249 // Undo prog_dmabuf()'s marking the pages as reserved
1250 mapend = virt_to_page(dmabuf->rawbuf +
1251 (PAGE_SIZE << dmabuf->buforder) - 1);
1252 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1253 cs4x_mem_map_unreserve(map);
1254 free_dmabuf(state->card, dmabuf);
1257 if (dmabuf->tmpbuff) {
1258 // Undo prog_dmabuf()'s marking the pages as reserved
1259 mapend = virt_to_page(dmabuf->tmpbuff +
1260 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1261 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1262 cs4x_mem_map_unreserve(map);
1263 free_dmabuf2(state->card, dmabuf);
1266 dmabuf->rawbuf = NULL;
1267 dmabuf->tmpbuff = NULL;
1268 dmabuf->mapped = dmabuf->ready = 0;
1272 static int __prog_dmabuf(struct cs_state *state)
1274 struct dmabuf *dmabuf = &state->dmabuf;
1275 unsigned long flags;
1276 unsigned long allocated_pages, allocated_bytes;
1277 unsigned long tmp1, tmp2, fmt=0;
1278 unsigned long *ptmp = (unsigned long *) dmabuf->pbuf;
1279 unsigned long SGarray[9], nSGpages=0;
1282 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()+ \n"));
1284 * check for CAPTURE and use only non-sg for initial release
1286 if(dmabuf->type == CS_TYPE_ADC)
1288 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n"));
1290 * add in non-sg support for capture.
1292 spin_lock_irqsave(&state->card->lock, flags);
1293 /* add code to reset the rawbuf memory. TRW */
1294 resync_dma_ptrs(state);
1295 dmabuf->total_bytes = dmabuf->blocks = 0;
1296 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1300 spin_unlock_irqrestore(&state->card->lock, flags);
1302 /* allocate DMA buffer if not allocated yet */
1303 if (!dmabuf->rawbuf || !dmabuf->tmpbuff)
1304 if ((ret = alloc_dmabuf(state)))
1307 * static image only supports 16Bit signed, stereo - hard code fmt
1309 fmt = CS_FMT_16BIT | CS_FMT_STEREO;
1311 dmabuf->numfrag = 2;
1312 dmabuf->fragsize = 2048;
1313 dmabuf->fragsamples = 2048 >> sample_shift[fmt];
1314 dmabuf->dmasize = 4096;
1315 dmabuf->fragshift = 11;
1317 memset(dmabuf->rawbuf, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1319 memset(dmabuf->tmpbuff, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1320 PAGE_SIZE<<dmabuf->buforder_tmpbuff);
1323 * Now set up the ring
1326 spin_lock_irqsave(&state->card->lock, flags);
1327 cs_rec_setup(state);
1328 spin_unlock_irqrestore(&state->card->lock, flags);
1330 /* set the ready flag for the dma buffer */
1333 CS_DBGOUT(CS_PARMS, 4, printk(
1334 "cs46xx: prog_dmabuf(): CAPTURE rate=%d fmt=0x%x numfrag=%d "
1335 "fragsize=%d dmasize=%d\n",
1336 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1337 dmabuf->fragsize, dmabuf->dmasize) );
1339 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n"));
1342 else if (dmabuf->type == CS_TYPE_DAC)
1347 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() DAC\n"));
1348 spin_lock_irqsave(&state->card->lock, flags);
1349 resync_dma_ptrs(state);
1350 dmabuf->total_bytes = dmabuf->blocks = 0;
1351 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1355 spin_unlock_irqrestore(&state->card->lock, flags);
1357 /* allocate DMA buffer if not allocated yet */
1358 if (!dmabuf->rawbuf)
1359 if ((ret = alloc_dmabuf(state)))
1362 allocated_pages = 1 << dmabuf->buforder;
1363 allocated_bytes = allocated_pages*PAGE_SIZE;
1365 if(allocated_pages < 2)
1367 CS_DBGOUT(CS_FUNCTION, 4, printk(
1368 "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n",
1369 (unsigned)allocated_pages));
1373 /* Use all the pages allocated, fragsize 4k. */
1374 /* Use 'pbuf' for S/G page map table. */
1375 dmabuf->SGok = 1; /* Use S/G. */
1377 nSGpages = allocated_bytes/4096; /* S/G pages always 4k. */
1379 /* Set up S/G variables. */
1380 *ptmp = virt_to_bus(dmabuf->rawbuf);
1381 *(ptmp+1) = 0x00000008;
1382 for(tmp1= 1; tmp1 < nSGpages; tmp1++) {
1383 *(ptmp+2*tmp1) = virt_to_bus( (dmabuf->rawbuf)+4096*tmp1);
1384 if( tmp1 == nSGpages-1)
1387 tmp2 = 0x80000000+8*(tmp1+1);
1388 *(ptmp+2*tmp1+1) = tmp2;
1390 SGarray[0] = 0x82c0200d;
1391 SGarray[1] = 0xffff0000;
1393 SGarray[3] = 0x00010600;
1394 SGarray[4] = *(ptmp+2);
1395 SGarray[5] = 0x80000010;
1397 SGarray[7] = *(ptmp+2);
1398 SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10;
1401 dmabuf->numfrag = nSGpages;
1402 dmabuf->fragsize = 4096;
1403 dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt];
1404 dmabuf->fragshift = 12;
1405 dmabuf->dmasize = dmabuf->numfrag*4096;
1408 SGarray[0] = 0xf2c0000f;
1409 SGarray[1] = 0x00000200;
1411 SGarray[3] = 0x00010600;
1412 SGarray[4]=SGarray[5]=SGarray[6]=SGarray[7]=SGarray[8] = 0;
1413 dmabuf->numfrag = 2;
1414 dmabuf->fragsize = 2048;
1415 dmabuf->fragsamples = 2048 >> sample_shift[dmabuf->fmt];
1416 dmabuf->dmasize = 4096;
1417 dmabuf->fragshift = 11;
1419 for(tmp1 = 0; tmp1 < sizeof(SGarray)/4; tmp1++)
1420 cs461x_poke( state->card, BA1_PDTC+tmp1*4, SGarray[tmp1]);
1422 memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1426 * Now set up the ring
1429 spin_lock_irqsave(&state->card->lock, flags);
1430 cs_play_setup(state);
1431 spin_unlock_irqrestore(&state->card->lock, flags);
1433 /* set the ready flag for the dma buffer */
1436 CS_DBGOUT(CS_PARMS, 4, printk(
1437 "cs46xx: prog_dmabuf(): PLAYBACK rate=%d fmt=0x%x numfrag=%d "
1438 "fragsize=%d dmasize=%d\n",
1439 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1440 dmabuf->fragsize, dmabuf->dmasize) );
1442 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n"));
1447 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n",
1453 static int prog_dmabuf(struct cs_state *state)
1458 ret = __prog_dmabuf(state);
1464 static void cs_clear_tail(struct cs_state *state)
1468 static int drain_dac(struct cs_state *state, int nonblock)
1470 DECLARE_WAITQUEUE(wait, current);
1471 struct dmabuf *dmabuf = &state->dmabuf;
1472 struct cs_card *card=state->card;
1473 unsigned long flags;
1477 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()+ \n"));
1478 if (dmabuf->mapped || !dmabuf->ready)
1480 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0, not ready\n"));
1484 add_wait_queue(&dmabuf->wait, &wait);
1486 /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1487 every time to make the process really go to sleep */
1488 current->state = TASK_INTERRUPTIBLE;
1490 spin_lock_irqsave(&state->card->lock, flags);
1491 count = dmabuf->count;
1492 spin_unlock_irqrestore(&state->card->lock, flags);
1497 if (signal_pending(current))
1501 remove_wait_queue(&dmabuf->wait, &wait);
1502 current->state = TASK_RUNNING;
1506 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1507 tmo >>= sample_shift[dmabuf->fmt];
1508 tmo += (2048*HZ)/dmabuf->rate;
1510 if (!schedule_timeout(tmo ? tmo : 1) && tmo){
1511 printk(KERN_ERR "cs46xx: drain_dac, dma timeout? %d\n", count);
1515 remove_wait_queue(&dmabuf->wait, &wait);
1516 current->state = TASK_RUNNING;
1517 if (signal_pending(current))
1519 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n"));
1521 * set to silence and let that clear the fifos.
1523 cs461x_clear_serial_FIFOs(card, CS_TYPE_DAC);
1524 return -ERESTARTSYS;
1527 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0\n"));
1532 /* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
1533 static void cs_update_ptr(struct cs_card *card, int wake)
1535 struct cs_state *state;
1536 struct dmabuf *dmabuf;
1540 /* error handling and process wake up for ADC */
1541 state = card->states[0];
1544 dmabuf = &state->dmabuf;
1545 if (dmabuf->enable & ADC_RUNNING) {
1546 /* update hardware pointer */
1547 hwptr = cs_get_dma_addr(state);
1549 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1550 CS_DBGOUT(CS_PARMS, 9, printk(
1551 "cs46xx: cs_update_ptr()+ ADC hwptr=%d diff=%d\n",
1553 dmabuf->hwptr = hwptr;
1554 dmabuf->total_bytes += diff;
1555 dmabuf->count += diff;
1556 if (dmabuf->count > dmabuf->dmasize)
1557 dmabuf->count = dmabuf->dmasize;
1561 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1562 wake_up(&dmabuf->wait);
1565 if (wake && dmabuf->count > 0)
1566 wake_up(&dmabuf->wait);
1574 state = card->states[1];
1577 dmabuf = &state->dmabuf;
1578 /* error handling and process wake up for DAC */
1579 if (dmabuf->enable & DAC_RUNNING) {
1580 /* update hardware pointer */
1581 hwptr = cs_get_dma_addr(state);
1583 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1584 CS_DBGOUT(CS_PARMS, 9, printk(
1585 "cs46xx: cs_update_ptr()+ DAC hwptr=%d diff=%d\n",
1587 dmabuf->hwptr = hwptr;
1588 dmabuf->total_bytes += diff;
1589 if (dmabuf->mapped) {
1590 dmabuf->count += diff;
1591 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1592 wake_up(&dmabuf->wait);
1594 * other drivers use fragsize, but don't see any sense
1595 * in that, since dmasize is the buffer asked for
1598 if( dmabuf->count > dmabuf->dmasize)
1599 dmabuf->count &= dmabuf->dmasize-1;
1601 dmabuf->count -= diff;
1603 * backfill with silence and clear out the last
1604 * "diff" number of bytes.
1608 memset(dmabuf->rawbuf + hwptr - diff,
1609 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff);
1613 memset(dmabuf->rawbuf,
1614 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1616 memset((char *)dmabuf->rawbuf +
1617 dmabuf->dmasize + hwptr - diff,
1618 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1622 if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
1623 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
1624 "cs46xx: ERROR DAC count<0 or count > dmasize (%d)\n",
1627 * buffer underrun or buffer overrun, reset the
1628 * count of bytes written back to 0.
1630 if(dmabuf->count < 0)
1635 if (wake && dmabuf->count < (signed)dmabuf->dmasize/2)
1636 wake_up(&dmabuf->wait);
1643 /* hold spinlock for the following! */
1644 static void cs_handle_midi(struct cs_card *card)
1651 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_RBE)) {
1652 ch = cs461x_peekBA0(card, BA0_MIDRP);
1653 if (card->midi.icnt < CS_MIDIINBUF) {
1654 card->midi.ibuf[card->midi.iwr] = ch;
1655 card->midi.iwr = (card->midi.iwr + 1) % CS_MIDIINBUF;
1661 wake_up(&card->midi.iwait);
1663 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_TBF) && card->midi.ocnt > 0) {
1664 temp1 = ( card->midi.obuf[card->midi.ord] ) & 0x000000ff;
1665 cs461x_pokeBA0(card, BA0_MIDWP,temp1);
1666 card->midi.ord = (card->midi.ord + 1) % CS_MIDIOUTBUF;
1668 if (card->midi.ocnt < CS_MIDIOUTBUF-16)
1672 wake_up(&card->midi.owait);
1675 static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1677 struct cs_card *card = (struct cs_card *)dev_id;
1678 /* Single channel card */
1679 struct cs_state *recstate = card->channel[0].state;
1680 struct cs_state *playstate = card->channel[1].state;
1683 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()+ \n"));
1685 spin_lock(&card->lock);
1687 status = cs461x_peekBA0(card, BA0_HISR);
1689 if ((status & 0x7fffffff) == 0)
1691 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1692 spin_unlock(&card->lock);
1693 return IRQ_HANDLED; /* Might be IRQ_NONE.. */
1697 * check for playback or capture interrupt only
1699 if( ((status & HISR_VC0) && playstate && playstate->dmabuf.ready) ||
1700 (((status & HISR_VC1) && recstate && recstate->dmabuf.ready)) )
1702 CS_DBGOUT(CS_INTERRUPT, 8, printk(
1703 "cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status));
1704 cs_update_ptr(card, CS_TRUE);
1707 if( status & HISR_MIDI )
1708 cs_handle_midi(card);
1711 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1712 spin_unlock(&card->lock);
1713 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n"));
1718 /**********************************************************************/
1720 static ssize_t cs_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
1722 struct cs_card *card = (struct cs_card *)file->private_data;
1724 unsigned long flags;
1728 if (!access_ok(VERIFY_WRITE, buffer, count))
1732 spin_lock_irqsave(&card->lock, flags);
1733 ptr = card->midi.ird;
1734 cnt = CS_MIDIINBUF - ptr;
1735 if (card->midi.icnt < cnt)
1736 cnt = card->midi.icnt;
1737 spin_unlock_irqrestore(&card->lock, flags);
1741 if (file->f_flags & O_NONBLOCK)
1742 return ret ? ret : -EAGAIN;
1743 interruptible_sleep_on(&card->midi.iwait);
1744 if (signal_pending(current))
1745 return ret ? ret : -ERESTARTSYS;
1748 if (copy_to_user(buffer, card->midi.ibuf + ptr, cnt))
1749 return ret ? ret : -EFAULT;
1750 ptr = (ptr + cnt) % CS_MIDIINBUF;
1751 spin_lock_irqsave(&card->lock, flags);
1752 card->midi.ird = ptr;
1753 card->midi.icnt -= cnt;
1754 spin_unlock_irqrestore(&card->lock, flags);
1763 static ssize_t cs_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1765 struct cs_card *card = (struct cs_card *)file->private_data;
1767 unsigned long flags;
1771 if (!access_ok(VERIFY_READ, buffer, count))
1775 spin_lock_irqsave(&card->lock, flags);
1776 ptr = card->midi.owr;
1777 cnt = CS_MIDIOUTBUF - ptr;
1778 if (card->midi.ocnt + cnt > CS_MIDIOUTBUF)
1779 cnt = CS_MIDIOUTBUF - card->midi.ocnt;
1781 cs_handle_midi(card);
1782 spin_unlock_irqrestore(&card->lock, flags);
1786 if (file->f_flags & O_NONBLOCK)
1787 return ret ? ret : -EAGAIN;
1788 interruptible_sleep_on(&card->midi.owait);
1789 if (signal_pending(current))
1790 return ret ? ret : -ERESTARTSYS;
1793 if (copy_from_user(card->midi.obuf + ptr, buffer, cnt))
1794 return ret ? ret : -EFAULT;
1795 ptr = (ptr + cnt) % CS_MIDIOUTBUF;
1796 spin_lock_irqsave(&card->lock, flags);
1797 card->midi.owr = ptr;
1798 card->midi.ocnt += cnt;
1799 spin_unlock_irqrestore(&card->lock, flags);
1803 spin_lock_irqsave(&card->lock, flags);
1804 cs_handle_midi(card);
1805 spin_unlock_irqrestore(&card->lock, flags);
1811 static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait)
1813 struct cs_card *card = (struct cs_card *)file->private_data;
1814 unsigned long flags;
1815 unsigned int mask = 0;
1817 if (file->f_flags & FMODE_WRITE)
1818 poll_wait(file, &card->midi.owait, wait);
1819 if (file->f_flags & FMODE_READ)
1820 poll_wait(file, &card->midi.iwait, wait);
1821 spin_lock_irqsave(&card->lock, flags);
1822 if (file->f_flags & FMODE_READ) {
1823 if (card->midi.icnt > 0)
1824 mask |= POLLIN | POLLRDNORM;
1826 if (file->f_flags & FMODE_WRITE) {
1827 if (card->midi.ocnt < CS_MIDIOUTBUF)
1828 mask |= POLLOUT | POLLWRNORM;
1830 spin_unlock_irqrestore(&card->lock, flags);
1835 static int cs_midi_open(struct inode *inode, struct file *file)
1837 unsigned int minor = iminor(inode);
1838 struct cs_card *card=NULL;
1839 unsigned long flags;
1840 struct list_head *entry;
1842 list_for_each(entry, &cs46xx_devs)
1844 card = list_entry(entry, struct cs_card, list);
1845 if (card->dev_midi == minor)
1849 if (entry == &cs46xx_devs)
1853 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
1854 "cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n"));
1858 file->private_data = card;
1859 /* wait for device to become free */
1860 down(&card->midi.open_sem);
1861 while (card->midi.open_mode & file->f_mode) {
1862 if (file->f_flags & O_NONBLOCK) {
1863 up(&card->midi.open_sem);
1866 up(&card->midi.open_sem);
1867 interruptible_sleep_on(&card->midi.open_wait);
1868 if (signal_pending(current))
1869 return -ERESTARTSYS;
1870 down(&card->midi.open_sem);
1872 spin_lock_irqsave(&card->midi.lock, flags);
1873 if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) {
1874 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1875 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1876 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1877 cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f); /* Enable xmit, rcv. */
1878 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM); /* Enable interrupts */
1880 if (file->f_mode & FMODE_READ) {
1881 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1883 if (file->f_mode & FMODE_WRITE) {
1884 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1886 spin_unlock_irqrestore(&card->midi.lock, flags);
1887 card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
1888 up(&card->midi.open_sem);
1893 static int cs_midi_release(struct inode *inode, struct file *file)
1895 struct cs_card *card = (struct cs_card *)file->private_data;
1896 DECLARE_WAITQUEUE(wait, current);
1897 unsigned long flags;
1898 unsigned count, tmo;
1900 if (file->f_mode & FMODE_WRITE) {
1901 current->state = TASK_INTERRUPTIBLE;
1902 add_wait_queue(&card->midi.owait, &wait);
1904 spin_lock_irqsave(&card->midi.lock, flags);
1905 count = card->midi.ocnt;
1906 spin_unlock_irqrestore(&card->midi.lock, flags);
1909 if (signal_pending(current))
1911 if (file->f_flags & O_NONBLOCK)
1913 tmo = (count * HZ) / 3100;
1914 if (!schedule_timeout(tmo ? : 1) && tmo)
1915 printk(KERN_DEBUG "cs46xx: midi timed out??\n");
1917 remove_wait_queue(&card->midi.owait, &wait);
1918 current->state = TASK_RUNNING;
1920 down(&card->midi.open_sem);
1921 card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE)));
1922 up(&card->midi.open_sem);
1923 wake_up(&card->midi.open_wait);
1928 * Midi file operations struct.
1930 static /*const*/ struct file_operations cs_midi_fops = {
1931 CS_OWNER CS_THIS_MODULE
1932 .llseek = no_llseek,
1933 .read = cs_midi_read,
1934 .write = cs_midi_write,
1935 .poll = cs_midi_poll,
1936 .open = cs_midi_open,
1937 .release = cs_midi_release,
1942 * CopySamples copies 16-bit stereo signed samples from the source to the
1943 * destination, possibly converting down to unsigned 8-bit and/or mono.
1944 * count specifies the number of output bytes to write.
1948 * dst - Pointer to a destination buffer.
1949 * src - Pointer to a source buffer
1950 * count - The number of bytes to copy into the destination buffer.
1951 * fmt - CS_FMT_16BIT and/or CS_FMT_STEREO bits
1952 * dmabuf - pointer to the dma buffer structure
1954 * NOTES: only call this routine if the output desired is not 16 Signed Stereo
1958 static void CopySamples(char *dst, char *src, int count, unsigned fmt,
1959 struct dmabuf *dmabuf)
1963 s16 *psSrc=(s16 *)src;
1964 s16 *psDst=(s16 *)dst;
1965 u8 *pucDst=(u8 *)dst;
1967 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") );
1968 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1969 " dst=%p src=%p count=%d fmt=0x%x\n",
1970 dst,src,count,fmt) );
1973 * See if the data should be output as 8-bit unsigned stereo.
1975 if((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1978 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1979 * stereo using rounding.
1985 *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8);
1989 * See if the data should be output at 8-bit unsigned mono.
1991 else if(!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1994 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1995 * mono using averaging and rounding.
2001 s32AudioSample = ((*psSrc)+(*(psSrc + 1)))/2 + (s32)0x80;
2002 if(s32AudioSample > 0x7fff)
2003 s32AudioSample = 0x7fff;
2004 *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8);
2009 * See if the data should be output at 16-bit signed mono.
2011 else if(!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT))
2014 * Convert each 16-bit signed stereo sample to 16-bit signed
2015 * mono using averaging.
2021 *(psDst++) = (s16)((*psSrc)+(*(psSrc + 1)))/2;
2029 * replacement for the standard copy_to_user, to allow for a conversion from
2030 * 16 bit to 8 bit and from stereo to mono, if the record conversion is active.
2031 * The current CS46xx/CS4280 static image only records in 16bit unsigned Stereo,
2032 * so we convert from any of the other format combinations.
2034 static unsigned cs_copy_to_user(
2041 struct dmabuf *dmabuf = &s->dmabuf;
2042 void *src = hwsrc; /* default to the standard destination buffer addr */
2044 CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
2045 "cs_copy_to_user()+ fmt=0x%x cnt=%d dest=%p\n",
2046 dmabuf->fmt,(unsigned)cnt,dest) );
2048 if(cnt > dmabuf->dmasize)
2050 cnt = dmabuf->dmasize;
2057 if(dmabuf->divisor != 1)
2059 if(!dmabuf->tmpbuff)
2061 *copied = cnt/dmabuf->divisor;
2065 CopySamples((char *)dmabuf->tmpbuff, (char *)hwsrc, cnt,
2066 dmabuf->fmt, dmabuf);
2067 src = dmabuf->tmpbuff;
2068 cnt = cnt/dmabuf->divisor;
2070 if (copy_to_user(dest, src, cnt))
2072 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
2073 "cs46xx: cs_copy_to_user()- fault dest=%p src=%p cnt=%d\n",
2079 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
2080 "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt) );
2084 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
2085 the user's buffer. it is filled by the dma machine and drained by this loop. */
2086 static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
2088 struct cs_card *card = (struct cs_card *) file->private_data;
2089 struct cs_state *state;
2090 DECLARE_WAITQUEUE(wait, current);
2091 struct dmabuf *dmabuf;
2093 unsigned long flags;
2098 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2099 printk("cs46xx: cs_read()+ %d\n",count) );
2100 state = (struct cs_state *)card->states[0];
2103 dmabuf = &state->dmabuf;
2107 if (!access_ok(VERIFY_WRITE, buffer, count))
2111 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2114 add_wait_queue(&state->dmabuf.wait, &wait);
2116 while(!(card->pm.flags & CS46XX_PM_IDLE))
2119 if (signal_pending(current)) {
2120 if(!ret) ret = -ERESTARTSYS;
2124 spin_lock_irqsave(&state->card->lock, flags);
2125 swptr = dmabuf->swptr;
2126 cnt = dmabuf->dmasize - swptr;
2127 if (dmabuf->count < cnt)
2128 cnt = dmabuf->count;
2130 __set_current_state(TASK_INTERRUPTIBLE);
2131 spin_unlock_irqrestore(&state->card->lock, flags);
2133 if (cnt > (count * dmabuf->divisor))
2134 cnt = count * dmabuf->divisor;
2136 /* buffer is empty, start the dma machine and wait for data to be
2139 if (file->f_flags & O_NONBLOCK) {
2140 if (!ret) ret = -EAGAIN;
2145 if (signal_pending(current)) {
2146 if(!ret) ret = -ERESTARTSYS;
2159 CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
2160 "_read() copy_to cnt=%d count=%d ", cnt,count) );
2161 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
2162 " .dmasize=%d .count=%d buffer=%p ret=%d\n",
2163 dmabuf->dmasize,dmabuf->count,buffer,ret) );
2165 if (cs_copy_to_user(state, buffer,
2166 (char *)dmabuf->rawbuf + swptr, cnt, &copied))
2168 if (!ret) ret = -EFAULT;
2171 swptr = (swptr + cnt) % dmabuf->dmasize;
2172 spin_lock_irqsave(&card->lock, flags);
2173 dmabuf->swptr = swptr;
2174 dmabuf->count -= cnt;
2175 spin_unlock_irqrestore(&card->lock, flags);
2182 remove_wait_queue(&state->dmabuf.wait, &wait);
2185 set_current_state(TASK_RUNNING);
2186 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2187 printk("cs46xx: cs_read()- %d\n",ret) );
2191 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
2192 the soundcard. it is drained by the dma machine and filled by this loop. */
2193 static ssize_t cs_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
2195 struct cs_card *card = (struct cs_card *) file->private_data;
2196 struct cs_state *state;
2197 DECLARE_WAITQUEUE(wait, current);
2198 struct dmabuf *dmabuf;
2200 unsigned long flags;
2204 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4,
2205 printk("cs46xx: cs_write called, count = %d\n", count) );
2206 state = (struct cs_state *)card->states[1];
2209 if (!access_ok(VERIFY_READ, buffer, count))
2211 dmabuf = &state->dmabuf;
2220 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2222 add_wait_queue(&state->dmabuf.wait, &wait);
2225 * Start the loop to read from the user's buffer and write to the dma buffer.
2226 * check for PM events and underrun/overrun in the loop.
2229 while(!(card->pm.flags & CS46XX_PM_IDLE))
2232 if (signal_pending(current)) {
2233 if(!ret) ret = -ERESTARTSYS;
2237 spin_lock_irqsave(&state->card->lock, flags);
2238 if (dmabuf->count < 0) {
2239 /* buffer underrun, we are recovering from sleep_on_timeout,
2240 resync hwptr and swptr */
2242 dmabuf->swptr = dmabuf->hwptr;
2244 if (dmabuf->underrun)
2246 dmabuf->underrun = 0;
2247 dmabuf->hwptr = cs_get_dma_addr(state);
2248 dmabuf->swptr = dmabuf->hwptr;
2251 swptr = dmabuf->swptr;
2252 cnt = dmabuf->dmasize - swptr;
2253 if (dmabuf->count + cnt > dmabuf->dmasize)
2254 cnt = dmabuf->dmasize - dmabuf->count;
2256 __set_current_state(TASK_INTERRUPTIBLE);
2257 spin_unlock_irqrestore(&state->card->lock, flags);
2262 /* buffer is full, start the dma machine and wait for data to be
2265 if (file->f_flags & O_NONBLOCK) {
2266 if (!ret) ret = -EAGAIN;
2271 if (signal_pending(current)) {
2272 if(!ret) ret = -ERESTARTSYS;
2284 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
2285 if (!ret) ret = -EFAULT;
2288 spin_lock_irqsave(&state->card->lock, flags);
2289 swptr = (swptr + cnt) % dmabuf->dmasize;
2290 dmabuf->swptr = swptr;
2291 dmabuf->count += cnt;
2292 if(dmabuf->count > dmabuf->dmasize)
2294 CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk(
2295 "cs46xx: cs_write() d->count > dmasize - resetting\n"));
2296 dmabuf->count = dmabuf->dmasize;
2298 dmabuf->endcleared = 0;
2299 spin_unlock_irqrestore(&state->card->lock, flags);
2308 remove_wait_queue(&state->dmabuf.wait, &wait);
2309 set_current_state(TASK_RUNNING);
2311 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2,
2312 printk("cs46xx: cs_write()- ret=0x%x\n", ret) );
2316 static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
2318 struct cs_card *card = (struct cs_card *)file->private_data;
2319 struct dmabuf *dmabuf;
2320 struct cs_state *state;
2322 unsigned long flags;
2323 unsigned int mask = 0;
2325 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n"));
2326 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
2330 if (file->f_mode & FMODE_WRITE)
2332 state = card->states[1];
2335 dmabuf = &state->dmabuf;
2336 poll_wait(file, &dmabuf->wait, wait);
2339 if (file->f_mode & FMODE_READ)
2341 state = card->states[0];
2344 dmabuf = &state->dmabuf;
2345 poll_wait(file, &dmabuf->wait, wait);
2349 spin_lock_irqsave(&card->lock, flags);
2350 cs_update_ptr(card, CS_FALSE);
2351 if (file->f_mode & FMODE_READ) {
2352 state = card->states[0];
2355 dmabuf = &state->dmabuf;
2356 if (dmabuf->count >= (signed)dmabuf->fragsize)
2357 mask |= POLLIN | POLLRDNORM;
2360 if (file->f_mode & FMODE_WRITE) {
2361 state = card->states[1];
2364 dmabuf = &state->dmabuf;
2365 if (dmabuf->mapped) {
2366 if (dmabuf->count >= (signed)dmabuf->fragsize)
2367 mask |= POLLOUT | POLLWRNORM;
2369 if ((signed)dmabuf->dmasize >= dmabuf->count
2370 + (signed)dmabuf->fragsize)
2371 mask |= POLLOUT | POLLWRNORM;
2375 spin_unlock_irqrestore(&card->lock, flags);
2377 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()- (0x%x) \n",
2383 * We let users mmap the ring buffer. Its not the real DMA buffer but
2384 * that side of the code is hidden in the IRQ handling. We do a software
2385 * emulation of DMA from a 64K or so buffer into a 2K FIFO.
2386 * (the hardware probably deserves a moan here but Crystal send me nice
2390 static int cs_mmap(struct file *file, struct vm_area_struct *vma)
2392 struct cs_card *card = (struct cs_card *)file->private_data;
2393 struct cs_state *state;
2394 struct dmabuf *dmabuf;
2398 CS_DBGOUT(CS_FUNCTION | CS_PARMS, 2, printk("cs46xx: cs_mmap()+ file=%p %s %s\n",
2399 file, vma->vm_flags & VM_WRITE ? "VM_WRITE" : "",
2400 vma->vm_flags & VM_READ ? "VM_READ" : "") );
2402 if (vma->vm_flags & VM_WRITE) {
2403 state = card->states[1];
2406 CS_DBGOUT(CS_OPEN, 2, printk(
2407 "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") );
2408 if ((ret = prog_dmabuf(state)) != 0)
2411 } else if (vma->vm_flags & VM_READ) {
2412 state = card->states[0];
2415 CS_DBGOUT(CS_OPEN, 2, printk(
2416 "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") );
2417 if ((ret = prog_dmabuf(state)) != 0)
2421 CS_DBGOUT(CS_ERROR, 2, printk(
2422 "cs46xx: cs_mmap() return -EINVAL\n") );
2427 * For now ONLY support playback, but seems like the only way to use
2428 * mmap() is to open an FD with RDWR, just read or just write access
2429 * does not function, get an error back from the kernel.
2430 * Also, QuakeIII opens with RDWR! So, there must be something
2431 * to needing read/write access mapping. So, allow read/write but
2434 state = card->states[1];
2441 dmabuf = &state->dmabuf;
2442 if (cs4x_pgoff(vma) != 0)
2447 size = vma->vm_end - vma->vm_start;
2449 CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) );
2451 if (size > (PAGE_SIZE << dmabuf->buforder))
2456 if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
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 *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"));