2 * Crystal SoundFusion CS46xx driver
4 * Copyright 1998-2001 Cirrus Logic Corporation <pcaudio@crystal.cirrus.com>
5 * <twoller@crystal.cirrus.com>
6 * Copyright 1999-2000 Jaroslav Kysela <perex@suse.cz>
7 * Copyright 2000 Alan Cox <alan@redhat.com>
9 * The core of this code is taken from the ALSA project driver by
10 * Jaroslav. Please send Jaroslav the credit for the driver and
11 * report bugs in this port to <alan@redhat.com>
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * Current maintainers:
27 * Cirrus Logic Corporation, Thomas Woller (tw)
28 * <twoller@crystal.cirrus.com>
30 * <nils@kernelconcepts.de>
31 * Thanks to David Pollard for testing.
34 * 20000909-nf Changed cs_read, cs_write and drain_dac
35 * 20001025-tw Separate Playback/Capture structs and buffers.
36 * Added Scatter/Gather support for Playback.
38 * 20001027-nf Port to kernel 2.4.0-test9, some clean-ups
39 * Start of powermanagement support (CS46XX_PM).
40 * 20001128-tw Add module parm for default buffer order.
41 * added DMA_GFP flag to kmalloc dma buffer allocs.
42 * backfill silence to eliminate stuttering on
44 * 20001201-tw add resyncing of swptr on underruns.
45 * 20001205-tw-nf fixed GETOSPACE ioctl() after open()
46 * 20010113-tw patch from Hans Grobler general cleanup.
47 * 20010117-tw 2.4.0 pci cleanup, wrapper code for 2.2.16-2.4.0
48 * 20010118-tw basic PM support for 2.2.16+ and 2.4.0/2.4.2.
49 * 20010228-dh patch from David Huggins - cs_update_ptr recursion.
50 * 20010409-tw add hercules game theatre XP amp code.
51 * 20010420-tw cleanup powerdown/up code.
52 * 20010521-tw eliminate pops, and fixes for powerdown.
53 * 20010525-tw added fixes for thinkpads with powerdown logic.
54 * 20010723-sh patch from Horms (Simon Horman) -
55 * SOUND_PCM_READ_BITS returns bits as set in driver
56 * rather than a logical or of the possible values.
57 * Various ioctls handle the case where the device
58 * is open for reading or writing but not both better.
61 * Playback/Capture supported from 8k-48k.
62 * 16Bit Signed LE & 8Bit Unsigned, with Mono or Stereo supported.
64 * APM/PM - 2.2.x APM is enabled and functioning fine. APM can also
65 * be enabled for 2.4.x by modifying the CS46XX_ACPI_SUPPORT macro
68 * Hercules Game Theatre XP - the EGPIO2 pin controls the external Amp,
69 * so, use the drain/polarity to enable.
70 * hercules_egpio_disable set to 1, will force a 0 to EGPIODR.
72 * VTB Santa Cruz - the GPIO7/GPIO8 on the Secondary Codec control
73 * the external amplifier for the "back" speakers, since we do not
74 * support the secondary codec then this external amp is also not
78 #include <linux/interrupt.h>
79 #include <linux/list.h>
80 #include <linux/module.h>
81 #include <linux/string.h>
82 #include <linux/ioport.h>
83 #include <linux/sched.h>
84 #include <linux/delay.h>
85 #include <linux/sound.h>
86 #include <linux/slab.h>
87 #include <linux/soundcard.h>
88 #include <linux/pci.h>
89 #include <linux/bitops.h>
90 #include <linux/init.h>
91 #include <linux/poll.h>
92 #include <linux/ac97_codec.h>
96 #include <asm/uaccess.h>
98 #include "cs46xxpm-24.h"
99 #include "cs46xx_wrapper-24.h"
102 /* MIDI buffer sizes */
103 #define CS_MIDIINBUF 500
104 #define CS_MIDIOUTBUF 500
106 #define ADC_RUNNING 1
107 #define DAC_RUNNING 2
109 #define CS_FMT_16BIT 1 /* These are fixed in fact */
110 #define CS_FMT_STEREO 2
111 #define CS_FMT_MASK 3
113 #define CS_TYPE_ADC 1
114 #define CS_TYPE_DAC 2
119 #define CS_INC_USE_COUNT(m) (atomic_inc(m))
120 #define CS_DEC_USE_COUNT(m) (atomic_dec(m))
121 #define CS_DEC_AND_TEST(m) (atomic_dec_and_test(m))
122 #define CS_IN_USE(m) (atomic_read(m) != 0)
124 #define CS_DBGBREAKPOINT {__asm__("INT $3");}
129 #define CS461X_BA0_SIZE 0x2000
130 #define CS461X_BA1_DATA0_SIZE 0x3000
131 #define CS461X_BA1_DATA1_SIZE 0x3800
132 #define CS461X_BA1_PRG_SIZE 0x7000
133 #define CS461X_BA1_REG_SIZE 0x0100
135 #define GOF_PER_SEC 200
137 #define CSDEBUG_INTERFACE 1
140 * Turn on/off debugging compilation by using 1/0 respectively for CSDEBUG
143 * CSDEBUG is usual mode is set to 1, then use the
144 * cs_debuglevel and cs_debugmask to turn on or off debugging.
145 * Debug level of 1 has been defined to be kernel errors and info
146 * that should be printed on any released driver.
149 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;}
151 #define CS_DBGOUT(mask,level,x)
156 #define CS_INIT 0x00000001 /* initialization and probe functions */
157 #define CS_ERROR 0x00000002 /* tmp debugging bit placeholder */
158 #define CS_INTERRUPT 0x00000004 /* interrupt handler (separate from all other) */
159 #define CS_FUNCTION 0x00000008 /* enter/leave functions */
160 #define CS_WAVE_WRITE 0x00000010 /* write information for wave */
161 #define CS_WAVE_READ 0x00000020 /* read information for wave */
162 #define CS_MIDI_WRITE 0x00000040 /* write information for midi */
163 #define CS_MIDI_READ 0x00000080 /* read information for midi */
164 #define CS_MPU401_WRITE 0x00000100 /* write information for mpu401 */
165 #define CS_MPU401_READ 0x00000200 /* read information for mpu401 */
166 #define CS_OPEN 0x00000400 /* all open functions in the driver */
167 #define CS_RELEASE 0x00000800 /* all release functions in the driver */
168 #define CS_PARMS 0x00001000 /* functional and operational parameters */
169 #define CS_IOCTL 0x00002000 /* ioctl (non-mixer) */
170 #define CS_PM 0x00004000 /* PM */
171 #define CS_TMP 0x10000000 /* tmp debug mask bit */
173 #define CS_IOCTL_CMD_SUSPEND 0x1 // suspend
174 #define CS_IOCTL_CMD_RESUME 0x2 // resume
177 static unsigned long cs_debuglevel=1; /* levels range from 1-9 */
178 module_param(cs_debuglevel, ulong, 0644);
179 static unsigned long cs_debugmask=CS_INIT | CS_ERROR; /* use CS_DBGOUT with various mask values */
180 module_param(cs_debugmask, ulong, 0644);
182 static unsigned long hercules_egpio_disable; /* if non-zero set all EGPIO to 0 */
183 module_param(hercules_egpio_disable, ulong, 0);
184 static unsigned long initdelay=700; /* PM delay in millisecs */
185 module_param(initdelay, ulong, 0);
186 static unsigned long powerdown=-1; /* turn on/off powerdown processing in driver */
187 module_param(powerdown, ulong, 0);
188 #define DMABUF_DEFAULTORDER 3
189 static unsigned long defaultorder=DMABUF_DEFAULTORDER;
190 module_param(defaultorder, ulong, 0);
192 static int external_amp;
193 module_param(external_amp, bool, 0);
195 module_param(thinkpad, bool, 0);
198 * set the powerdown module parm to 0 to disable all
199 * powerdown. also set thinkpad to 1 to disable powerdown,
200 * but also to enable the clkrun functionality.
202 static unsigned cs_powerdown=1;
203 static unsigned cs_laptop_wait=1;
205 /* An instance of the 4610 channel */
213 #define CS46XX_MAJOR_VERSION "1"
214 #define CS46XX_MINOR_VERSION "28"
217 #define CS46XX_ARCH "64" //architecture key
219 #define CS46XX_ARCH "32" //architecture key
222 static struct list_head cs46xx_devs = { &cs46xx_devs, &cs46xx_devs };
224 /* magic numbers to protect our data structures */
225 #define CS_CARD_MAGIC 0x43525553 /* "CRUS" */
226 #define CS_STATE_MAGIC 0x4c4f4749 /* "LOGI" */
229 /* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
232 static const unsigned sample_size[] = { 1, 2, 2, 4 };
233 static const unsigned sample_shift[] = { 0, 1, 1, 2 };
235 /* "software" or virtual channel, an instance of opened /dev/dsp */
238 struct cs_card *card; /* Card info */
240 /* single open lock mechanism, only used for recording */
241 struct semaphore open_sem;
242 wait_queue_head_t open_wait;
247 /* virtual channel number */
251 /* wave sample stuff */
253 unsigned char fmt, enable;
255 /* hardware channel */
256 struct cs_channel *channel;
257 int pringbuf; /* Software ring slot */
258 void *pbuf; /* 4K hardware DMA buffer */
260 /* OSS buffer management stuff */
262 dma_addr_t dma_handle;
268 void *tmpbuff; /* tmp buffer for sample conversions */
270 dma_addr_t dmaaddr_tmpbuff;
271 unsigned buforder_tmpbuff; /* Log base 2 of size in bytes.. */
273 /* our buffer acts like a circular ring */
274 unsigned hwptr; /* where dma last started, updated by update_ptr */
275 unsigned swptr; /* where driver last clear/filled, updated by read/write */
276 int count; /* bytes to be comsumed or been generated by dma machine */
277 unsigned total_bytes; /* total bytes dmaed by hardware */
278 unsigned blocks; /* total blocks */
280 unsigned error; /* number of over/underruns */
281 unsigned underrun; /* underrun pending before next write has occurred */
282 wait_queue_head_t wait; /* put process on wait queue when no more space in buffer */
284 /* redundant, but makes calculations easier */
287 unsigned fragsamples;
292 unsigned endcleared:1;
294 unsigned update_flag;
295 unsigned ossfragshift;
297 unsigned subdivision;
299 /* Guard against mmap/write/read races */
300 struct semaphore sem;
304 struct cs_channel channel[2];
307 /* We keep cs461x cards in a linked list */
308 struct cs_card *next;
310 /* The cs461x has a certain amount of cross channel interaction
311 so we use a single per card lock */
315 spinlock_t ac97_lock;
317 /* mixer use count */
318 atomic_t mixer_use_cnt;
320 /* PCI device stuff */
321 struct pci_dev * pci_dev;
322 struct list_head list;
324 unsigned int pctl, cctl; /* Hardware DMA flag sets */
326 /* soundcore stuff */
330 /* structures for abstraction of hardware facilities, codecs, banks and channels*/
331 struct ac97_codec *ac97_codec[NR_AC97];
332 struct cs_state *states[2];
336 int amplifier; /* Amplifier control */
337 void (*amplifier_ctrl)(struct cs_card *, int);
338 void (*amp_init)(struct cs_card *);
340 int active; /* Active clocking */
341 void (*active_ctrl)(struct cs_card *, int);
343 /* hardware resources */
344 unsigned long ba0_addr;
345 unsigned long ba1_addr;
362 /* Function support */
363 struct cs_channel *(*alloc_pcm_channel)(struct cs_card *);
364 struct cs_channel *(*alloc_rec_pcm_channel)(struct cs_card *);
365 void (*free_pcm_channel)(struct cs_card *, int chan);
367 /* /dev/midi stuff */
369 unsigned ird, iwr, icnt;
370 unsigned ord, owr, ocnt;
371 wait_queue_head_t open_wait;
372 wait_queue_head_t iwait;
373 wait_queue_head_t owait;
375 unsigned char ibuf[CS_MIDIINBUF];
376 unsigned char obuf[CS_MIDIOUTBUF];
378 struct semaphore open_sem;
383 static int cs_open_mixdev(struct inode *inode, struct file *file);
384 static int cs_release_mixdev(struct inode *inode, struct file *file);
385 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
387 static int cs_hardware_init(struct cs_card *card);
388 static int cs46xx_powerup(struct cs_card *card, unsigned int type);
389 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag);
390 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type);
391 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, pm_message_t state);
392 static int cs46xx_resume_tbl(struct pci_dev *pcidev);
394 #ifndef CS46XX_ACPI_SUPPORT
395 static int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data);
402 #define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
403 #define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
404 #define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
405 #define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
406 #define SOUND_MIXER_CS_APM _SIOWR('M',124, int)
408 static void printioctl(unsigned int x)
412 /* these values are incorrect for the ac97 driver, fix.
413 * Index of mixtable1[] member is Device ID
414 * and must be <= SOUND_MIXER_NRDEVICES.
415 * Value of array member is index into s->mix.vol[]
417 static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
418 [SOUND_MIXER_PCM] = 1, /* voice */
419 [SOUND_MIXER_LINE1] = 2, /* AUX */
420 [SOUND_MIXER_CD] = 3, /* CD */
421 [SOUND_MIXER_LINE] = 4, /* Line */
422 [SOUND_MIXER_SYNTH] = 5, /* FM */
423 [SOUND_MIXER_MIC] = 6, /* Mic */
424 [SOUND_MIXER_SPEAKER] = 7, /* Speaker */
425 [SOUND_MIXER_RECLEV] = 8, /* Recording level */
426 [SOUND_MIXER_VOLUME] = 9 /* Master Volume */
431 case SOUND_MIXER_CS_GETDBGMASK:
432 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") );
434 case SOUND_MIXER_CS_GETDBGLEVEL:
435 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGLEVEL: ") );
437 case SOUND_MIXER_CS_SETDBGMASK:
438 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGMASK: ") );
440 case SOUND_MIXER_CS_SETDBGLEVEL:
441 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGLEVEL: ") );
444 CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION: ") );
446 case SNDCTL_DSP_SYNC:
447 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC: ") );
449 case SNDCTL_DSP_SETDUPLEX:
450 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX: ") );
452 case SNDCTL_DSP_GETCAPS:
453 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS: ") );
455 case SNDCTL_DSP_RESET:
456 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET: ") );
458 case SNDCTL_DSP_SPEED:
459 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED: ") );
461 case SNDCTL_DSP_STEREO:
462 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO: ") );
464 case SNDCTL_DSP_CHANNELS:
465 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS: ") );
467 case SNDCTL_DSP_GETFMTS:
468 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS: ") );
470 case SNDCTL_DSP_SETFMT:
471 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT: ") );
473 case SNDCTL_DSP_POST:
474 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST: ") );
476 case SNDCTL_DSP_GETTRIGGER:
477 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER: ") );
479 case SNDCTL_DSP_SETTRIGGER:
480 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER: ") );
482 case SNDCTL_DSP_GETOSPACE:
483 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE: ") );
485 case SNDCTL_DSP_GETISPACE:
486 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE: ") );
488 case SNDCTL_DSP_NONBLOCK:
489 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK: ") );
491 case SNDCTL_DSP_GETODELAY:
492 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY: ") );
494 case SNDCTL_DSP_GETIPTR:
495 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR: ") );
497 case SNDCTL_DSP_GETOPTR:
498 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR: ") );
500 case SNDCTL_DSP_GETBLKSIZE:
501 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE: ") );
503 case SNDCTL_DSP_SETFRAGMENT:
504 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFRAGMENT: ") );
506 case SNDCTL_DSP_SUBDIVIDE:
507 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE: ") );
509 case SOUND_PCM_READ_RATE:
510 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE: ") );
512 case SOUND_PCM_READ_CHANNELS:
513 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_CHANNELS: ") );
515 case SOUND_PCM_READ_BITS:
516 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS: ") );
518 case SOUND_PCM_WRITE_FILTER:
519 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_WRITE_FILTER: ") );
521 case SNDCTL_DSP_SETSYNCRO:
522 CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO: ") );
524 case SOUND_PCM_READ_FILTER:
525 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") );
528 case SOUND_MIXER_PRIVATE1:
529 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") );
531 case SOUND_MIXER_PRIVATE2:
532 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2: ") );
534 case SOUND_MIXER_PRIVATE3:
535 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3: ") );
537 case SOUND_MIXER_PRIVATE4:
538 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4: ") );
540 case SOUND_MIXER_PRIVATE5:
541 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5: ") );
543 case SOUND_MIXER_INFO:
544 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO: ") );
546 case SOUND_OLD_MIXER_INFO:
547 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") );
553 case SOUND_MIXER_VOLUME:
554 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") );
556 case SOUND_MIXER_SPEAKER:
557 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SPEAKER: ") );
559 case SOUND_MIXER_RECLEV:
560 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECLEV: ") );
562 case SOUND_MIXER_MIC:
563 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_MIC: ") );
565 case SOUND_MIXER_SYNTH:
566 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SYNTH: ") );
568 case SOUND_MIXER_RECSRC:
569 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECSRC: ") );
571 case SOUND_MIXER_DEVMASK:
572 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_DEVMASK: ") );
574 case SOUND_MIXER_RECMASK:
575 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECMASK: ") );
577 case SOUND_MIXER_STEREODEVS:
578 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_STEREODEVS: ") );
580 case SOUND_MIXER_CAPS:
581 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:") );
585 if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
587 CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) );
591 CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ",
597 CS_DBGOUT(CS_IOCTL, 4, printk("command = 0x%x IOC_NR=%d\n",x, _IOC_NR(x)) );
602 * common I/O routines
605 static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
607 writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
610 static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
612 return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
615 static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
617 writel(val, codec->ba0+reg);
620 static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
622 return readl(codec->ba0+reg);
626 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
627 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
629 static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
631 if(card->channel[1].used==1)
633 card->channel[1].used=1;
634 card->channel[1].num=1;
635 return &card->channel[1];
638 static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
640 if(card->channel[0].used==1)
642 card->channel[0].used=1;
643 card->channel[0].num=0;
644 return &card->channel[0];
647 static void cs_free_pcm_channel(struct cs_card *card, int channel)
649 card->channel[channel].state = NULL;
650 card->channel[channel].used=0;
654 * setup a divisor value to help with conversion from
655 * 16bit Stereo, down to 8bit stereo/mono or 16bit mono.
656 * assign a divisor of 1 if using 16bit Stereo as that is
657 * the only format that the static image will capture.
659 static void cs_set_divisor(struct dmabuf *dmabuf)
661 if(dmabuf->type == CS_TYPE_DAC)
663 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
664 (dmabuf->fmt & CS_FMT_16BIT))
666 else if( (dmabuf->fmt & CS_FMT_STEREO) &&
667 !(dmabuf->fmt & CS_FMT_16BIT))
669 else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
670 !(dmabuf->fmt & CS_FMT_16BIT))
675 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, printk(
676 "cs46xx: cs_set_divisor()- %s %d\n",
677 (dmabuf->type == CS_TYPE_ADC) ? "ADC" : "DAC",
682 * mute some of the more prevalent registers to avoid popping.
684 static void cs_mute(struct cs_card *card, int state)
686 struct ac97_codec *dev=card->ac97_codec[0];
688 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n",
689 (state == CS_TRUE) ? "Muting" : "UnMuting") );
694 * fix pops when powering up on thinkpads
696 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
697 (u8)BA0_AC97_MASTER_VOLUME);
698 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
699 (u8)BA0_AC97_HEADPHONE_VOLUME);
700 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
701 (u8)BA0_AC97_MASTER_VOLUME_MONO);
702 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
703 (u8)BA0_AC97_PCM_OUT_VOLUME);
705 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
706 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
707 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
708 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
712 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume);
713 cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume);
714 cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono);
715 cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, card->pm.u32AC97_pcm_out_volume);
717 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()-\n"));
720 /* set playback sample rate */
721 static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
723 struct dmabuf *dmabuf = &state->dmabuf;
724 unsigned int tmp1, tmp2;
725 unsigned int phiIncr;
726 unsigned int correctionPerGOF, correctionPerSec;
729 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()+ %d\n",rate) );
732 * Compute the values used to drive the actual sample rate conversion.
733 * The following formulas are being computed, using inline assembly
734 * since we need to use 64 bit arithmetic to compute the values:
736 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
737 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
739 * ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
740 * GOF_PER_SEC * correctionPerGOF
744 * phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
745 * correctionPerGOF:correctionPerSec =
746 * dividend:remainder(ulOther / GOF_PER_SEC)
749 phiIncr = tmp1 / 48000;
750 tmp1 -= phiIncr * 48000;
755 tmp1 -= tmp2 * 48000;
756 correctionPerGOF = tmp1 / GOF_PER_SEC;
757 tmp1 -= correctionPerGOF * GOF_PER_SEC;
758 correctionPerSec = tmp1;
761 * Fill in the SampleRateConverter control block.
764 spin_lock_irqsave(&state->card->lock, flags);
765 cs461x_poke(state->card, BA1_PSRC,
766 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
767 cs461x_poke(state->card, BA1_PPI, phiIncr);
768 spin_unlock_irqrestore(&state->card->lock, flags);
771 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()- %d\n",rate) );
775 /* set recording sample rate */
776 static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate)
778 struct dmabuf *dmabuf = &state->dmabuf;
779 struct cs_card *card = state->card;
780 unsigned int phiIncr, coeffIncr, tmp1, tmp2;
781 unsigned int correctionPerGOF, correctionPerSec, initialDelay;
782 unsigned int frameGroupLength, cnt;
784 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()+ %d\n",rate) );
787 * We can only decimate by up to a factor of 1/9th the hardware rate.
788 * Correct the value if an attempt is made to stray outside that limit.
790 if ((rate * 9) < 48000)
794 * We can not capture at at rate greater than the Input Rate (48000).
795 * Return an error if an attempt is made to stray outside that limit.
801 * Compute the values used to drive the actual sample rate conversion.
802 * The following formulas are being computed, using inline assembly
803 * since we need to use 64 bit arithmetic to compute the values:
805 * coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
806 * phiIncr = floor((Fs,in * 2^26) / Fs,out)
807 * correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
809 * correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
810 * GOF_PER_SEC * correctionPerGOF
811 * initialDelay = ceil((24 * Fs,in) / Fs,out)
815 * coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
816 * phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
817 * correctionPerGOF:correctionPerSec =
818 * dividend:remainder(ulOther / GOF_PER_SEC)
819 * initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
823 coeffIncr = tmp1 / 48000;
824 tmp1 -= coeffIncr * 48000;
827 coeffIncr += tmp1 / 48000;
828 coeffIncr ^= 0xFFFFFFFF;
831 phiIncr = tmp1 / rate;
832 tmp1 -= phiIncr * rate;
838 correctionPerGOF = tmp1 / GOF_PER_SEC;
839 tmp1 -= correctionPerGOF * GOF_PER_SEC;
840 correctionPerSec = tmp1;
841 initialDelay = ((48000 * 24) + rate - 1) / rate;
844 * Fill in the VariDecimate control block.
846 spin_lock_irqsave(&card->lock, flags);
847 cs461x_poke(card, BA1_CSRC,
848 ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
849 cs461x_poke(card, BA1_CCI, coeffIncr);
850 cs461x_poke(card, BA1_CD,
851 (((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
852 cs461x_poke(card, BA1_CPI, phiIncr);
853 spin_unlock_irqrestore(&card->lock, flags);
856 * Figure out the frame group length for the write back task. Basically,
857 * this is just the factors of 24000 (2^6*3*5^3) that are not present in
858 * the output sample rate.
860 frameGroupLength = 1;
861 for (cnt = 2; cnt <= 64; cnt *= 2) {
862 if (((rate / cnt) * cnt) != rate)
863 frameGroupLength *= 2;
865 if (((rate / 3) * 3) != rate) {
866 frameGroupLength *= 3;
868 for (cnt = 5; cnt <= 125; cnt *= 5) {
869 if (((rate / cnt) * cnt) != rate)
870 frameGroupLength *= 5;
874 * Fill in the WriteBack control block.
876 spin_lock_irqsave(&card->lock, flags);
877 cs461x_poke(card, BA1_CFG1, frameGroupLength);
878 cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
879 cs461x_poke(card, BA1_CCST, 0x0000FFFF);
880 cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
881 cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
882 spin_unlock_irqrestore(&card->lock, flags);
884 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()- %d\n",rate) );
888 /* prepare channel attributes for playback */
889 static void cs_play_setup(struct cs_state *state)
891 struct dmabuf *dmabuf = &state->dmabuf;
892 struct cs_card *card = state->card;
893 unsigned int tmp, Count, playFormat;
895 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") );
896 cs461x_poke(card, BA1_PVOL, 0x80008000);
898 cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
901 playFormat=cs461x_peek(card, BA1_PFIE);
902 if ((dmabuf->fmt & CS_FMT_STEREO)) {
903 playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO;
907 playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO;
909 if ((dmabuf->fmt & CS_FMT_16BIT)) {
910 playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT
911 | DMA_RQ_C2_AC_SIGNED_CONVERT);
915 playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT
916 | DMA_RQ_C2_AC_SIGNED_CONVERT);
918 cs461x_poke(card, BA1_PFIE, playFormat);
920 tmp = cs461x_peek(card, BA1_PDTC);
922 cs461x_poke(card, BA1_PDTC, tmp | --Count);
924 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") );
928 static struct InitStruct
932 } InitArray[] = { {0x00000040, 0x3fc0000f},
933 {0x0000004c, 0x04800000},
935 {0x000000b3, 0x00000780},
936 {0x000000b7, 0x00000000},
937 {0x000000bc, 0x07800000},
939 {0x000000cd, 0x00800000},
943 * "SetCaptureSPValues()" -- Initialize record task values before each
946 static void SetCaptureSPValues(struct cs_card *card)
949 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") );
950 for(i=0; i<sizeof(InitArray)/sizeof(struct InitStruct); i++)
952 offset = InitArray[i].off*4; /* 8bit to 32bit offset value */
953 cs461x_poke(card, offset, InitArray[i].val );
955 CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()-\n") );
958 /* prepare channel attributes for recording */
959 static void cs_rec_setup(struct cs_state *state)
961 struct cs_card *card = state->card;
962 struct dmabuf *dmabuf = &state->dmabuf;
963 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n") );
965 SetCaptureSPValues(card);
968 * set the attenuation to 0dB
970 cs461x_poke(card, BA1_CVOL, 0x80008000);
973 * set the physical address of the capture buffer into the SP
975 cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->rawbuf));
977 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()-\n") );
981 /* get current playback/recording dma buffer pointer (byte offset from LBA),
982 called with spinlock held! */
984 static inline unsigned cs_get_dma_addr(struct cs_state *state)
986 struct dmabuf *dmabuf = &state->dmabuf;
989 if ( (!(dmabuf->enable & DAC_RUNNING)) &&
990 (!(dmabuf->enable & ADC_RUNNING) ) )
992 CS_DBGOUT(CS_ERROR, 2, printk(
993 "cs46xx: ERROR cs_get_dma_addr(): not enabled \n") );
998 * granularity is byte boundary, good part.
1000 if(dmabuf->enable & DAC_RUNNING)
1002 offset = cs461x_peek(state->card, BA1_PBA);
1004 else /* ADC_RUNNING must be set */
1006 offset = cs461x_peek(state->card, BA1_CBA);
1008 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9,
1009 printk("cs46xx: cs_get_dma_addr() %d\n",offset) );
1010 offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf;
1011 CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8,
1012 printk("cs46xx: cs_get_dma_addr()- %d\n",offset) );
1016 static void resync_dma_ptrs(struct cs_state *state)
1018 struct dmabuf *dmabuf;
1020 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") );
1023 dmabuf = &state->dmabuf;
1024 dmabuf->hwptr=dmabuf->swptr = 0;
1025 dmabuf->pringbuf = 0;
1027 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()- \n") );
1030 /* Stop recording (lock held) */
1031 static inline void __stop_adc(struct cs_state *state)
1033 struct dmabuf *dmabuf = &state->dmabuf;
1034 struct cs_card *card = state->card;
1037 dmabuf->enable &= ~ADC_RUNNING;
1039 tmp = cs461x_peek(card, BA1_CCTL);
1041 cs461x_poke(card, BA1_CCTL, tmp );
1044 static void stop_adc(struct cs_state *state)
1046 unsigned long flags;
1048 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()+ \n") );
1049 spin_lock_irqsave(&state->card->lock, flags);
1051 spin_unlock_irqrestore(&state->card->lock, flags);
1052 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()- \n") );
1055 static void start_adc(struct cs_state *state)
1057 struct dmabuf *dmabuf = &state->dmabuf;
1058 struct cs_card *card = state->card;
1059 unsigned long flags;
1062 spin_lock_irqsave(&card->lock, flags);
1063 if (!(dmabuf->enable & ADC_RUNNING) &&
1064 ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize)
1065 && dmabuf->ready) &&
1066 ((card->pm.flags & CS46XX_PM_IDLE) ||
1067 (card->pm.flags & CS46XX_PM_RESUMED)) )
1069 dmabuf->enable |= ADC_RUNNING;
1070 cs_set_divisor(dmabuf);
1071 tmp = cs461x_peek(card, BA1_CCTL);
1074 CS_DBGOUT(CS_FUNCTION, 2, printk(
1075 "cs46xx: start_adc() poke 0x%x \n",tmp) );
1076 cs461x_poke(card, BA1_CCTL, tmp);
1078 spin_unlock_irqrestore(&card->lock, flags);
1081 /* stop playback (lock held) */
1082 static inline void __stop_dac(struct cs_state *state)
1084 struct dmabuf *dmabuf = &state->dmabuf;
1085 struct cs_card *card = state->card;
1088 dmabuf->enable &= ~DAC_RUNNING;
1090 tmp=cs461x_peek(card, BA1_PCTL);
1092 cs461x_poke(card, BA1_PCTL, tmp);
1095 static void stop_dac(struct cs_state *state)
1097 unsigned long flags;
1099 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()+ \n") );
1100 spin_lock_irqsave(&state->card->lock, flags);
1102 spin_unlock_irqrestore(&state->card->lock, flags);
1103 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()- \n") );
1106 static void start_dac(struct cs_state *state)
1108 struct dmabuf *dmabuf = &state->dmabuf;
1109 struct cs_card *card = state->card;
1110 unsigned long flags;
1113 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()+ \n") );
1114 spin_lock_irqsave(&card->lock, flags);
1115 if (!(dmabuf->enable & DAC_RUNNING) &&
1116 ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) &&
1117 ((card->pm.flags & CS46XX_PM_IDLE) ||
1118 (card->pm.flags & CS46XX_PM_RESUMED)) )
1120 dmabuf->enable |= DAC_RUNNING;
1121 tmp = cs461x_peek(card, BA1_PCTL);
1124 CS_DBGOUT(CS_PARMS, 6, printk(
1125 "cs46xx: start_dac() poke card=%p tmp=0x%.08x addr=%p \n",
1126 card, (unsigned)tmp,
1127 card->ba1.idx[(BA1_PCTL >> 16) & 3]+(BA1_PCTL&0xffff) ) );
1128 cs461x_poke(card, BA1_PCTL, tmp);
1130 spin_unlock_irqrestore(&card->lock, flags);
1131 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()- \n") );
1134 #define DMABUF_MINORDER 1
1137 * allocate DMA buffer, playback and recording buffers are separate.
1139 static int alloc_dmabuf(struct cs_state *state)
1142 struct cs_card *card=state->card;
1143 struct dmabuf *dmabuf = &state->dmabuf;
1144 void *rawbuf = NULL;
1145 void *tmpbuff = NULL;
1147 struct page *map, *mapend;
1150 dmabuf->ready = dmabuf->mapped = 0;
1153 * check for order within limits, but do not overwrite value.
1155 if((defaultorder > 1) && (defaultorder < 12))
1160 for (order = df; order >= DMABUF_MINORDER; order--)
1161 if ( (rawbuf = (void *) pci_alloc_consistent(
1162 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr)))
1165 CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
1166 "cs46xx: alloc_dmabuf(): unable to allocate rawbuf\n"));
1169 dmabuf->buforder = order;
1170 dmabuf->rawbuf = rawbuf;
1171 // Now mark the pages as reserved; otherwise the
1172 // remap_pfn_range() in cs46xx_mmap doesn't work.
1173 // 1. get index to last page in mem_map array for rawbuf.
1174 mapend = virt_to_page(dmabuf->rawbuf +
1175 (PAGE_SIZE << dmabuf->buforder) - 1);
1177 // 2. mark each physical page in range as 'reserved'.
1178 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1179 cs4x_mem_map_reserve(map);
1181 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: alloc_dmabuf(): allocated %ld (order = %d) bytes at %p\n",
1182 PAGE_SIZE << order, order, rawbuf) );
1185 * only allocate the conversion buffer for the ADC
1187 if(dmabuf->type == CS_TYPE_DAC)
1189 dmabuf->tmpbuff = NULL;
1190 dmabuf->buforder_tmpbuff = 0;
1194 * now the temp buffer for 16/8 conversions
1197 tmpbuff = (void *) pci_alloc_consistent(
1198 card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr_tmpbuff);
1202 CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: allocated %ld (order = %d) bytes at %p\n",
1203 PAGE_SIZE << order, order, tmpbuff) );
1205 dmabuf->tmpbuff = tmpbuff;
1206 dmabuf->buforder_tmpbuff = order;
1208 // Now mark the pages as reserved; otherwise the
1209 // remap_pfn_range() in cs46xx_mmap doesn't work.
1210 // 1. get index to last page in mem_map array for rawbuf.
1211 mapend = virt_to_page(dmabuf->tmpbuff +
1212 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1214 // 2. mark each physical page in range as 'reserved'.
1215 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1216 cs4x_mem_map_reserve(map);
1220 /* free DMA buffer */
1221 static void dealloc_dmabuf(struct cs_state *state)
1223 struct dmabuf *dmabuf = &state->dmabuf;
1224 struct page *map, *mapend;
1226 if (dmabuf->rawbuf) {
1227 // Undo prog_dmabuf()'s marking the pages as reserved
1228 mapend = virt_to_page(dmabuf->rawbuf +
1229 (PAGE_SIZE << dmabuf->buforder) - 1);
1230 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1231 cs4x_mem_map_unreserve(map);
1232 free_dmabuf(state->card, dmabuf);
1235 if (dmabuf->tmpbuff) {
1236 // Undo prog_dmabuf()'s marking the pages as reserved
1237 mapend = virt_to_page(dmabuf->tmpbuff +
1238 (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1239 for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1240 cs4x_mem_map_unreserve(map);
1241 free_dmabuf2(state->card, dmabuf);
1244 dmabuf->rawbuf = NULL;
1245 dmabuf->tmpbuff = NULL;
1246 dmabuf->mapped = dmabuf->ready = 0;
1250 static int __prog_dmabuf(struct cs_state *state)
1252 struct dmabuf *dmabuf = &state->dmabuf;
1253 unsigned long flags;
1254 unsigned long allocated_pages, allocated_bytes;
1255 unsigned long tmp1, tmp2, fmt=0;
1256 unsigned long *ptmp = (unsigned long *) dmabuf->pbuf;
1257 unsigned long SGarray[9], nSGpages=0;
1260 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()+ \n"));
1262 * check for CAPTURE and use only non-sg for initial release
1264 if(dmabuf->type == CS_TYPE_ADC)
1266 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n"));
1268 * add in non-sg support for capture.
1270 spin_lock_irqsave(&state->card->lock, flags);
1271 /* add code to reset the rawbuf memory. TRW */
1272 resync_dma_ptrs(state);
1273 dmabuf->total_bytes = dmabuf->blocks = 0;
1274 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1278 spin_unlock_irqrestore(&state->card->lock, flags);
1280 /* allocate DMA buffer if not allocated yet */
1281 if (!dmabuf->rawbuf || !dmabuf->tmpbuff)
1282 if ((ret = alloc_dmabuf(state)))
1285 * static image only supports 16Bit signed, stereo - hard code fmt
1287 fmt = CS_FMT_16BIT | CS_FMT_STEREO;
1289 dmabuf->numfrag = 2;
1290 dmabuf->fragsize = 2048;
1291 dmabuf->fragsamples = 2048 >> sample_shift[fmt];
1292 dmabuf->dmasize = 4096;
1293 dmabuf->fragshift = 11;
1295 memset(dmabuf->rawbuf, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1297 memset(dmabuf->tmpbuff, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1298 PAGE_SIZE<<dmabuf->buforder_tmpbuff);
1301 * Now set up the ring
1304 spin_lock_irqsave(&state->card->lock, flags);
1305 cs_rec_setup(state);
1306 spin_unlock_irqrestore(&state->card->lock, flags);
1308 /* set the ready flag for the dma buffer */
1311 CS_DBGOUT(CS_PARMS, 4, printk(
1312 "cs46xx: prog_dmabuf(): CAPTURE rate=%d fmt=0x%x numfrag=%d "
1313 "fragsize=%d dmasize=%d\n",
1314 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1315 dmabuf->fragsize, dmabuf->dmasize) );
1317 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n"));
1320 else if (dmabuf->type == CS_TYPE_DAC)
1325 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() DAC\n"));
1326 spin_lock_irqsave(&state->card->lock, flags);
1327 resync_dma_ptrs(state);
1328 dmabuf->total_bytes = dmabuf->blocks = 0;
1329 dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1333 spin_unlock_irqrestore(&state->card->lock, flags);
1335 /* allocate DMA buffer if not allocated yet */
1336 if (!dmabuf->rawbuf)
1337 if ((ret = alloc_dmabuf(state)))
1340 allocated_pages = 1 << dmabuf->buforder;
1341 allocated_bytes = allocated_pages*PAGE_SIZE;
1343 if(allocated_pages < 2)
1345 CS_DBGOUT(CS_FUNCTION, 4, printk(
1346 "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n",
1347 (unsigned)allocated_pages));
1351 /* Use all the pages allocated, fragsize 4k. */
1352 /* Use 'pbuf' for S/G page map table. */
1353 dmabuf->SGok = 1; /* Use S/G. */
1355 nSGpages = allocated_bytes/4096; /* S/G pages always 4k. */
1357 /* Set up S/G variables. */
1358 *ptmp = virt_to_bus(dmabuf->rawbuf);
1359 *(ptmp+1) = 0x00000008;
1360 for(tmp1= 1; tmp1 < nSGpages; tmp1++) {
1361 *(ptmp+2*tmp1) = virt_to_bus( (dmabuf->rawbuf)+4096*tmp1);
1362 if( tmp1 == nSGpages-1)
1365 tmp2 = 0x80000000+8*(tmp1+1);
1366 *(ptmp+2*tmp1+1) = tmp2;
1368 SGarray[0] = 0x82c0200d;
1369 SGarray[1] = 0xffff0000;
1371 SGarray[3] = 0x00010600;
1372 SGarray[4] = *(ptmp+2);
1373 SGarray[5] = 0x80000010;
1375 SGarray[7] = *(ptmp+2);
1376 SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10;
1379 dmabuf->numfrag = nSGpages;
1380 dmabuf->fragsize = 4096;
1381 dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt];
1382 dmabuf->fragshift = 12;
1383 dmabuf->dmasize = dmabuf->numfrag*4096;
1386 SGarray[0] = 0xf2c0000f;
1387 SGarray[1] = 0x00000200;
1389 SGarray[3] = 0x00010600;
1390 SGarray[4]=SGarray[5]=SGarray[6]=SGarray[7]=SGarray[8] = 0;
1391 dmabuf->numfrag = 2;
1392 dmabuf->fragsize = 2048;
1393 dmabuf->fragsamples = 2048 >> sample_shift[dmabuf->fmt];
1394 dmabuf->dmasize = 4096;
1395 dmabuf->fragshift = 11;
1397 for(tmp1 = 0; tmp1 < sizeof(SGarray)/4; tmp1++)
1398 cs461x_poke( state->card, BA1_PDTC+tmp1*4, SGarray[tmp1]);
1400 memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1404 * Now set up the ring
1407 spin_lock_irqsave(&state->card->lock, flags);
1408 cs_play_setup(state);
1409 spin_unlock_irqrestore(&state->card->lock, flags);
1411 /* set the ready flag for the dma buffer */
1414 CS_DBGOUT(CS_PARMS, 4, printk(
1415 "cs46xx: prog_dmabuf(): PLAYBACK rate=%d fmt=0x%x numfrag=%d "
1416 "fragsize=%d dmasize=%d\n",
1417 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1418 dmabuf->fragsize, dmabuf->dmasize) );
1420 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n"));
1425 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n",
1431 static int prog_dmabuf(struct cs_state *state)
1436 ret = __prog_dmabuf(state);
1442 static void cs_clear_tail(struct cs_state *state)
1446 static int drain_dac(struct cs_state *state, int nonblock)
1448 DECLARE_WAITQUEUE(wait, current);
1449 struct dmabuf *dmabuf = &state->dmabuf;
1450 struct cs_card *card=state->card;
1451 unsigned long flags;
1455 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()+ \n"));
1456 if (dmabuf->mapped || !dmabuf->ready)
1458 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0, not ready\n"));
1462 add_wait_queue(&dmabuf->wait, &wait);
1464 /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1465 every time to make the process really go to sleep */
1466 current->state = TASK_INTERRUPTIBLE;
1468 spin_lock_irqsave(&state->card->lock, flags);
1469 count = dmabuf->count;
1470 spin_unlock_irqrestore(&state->card->lock, flags);
1475 if (signal_pending(current))
1479 remove_wait_queue(&dmabuf->wait, &wait);
1480 current->state = TASK_RUNNING;
1484 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1485 tmo >>= sample_shift[dmabuf->fmt];
1486 tmo += (2048*HZ)/dmabuf->rate;
1488 if (!schedule_timeout(tmo ? tmo : 1) && tmo){
1489 printk(KERN_ERR "cs46xx: drain_dac, dma timeout? %d\n", count);
1493 remove_wait_queue(&dmabuf->wait, &wait);
1494 current->state = TASK_RUNNING;
1495 if (signal_pending(current))
1497 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n"));
1499 * set to silence and let that clear the fifos.
1501 cs461x_clear_serial_FIFOs(card, CS_TYPE_DAC);
1502 return -ERESTARTSYS;
1505 CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0\n"));
1510 /* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
1511 static void cs_update_ptr(struct cs_card *card, int wake)
1513 struct cs_state *state;
1514 struct dmabuf *dmabuf;
1518 /* error handling and process wake up for ADC */
1519 state = card->states[0];
1522 dmabuf = &state->dmabuf;
1523 if (dmabuf->enable & ADC_RUNNING) {
1524 /* update hardware pointer */
1525 hwptr = cs_get_dma_addr(state);
1527 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1528 CS_DBGOUT(CS_PARMS, 9, printk(
1529 "cs46xx: cs_update_ptr()+ ADC hwptr=%d diff=%d\n",
1531 dmabuf->hwptr = hwptr;
1532 dmabuf->total_bytes += diff;
1533 dmabuf->count += diff;
1534 if (dmabuf->count > dmabuf->dmasize)
1535 dmabuf->count = dmabuf->dmasize;
1539 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1540 wake_up(&dmabuf->wait);
1543 if (wake && dmabuf->count > 0)
1544 wake_up(&dmabuf->wait);
1552 state = card->states[1];
1555 dmabuf = &state->dmabuf;
1556 /* error handling and process wake up for DAC */
1557 if (dmabuf->enable & DAC_RUNNING) {
1558 /* update hardware pointer */
1559 hwptr = cs_get_dma_addr(state);
1561 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1562 CS_DBGOUT(CS_PARMS, 9, printk(
1563 "cs46xx: cs_update_ptr()+ DAC hwptr=%d diff=%d\n",
1565 dmabuf->hwptr = hwptr;
1566 dmabuf->total_bytes += diff;
1567 if (dmabuf->mapped) {
1568 dmabuf->count += diff;
1569 if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1570 wake_up(&dmabuf->wait);
1572 * other drivers use fragsize, but don't see any sense
1573 * in that, since dmasize is the buffer asked for
1576 if( dmabuf->count > dmabuf->dmasize)
1577 dmabuf->count &= dmabuf->dmasize-1;
1579 dmabuf->count -= diff;
1581 * backfill with silence and clear out the last
1582 * "diff" number of bytes.
1586 memset(dmabuf->rawbuf + hwptr - diff,
1587 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff);
1591 memset(dmabuf->rawbuf,
1592 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1594 memset((char *)dmabuf->rawbuf +
1595 dmabuf->dmasize + hwptr - diff,
1596 (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1600 if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
1601 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
1602 "cs46xx: ERROR DAC count<0 or count > dmasize (%d)\n",
1605 * buffer underrun or buffer overrun, reset the
1606 * count of bytes written back to 0.
1608 if(dmabuf->count < 0)
1613 if (wake && dmabuf->count < (signed)dmabuf->dmasize/2)
1614 wake_up(&dmabuf->wait);
1621 /* hold spinlock for the following! */
1622 static void cs_handle_midi(struct cs_card *card)
1629 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_RBE)) {
1630 ch = cs461x_peekBA0(card, BA0_MIDRP);
1631 if (card->midi.icnt < CS_MIDIINBUF) {
1632 card->midi.ibuf[card->midi.iwr] = ch;
1633 card->midi.iwr = (card->midi.iwr + 1) % CS_MIDIINBUF;
1639 wake_up(&card->midi.iwait);
1641 while (!(cs461x_peekBA0(card, BA0_MIDSR) & MIDSR_TBF) && card->midi.ocnt > 0) {
1642 temp1 = ( card->midi.obuf[card->midi.ord] ) & 0x000000ff;
1643 cs461x_pokeBA0(card, BA0_MIDWP,temp1);
1644 card->midi.ord = (card->midi.ord + 1) % CS_MIDIOUTBUF;
1646 if (card->midi.ocnt < CS_MIDIOUTBUF-16)
1650 wake_up(&card->midi.owait);
1653 static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1655 struct cs_card *card = (struct cs_card *)dev_id;
1656 /* Single channel card */
1657 struct cs_state *recstate = card->channel[0].state;
1658 struct cs_state *playstate = card->channel[1].state;
1661 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()+ \n"));
1663 spin_lock(&card->lock);
1665 status = cs461x_peekBA0(card, BA0_HISR);
1667 if ((status & 0x7fffffff) == 0)
1669 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1670 spin_unlock(&card->lock);
1671 return IRQ_HANDLED; /* Might be IRQ_NONE.. */
1675 * check for playback or capture interrupt only
1677 if( ((status & HISR_VC0) && playstate && playstate->dmabuf.ready) ||
1678 (((status & HISR_VC1) && recstate && recstate->dmabuf.ready)) )
1680 CS_DBGOUT(CS_INTERRUPT, 8, printk(
1681 "cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status));
1682 cs_update_ptr(card, CS_TRUE);
1685 if( status & HISR_MIDI )
1686 cs_handle_midi(card);
1689 cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1690 spin_unlock(&card->lock);
1691 CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n"));
1696 /**********************************************************************/
1698 static ssize_t cs_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
1700 struct cs_card *card = (struct cs_card *)file->private_data;
1702 unsigned long flags;
1706 if (!access_ok(VERIFY_WRITE, buffer, count))
1710 spin_lock_irqsave(&card->lock, flags);
1711 ptr = card->midi.ird;
1712 cnt = CS_MIDIINBUF - ptr;
1713 if (card->midi.icnt < cnt)
1714 cnt = card->midi.icnt;
1715 spin_unlock_irqrestore(&card->lock, flags);
1719 if (file->f_flags & O_NONBLOCK)
1720 return ret ? ret : -EAGAIN;
1721 interruptible_sleep_on(&card->midi.iwait);
1722 if (signal_pending(current))
1723 return ret ? ret : -ERESTARTSYS;
1726 if (copy_to_user(buffer, card->midi.ibuf + ptr, cnt))
1727 return ret ? ret : -EFAULT;
1728 ptr = (ptr + cnt) % CS_MIDIINBUF;
1729 spin_lock_irqsave(&card->lock, flags);
1730 card->midi.ird = ptr;
1731 card->midi.icnt -= cnt;
1732 spin_unlock_irqrestore(&card->lock, flags);
1741 static ssize_t cs_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1743 struct cs_card *card = (struct cs_card *)file->private_data;
1745 unsigned long flags;
1749 if (!access_ok(VERIFY_READ, buffer, count))
1753 spin_lock_irqsave(&card->lock, flags);
1754 ptr = card->midi.owr;
1755 cnt = CS_MIDIOUTBUF - ptr;
1756 if (card->midi.ocnt + cnt > CS_MIDIOUTBUF)
1757 cnt = CS_MIDIOUTBUF - card->midi.ocnt;
1759 cs_handle_midi(card);
1760 spin_unlock_irqrestore(&card->lock, flags);
1764 if (file->f_flags & O_NONBLOCK)
1765 return ret ? ret : -EAGAIN;
1766 interruptible_sleep_on(&card->midi.owait);
1767 if (signal_pending(current))
1768 return ret ? ret : -ERESTARTSYS;
1771 if (copy_from_user(card->midi.obuf + ptr, buffer, cnt))
1772 return ret ? ret : -EFAULT;
1773 ptr = (ptr + cnt) % CS_MIDIOUTBUF;
1774 spin_lock_irqsave(&card->lock, flags);
1775 card->midi.owr = ptr;
1776 card->midi.ocnt += cnt;
1777 spin_unlock_irqrestore(&card->lock, flags);
1781 spin_lock_irqsave(&card->lock, flags);
1782 cs_handle_midi(card);
1783 spin_unlock_irqrestore(&card->lock, flags);
1789 static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait)
1791 struct cs_card *card = (struct cs_card *)file->private_data;
1792 unsigned long flags;
1793 unsigned int mask = 0;
1795 if (file->f_flags & FMODE_WRITE)
1796 poll_wait(file, &card->midi.owait, wait);
1797 if (file->f_flags & FMODE_READ)
1798 poll_wait(file, &card->midi.iwait, wait);
1799 spin_lock_irqsave(&card->lock, flags);
1800 if (file->f_flags & FMODE_READ) {
1801 if (card->midi.icnt > 0)
1802 mask |= POLLIN | POLLRDNORM;
1804 if (file->f_flags & FMODE_WRITE) {
1805 if (card->midi.ocnt < CS_MIDIOUTBUF)
1806 mask |= POLLOUT | POLLWRNORM;
1808 spin_unlock_irqrestore(&card->lock, flags);
1813 static int cs_midi_open(struct inode *inode, struct file *file)
1815 unsigned int minor = iminor(inode);
1816 struct cs_card *card=NULL;
1817 unsigned long flags;
1818 struct list_head *entry;
1820 list_for_each(entry, &cs46xx_devs)
1822 card = list_entry(entry, struct cs_card, list);
1823 if (card->dev_midi == minor)
1827 if (entry == &cs46xx_devs)
1831 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
1832 "cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n"));
1836 file->private_data = card;
1837 /* wait for device to become free */
1838 down(&card->midi.open_sem);
1839 while (card->midi.open_mode & file->f_mode) {
1840 if (file->f_flags & O_NONBLOCK) {
1841 up(&card->midi.open_sem);
1844 up(&card->midi.open_sem);
1845 interruptible_sleep_on(&card->midi.open_wait);
1846 if (signal_pending(current))
1847 return -ERESTARTSYS;
1848 down(&card->midi.open_sem);
1850 spin_lock_irqsave(&card->midi.lock, flags);
1851 if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) {
1852 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1853 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1854 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1855 cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f); /* Enable xmit, rcv. */
1856 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM); /* Enable interrupts */
1858 if (file->f_mode & FMODE_READ) {
1859 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1861 if (file->f_mode & FMODE_WRITE) {
1862 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1864 spin_unlock_irqrestore(&card->midi.lock, flags);
1865 card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
1866 up(&card->midi.open_sem);
1871 static int cs_midi_release(struct inode *inode, struct file *file)
1873 struct cs_card *card = (struct cs_card *)file->private_data;
1874 DECLARE_WAITQUEUE(wait, current);
1875 unsigned long flags;
1876 unsigned count, tmo;
1878 if (file->f_mode & FMODE_WRITE) {
1879 current->state = TASK_INTERRUPTIBLE;
1880 add_wait_queue(&card->midi.owait, &wait);
1882 spin_lock_irqsave(&card->midi.lock, flags);
1883 count = card->midi.ocnt;
1884 spin_unlock_irqrestore(&card->midi.lock, flags);
1887 if (signal_pending(current))
1889 if (file->f_flags & O_NONBLOCK)
1891 tmo = (count * HZ) / 3100;
1892 if (!schedule_timeout(tmo ? : 1) && tmo)
1893 printk(KERN_DEBUG "cs46xx: midi timed out??\n");
1895 remove_wait_queue(&card->midi.owait, &wait);
1896 current->state = TASK_RUNNING;
1898 down(&card->midi.open_sem);
1899 card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE)));
1900 up(&card->midi.open_sem);
1901 wake_up(&card->midi.open_wait);
1906 * Midi file operations struct.
1908 static /*const*/ struct file_operations cs_midi_fops = {
1909 CS_OWNER CS_THIS_MODULE
1910 .llseek = no_llseek,
1911 .read = cs_midi_read,
1912 .write = cs_midi_write,
1913 .poll = cs_midi_poll,
1914 .open = cs_midi_open,
1915 .release = cs_midi_release,
1920 * CopySamples copies 16-bit stereo signed samples from the source to the
1921 * destination, possibly converting down to unsigned 8-bit and/or mono.
1922 * count specifies the number of output bytes to write.
1926 * dst - Pointer to a destination buffer.
1927 * src - Pointer to a source buffer
1928 * count - The number of bytes to copy into the destination buffer.
1929 * fmt - CS_FMT_16BIT and/or CS_FMT_STEREO bits
1930 * dmabuf - pointer to the dma buffer structure
1932 * NOTES: only call this routine if the output desired is not 16 Signed Stereo
1936 static void CopySamples(char *dst, char *src, int count, unsigned fmt,
1937 struct dmabuf *dmabuf)
1941 s16 *psSrc=(s16 *)src;
1942 s16 *psDst=(s16 *)dst;
1943 u8 *pucDst=(u8 *)dst;
1945 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") );
1946 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1947 " dst=%p src=%p count=%d fmt=0x%x\n",
1948 dst,src,count,fmt) );
1951 * See if the data should be output as 8-bit unsigned stereo.
1953 if((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1956 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1957 * stereo using rounding.
1963 *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8);
1967 * See if the data should be output at 8-bit unsigned mono.
1969 else if(!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1972 * Convert each 16-bit signed stereo sample to 8-bit unsigned
1973 * mono using averaging and rounding.
1979 s32AudioSample = ((*psSrc)+(*(psSrc + 1)))/2 + (s32)0x80;
1980 if(s32AudioSample > 0x7fff)
1981 s32AudioSample = 0x7fff;
1982 *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8);
1987 * See if the data should be output at 16-bit signed mono.
1989 else if(!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT))
1992 * Convert each 16-bit signed stereo sample to 16-bit signed
1993 * mono using averaging.
1999 *(psDst++) = (s16)((*psSrc)+(*(psSrc + 1)))/2;
2007 * replacement for the standard copy_to_user, to allow for a conversion from
2008 * 16 bit to 8 bit and from stereo to mono, if the record conversion is active.
2009 * The current CS46xx/CS4280 static image only records in 16bit unsigned Stereo,
2010 * so we convert from any of the other format combinations.
2012 static unsigned cs_copy_to_user(
2019 struct dmabuf *dmabuf = &s->dmabuf;
2020 void *src = hwsrc; /* default to the standard destination buffer addr */
2022 CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
2023 "cs_copy_to_user()+ fmt=0x%x cnt=%d dest=%p\n",
2024 dmabuf->fmt,(unsigned)cnt,dest) );
2026 if(cnt > dmabuf->dmasize)
2028 cnt = dmabuf->dmasize;
2035 if(dmabuf->divisor != 1)
2037 if(!dmabuf->tmpbuff)
2039 *copied = cnt/dmabuf->divisor;
2043 CopySamples((char *)dmabuf->tmpbuff, (char *)hwsrc, cnt,
2044 dmabuf->fmt, dmabuf);
2045 src = dmabuf->tmpbuff;
2046 cnt = cnt/dmabuf->divisor;
2048 if (copy_to_user(dest, src, cnt))
2050 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
2051 "cs46xx: cs_copy_to_user()- fault dest=%p src=%p cnt=%d\n",
2057 CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
2058 "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt) );
2062 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
2063 the user's buffer. it is filled by the dma machine and drained by this loop. */
2064 static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
2066 struct cs_card *card = (struct cs_card *) file->private_data;
2067 struct cs_state *state;
2068 DECLARE_WAITQUEUE(wait, current);
2069 struct dmabuf *dmabuf;
2071 unsigned long flags;
2076 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2077 printk("cs46xx: cs_read()+ %zd\n",count) );
2078 state = (struct cs_state *)card->states[0];
2081 dmabuf = &state->dmabuf;
2085 if (!access_ok(VERIFY_WRITE, buffer, count))
2089 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2092 add_wait_queue(&state->dmabuf.wait, &wait);
2094 while(!(card->pm.flags & CS46XX_PM_IDLE))
2097 if (signal_pending(current)) {
2098 if(!ret) ret = -ERESTARTSYS;
2102 spin_lock_irqsave(&state->card->lock, flags);
2103 swptr = dmabuf->swptr;
2104 cnt = dmabuf->dmasize - swptr;
2105 if (dmabuf->count < cnt)
2106 cnt = dmabuf->count;
2108 __set_current_state(TASK_INTERRUPTIBLE);
2109 spin_unlock_irqrestore(&state->card->lock, flags);
2111 if (cnt > (count * dmabuf->divisor))
2112 cnt = count * dmabuf->divisor;
2114 /* buffer is empty, start the dma machine and wait for data to be
2117 if (file->f_flags & O_NONBLOCK) {
2118 if (!ret) ret = -EAGAIN;
2123 if (signal_pending(current)) {
2124 if(!ret) ret = -ERESTARTSYS;
2137 CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
2138 "_read() copy_to cnt=%d count=%zd ", cnt,count) );
2139 CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
2140 " .dmasize=%d .count=%d buffer=%p ret=%zd\n",
2141 dmabuf->dmasize,dmabuf->count,buffer,ret) );
2143 if (cs_copy_to_user(state, buffer,
2144 (char *)dmabuf->rawbuf + swptr, cnt, &copied))
2146 if (!ret) ret = -EFAULT;
2149 swptr = (swptr + cnt) % dmabuf->dmasize;
2150 spin_lock_irqsave(&card->lock, flags);
2151 dmabuf->swptr = swptr;
2152 dmabuf->count -= cnt;
2153 spin_unlock_irqrestore(&card->lock, flags);
2160 remove_wait_queue(&state->dmabuf.wait, &wait);
2163 set_current_state(TASK_RUNNING);
2164 CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2165 printk("cs46xx: cs_read()- %zd\n",ret) );
2169 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
2170 the soundcard. it is drained by the dma machine and filled by this loop. */
2171 static ssize_t cs_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
2173 struct cs_card *card = (struct cs_card *) file->private_data;
2174 struct cs_state *state;
2175 DECLARE_WAITQUEUE(wait, current);
2176 struct dmabuf *dmabuf;
2178 unsigned long flags;
2182 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4,
2183 printk("cs46xx: cs_write called, count = %zd\n", count) );
2184 state = (struct cs_state *)card->states[1];
2187 if (!access_ok(VERIFY_READ, buffer, count))
2189 dmabuf = &state->dmabuf;
2198 if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2200 add_wait_queue(&state->dmabuf.wait, &wait);
2203 * Start the loop to read from the user's buffer and write to the dma buffer.
2204 * check for PM events and underrun/overrun in the loop.
2207 while(!(card->pm.flags & CS46XX_PM_IDLE))
2210 if (signal_pending(current)) {
2211 if(!ret) ret = -ERESTARTSYS;
2215 spin_lock_irqsave(&state->card->lock, flags);
2216 if (dmabuf->count < 0) {
2217 /* buffer underrun, we are recovering from sleep_on_timeout,
2218 resync hwptr and swptr */
2220 dmabuf->swptr = dmabuf->hwptr;
2222 if (dmabuf->underrun)
2224 dmabuf->underrun = 0;
2225 dmabuf->hwptr = cs_get_dma_addr(state);
2226 dmabuf->swptr = dmabuf->hwptr;
2229 swptr = dmabuf->swptr;
2230 cnt = dmabuf->dmasize - swptr;
2231 if (dmabuf->count + cnt > dmabuf->dmasize)
2232 cnt = dmabuf->dmasize - dmabuf->count;
2234 __set_current_state(TASK_INTERRUPTIBLE);
2235 spin_unlock_irqrestore(&state->card->lock, flags);
2240 /* buffer is full, start the dma machine and wait for data to be
2243 if (file->f_flags & O_NONBLOCK) {
2244 if (!ret) ret = -EAGAIN;
2249 if (signal_pending(current)) {
2250 if(!ret) ret = -ERESTARTSYS;
2262 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
2263 if (!ret) ret = -EFAULT;
2266 spin_lock_irqsave(&state->card->lock, flags);
2267 swptr = (swptr + cnt) % dmabuf->dmasize;
2268 dmabuf->swptr = swptr;
2269 dmabuf->count += cnt;
2270 if(dmabuf->count > dmabuf->dmasize)
2272 CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk(
2273 "cs46xx: cs_write() d->count > dmasize - resetting\n"));
2274 dmabuf->count = dmabuf->dmasize;
2276 dmabuf->endcleared = 0;
2277 spin_unlock_irqrestore(&state->card->lock, flags);
2286 remove_wait_queue(&state->dmabuf.wait, &wait);
2287 set_current_state(TASK_RUNNING);
2289 CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2,
2290 printk("cs46xx: cs_write()- ret=%zd\n", ret) );
2294 static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
2296 struct cs_card *card = (struct cs_card *)file->private_data;
2297 struct dmabuf *dmabuf;
2298 struct cs_state *state;
2300 unsigned long flags;
2301 unsigned int mask = 0;
2303 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n"));
2304 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
2308 if (file->f_mode & FMODE_WRITE)
2310 state = card->states[1];
2313 dmabuf = &state->dmabuf;
2314 poll_wait(file, &dmabuf->wait, wait);
2317 if (file->f_mode & FMODE_READ)
2319 state = card->states[0];
2322 dmabuf = &state->dmabuf;
2323 poll_wait(file, &dmabuf->wait, wait);
2327 spin_lock_irqsave(&card->lock, flags);
2328 cs_update_ptr(card, CS_FALSE);
2329 if (file->f_mode & FMODE_READ) {
2330 state = card->states[0];
2333 dmabuf = &state->dmabuf;
2334 if (dmabuf->count >= (signed)dmabuf->fragsize)
2335 mask |= POLLIN | POLLRDNORM;
2338 if (file->f_mode & FMODE_WRITE) {
2339 state = card->states[1];
2342 dmabuf = &state->dmabuf;
2343 if (dmabuf->mapped) {
2344 if (dmabuf->count >= (signed)dmabuf->fragsize)
2345 mask |= POLLOUT | POLLWRNORM;
2347 if ((signed)dmabuf->dmasize >= dmabuf->count
2348 + (signed)dmabuf->fragsize)
2349 mask |= POLLOUT | POLLWRNORM;
2353 spin_unlock_irqrestore(&card->lock, flags);
2355 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()- (0x%x) \n",
2361 * We let users mmap the ring buffer. Its not the real DMA buffer but
2362 * that side of the code is hidden in the IRQ handling. We do a software
2363 * emulation of DMA from a 64K or so buffer into a 2K FIFO.
2364 * (the hardware probably deserves a moan here but Crystal send me nice
2368 static int cs_mmap(struct file *file, struct vm_area_struct *vma)
2370 struct cs_card *card = (struct cs_card *)file->private_data;
2371 struct cs_state *state;
2372 struct dmabuf *dmabuf;
2376 CS_DBGOUT(CS_FUNCTION | CS_PARMS, 2, printk("cs46xx: cs_mmap()+ file=%p %s %s\n",
2377 file, vma->vm_flags & VM_WRITE ? "VM_WRITE" : "",
2378 vma->vm_flags & VM_READ ? "VM_READ" : "") );
2380 if (vma->vm_flags & VM_WRITE) {
2381 state = card->states[1];
2384 CS_DBGOUT(CS_OPEN, 2, printk(
2385 "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") );
2386 if ((ret = prog_dmabuf(state)) != 0)
2389 } else if (vma->vm_flags & VM_READ) {
2390 state = card->states[0];
2393 CS_DBGOUT(CS_OPEN, 2, printk(
2394 "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") );
2395 if ((ret = prog_dmabuf(state)) != 0)
2399 CS_DBGOUT(CS_ERROR, 2, printk(
2400 "cs46xx: cs_mmap() return -EINVAL\n") );
2405 * For now ONLY support playback, but seems like the only way to use
2406 * mmap() is to open an FD with RDWR, just read or just write access
2407 * does not function, get an error back from the kernel.
2408 * Also, QuakeIII opens with RDWR! So, there must be something
2409 * to needing read/write access mapping. So, allow read/write but
2412 state = card->states[1];
2419 dmabuf = &state->dmabuf;
2420 if (cs4x_pgoff(vma) != 0)
2425 size = vma->vm_end - vma->vm_start;
2427 CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) );
2429 if (size > (PAGE_SIZE << dmabuf->buforder))
2434 if (remap_pfn_range(vma, vma->vm_start,
2435 virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
2436 size, vma->vm_page_prot))
2443 CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") );
2449 static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2451 struct cs_card *card = (struct cs_card *)file->private_data;
2452 struct cs_state *state;
2453 struct dmabuf *dmabuf=NULL;
2454 unsigned long flags;
2455 audio_buf_info abinfo;
2457 int val, valsave, mapped, ret;
2458 void __user *argp = (void __user *)arg;
2459 int __user *p = argp;
2461 state = (struct cs_state *)card->states[0];
2464 dmabuf = &state->dmabuf;
2465 mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped;
2467 state = (struct cs_state *)card->states[1];
2470 dmabuf = &state->dmabuf;
2471 mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped;
2480 case OSS_GETVERSION:
2481 return put_user(SOUND_VERSION, p);
2483 case SNDCTL_DSP_RESET:
2484 /* FIXME: spin_lock ? */
2485 if (file->f_mode & FMODE_WRITE) {
2486 state = (struct cs_state *)card->states[1];
2489 dmabuf = &state->dmabuf;
2491 synchronize_irq(card->irq);
2493 resync_dma_ptrs(state);
2494 dmabuf->swptr = dmabuf->hwptr = 0;
2495 dmabuf->count = dmabuf->total_bytes = 0;
2500 if (file->f_mode & FMODE_READ) {
2501 state = (struct cs_state *)card->states[0];
2504 dmabuf = &state->dmabuf;
2506 synchronize_irq(card->irq);
2507 resync_dma_ptrs(state);
2509 dmabuf->swptr = dmabuf->hwptr = 0;
2510 dmabuf->count = dmabuf->total_bytes = 0;
2515 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") );
2518 case SNDCTL_DSP_SYNC:
2519 if (file->f_mode & FMODE_WRITE)
2520 return drain_dac(state, file->f_flags & O_NONBLOCK);
2523 case SNDCTL_DSP_SPEED: /* set sample rate */
2524 if (get_user(val, p))
2527 if (file->f_mode & FMODE_READ) {
2528 state = (struct cs_state *)card->states[0];
2531 dmabuf = &state->dmabuf;
2535 cs_set_adc_rate(state, val);
2536 cs_set_divisor(dmabuf);
2539 if (file->f_mode & FMODE_WRITE) {
2540 state = (struct cs_state *)card->states[1];
2543 dmabuf = &state->dmabuf;
2547 cs_set_dac_rate(state, val);
2548 cs_set_divisor(dmabuf);
2551 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2552 "cs46xx: cs_ioctl() DSP_SPEED %s %s %d\n",
2553 file->f_mode & FMODE_WRITE ? "DAC" : "",
2554 file->f_mode & FMODE_READ ? "ADC" : "",
2556 return put_user(dmabuf->rate, p);
2558 return put_user(0, p);
2560 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2561 if (get_user(val, p))
2563 if (file->f_mode & FMODE_WRITE) {
2564 state = (struct cs_state *)card->states[1];
2567 dmabuf = &state->dmabuf;
2572 dmabuf->fmt |= CS_FMT_STEREO;
2574 dmabuf->fmt &= ~CS_FMT_STEREO;
2575 cs_set_divisor(dmabuf);
2576 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2577 "cs46xx: DSP_STEREO() DAC %s\n",
2578 (dmabuf->fmt & CS_FMT_STEREO) ?
2582 if (file->f_mode & FMODE_READ) {
2583 state = (struct cs_state *)card->states[0];
2586 dmabuf = &state->dmabuf;
2591 dmabuf->fmt |= CS_FMT_STEREO;
2593 dmabuf->fmt &= ~CS_FMT_STEREO;
2594 cs_set_divisor(dmabuf);
2595 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2596 "cs46xx: DSP_STEREO() ADC %s\n",
2597 (dmabuf->fmt & CS_FMT_STEREO) ?
2603 case SNDCTL_DSP_GETBLKSIZE:
2604 if (file->f_mode & FMODE_WRITE) {
2605 state = (struct cs_state *)card->states[1];
2608 dmabuf = &state->dmabuf;
2609 if ((val = prog_dmabuf(state)))
2611 return put_user(dmabuf->fragsize, p);
2614 if (file->f_mode & FMODE_READ) {
2615 state = (struct cs_state *)card->states[0];
2618 dmabuf = &state->dmabuf;
2619 if ((val = prog_dmabuf(state)))
2621 return put_user(dmabuf->fragsize/dmabuf->divisor,
2625 return put_user(0, p);
2627 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
2628 return put_user(AFMT_S16_LE | AFMT_U8, p);
2630 case SNDCTL_DSP_SETFMT: /* Select sample format */
2631 if (get_user(val, p))
2633 CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2634 "cs46xx: cs_ioctl() DSP_SETFMT %s %s %s %s\n",
2635 file->f_mode & FMODE_WRITE ? "DAC" : "",
2636 file->f_mode & FMODE_READ ? "ADC" : "",
2637 val == AFMT_S16_LE ? "16Bit Signed" : "",
2638 val == AFMT_U8 ? "8Bit Unsigned" : "") );
2640 if (val != AFMT_QUERY) {
2641 if(val==AFMT_S16_LE || val==AFMT_U8)
2643 if (file->f_mode & FMODE_WRITE) {
2644 state = (struct cs_state *)card->states[1];
2647 dmabuf = &state->dmabuf;
2651 if(val==AFMT_S16_LE)
2652 dmabuf->fmt |= CS_FMT_16BIT;
2654 dmabuf->fmt &= ~CS_FMT_16BIT;
2655 cs_set_divisor(dmabuf);
2656 if((ret = prog_dmabuf(state)))
2660 if (file->f_mode & FMODE_READ) {
2662 state = (struct cs_state *)card->states[0];
2665 dmabuf = &state->dmabuf;
2669 if(val==AFMT_S16_LE)
2670 dmabuf->fmt |= CS_FMT_16BIT;
2672 dmabuf->fmt &= ~CS_FMT_16BIT;
2673 cs_set_divisor(dmabuf);
2674 if((ret = prog_dmabuf(state)))
2681 CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk(
2682 "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n",
2688 if(file->f_mode & FMODE_WRITE)
2690 state = (struct cs_state *)card->states[1];
2692 dmabuf = &state->dmabuf;
2694 else if(file->f_mode & FMODE_READ)
2696 state = (struct cs_state *)card->states[0];
2698 dmabuf = &state->dmabuf;
2703 if(dmabuf->fmt & CS_FMT_16BIT)
2704 return put_user(AFMT_S16_LE, p);
2706 return put_user(AFMT_U8, p);
2708 return put_user(0, p);
2710 case SNDCTL_DSP_CHANNELS:
2711 if (get_user(val, p))
2714 if (file->f_mode & FMODE_WRITE) {
2715 state = (struct cs_state *)card->states[1];
2718 dmabuf = &state->dmabuf;
2723 dmabuf->fmt |= CS_FMT_STEREO;
2725 dmabuf->fmt &= ~CS_FMT_STEREO;
2726 cs_set_divisor(dmabuf);
2727 if (prog_dmabuf(state))
2731 if (file->f_mode & FMODE_READ) {
2732 state = (struct cs_state *)card->states[0];
2735 dmabuf = &state->dmabuf;
2740 dmabuf->fmt |= CS_FMT_STEREO;
2742 dmabuf->fmt &= ~CS_FMT_STEREO;
2743 cs_set_divisor(dmabuf);
2744 if (prog_dmabuf(state))
2749 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
2752 case SNDCTL_DSP_POST:
2754 * There will be a longer than normal pause in the data.
2755 * so... do nothing, because there is nothing that we can do.
2759 case SNDCTL_DSP_SUBDIVIDE:
2760 if (file->f_mode & FMODE_WRITE) {
2761 state = (struct cs_state *)card->states[1];
2764 dmabuf = &state->dmabuf;
2765 if (dmabuf->subdivision)
2767 if (get_user(val, p))
2769 if (val != 1 && val != 2)
2771 dmabuf->subdivision = val;
2774 if (file->f_mode & FMODE_READ) {
2775 state = (struct cs_state *)card->states[0];
2778 dmabuf = &state->dmabuf;
2779 if (dmabuf->subdivision)
2781 if (get_user(val, p))
2783 if (val != 1 && val != 2)
2785 dmabuf->subdivision = val;
2790 case SNDCTL_DSP_SETFRAGMENT:
2791 if (get_user(val, p))
2794 if (file->f_mode & FMODE_WRITE) {
2795 state = (struct cs_state *)card->states[1];
2798 dmabuf = &state->dmabuf;
2799 dmabuf->ossfragshift = val & 0xffff;
2800 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2803 if (file->f_mode & FMODE_READ) {
2804 state = (struct cs_state *)card->states[0];
2807 dmabuf = &state->dmabuf;
2808 dmabuf->ossfragshift = val & 0xffff;
2809 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2814 case SNDCTL_DSP_GETOSPACE:
2815 if (!(file->f_mode & FMODE_WRITE))
2817 state = (struct cs_state *)card->states[1];
2820 dmabuf = &state->dmabuf;
2821 spin_lock_irqsave(&state->card->lock, flags);
2822 cs_update_ptr(card, CS_TRUE);
2823 abinfo.fragsize = dmabuf->fragsize;
2824 abinfo.fragstotal = dmabuf->numfrag;
2826 * for mmap we always have total space available
2829 abinfo.bytes = dmabuf->dmasize;
2831 abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2833 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2834 spin_unlock_irqrestore(&state->card->lock, flags);
2835 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2839 case SNDCTL_DSP_GETISPACE:
2840 if (!(file->f_mode & FMODE_READ))
2842 state = (struct cs_state *)card->states[0];
2845 dmabuf = &state->dmabuf;
2846 spin_lock_irqsave(&state->card->lock, flags);
2847 cs_update_ptr(card, CS_TRUE);
2848 abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
2849 abinfo.bytes = dmabuf->count/dmabuf->divisor;
2850 abinfo.fragstotal = dmabuf->numfrag;
2851 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2852 spin_unlock_irqrestore(&state->card->lock, flags);
2853 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2857 case SNDCTL_DSP_NONBLOCK:
2858 file->f_flags |= O_NONBLOCK;
2861 case SNDCTL_DSP_GETCAPS:
2862 return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
2865 case SNDCTL_DSP_GETTRIGGER:
2867 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") );
2868 if (file->f_mode & FMODE_WRITE)
2870 state = (struct cs_state *)card->states[1];
2873 dmabuf = &state->dmabuf;
2874 if(dmabuf->enable & DAC_RUNNING)
2875 val |= PCM_ENABLE_INPUT;
2878 if (file->f_mode & FMODE_READ)
2882 state = (struct cs_state *)card->states[0];
2883 dmabuf = &state->dmabuf;
2884 if(dmabuf->enable & ADC_RUNNING)
2885 val |= PCM_ENABLE_OUTPUT;
2888 CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) );
2889 return put_user(val, p);
2891 case SNDCTL_DSP_SETTRIGGER:
2892 if (get_user(val, p))
2894 if (file->f_mode & FMODE_READ) {
2895 state = (struct cs_state *)card->states[0];
2898 dmabuf = &state->dmabuf;
2899 if (val & PCM_ENABLE_INPUT) {
2900 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2907 if (file->f_mode & FMODE_WRITE) {
2908 state = (struct cs_state *)card->states[1];
2911 dmabuf = &state->dmabuf;
2912 if (val & PCM_ENABLE_OUTPUT) {
2913 if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2922 case SNDCTL_DSP_GETIPTR:
2923 if (!(file->f_mode & FMODE_READ))
2925 state = (struct cs_state *)card->states[0];
2928 dmabuf = &state->dmabuf;
2929 spin_lock_irqsave(&state->card->lock, flags);
2930 cs_update_ptr(card, CS_TRUE);
2931 cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
2932 cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
2933 cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
2934 spin_unlock_irqrestore(&state->card->lock, flags);
2935 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2941 case SNDCTL_DSP_GETOPTR:
2942 if (!(file->f_mode & FMODE_WRITE))
2944 state = (struct cs_state *)card->states[1];
2947 dmabuf = &state->dmabuf;
2948 spin_lock_irqsave(&state->card->lock, flags);
2949 cs_update_ptr(card, CS_TRUE);
2950 cinfo.bytes = dmabuf->total_bytes;
2953 cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift)
2955 CS_DBGOUT(CS_PARMS, 8,
2956 printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n",
2957 cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
2958 dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
2962 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2964 cinfo.ptr = dmabuf->hwptr;
2966 CS_DBGOUT(CS_PARMS, 4, printk(
2967 "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%d\n",
2968 cinfo.bytes,cinfo.blocks,cinfo.ptr) );
2969 spin_unlock_irqrestore(&state->card->lock, flags);
2970 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
2976 case SNDCTL_DSP_SETDUPLEX:
2979 case SNDCTL_DSP_GETODELAY:
2980 if (!(file->f_mode & FMODE_WRITE))
2982 state = (struct cs_state *)card->states[1];
2985 dmabuf = &state->dmabuf;
2986 spin_lock_irqsave(&state->card->lock, flags);
2987 cs_update_ptr(card, CS_TRUE);
2988 val = dmabuf->count;
2989 spin_unlock_irqrestore(&state->card->lock, flags);
2993 return put_user(val, p);
2995 case SOUND_PCM_READ_RATE:
2996 if(file->f_mode & FMODE_READ)
2997 state = (struct cs_state *)card->states[0];
2999 state = (struct cs_state *)card->states[1];
3002 dmabuf = &state->dmabuf;
3003 return put_user(dmabuf->rate, p);
3005 return put_user(0, p);
3008 case SOUND_PCM_READ_CHANNELS:
3009 if(file->f_mode & FMODE_READ)
3010 state = (struct cs_state *)card->states[0];
3012 state = (struct cs_state *)card->states[1];
3015 dmabuf = &state->dmabuf;
3016 return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
3019 return put_user(0, p);
3021 case SOUND_PCM_READ_BITS:
3022 if(file->f_mode & FMODE_READ)
3023 state = (struct cs_state *)card->states[0];
3025 state = (struct cs_state *)card->states[1];
3028 dmabuf = &state->dmabuf;
3029 return put_user((dmabuf->fmt & CS_FMT_16BIT) ?
3030 AFMT_S16_LE : AFMT_U8, p);
3033 return put_user(0, p);
3035 case SNDCTL_DSP_MAPINBUF:
3036 case SNDCTL_DSP_MAPOUTBUF:
3037 case SNDCTL_DSP_SETSYNCRO:
3038 case SOUND_PCM_WRITE_FILTER:
3039 case SOUND_PCM_READ_FILTER:
3047 * AMP control - null AMP
3050 static void amp_none(struct cs_card *card, int change)
3058 static void amp_voyetra(struct cs_card *card, int change)
3060 /* Manage the EAPD bit on the Crystal 4297
3061 and the Analog AD1885 */
3063 int old=card->amplifier;
3065 card->amplifier+=change;
3066 if(card->amplifier && !old)
3068 /* Turn the EAPD amp on */
3069 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3070 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
3073 else if(old && !card->amplifier)
3075 /* Turn the EAPD amp off */
3076 cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL,
3077 cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
3084 * Game Theatre XP card - EGPIO[2] is used to enable the external amp.
3087 static void amp_hercules(struct cs_card *card, int change)
3089 int old=card->amplifier;
3092 CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
3093 "cs46xx: amp_hercules() called before initialized.\n"));
3096 card->amplifier+=change;
3097 if( (card->amplifier && !old) && !(hercules_egpio_disable))
3099 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3100 "cs46xx: amp_hercules() external amp enabled\n"));
3101 cs461x_pokeBA0(card, BA0_EGPIODR,
3102 EGPIODR_GPOE2); /* enable EGPIO2 output */
3103 cs461x_pokeBA0(card, BA0_EGPIOPTR,
3104 EGPIOPTR_GPPT2); /* open-drain on output */
3106 else if(old && !card->amplifier)
3108 CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3109 "cs46xx: amp_hercules() external amp disabled\n"));
3110 cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
3111 cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
3116 * Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
3117 * whenever we need to beat on the chip.
3119 * The original idea and code for this hack comes from David Kaiser at
3120 * Linuxcare. Perhaps one day Crystal will document their chips well
3121 * enough to make them useful.
3124 static void clkrun_hack(struct cs_card *card, int change)
3126 struct pci_dev *acpi_dev;
3130 int old=card->active;
3132 card->active+=change;
3134 acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
3135 if(acpi_dev == NULL)
3136 return; /* Not a thinkpad thats for sure */
3138 /* Find the control port */
3139 pci_read_config_byte(acpi_dev, 0x41, &pp);
3142 /* Read ACPI port */
3143 control=inw(port+0x10);
3145 /* Flip CLKRUN off while running */
3146 if(!card->active && old)
3148 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3149 "cs46xx: clkrun() enable clkrun - change=%d active=%d\n",
3150 change,card->active));
3151 outw(control|0x2000, port+0x10);
3156 * sometimes on a resume the bit is set, so always reset the bit.
3158 CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3159 "cs46xx: clkrun() disable clkrun - change=%d active=%d\n",
3160 change,card->active));
3161 outw(control&~0x2000, port+0x10);
3166 static int cs_open(struct inode *inode, struct file *file)
3168 struct cs_card *card = (struct cs_card *)file->private_data;
3169 struct cs_state *state = NULL;
3170 struct dmabuf *dmabuf = NULL;
3171 struct list_head *entry;
3172 unsigned int minor = iminor(inode);
3176 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=%p %s %s\n",
3177 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3178 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3180 list_for_each(entry, &cs46xx_devs)
3182 card = list_entry(entry, struct cs_card, list);
3184 if (!((card->dev_audio ^ minor) & ~0xf))
3187 if (entry == &cs46xx_devs)
3190 CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
3191 "cs46xx: cs_open(): Error - unable to find audio card struct\n"));
3196 * hardcode state[0] for capture, [1] for playback
3198 if(file->f_mode & FMODE_READ)
3200 CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
3201 if (card->states[0] == NULL) {
3202 state = card->states[0] = (struct cs_state *)
3203 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3206 memset(state, 0, sizeof(struct cs_state));
3207 init_MUTEX(&state->sem);
3208 dmabuf = &state->dmabuf;
3209 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3210 if(dmabuf->pbuf==NULL)
3213 card->states[0]=NULL;
3219 state = card->states[0];
3220 if(state->open_mode & FMODE_READ)
3223 dmabuf->channel = card->alloc_rec_pcm_channel(card);
3225 if (dmabuf->channel == NULL) {
3226 kfree (card->states[0]);
3227 card->states[0] = NULL;
3231 /* Now turn on external AMP if needed */
3233 state->card->active_ctrl(state->card,1);
3234 state->card->amplifier_ctrl(state->card,1);
3236 if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) )
3238 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3239 "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n",tmp) );
3243 dmabuf->channel->state = state;
3244 /* initialize the virtual channel */
3246 state->magic = CS_STATE_MAGIC;
3247 init_waitqueue_head(&dmabuf->wait);
3248 init_MUTEX(&state->open_sem);
3249 file->private_data = card;
3251 down(&state->open_sem);
3253 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3254 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3255 /dev/dspW will accept 16-bits sample */
3257 /* Default input is 8bit mono */
3258 dmabuf->fmt &= ~CS_FMT_MASK;
3259 dmabuf->type = CS_TYPE_ADC;
3260 dmabuf->ossfragshift = 0;
3261 dmabuf->ossmaxfrags = 0;
3262 dmabuf->subdivision = 0;
3263 cs_set_adc_rate(state, 8000);
3264 cs_set_divisor(dmabuf);
3266 state->open_mode |= FMODE_READ;
3267 up(&state->open_sem);
3269 if(file->f_mode & FMODE_WRITE)
3271 CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
3272 if (card->states[1] == NULL) {
3273 state = card->states[1] = (struct cs_state *)
3274 kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3277 memset(state, 0, sizeof(struct cs_state));
3278 init_MUTEX(&state->sem);
3279 dmabuf = &state->dmabuf;
3280 dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
3281 if(dmabuf->pbuf==NULL)
3284 card->states[1]=NULL;
3290 state = card->states[1];
3291 if(state->open_mode & FMODE_WRITE)
3294 dmabuf->channel = card->alloc_pcm_channel(card);
3296 if (dmabuf->channel == NULL) {
3297 kfree (card->states[1]);
3298 card->states[1] = NULL;
3302 /* Now turn on external AMP if needed */
3304 state->card->active_ctrl(state->card,1);
3305 state->card->amplifier_ctrl(state->card,1);
3307 if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) )
3309 CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3310 "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n",tmp) );
3314 dmabuf->channel->state = state;
3315 /* initialize the virtual channel */
3317 state->magic = CS_STATE_MAGIC;
3318 init_waitqueue_head(&dmabuf->wait);
3319 init_MUTEX(&state->open_sem);
3320 file->private_data = card;
3322 down(&state->open_sem);
3324 /* set default sample format. According to OSS Programmer's Guide /dev/dsp
3325 should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3326 /dev/dspW will accept 16-bits sample */
3328 /* Default output is 8bit mono. */
3329 dmabuf->fmt &= ~CS_FMT_MASK;
3330 dmabuf->type = CS_TYPE_DAC;
3331 dmabuf->ossfragshift = 0;
3332 dmabuf->ossmaxfrags = 0;
3333 dmabuf->subdivision = 0;
3334 cs_set_dac_rate(state, 8000);
3335 cs_set_divisor(dmabuf);
3337 state->open_mode |= FMODE_WRITE;
3338 up(&state->open_sem);
3339 if((ret = prog_dmabuf(state)))
3342 CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n") );
3343 return nonseekable_open(inode, file);
3346 static int cs_release(struct inode *inode, struct file *file)
3348 struct cs_card *card = (struct cs_card *)file->private_data;
3349 struct dmabuf *dmabuf;
3350 struct cs_state *state;
3352 CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=%p %s %s\n",
3353 file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3354 file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3356 if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
3360 state = card->states[1];
3363 if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) )
3365 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n") );
3366 dmabuf = &state->dmabuf;
3367 cs_clear_tail(state);
3368 drain_dac(state, file->f_flags & O_NONBLOCK);
3369 /* stop DMA state machine and free DMA buffers/channels */
3370 down(&state->open_sem);
3372 dealloc_dmabuf(state);
3373 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3374 free_page((unsigned long)state->dmabuf.pbuf);
3376 /* we're covered by the open_sem */
3377 up(&state->open_sem);
3378 state->card->states[state->virt] = NULL;
3379 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3381 if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) )
3383 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3384 "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) );
3387 /* Now turn off external AMP if needed */
3388 state->card->amplifier_ctrl(state->card, -1);
3389 state->card->active_ctrl(state->card, -1);
3395 state = card->states[0];
3398 if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) )
3400 CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n") );
3401 dmabuf = &state->dmabuf;
3402 down(&state->open_sem);
3404 dealloc_dmabuf(state);
3405 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3406 free_page((unsigned long)state->dmabuf.pbuf);
3408 /* we're covered by the open_sem */
3409 up(&state->open_sem);
3410 state->card->states[state->virt] = NULL;
3411 state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3413 if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) )
3415 CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3416 "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) );
3419 /* Now turn off external AMP if needed */
3420 state->card->amplifier_ctrl(state->card, -1);
3421 state->card->active_ctrl(state->card, -1);
3427 CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n") );
3431 static void printpm(struct cs_card *s)
3433 CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
3434 CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
3435 (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
3436 CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
3437 s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
3438 CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
3439 s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
3440 CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
3441 s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
3442 CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
3443 s->pm.u32SSCR,s->pm.u32SRCSA));
3444 CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
3445 s->pm.u32DacASR,s->pm.u32AdcASR));
3446 CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
3447 s->pm.u32DacSR,s->pm.u32AdcSR));
3448 CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
3449 s->pm.u32MIDCR_Save));
3450 CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%x\n",
3451 s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
3452 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%x\n",
3453 s->pm.u32AC97_master_volume));
3454 CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%x\n",
3455 s->pm.u32AC97_headphone_volume));
3456 CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%x\n",
3457 s->pm.u32AC97_master_volume_mono));
3458 CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%x\n",
3459 s->pm.u32AC97_pcm_out_volume));
3460 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %d\n",
3461 s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
3462 CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %d\n",
3463 s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
3467 /****************************************************************************
3469 * Suspend - save the ac97 regs, mute the outputs and power down the part.
3471 ****************************************************************************/
3472 static void cs46xx_ac97_suspend(struct cs_card *card)
3475 struct ac97_codec *dev=card->ac97_codec[0];
3478 CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n"));
3482 stop_dac(card->states[1]);
3483 resync_dma_ptrs(card->states[1]);
3487 stop_adc(card->states[0]);
3488 resync_dma_ptrs(card->states[0]);
3491 for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3492 && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3495 card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
3498 * Save the ac97 volume registers as well as the current powerdown state.
3499 * Now, mute the all the outputs (master, headphone, and mono), as well
3500 * as the PCM volume, in preparation for powering down the entire part.
3501 card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
3502 (u8)BA0_AC97_MASTER_VOLUME);
3503 card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
3504 (u8)BA0_AC97_HEADPHONE_VOLUME);
3505 card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
3506 (u8)BA0_AC97_MASTER_VOLUME_MONO);
3507 card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
3508 (u8)BA0_AC97_PCM_OUT_VOLUME);