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);
3513 cs_ac97_set(dev
, (u8
)BA0_AC97_MASTER_VOLUME
, 0x8000);
3514 cs_ac97_set(dev
, (u8
)BA0_AC97_HEADPHONE_VOLUME
, 0x8000);
3515 cs_ac97_set(dev
, (u8
)BA0_AC97_MASTER_VOLUME_MONO
, 0x8000);
3516 cs_ac97_set(dev
, (u8
)BA0_AC97_PCM_OUT_VOLUME
, 0x8000);
3519 * save the registers that cause pops
3521 card
->pm
.u32AC97_powerdown
= (u32
)cs_ac97_get(dev
, (u8
)AC97_POWER_CONTROL
);
3522 card
->pm
.u32AC97_general_purpose
= (u32
)cs_ac97_get(dev
, (u8
)BA0_AC97_GENERAL_PURPOSE
);
3524 * And power down everything on the AC97 codec.
3525 * well, for now, only power down the DAC/ADC and MIXER VREFON components.
3526 * trouble with removing VREF.
3528 if( (tmp
= cs461x_powerdown(card
, CS_POWER_DAC
| CS_POWER_ADC
|
3529 CS_POWER_MIXVON
, CS_TRUE
)) )
3531 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_INFO
3532 "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp
) );
3535 CS_DBGOUT(CS_PM
, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n"));
3538 /****************************************************************************
3540 * Resume - power up the part and restore its registers..
3542 ****************************************************************************/
3543 static void cs46xx_ac97_resume(struct cs_card
*card
)
3546 struct ac97_codec
*dev
=card
->ac97_codec
[0];
3548 CS_DBGOUT(CS_PM
, 9, printk("cs46xx: cs46xx_ac97_resume()+\n"));
3551 * First, we restore the state of the general purpose register. This
3552 * contains the mic select (mic1 or mic2) and if we restore this after
3553 * we restore the mic volume/boost state and mic2 was selected at
3554 * suspend time, we will end up with a brief period of time where mic1
3555 * is selected with the volume/boost settings for mic2, causing
3556 * acoustic feedback. So we restore the general purpose register
3557 * first, thereby getting the correct mic selected before we restore
3558 * the mic volume/boost.
3560 cs_ac97_set(dev
, (u8
)BA0_AC97_GENERAL_PURPOSE
,
3561 (u16
)card
->pm
.u32AC97_general_purpose
);
3563 * Now, while the outputs are still muted, restore the state of power
3566 cs_ac97_set(dev
, (u8
)BA0_AC97_POWERDOWN
, (u16
)card
->pm
.u32AC97_powerdown
);
3567 mdelay(5 * cs_laptop_wait
);
3569 * Restore just the first set of registers, from register number
3570 * 0x02 to the register number that ulHighestRegToRestore specifies.
3572 for( Count
= 0x2, i
=0;
3573 (Count
<= CS46XX_AC97_HIGHESTREGTORESTORE
)
3574 && (i
< CS46XX_AC97_NUMBER_RESTORE_REGS
);
3577 cs_ac97_set(dev
, (u8
)(BA0_AC97_RESET
+ Count
), (u16
)card
->pm
.ac97
[i
]);
3580 /* Check if we have to init the amplifier */
3582 card
->amp_init(card
);
3584 CS_DBGOUT(CS_PM
, 9, printk("cs46xx: cs46xx_ac97_resume()-\n"));
3588 static int cs46xx_restart_part(struct cs_card
*card
)
3590 struct dmabuf
*dmabuf
;
3591 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 4,
3592 printk( "cs46xx: cs46xx_restart_part()+\n"));
3595 dmabuf
= &card
->states
[1]->dmabuf
;
3597 resync_dma_ptrs(card
->states
[1]);
3598 cs_set_divisor(dmabuf
);
3599 if(__prog_dmabuf(card
->states
[1]))
3601 CS_DBGOUT(CS_PM
| CS_ERROR
, 1,
3602 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n"));
3605 cs_set_dac_rate(card
->states
[1], dmabuf
->rate
);
3609 dmabuf
= &card
->states
[0]->dmabuf
;
3611 resync_dma_ptrs(card
->states
[0]);
3612 cs_set_divisor(dmabuf
);
3613 if(__prog_dmabuf(card
->states
[0]))
3615 CS_DBGOUT(CS_PM
| CS_ERROR
, 1,
3616 printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n"));
3619 cs_set_adc_rate(card
->states
[0], dmabuf
->rate
);
3621 card
->pm
.flags
|= CS46XX_PM_RESUMED
;
3623 start_adc(card
->states
[0]);
3625 start_dac(card
->states
[1]);
3627 card
->pm
.flags
|= CS46XX_PM_IDLE
;
3628 card
->pm
.flags
&= ~(CS46XX_PM_SUSPENDING
| CS46XX_PM_SUSPENDED
3629 | CS46XX_PM_RESUMING
| CS46XX_PM_RESUMED
);
3631 wake_up(&card
->states
[0]->dmabuf
.wait
);
3633 wake_up(&card
->states
[1]->dmabuf
.wait
);
3635 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 4,
3636 printk( "cs46xx: cs46xx_restart_part()-\n"));
3641 static void cs461x_reset(struct cs_card
*card
);
3642 static void cs461x_proc_stop(struct cs_card
*card
);
3643 static int cs46xx_suspend(struct cs_card
*card
, pm_message_t state
)
3646 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 4,
3647 printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=%p\n",
3648 (unsigned)card
->pm
.flags
,card
));
3650 * check the current state, only suspend if IDLE
3652 if(!(card
->pm
.flags
& CS46XX_PM_IDLE
))
3654 CS_DBGOUT(CS_PM
| CS_ERROR
, 2,
3655 printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n"));
3658 card
->pm
.flags
&= ~CS46XX_PM_IDLE
;
3659 card
->pm
.flags
|= CS46XX_PM_SUSPENDING
;
3661 card
->active_ctrl(card
,1);
3663 tmp
= cs461x_peek(card
, BA1_PFIE
);
3666 cs461x_poke(card
, BA1_PFIE
, tmp
); /* playback interrupt disable */
3668 tmp
= cs461x_peek(card
, BA1_CIE
);
3671 cs461x_poke(card
, BA1_CIE
, tmp
); /* capture interrupt disable */
3674 * Stop playback DMA.
3676 tmp
= cs461x_peek(card
, BA1_PCTL
);
3677 cs461x_poke(card
, BA1_PCTL
, tmp
& 0x0000ffff);
3682 tmp
= cs461x_peek(card
, BA1_CCTL
);
3683 cs461x_poke(card
, BA1_CCTL
, tmp
& 0xffff0000);
3687 card
->pm
.dmabuf_swptr_play
= card
->states
[1]->dmabuf
.swptr
;
3688 card
->pm
.dmabuf_count_play
= card
->states
[1]->dmabuf
.count
;
3692 card
->pm
.dmabuf_swptr_capture
= card
->states
[0]->dmabuf
.swptr
;
3693 card
->pm
.dmabuf_count_capture
= card
->states
[0]->dmabuf
.count
;
3696 cs46xx_ac97_suspend(card
);
3699 * Reset the processor.
3703 cs461x_proc_stop(card
);
3706 * Power down the DAC and ADC. For now leave the other areas on.
3708 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, 0x0300);
3711 * Power down the PLL.
3713 cs461x_pokeBA0(card
, BA0_CLKCR1
, 0);
3716 * Turn off the Processor by turning off the software clock enable flag in
3717 * the clock control register.
3719 tmp
= cs461x_peekBA0(card
, BA0_CLKCR1
) & ~CLKCR1_SWCE
;
3720 cs461x_pokeBA0(card
, BA0_CLKCR1
, tmp
);
3722 card
->active_ctrl(card
,-1);
3724 card
->pm
.flags
&= ~CS46XX_PM_SUSPENDING
;
3725 card
->pm
.flags
|= CS46XX_PM_SUSPENDED
;
3729 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 4,
3730 printk("cs46xx: cs46xx_suspend()- flags=0x%x\n",
3731 (unsigned)card
->pm
.flags
));
3735 static int cs46xx_resume(struct cs_card
*card
)
3739 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 4,
3740 printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n",
3741 (unsigned)card
->pm
.flags
));
3742 if(!(card
->pm
.flags
& CS46XX_PM_SUSPENDED
))
3744 CS_DBGOUT(CS_PM
| CS_ERROR
, 2,
3745 printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n"));
3748 card
->pm
.flags
|= CS46XX_PM_RESUMING
;
3749 card
->pm
.flags
&= ~CS46XX_PM_SUSPENDED
;
3751 card
->active_ctrl(card
, 1);
3755 if (cs_hardware_init(card
) != 0)
3757 CS_DBGOUT(CS_PM
| CS_ERROR
, 4, printk(
3758 "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n"));
3759 mdelay(10 * cs_laptop_wait
);
3767 CS_DBGOUT(CS_PM
| CS_ERROR
, 1, printk(
3768 "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i
));
3772 if(cs46xx_restart_part(card
))
3774 CS_DBGOUT(CS_PM
| CS_ERROR
, 4, printk(
3775 "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n"));
3778 card
->active_ctrl(card
, -1);
3780 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 4, printk("cs46xx: cs46xx_resume()- flags=0x%x\n",
3781 (unsigned)card
->pm
.flags
));
3785 static /*const*/ struct file_operations cs461x_fops
= {
3786 CS_OWNER CS_THIS_MODULE
3787 .llseek
= no_llseek
,
3794 .release
= cs_release
,
3797 /* Write AC97 codec registers */
3800 static u16
_cs_ac97_get(struct ac97_codec
*dev
, u8 reg
)
3802 struct cs_card
*card
= dev
->private_data
;
3808 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3809 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3810 * 3. Write ACCTL = Control Register = 460h for initiating the write
3811 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
3812 * 5. if DCV not cleared, break and return error
3813 * 6. Read ACSTS = Status Register = 464h, check VSTS bit
3816 cs461x_peekBA0(card
, BA0_ACSDA
);
3819 * Setup the AC97 control registers on the CS461x to send the
3820 * appropriate command to the AC97 to perform the read.
3821 * ACCAD = Command Address Register = 46Ch
3822 * ACCDA = Command Data Register = 470h
3823 * ACCTL = Control Register = 460h
3824 * set DCV - will clear when process completed
3825 * set CRW - Read command
3826 * set VFRM - valid frame enabled
3827 * set ESYN - ASYNC generation enabled
3828 * set RSTN - ARST# inactive, AC97 codec not reset
3831 cs461x_pokeBA0(card
, BA0_ACCAD
, reg
);
3832 cs461x_pokeBA0(card
, BA0_ACCDA
, 0);
3833 cs461x_pokeBA0(card
, BA0_ACCTL
, ACCTL_DCV
| ACCTL_CRW
|
3834 ACCTL_VFRM
| ACCTL_ESYN
|
3839 * Wait for the read to occur.
3841 if(!(card
->pm
.flags
& CS46XX_PM_IDLE
))
3844 loopcnt
= 500 * cs_laptop_wait
;
3845 loopcnt
*= cs_laptop_wait
;
3846 for (count
= 0; count
< loopcnt
; count
++) {
3848 * First, we want to wait for a short time.
3850 udelay(10 * cs_laptop_wait
);
3852 * Now, check to see if the read has completed.
3853 * ACCTL = 460h, DCV should be reset by now and 460h = 17h
3855 if (!(cs461x_peekBA0(card
, BA0_ACCTL
) & ACCTL_DCV
))
3860 * Make sure the read completed.
3862 if (cs461x_peekBA0(card
, BA0_ACCTL
) & ACCTL_DCV
) {
3863 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
3864 "cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffff\n", reg
));
3869 * Wait for the valid status bit to go active.
3872 if(!(card
->pm
.flags
& CS46XX_PM_IDLE
))
3876 loopcnt
*= cs_laptop_wait
;
3877 for (count
= 0; count
< loopcnt
; count
++) {
3879 * Read the AC97 status register.
3880 * ACSTS = Status Register = 464h
3881 * VSTS - Valid Status
3883 if (cs461x_peekBA0(card
, BA0_ACSTS
) & ACSTS_VSTS
)
3885 udelay(10 * cs_laptop_wait
);
3889 * Make sure we got valid status.
3891 if (!( (tmp
=cs461x_peekBA0(card
, BA0_ACSTS
)) & ACSTS_VSTS
)) {
3892 CS_DBGOUT(CS_ERROR
, 2, printk(KERN_WARNING
3893 "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n",
3899 * Read the data returned from the AC97 register.
3900 * ACSDA = Status Data Register = 474h
3902 CS_DBGOUT(CS_FUNCTION
, 9, printk(KERN_INFO
3903 "cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n",
3904 reg
, cs461x_peekBA0(card
, BA0_ACSDA
),
3905 cs461x_peekBA0(card
, BA0_ACCAD
)));
3906 ret
= cs461x_peekBA0(card
, BA0_ACSDA
);
3910 static u16
cs_ac97_get(struct ac97_codec
*dev
, u8 reg
)
3913 struct cs_card
*card
= dev
->private_data
;
3915 spin_lock(&card
->ac97_lock
);
3916 ret
= _cs_ac97_get(dev
, reg
);
3917 spin_unlock(&card
->ac97_lock
);
3921 static void cs_ac97_set(struct ac97_codec
*dev
, u8 reg
, u16 val
)
3923 struct cs_card
*card
= dev
->private_data
;
3927 spin_lock(&card
->ac97_lock
);
3929 if(reg
== AC97_CD_VOL
)
3931 val2
= _cs_ac97_get(dev
, AC97_CD_VOL
);
3936 * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3937 * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97
3938 * 3. Write ACCTL = Control Register = 460h for initiating the write
3939 * 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
3940 * 5. if DCV not cleared, break and return error
3944 * Setup the AC97 control registers on the CS461x to send the
3945 * appropriate command to the AC97 to perform the read.
3946 * ACCAD = Command Address Register = 46Ch
3947 * ACCDA = Command Data Register = 470h
3948 * ACCTL = Control Register = 460h
3949 * set DCV - will clear when process completed
3950 * reset CRW - Write command
3951 * set VFRM - valid frame enabled
3952 * set ESYN - ASYNC generation enabled
3953 * set RSTN - ARST# inactive, AC97 codec not reset
3955 cs461x_pokeBA0(card
, BA0_ACCAD
, reg
);
3956 cs461x_pokeBA0(card
, BA0_ACCDA
, val
);
3957 cs461x_peekBA0(card
, BA0_ACCTL
);
3958 cs461x_pokeBA0(card
, BA0_ACCTL
, 0 | ACCTL_VFRM
| ACCTL_ESYN
| ACCTL_RSTN
);
3959 cs461x_pokeBA0(card
, BA0_ACCTL
, ACCTL_DCV
| ACCTL_VFRM
|
3960 ACCTL_ESYN
| ACCTL_RSTN
);
3961 for (count
= 0; count
< 1000; count
++) {
3963 * First, we want to wait for a short time.
3965 udelay(10 * cs_laptop_wait
);
3967 * Now, check to see if the write has completed.
3968 * ACCTL = 460h, DCV should be reset by now and 460h = 07h
3970 if (!(cs461x_peekBA0(card
, BA0_ACCTL
) & ACCTL_DCV
))
3974 * Make sure the write completed.
3976 if (cs461x_peekBA0(card
, BA0_ACCTL
) & ACCTL_DCV
)
3978 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
3979 "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg
, val
));
3982 spin_unlock(&card
->ac97_lock
);
3985 * Adjust power if the mixer is selected/deselected according
3988 * IF the CD is a valid input source (mixer or direct) AND
3989 * the CD is not muted THEN power is needed
3991 * We do two things. When record select changes the input to
3992 * add/remove the CD we adjust the power count if the CD is
3995 * When the CD mute changes we adjust the power level if the
3996 * CD was a valid input.
3998 * We also check for CD volume != 0, as the CD mute isn't
3999 * normally tweaked from userspace.
4002 /* CD mute change ? */
4004 if(reg
==AC97_CD_VOL
)
4006 /* Mute bit change ? */
4007 if((val2
^val
)&0x8000 || ((val2
== 0x1f1f || val
== 0x1f1f) && val2
!= val
))
4009 /* This is a hack but its cleaner than the alternatives.
4010 Right now card->ac97_codec[0] might be NULL as we are
4011 still doing codec setup. This does an early assignment
4012 to avoid the problem if it occurs */
4014 if(card
->ac97_codec
[0]==NULL
)
4015 card
->ac97_codec
[0]=dev
;
4018 if(val
&0x8000 || val
== 0x1f1f)
4019 card
->amplifier_ctrl(card
, -1);
4020 else /* Mute off power on */
4023 card
->amp_init(card
);
4024 card
->amplifier_ctrl(card
, 1);
4031 /* OSS /dev/mixer file operation methods */
4033 static int cs_open_mixdev(struct inode
*inode
, struct file
*file
)
4036 unsigned int minor
= iminor(inode
);
4037 struct cs_card
*card
=NULL
;
4038 struct list_head
*entry
;
4041 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
, 4,
4042 printk(KERN_INFO
"cs46xx: cs_open_mixdev()+\n"));
4044 list_for_each(entry
, &cs46xx_devs
)
4046 card
= list_entry(entry
, struct cs_card
, list
);
4047 for (i
= 0; i
< NR_AC97
; i
++)
4048 if (card
->ac97_codec
[i
] != NULL
&&
4049 card
->ac97_codec
[i
]->dev_mixer
== minor
)
4054 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
| CS_ERROR
, 2,
4055 printk(KERN_INFO
"cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4059 if(!card
->ac97_codec
[i
])
4061 file
->private_data
= card
->ac97_codec
[i
];
4063 card
->active_ctrl(card
,1);
4064 if(!CS_IN_USE(&card
->mixer_use_cnt
))
4066 if( (tmp
= cs46xx_powerup(card
, CS_POWER_MIXVON
)) )
4068 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_INFO
4069 "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n",tmp
) );
4073 card
->amplifier_ctrl(card
, 1);
4074 CS_INC_USE_COUNT(&card
->mixer_use_cnt
);
4075 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
, 4,
4076 printk(KERN_INFO
"cs46xx: cs_open_mixdev()- 0\n"));
4077 return nonseekable_open(inode
, file
);
4080 static int cs_release_mixdev(struct inode
*inode
, struct file
*file
)
4082 unsigned int minor
= iminor(inode
);
4083 struct cs_card
*card
=NULL
;
4084 struct list_head
*entry
;
4088 CS_DBGOUT(CS_FUNCTION
| CS_RELEASE
, 4,
4089 printk(KERN_INFO
"cs46xx: cs_release_mixdev()+\n"));
4090 list_for_each(entry
, &cs46xx_devs
)
4092 card
= list_entry(entry
, struct cs_card
, list
);
4093 for (i
= 0; i
< NR_AC97
; i
++)
4094 if (card
->ac97_codec
[i
] != NULL
&&
4095 card
->ac97_codec
[i
]->dev_mixer
== minor
)
4100 CS_DBGOUT(CS_FUNCTION
| CS_OPEN
| CS_ERROR
, 2,
4101 printk(KERN_INFO
"cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4105 if(!CS_DEC_AND_TEST(&card
->mixer_use_cnt
))
4107 CS_DBGOUT(CS_FUNCTION
| CS_RELEASE
, 4,
4108 printk(KERN_INFO
"cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n"));
4109 card
->active_ctrl(card
, -1);
4110 card
->amplifier_ctrl(card
, -1);
4114 * ok, no outstanding mixer opens, so powerdown.
4116 if( (tmp
= cs461x_powerdown(card
, CS_POWER_MIXVON
, CS_FALSE
)) )
4118 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_INFO
4119 "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n",tmp
) );
4120 card
->active_ctrl(card
, -1);
4121 card
->amplifier_ctrl(card
, -1);
4124 card
->active_ctrl(card
, -1);
4125 card
->amplifier_ctrl(card
, -1);
4126 CS_DBGOUT(CS_FUNCTION
| CS_RELEASE
, 4,
4127 printk(KERN_INFO
"cs46xx: cs_release_mixdev()- 0\n"));
4131 static int cs_ioctl_mixdev(struct inode
*inode
, struct file
*file
, unsigned int cmd
,
4134 struct ac97_codec
*codec
= (struct ac97_codec
*)file
->private_data
;
4135 struct cs_card
*card
=NULL
;
4136 struct list_head
*entry
;
4137 unsigned long __user
*p
= (long __user
*)arg
;
4139 #if CSDEBUG_INTERFACE
4142 if( (cmd
== SOUND_MIXER_CS_GETDBGMASK
) ||
4143 (cmd
== SOUND_MIXER_CS_SETDBGMASK
) ||
4144 (cmd
== SOUND_MIXER_CS_GETDBGLEVEL
) ||
4145 (cmd
== SOUND_MIXER_CS_SETDBGLEVEL
) ||
4146 (cmd
== SOUND_MIXER_CS_APM
))
4151 case SOUND_MIXER_CS_GETDBGMASK
:
4152 return put_user(cs_debugmask
, p
);
4154 case SOUND_MIXER_CS_GETDBGLEVEL
:
4155 return put_user(cs_debuglevel
, p
);
4157 case SOUND_MIXER_CS_SETDBGMASK
:
4158 if (get_user(val
, p
))
4163 case SOUND_MIXER_CS_SETDBGLEVEL
:
4164 if (get_user(val
, p
))
4166 cs_debuglevel
= val
;
4169 case SOUND_MIXER_CS_APM
:
4170 if (get_user(val
, p
))
4172 if(val
== CS_IOCTL_CMD_SUSPEND
)
4174 list_for_each(entry
, &cs46xx_devs
)
4176 card
= list_entry(entry
, struct cs_card
, list
);
4177 cs46xx_suspend(card
, 0);
4181 else if(val
== CS_IOCTL_CMD_RESUME
)
4183 list_for_each(entry
, &cs46xx_devs
)
4185 card
= list_entry(entry
, struct cs_card
, list
);
4186 cs46xx_resume(card
);
4191 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_INFO
4192 "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n",
4198 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_INFO
4199 "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n") );
4204 return codec
->mixer_ioctl(codec
, cmd
, arg
);
4207 static /*const*/ struct file_operations cs_mixer_fops
= {
4208 CS_OWNER CS_THIS_MODULE
4209 .llseek
= no_llseek
,
4210 .ioctl
= cs_ioctl_mixdev
,
4211 .open
= cs_open_mixdev
,
4212 .release
= cs_release_mixdev
,
4215 /* AC97 codec initialisation. */
4216 static int __init
cs_ac97_init(struct cs_card
*card
)
4220 struct ac97_codec
*codec
;
4223 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2, printk(KERN_INFO
4224 "cs46xx: cs_ac97_init()+\n") );
4226 for (num_ac97
= 0; num_ac97
< NR_AC97
; num_ac97
++) {
4227 if ((codec
= ac97_alloc_codec()) == NULL
)
4230 /* initialize some basic codec information, other fields will be filled
4231 in ac97_probe_codec */
4232 codec
->private_data
= card
;
4233 codec
->id
= num_ac97
;
4235 codec
->codec_read
= cs_ac97_get
;
4236 codec
->codec_write
= cs_ac97_set
;
4238 if (ac97_probe_codec(codec
) == 0)
4240 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2, printk(KERN_INFO
4241 "cs46xx: cs_ac97_init()- codec number %d not found\n",
4243 card
->ac97_codec
[num_ac97
] = NULL
;
4246 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2, printk(KERN_INFO
4247 "cs46xx: cs_ac97_init() found codec %d\n",num_ac97
) );
4249 eid
= cs_ac97_get(codec
, AC97_EXTENDED_ID
);
4253 printk(KERN_WARNING
"cs46xx: codec %d not present\n",num_ac97
);
4254 ac97_release_codec(codec
);
4258 card
->ac97_features
= eid
;
4260 if ((codec
->dev_mixer
= register_sound_mixer(&cs_mixer_fops
, -1)) < 0) {
4261 printk(KERN_ERR
"cs46xx: couldn't register mixer!\n");
4262 ac97_release_codec(codec
);
4265 card
->ac97_codec
[num_ac97
] = codec
;
4267 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2, printk(KERN_INFO
4268 "cs46xx: cs_ac97_init() ac97_codec[%d] set to %p\n",
4269 (unsigned int)num_ac97
,
4271 /* if there is no secondary codec at all, don't probe any more */
4278 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2, printk(KERN_INFO
4279 "cs46xx: cs_ac97_init()- %d\n", (unsigned int)num_ac97
));
4284 * load the static image into the DSP
4286 #include "cs461x_image.h"
4287 static void cs461x_download_image(struct cs_card
*card
)
4289 unsigned i
, j
, temp1
, temp2
, offset
, count
;
4290 unsigned char __iomem
*pBA1
= ioremap(card
->ba1_addr
, 0x40000);
4291 for( i
=0; i
< CLEAR__COUNT
; i
++)
4293 offset
= ClrStat
[i
].BA1__DestByteOffset
;
4294 count
= ClrStat
[i
].BA1__SourceSize
;
4295 for( temp1
= offset
; temp1
<(offset
+count
); temp1
+=4 )
4296 writel(0, pBA1
+temp1
);
4299 for(i
=0; i
<FILL__COUNT
; i
++)
4301 temp2
= FillStat
[i
].Offset
;
4302 for(j
=0; j
<(FillStat
[i
].Size
)/4; j
++)
4304 temp1
= (FillStat
[i
]).pFill
[j
];
4305 writel(temp1
, pBA1
+temp2
+j
*4);
4316 static void cs461x_reset(struct cs_card
*card
)
4321 * Write the reset bit of the SP control register.
4323 cs461x_poke(card
, BA1_SPCR
, SPCR_RSTSP
);
4326 * Write the control register.
4328 cs461x_poke(card
, BA1_SPCR
, SPCR_DRQEN
);
4331 * Clear the trap registers.
4333 for (idx
= 0; idx
< 8; idx
++) {
4334 cs461x_poke(card
, BA1_DREG
, DREG_REGID_TRAP_SELECT
+ idx
);
4335 cs461x_poke(card
, BA1_TWPR
, 0xFFFF);
4337 cs461x_poke(card
, BA1_DREG
, 0);
4340 * Set the frame timer to reflect the number of cycles per frame.
4342 cs461x_poke(card
, BA1_FRMT
, 0xadf);
4345 static void cs461x_clear_serial_FIFOs(struct cs_card
*card
, int type
)
4347 int idx
, loop
, startfifo
=0, endfifo
=0, powerdown1
= 0;
4351 * See if the devices are powered down. If so, we must power them up first
4352 * or they will not respond.
4354 if (!((tmp
= cs461x_peekBA0(card
, BA0_CLKCR1
)) & CLKCR1_SWCE
)) {
4355 cs461x_pokeBA0(card
, BA0_CLKCR1
, tmp
| CLKCR1_SWCE
);
4360 * We want to clear out the serial port FIFOs so we don't end up playing
4361 * whatever random garbage happens to be in them. We fill the sample FIFOS
4362 * with zero (silence).
4364 cs461x_pokeBA0(card
, BA0_SERBWP
, 0);
4367 * Check for which FIFO locations to clear, if we are currently
4368 * playing or capturing then we don't want to put in 128 bytes of
4371 if(type
& CS_TYPE_DAC
)
4376 if(type
& CS_TYPE_ADC
)
4383 * Fill sample FIFO locations (256 locations total).
4385 for (idx
= startfifo
; idx
< endfifo
; idx
++) {
4387 * Make sure the previous FIFO write operation has completed.
4389 for (loop
= 0; loop
< 5; loop
++) {
4391 if (!(cs461x_peekBA0(card
, BA0_SERBST
) & SERBST_WBSY
))
4394 if (cs461x_peekBA0(card
, BA0_SERBST
) & SERBST_WBSY
) {
4396 cs461x_pokeBA0(card
, BA0_CLKCR1
, tmp
);
4399 * Write the serial port FIFO index.
4401 cs461x_pokeBA0(card
, BA0_SERBAD
, idx
);
4403 * Tell the serial port to load the new value into the FIFO location.
4405 cs461x_pokeBA0(card
, BA0_SERBCM
, SERBCM_WRC
);
4408 * Now, if we powered up the devices, then power them back down again.
4409 * This is kinda ugly, but should never happen.
4412 cs461x_pokeBA0(card
, BA0_CLKCR1
, tmp
);
4416 static int cs461x_powerdown(struct cs_card
*card
, unsigned int type
, int suspendflag
)
4419 unsigned int tmp
=0,muted
=0;
4421 CS_DBGOUT(CS_FUNCTION
, 4, printk(KERN_INFO
4422 "cs46xx: cs461x_powerdown()+ type=0x%x\n",type
));
4423 if(!cs_powerdown
&& !suspendflag
)
4425 CS_DBGOUT(CS_FUNCTION
, 8, printk(KERN_INFO
4426 "cs46xx: cs461x_powerdown() DISABLED exiting\n"));
4429 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4430 CS_DBGOUT(CS_FUNCTION
, 8, printk(KERN_INFO
4431 "cs46xx: cs461x_powerdown() powerdown reg=0x%x\n",tmp
));
4433 * if powering down only the VREF, and not powering down the DAC/ADC,
4434 * then do not power down the VREF, UNLESS both the DAC and ADC are not
4435 * currently powered down. If powering down DAC and ADC, then
4436 * it is possible to power down the VREF (ON).
4438 if ( ((type
& CS_POWER_MIXVON
) &&
4439 (!(type
& CS_POWER_ADC
) || (!(type
& CS_POWER_DAC
))) )
4441 ((tmp
& CS_AC97_POWER_CONTROL_ADC_ON
) ||
4442 (tmp
& CS_AC97_POWER_CONTROL_DAC_ON
) ) )
4444 CS_DBGOUT(CS_FUNCTION
, 8, printk(KERN_INFO
4445 "cs46xx: cs461x_powerdown()- 0 unable to powerdown. tmp=0x%x\n",tmp
));
4449 * for now, always keep power to the mixer block.
4450 * not sure why it's a problem but it seems to be if we power off.
4452 type
&= ~CS_POWER_MIXVON
;
4453 type
&= ~CS_POWER_MIXVOFF
;
4456 * Power down indicated areas.
4458 if(type
& CS_POWER_MIXVOFF
)
4461 CS_DBGOUT(CS_FUNCTION
, 4,
4462 printk(KERN_INFO
"cs46xx: cs461x_powerdown()+ MIXVOFF\n"));
4464 * Power down the MIXER (VREF ON) on the AC97 card.
4466 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4467 if (tmp
& CS_AC97_POWER_CONTROL_MIXVOFF_ON
)
4471 cs_mute(card
, CS_TRUE
);
4474 tmp
|= CS_AC97_POWER_CONTROL_MIXVOFF
;
4475 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4477 * Now, we wait until we sample a ready state.
4479 for (count
= 0; count
< 32; count
++) {
4481 * First, lets wait a short while to let things settle out a
4482 * bit, and to prevent retrying the read too quickly.
4487 * Read the current state of the power control register.
4489 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4490 CS_AC97_POWER_CONTROL_MIXVOFF_ON
))
4495 * Check the status..
4497 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4498 CS_AC97_POWER_CONTROL_MIXVOFF_ON
)
4500 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4501 "cs46xx: powerdown MIXVOFF failed\n"));
4506 if(type
& CS_POWER_MIXVON
)
4509 CS_DBGOUT(CS_FUNCTION
, 4,
4510 printk(KERN_INFO
"cs46xx: cs461x_powerdown()+ MIXVON\n"));
4512 * Power down the MIXER (VREF ON) on the AC97 card.
4514 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4515 if (tmp
& CS_AC97_POWER_CONTROL_MIXVON_ON
)
4519 cs_mute(card
, CS_TRUE
);
4522 tmp
|= CS_AC97_POWER_CONTROL_MIXVON
;
4523 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4525 * Now, we wait until we sample a ready state.
4527 for (count
= 0; count
< 32; count
++) {
4529 * First, lets wait a short while to let things settle out a
4530 * bit, and to prevent retrying the read too quickly.
4535 * Read the current state of the power control register.
4537 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4538 CS_AC97_POWER_CONTROL_MIXVON_ON
))
4543 * Check the status..
4545 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4546 CS_AC97_POWER_CONTROL_MIXVON_ON
)
4548 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4549 "cs46xx: powerdown MIXVON failed\n"));
4554 if(type
& CS_POWER_ADC
)
4557 * Power down the ADC on the AC97 card.
4559 CS_DBGOUT(CS_FUNCTION
, 4, printk(KERN_INFO
"cs46xx: cs461x_powerdown()+ ADC\n"));
4560 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4561 if (tmp
& CS_AC97_POWER_CONTROL_ADC_ON
)
4565 cs_mute(card
, CS_TRUE
);
4568 tmp
|= CS_AC97_POWER_CONTROL_ADC
;
4569 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4572 * Now, we wait until we sample a ready state.
4574 for (count
= 0; count
< 32; count
++) {
4576 * First, lets wait a short while to let things settle out a
4577 * bit, and to prevent retrying the read too quickly.
4582 * Read the current state of the power control register.
4584 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4585 CS_AC97_POWER_CONTROL_ADC_ON
))
4590 * Check the status..
4592 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4593 CS_AC97_POWER_CONTROL_ADC_ON
)
4595 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4596 "cs46xx: powerdown ADC failed\n"));
4601 if(type
& CS_POWER_DAC
)
4604 * Power down the DAC on the AC97 card.
4607 CS_DBGOUT(CS_FUNCTION
, 4,
4608 printk(KERN_INFO
"cs46xx: cs461x_powerdown()+ DAC\n"));
4609 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4610 if (tmp
& CS_AC97_POWER_CONTROL_DAC_ON
)
4614 cs_mute(card
, CS_TRUE
);
4617 tmp
|= CS_AC97_POWER_CONTROL_DAC
;
4618 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4620 * Now, we wait until we sample a ready state.
4622 for (count
= 0; count
< 32; count
++) {
4624 * First, lets wait a short while to let things settle out a
4625 * bit, and to prevent retrying the read too quickly.
4630 * Read the current state of the power control register.
4632 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4633 CS_AC97_POWER_CONTROL_DAC_ON
))
4638 * Check the status..
4640 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4641 CS_AC97_POWER_CONTROL_DAC_ON
)
4643 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4644 "cs46xx: powerdown DAC failed\n"));
4649 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4651 cs_mute(card
, CS_FALSE
);
4652 CS_DBGOUT(CS_FUNCTION
, 4, printk(KERN_INFO
4653 "cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp
));
4657 static int cs46xx_powerup(struct cs_card
*card
, unsigned int type
)
4660 unsigned int tmp
=0,muted
=0;
4662 CS_DBGOUT(CS_FUNCTION
, 8, printk(KERN_INFO
4663 "cs46xx: cs46xx_powerup()+ type=0x%x\n",type
));
4665 * check for VREF and powerup if need to.
4667 if(type
& CS_POWER_MIXVON
)
4668 type
|= CS_POWER_MIXVOFF
;
4669 if(type
& (CS_POWER_DAC
| CS_POWER_ADC
))
4670 type
|= CS_POWER_MIXVON
| CS_POWER_MIXVOFF
;
4673 * Power up indicated areas.
4675 if(type
& CS_POWER_MIXVOFF
)
4678 CS_DBGOUT(CS_FUNCTION
, 4,
4679 printk(KERN_INFO
"cs46xx: cs46xx_powerup()+ MIXVOFF\n"));
4681 * Power up the MIXER (VREF ON) on the AC97 card.
4683 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4684 if (!(tmp
& CS_AC97_POWER_CONTROL_MIXVOFF_ON
))
4688 cs_mute(card
, CS_TRUE
);
4691 tmp
&= ~CS_AC97_POWER_CONTROL_MIXVOFF
;
4692 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4694 * Now, we wait until we sample a ready state.
4696 for (count
= 0; count
< 32; count
++) {
4698 * First, lets wait a short while to let things settle out a
4699 * bit, and to prevent retrying the read too quickly.
4704 * Read the current state of the power control register.
4706 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4707 CS_AC97_POWER_CONTROL_MIXVOFF_ON
)
4712 * Check the status..
4714 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4715 CS_AC97_POWER_CONTROL_MIXVOFF_ON
))
4717 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4718 "cs46xx: powerup MIXVOFF failed\n"));
4723 if(type
& CS_POWER_MIXVON
)
4726 CS_DBGOUT(CS_FUNCTION
, 4,
4727 printk(KERN_INFO
"cs46xx: cs46xx_powerup()+ MIXVON\n"));
4729 * Power up the MIXER (VREF ON) on the AC97 card.
4731 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4732 if (!(tmp
& CS_AC97_POWER_CONTROL_MIXVON_ON
))
4736 cs_mute(card
, CS_TRUE
);
4739 tmp
&= ~CS_AC97_POWER_CONTROL_MIXVON
;
4740 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4742 * Now, we wait until we sample a ready state.
4744 for (count
= 0; count
< 32; count
++) {
4746 * First, lets wait a short while to let things settle out a
4747 * bit, and to prevent retrying the read too quickly.
4752 * Read the current state of the power control register.
4754 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4755 CS_AC97_POWER_CONTROL_MIXVON_ON
)
4760 * Check the status..
4762 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4763 CS_AC97_POWER_CONTROL_MIXVON_ON
))
4765 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4766 "cs46xx: powerup MIXVON failed\n"));
4771 if(type
& CS_POWER_ADC
)
4774 * Power up the ADC on the AC97 card.
4776 CS_DBGOUT(CS_FUNCTION
, 4, printk(KERN_INFO
"cs46xx: cs46xx_powerup()+ ADC\n"));
4777 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4778 if (!(tmp
& CS_AC97_POWER_CONTROL_ADC_ON
))
4782 cs_mute(card
, CS_TRUE
);
4785 tmp
&= ~CS_AC97_POWER_CONTROL_ADC
;
4786 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4789 * Now, we wait until we sample a ready state.
4791 for (count
= 0; count
< 32; count
++) {
4793 * First, lets wait a short while to let things settle out a
4794 * bit, and to prevent retrying the read too quickly.
4799 * Read the current state of the power control register.
4801 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4802 CS_AC97_POWER_CONTROL_ADC_ON
)
4807 * Check the status..
4809 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4810 CS_AC97_POWER_CONTROL_ADC_ON
))
4812 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4813 "cs46xx: powerup ADC failed\n"));
4818 if(type
& CS_POWER_DAC
)
4821 * Power up the DAC on the AC97 card.
4824 CS_DBGOUT(CS_FUNCTION
, 4,
4825 printk(KERN_INFO
"cs46xx: cs46xx_powerup()+ DAC\n"));
4826 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4827 if (!(tmp
& CS_AC97_POWER_CONTROL_DAC_ON
))
4831 cs_mute(card
, CS_TRUE
);
4834 tmp
&= ~CS_AC97_POWER_CONTROL_DAC
;
4835 cs_ac97_set(card
->ac97_codec
[0], AC97_POWER_CONTROL
, tmp
);
4837 * Now, we wait until we sample a ready state.
4839 for (count
= 0; count
< 32; count
++) {
4841 * First, lets wait a short while to let things settle out a
4842 * bit, and to prevent retrying the read too quickly.
4847 * Read the current state of the power control register.
4849 if (cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4850 CS_AC97_POWER_CONTROL_DAC_ON
)
4855 * Check the status..
4857 if (!(cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
) &
4858 CS_AC97_POWER_CONTROL_DAC_ON
))
4860 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_WARNING
4861 "cs46xx: powerup DAC failed\n"));
4866 tmp
= cs_ac97_get(card
->ac97_codec
[0], AC97_POWER_CONTROL
);
4868 cs_mute(card
, CS_FALSE
);
4869 CS_DBGOUT(CS_FUNCTION
, 4, printk(KERN_INFO
4870 "cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp
));
4875 static void cs461x_proc_start(struct cs_card
*card
)
4880 * Set the frame timer to reflect the number of cycles per frame.
4882 cs461x_poke(card
, BA1_FRMT
, 0xadf);
4884 * Turn on the run, run at frame, and DMA enable bits in the local copy of
4885 * the SP control register.
4887 cs461x_poke(card
, BA1_SPCR
, SPCR_RUN
| SPCR_RUNFR
| SPCR_DRQEN
);
4889 * Wait until the run at frame bit resets itself in the SP control
4892 for (cnt
= 0; cnt
< 25; cnt
++) {
4894 if (!(cs461x_peek(card
, BA1_SPCR
) & SPCR_RUNFR
))
4898 if (cs461x_peek(card
, BA1_SPCR
) & SPCR_RUNFR
)
4899 printk(KERN_WARNING
"cs46xx: SPCR_RUNFR never reset\n");
4902 static void cs461x_proc_stop(struct cs_card
*card
)
4905 * Turn off the run, run at frame, and DMA enable bits in the local copy of
4906 * the SP control register.
4908 cs461x_poke(card
, BA1_SPCR
, 0);
4911 static int cs_hardware_init(struct cs_card
*card
)
4913 unsigned long end_time
;
4914 unsigned int tmp
,count
;
4916 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2, printk(KERN_INFO
4917 "cs46xx: cs_hardware_init()+\n") );
4919 * First, blast the clock control register to zero so that the PLL starts
4920 * out in a known state, and blast the master serial port control register
4921 * to zero so that the serial ports also start out in a known state.
4923 cs461x_pokeBA0(card
, BA0_CLKCR1
, 0);
4924 cs461x_pokeBA0(card
, BA0_SERMC1
, 0);
4927 * If we are in AC97 mode, then we must set the part to a host controlled
4928 * AC-link. Otherwise, we won't be able to bring up the link.
4930 cs461x_pokeBA0(card
, BA0_SERACC
, SERACC_HSP
| SERACC_CODEC_TYPE_1_03
); /* 1.03 card */
4931 /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
4934 * Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
4935 * spec) and then drive it high. This is done for non AC97 modes since
4936 * there might be logic external to the CS461x that uses the ARST# line
4939 cs461x_pokeBA0(card
, BA0_ACCTL
, 1);
4941 cs461x_pokeBA0(card
, BA0_ACCTL
, 0);
4943 cs461x_pokeBA0(card
, BA0_ACCTL
, ACCTL_RSTN
);
4946 * The first thing we do here is to enable sync generation. As soon
4947 * as we start receiving bit clock, we'll start producing the SYNC
4950 cs461x_pokeBA0(card
, BA0_ACCTL
, ACCTL_ESYN
| ACCTL_RSTN
);
4953 * Now wait for a short while to allow the AC97 part to start
4954 * generating bit clock (so we don't try to start the PLL without an
4957 mdelay(5 * cs_laptop_wait
); /* 1 should be enough ?? (and pigs might fly) */
4960 * Set the serial port timing configuration, so that
4961 * the clock control circuit gets its clock from the correct place.
4963 cs461x_pokeBA0(card
, BA0_SERMC1
, SERMC1_PTC_AC97
);
4966 * The part seems to not be ready for a while after a resume.
4967 * so, if we are resuming, then wait for 700 mils. Note that 600 mils
4968 * is not enough for some platforms! tested on an IBM Thinkpads and
4971 if(!(card
->pm
.flags
& CS46XX_PM_IDLE
))
4974 * Write the selected clock control setup to the hardware. Do not turn on
4975 * SWCE yet (if requested), so that the devices clocked by the output of
4976 * PLL are not clocked until the PLL is stable.
4978 cs461x_pokeBA0(card
, BA0_PLLCC
, PLLCC_LPF_1050_2780_KHZ
| PLLCC_CDR_73_104_MHZ
);
4979 cs461x_pokeBA0(card
, BA0_PLLM
, 0x3a);
4980 cs461x_pokeBA0(card
, BA0_CLKCR2
, CLKCR2_PDIVS_8
);
4985 cs461x_pokeBA0(card
, BA0_CLKCR1
, CLKCR1_PLLP
);
4988 * Wait until the PLL has stabilized.
4990 mdelay(5 * cs_laptop_wait
); /* Again 1 should be enough ?? */
4993 * Turn on clocking of the core so that we can setup the serial ports.
4995 tmp
= cs461x_peekBA0(card
, BA0_CLKCR1
) | CLKCR1_SWCE
;
4996 cs461x_pokeBA0(card
, BA0_CLKCR1
, tmp
);
4999 * Fill the serial port FIFOs with silence.
5001 cs461x_clear_serial_FIFOs(card
,CS_TYPE_DAC
| CS_TYPE_ADC
);
5004 * Set the serial port FIFO pointer to the first sample in the FIFO.
5006 /* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
5009 * Write the serial port configuration to the part. The master
5010 * enable bit is not set until all other values have been written.
5012 cs461x_pokeBA0(card
, BA0_SERC1
, SERC1_SO1F_AC97
| SERC1_SO1EN
);
5013 cs461x_pokeBA0(card
, BA0_SERC2
, SERC2_SI1F_AC97
| SERC1_SO1EN
);
5014 cs461x_pokeBA0(card
, BA0_SERMC1
, SERMC1_PTC_AC97
| SERMC1_MSPE
);
5017 mdelay(5 * cs_laptop_wait
); /* Shouldnt be needed ?? */
5020 * If we are resuming under 2.2.x then we can not schedule a timeout.
5021 * so, just spin the CPU.
5023 if(card
->pm
.flags
& CS46XX_PM_IDLE
)
5026 * Wait for the card ready signal from the AC97 card.
5028 end_time
= jiffies
+ 3 * (HZ
>> 2);
5031 * Read the AC97 status register to see if we've seen a CODEC READY
5032 * signal from the AC97 card.
5034 if (cs461x_peekBA0(card
, BA0_ACSTS
) & ACSTS_CRDY
)
5036 current
->state
= TASK_UNINTERRUPTIBLE
;
5037 schedule_timeout(1);
5038 } while (time_before(jiffies
, end_time
));
5042 for (count
= 0; count
< 100; count
++) {
5043 // First, we want to wait for a short time.
5044 udelay(25 * cs_laptop_wait
);
5046 if (cs461x_peekBA0(card
, BA0_ACSTS
) & ACSTS_CRDY
)
5052 * Make sure CODEC is READY.
5054 if (!(cs461x_peekBA0(card
, BA0_ACSTS
) & ACSTS_CRDY
)) {
5055 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_WARNING
5056 "cs46xx: create - never read card ready from AC'97\n"));
5057 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_WARNING
5058 "cs46xx: probably not a bug, try using the CS4232 driver,\n"));
5059 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_WARNING
5060 "cs46xx: or turn off any automatic Power Management support in the BIOS.\n"));
5065 * Assert the vaid frame signal so that we can start sending commands
5068 cs461x_pokeBA0(card
, BA0_ACCTL
, ACCTL_VFRM
| ACCTL_ESYN
| ACCTL_RSTN
);
5070 if(card
->pm
.flags
& CS46XX_PM_IDLE
)
5073 * Wait until we've sampled input slots 3 and 4 as valid, meaning that
5074 * the card is pumping ADC data across the AC-link.
5076 end_time
= jiffies
+ 3 * (HZ
>> 2);
5079 * Read the input slot valid register and see if input slots 3 and
5082 if ((cs461x_peekBA0(card
, BA0_ACISV
) & (ACISV_ISV3
| ACISV_ISV4
)) == (ACISV_ISV3
| ACISV_ISV4
))
5084 current
->state
= TASK_UNINTERRUPTIBLE
;
5085 schedule_timeout(1);
5086 } while (time_before(jiffies
, end_time
));
5090 for (count
= 0; count
< 100; count
++) {
5091 // First, we want to wait for a short time.
5092 udelay(25 * cs_laptop_wait
);
5094 if ((cs461x_peekBA0(card
, BA0_ACISV
) & (ACISV_ISV3
| ACISV_ISV4
)) == (ACISV_ISV3
| ACISV_ISV4
))
5099 * Make sure input slots 3 and 4 are valid. If not, then return
5102 if ((cs461x_peekBA0(card
, BA0_ACISV
) & (ACISV_ISV3
| ACISV_ISV4
)) != (ACISV_ISV3
| ACISV_ISV4
)) {
5103 printk(KERN_WARNING
"cs46xx: create - never read ISV3 & ISV4 from AC'97\n");
5108 * Now, assert valid frame and the slot 3 and 4 valid bits. This will
5109 * commense the transfer of digital audio data to the AC97 card.
5111 cs461x_pokeBA0(card
, BA0_ACOSV
, ACOSV_SLV3
| ACOSV_SLV4
);
5114 * Turn off the Processor by turning off the software clock enable flag in
5115 * the clock control register.
5117 /* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
5118 /* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
5121 * Reset the processor.
5126 * Download the image to the processor.
5129 cs461x_download_image(card
);
5132 * Stop playback DMA.
5134 tmp
= cs461x_peek(card
, BA1_PCTL
);
5135 card
->pctl
= tmp
& 0xffff0000;
5136 cs461x_poke(card
, BA1_PCTL
, tmp
& 0x0000ffff);
5141 tmp
= cs461x_peek(card
, BA1_CCTL
);
5142 card
->cctl
= tmp
& 0x0000ffff;
5143 cs461x_poke(card
, BA1_CCTL
, tmp
& 0xffff0000);
5145 /* initialize AC97 codec and register /dev/mixer */
5146 if(card
->pm
.flags
& CS46XX_PM_IDLE
)
5148 if (cs_ac97_init(card
) <= 0)
5150 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_INFO
5151 "cs46xx: cs_ac97_init() failure\n") );
5157 cs46xx_ac97_resume(card
);
5160 cs461x_proc_start(card
);
5163 * Enable interrupts on the part.
5165 cs461x_pokeBA0(card
, BA0_HICR
, HICR_IEV
| HICR_CHGM
);
5167 tmp
= cs461x_peek(card
, BA1_PFIE
);
5169 cs461x_poke(card
, BA1_PFIE
, tmp
); /* playback interrupt enable */
5171 tmp
= cs461x_peek(card
, BA1_CIE
);
5174 cs461x_poke(card
, BA1_CIE
, tmp
); /* capture interrupt enable */
5177 * If IDLE then Power down the part. We will power components up
5178 * when we need them.
5180 if(card
->pm
.flags
& CS46XX_PM_IDLE
)
5184 if( (tmp
= cs46xx_powerup(card
, CS_POWER_DAC
| CS_POWER_ADC
|
5185 CS_POWER_MIXVON
)) )
5187 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_INFO
5188 "cs46xx: cs461x_powerup() failure (0x%x)\n",tmp
) );
5194 if( (tmp
= cs461x_powerdown(card
, CS_POWER_DAC
| CS_POWER_ADC
|
5195 CS_POWER_MIXVON
, CS_FALSE
)) )
5197 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_INFO
5198 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp
) );
5203 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2, printk(KERN_INFO
5204 "cs46xx: cs_hardware_init()- 0\n"));
5208 /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered
5209 until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
5220 void (*amp
)(struct cs_card
*, int);
5221 void (*amp_init
)(struct cs_card
*);
5222 void (*active
)(struct cs_card
*, int);
5225 static struct cs_card_type cards
[] = {
5229 .name
= "Genius Soundmaker 128 value",
5241 .name
= "Mitac MI6020/21",
5247 .name
= "Hercules Game Theatre XP",
5248 .amp
= amp_hercules
,
5253 .name
= "Hercules Game Theatre XP",
5254 .amp
= amp_hercules
,
5259 .name
= "Hercules Game Theatre XP",
5260 .amp
= amp_hercules
,
5265 .name
= "Hercules Game Theatre XP",
5266 .amp
= amp_hercules
,
5271 .name
= "Hercules Game Theatre XP",
5272 .amp
= amp_hercules
,
5277 .name
= "Hercules Game Theatre XP",
5278 .amp
= amp_hercules
,
5283 .name
= "Hercules Fortissimo II",
5286 /* Not sure if the 570 needs the clkrun hack */
5288 .vendor
= PCI_VENDOR_ID_IBM
,
5290 .name
= "Thinkpad 570",
5292 .active
= clkrun_hack
,
5295 .vendor
= PCI_VENDOR_ID_IBM
,
5297 .name
= "Thinkpad 600X/A20/T20",
5299 .active
= clkrun_hack
,
5302 .vendor
= PCI_VENDOR_ID_IBM
,
5304 .name
= "Thinkpad 600E (unsupported)",
5307 .name
= "Card without SSID set",
5312 MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
5313 MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
5314 MODULE_LICENSE("GPL");
5317 static const char cs46xx_banner
[] = KERN_INFO
"Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION
"." CS46XX_MINOR_VERSION
"." CS46XX_ARCH
", " __TIME__
" " __DATE__
"\n";
5318 static const char fndmsg
[] = KERN_INFO
"cs46xx: Found %d audio device(s).\n";
5320 static int __devinit
cs46xx_probe(struct pci_dev
*pci_dev
,
5321 const struct pci_device_id
*pciid
)
5323 struct pm_dev
*pmdev
;
5325 u16 ss_card
, ss_vendor
;
5326 struct cs_card
*card
;
5327 dma_addr_t dma_mask
;
5328 struct cs_card_type
*cp
= &cards
[0];
5330 CS_DBGOUT(CS_FUNCTION
| CS_INIT
, 2,
5331 printk(KERN_INFO
"cs46xx: probe()+\n"));
5333 dma_mask
= 0xffffffff; /* this enables playback and recording */
5334 if (pci_enable_device(pci_dev
)) {
5335 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1, printk(KERN_ERR
5336 "cs46xx: pci_enable_device() failed\n"));
5339 if (!RSRCISMEMORYREGION(pci_dev
, 0) ||
5340 !RSRCISMEMORYREGION(pci_dev
, 1)) {
5341 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_ERR
5342 "cs46xx: probe()- Memory region not assigned\n"));
5345 if (pci_dev
->irq
== 0) {
5346 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_ERR
5347 "cs46xx: probe() IRQ not assigned\n"));
5350 if (!pci_dma_supported(pci_dev
, 0xffffffff)) {
5351 CS_DBGOUT(CS_ERROR
, 1, printk(KERN_ERR
5352 "cs46xx: probe() architecture does not support 32bit PCI busmaster DMA\n"));
5355 pci_read_config_word(pci_dev
, PCI_SUBSYSTEM_VENDOR_ID
, &ss_vendor
);
5356 pci_read_config_word(pci_dev
, PCI_SUBSYSTEM_ID
, &ss_card
);
5358 if ((card
= kmalloc(sizeof(struct cs_card
), GFP_KERNEL
)) == NULL
) {
5359 printk(KERN_ERR
"cs46xx: out of memory\n");
5362 memset(card
, 0, sizeof(*card
));
5363 card
->ba0_addr
= RSRCADDRESS(pci_dev
, 0);
5364 card
->ba1_addr
= RSRCADDRESS(pci_dev
, 1);
5365 card
->pci_dev
= pci_dev
;
5366 card
->irq
= pci_dev
->irq
;
5367 card
->magic
= CS_CARD_MAGIC
;
5368 spin_lock_init(&card
->lock
);
5369 spin_lock_init(&card
->ac97_lock
);
5371 pci_set_master(pci_dev
);
5373 printk(cs46xx_banner
);
5374 printk(KERN_INFO
"cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %d\n",
5375 card
->ba0_addr
, card
->ba1_addr
, card
->irq
);
5377 card
->alloc_pcm_channel
= cs_alloc_pcm_channel
;
5378 card
->alloc_rec_pcm_channel
= cs_alloc_rec_pcm_channel
;
5379 card
->free_pcm_channel
= cs_free_pcm_channel
;
5380 card
->amplifier_ctrl
= amp_none
;
5381 card
->active_ctrl
= amp_none
;
5385 if(cp
->vendor
== ss_vendor
&& cp
->id
== ss_card
)
5387 card
->amplifier_ctrl
= cp
->amp
;
5389 card
->active_ctrl
= cp
->active
;
5391 card
->amp_init
= cp
->amp_init
;
5398 printk(KERN_INFO
"cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5399 ss_vendor
, ss_card
, card
->ba0_addr
, card
->ba1_addr
, card
->irq
);
5403 printk(KERN_INFO
"cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5404 cp
->name
, ss_vendor
, ss_card
, card
->ba0_addr
, card
->ba1_addr
, card
->irq
);
5407 if (card
->amplifier_ctrl
==NULL
)
5409 card
->amplifier_ctrl
= amp_none
;
5410 card
->active_ctrl
= clkrun_hack
;
5413 if (external_amp
== 1)
5415 printk(KERN_INFO
"cs46xx: Crystal EAPD support forced on.\n");
5416 card
->amplifier_ctrl
= amp_voyetra
;
5421 printk(KERN_INFO
"cs46xx: Activating CLKRUN hack for Thinkpad.\n");
5422 card
->active_ctrl
= clkrun_hack
;
5425 * The thinkpads don't work well without runtime updating on their kernel
5426 * delay values (or any laptop with variable CPU speeds really).
5427 * so, just to be safe set the init delay to 2100. Eliminates
5428 * failures on T21 Thinkpads. remove this code when the udelay
5429 * and mdelay kernel code is replaced by a pm timer, or the delays
5430 * work well for battery and/or AC power both.
5432 if(card
->active_ctrl
== clkrun_hack
)
5437 if((card
->active_ctrl
== clkrun_hack
) && !(powerdown
== 1))
5440 * for some currently unknown reason, powering down the DAC and ADC component
5441 * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97
5442 * codec access problems. probably the serial clock becomes unsynced.
5443 * added code to sync the chips back up, but only helped about 70% the time.
5449 card
->active_ctrl(card
, 1);
5451 /* claim our iospace and irq */
5453 card
->ba0
= ioremap_nocache(card
->ba0_addr
, CS461X_BA0_SIZE
);
5454 card
->ba1
.name
.data0
= ioremap_nocache(card
->ba1_addr
+ BA1_SP_DMEM0
, CS461X_BA1_DATA0_SIZE
);
5455 card
->ba1
.name
.data1
= ioremap_nocache(card
->ba1_addr
+ BA1_SP_DMEM1
, CS461X_BA1_DATA1_SIZE
);
5456 card
->ba1
.name
.pmem
= ioremap_nocache(card
->ba1_addr
+ BA1_SP_PMEM
, CS461X_BA1_PRG_SIZE
);
5457 card
->ba1
.name
.reg
= ioremap_nocache(card
->ba1_addr
+ BA1_SP_REG
, CS461X_BA1_REG_SIZE
);
5459 CS_DBGOUT(CS_INIT
, 4, printk(KERN_INFO
5460 "cs46xx: card=%p card->ba0=%p\n",card
,card
->ba0
) );
5461 CS_DBGOUT(CS_INIT
, 4, printk(KERN_INFO
5462 "cs46xx: card->ba1=%p %p %p %p\n",
5463 card
->ba1
.name
.data0
,
5464 card
->ba1
.name
.data1
,
5465 card
->ba1
.name
.pmem
,
5466 card
->ba1
.name
.reg
) );
5468 if(card
->ba0
== 0 || card
->ba1
.name
.data0
== 0 ||
5469 card
->ba1
.name
.data1
== 0 || card
->ba1
.name
.pmem
== 0 ||
5470 card
->ba1
.name
.reg
== 0)
5473 if (request_irq(card
->irq
, &cs_interrupt
, SA_SHIRQ
, "cs46xx", card
)) {
5474 printk(KERN_ERR
"cs46xx: unable to allocate irq %d\n", card
->irq
);
5477 /* register /dev/dsp */
5478 if ((card
->dev_audio
= register_sound_dsp(&cs461x_fops
, -1)) < 0) {
5479 printk(KERN_ERR
"cs46xx: unable to register dsp\n");
5483 /* register /dev/midi */
5484 if((card
->dev_midi
= register_sound_midi(&cs_midi_fops
, -1)) < 0)
5485 printk(KERN_ERR
"cs46xx: unable to register midi\n");
5487 card
->pm
.flags
|= CS46XX_PM_IDLE
;
5490 if (cs_hardware_init(card
) != 0)
5492 CS_DBGOUT(CS_ERROR
, 4, printk(
5493 "cs46xx: ERROR in cs_hardware_init()... retrying\n"));
5494 for (j
= 0; j
< NR_AC97
; j
++)
5495 if (card
->ac97_codec
[j
] != NULL
) {
5496 unregister_sound_mixer(card
->ac97_codec
[j
]->dev_mixer
);
5497 ac97_release_codec(card
->ac97_codec
[j
]);
5499 mdelay(10 * cs_laptop_wait
);
5506 CS_DBGOUT(CS_PM
| CS_ERROR
, 1, printk(
5507 "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i
));
5508 unregister_sound_dsp(card
->dev_audio
);
5510 unregister_sound_midi(card
->dev_midi
);
5514 init_waitqueue_head(&card
->midi
.open_wait
);
5515 init_MUTEX(&card
->midi
.open_sem
);
5516 init_waitqueue_head(&card
->midi
.iwait
);
5517 init_waitqueue_head(&card
->midi
.owait
);
5518 cs461x_pokeBA0(card
, BA0_MIDCR
, MIDCR_MRST
);
5519 cs461x_pokeBA0(card
, BA0_MIDCR
, 0);
5522 * Check if we have to init the amplifier, but probably already done
5523 * since the CD logic in the ac97 init code will turn on the ext amp.
5527 card
->active_ctrl(card
, -1);
5529 PCI_SET_DRIVER_DATA(pci_dev
, card
);
5530 PCI_SET_DMA_MASK(pci_dev
, dma_mask
);
5531 list_add(&card
->list
, &cs46xx_devs
);
5533 pmdev
= cs_pm_register(PM_PCI_DEV
, PM_PCI_ID(pci_dev
), cs46xx_pm_callback
);
5536 CS_DBGOUT(CS_INIT
| CS_PM
, 4, printk(KERN_INFO
5537 "cs46xx: probe() pm_register() succeeded (%p).\n",
5543 CS_DBGOUT(CS_INIT
| CS_PM
| CS_ERROR
, 2, printk(KERN_INFO
5544 "cs46xx: probe() pm_register() failed (%p).\n",
5546 card
->pm
.flags
|= CS46XX_PM_NOT_REGISTERED
;
5549 CS_DBGOUT(CS_PM
, 9, printk(KERN_INFO
"cs46xx: pm.flags=0x%x card=%p\n",
5550 (unsigned)card
->pm
.flags
,card
));
5552 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2, printk(KERN_INFO
5553 "cs46xx: probe()- device allocated successfully\n"));
5557 free_irq(card
->irq
, card
);
5561 if(card
->ba1
.name
.data0
)
5562 iounmap(card
->ba1
.name
.data0
);
5563 if(card
->ba1
.name
.data1
)
5564 iounmap(card
->ba1
.name
.data1
);
5565 if(card
->ba1
.name
.pmem
)
5566 iounmap(card
->ba1
.name
.pmem
);
5567 if(card
->ba1
.name
.reg
)
5568 iounmap(card
->ba1
.name
.reg
);
5570 CS_DBGOUT(CS_INIT
| CS_ERROR
, 1, printk(KERN_INFO
5571 "cs46xx: probe()- no device allocated\n"));
5575 // ---------------------------------------------------------------------
5577 static void __devexit
cs46xx_remove(struct pci_dev
*pci_dev
)
5579 struct cs_card
*card
= PCI_GET_DRIVER_DATA(pci_dev
);
5583 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2, printk(KERN_INFO
5584 "cs46xx: cs46xx_remove()+\n"));
5586 card
->active_ctrl(card
,1);
5588 tmp
= cs461x_peek(card
, BA1_PFIE
);
5591 cs461x_poke(card
, BA1_PFIE
, tmp
); /* playback interrupt disable */
5593 tmp
= cs461x_peek(card
, BA1_CIE
);
5596 cs461x_poke(card
, BA1_CIE
, tmp
); /* capture interrupt disable */
5599 * Stop playback DMA.
5601 tmp
= cs461x_peek(card
, BA1_PCTL
);
5602 cs461x_poke(card
, BA1_PCTL
, tmp
& 0x0000ffff);
5607 tmp
= cs461x_peek(card
, BA1_CCTL
);
5608 cs461x_poke(card
, BA1_CCTL
, tmp
& 0xffff0000);
5611 * Reset the processor.
5615 cs461x_proc_stop(card
);
5618 * Power down the DAC and ADC. We will power them up (if) when we need
5621 if( (tmp
= cs461x_powerdown(card
, CS_POWER_DAC
| CS_POWER_ADC
|
5622 CS_POWER_MIXVON
, CS_TRUE
)) )
5624 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(KERN_INFO
5625 "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp
) );
5629 * Power down the PLL.
5631 cs461x_pokeBA0(card
, BA0_CLKCR1
, 0);
5634 * Turn off the Processor by turning off the software clock enable flag in
5635 * the clock control register.
5637 tmp
= cs461x_peekBA0(card
, BA0_CLKCR1
) & ~CLKCR1_SWCE
;
5638 cs461x_pokeBA0(card
, BA0_CLKCR1
, tmp
);
5640 card
->active_ctrl(card
,-1);
5642 /* free hardware resources */
5643 free_irq(card
->irq
, card
);
5645 iounmap(card
->ba1
.name
.data0
);
5646 iounmap(card
->ba1
.name
.data1
);
5647 iounmap(card
->ba1
.name
.pmem
);
5648 iounmap(card
->ba1
.name
.reg
);
5650 /* unregister audio devices */
5651 for (i
= 0; i
< NR_AC97
; i
++)
5652 if (card
->ac97_codec
[i
] != NULL
) {
5653 unregister_sound_mixer(card
->ac97_codec
[i
]->dev_mixer
);
5654 ac97_release_codec(card
->ac97_codec
[i
]);
5656 unregister_sound_dsp(card
->dev_audio
);
5658 unregister_sound_midi(card
->dev_midi
);
5659 list_del(&card
->list
);
5661 PCI_SET_DRIVER_DATA(pci_dev
,NULL
);
5663 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2, printk(KERN_INFO
5664 "cs46xx: cs46xx_remove()-: remove successful\n"));
5669 CS46XX_4612
, /* same as 4630 */
5670 CS46XX_4615
, /* same as 4624 */
5673 static struct pci_device_id cs46xx_pci_tbl
[] = {
5675 .vendor
= PCI_VENDOR_ID_CIRRUS
,
5676 .device
= PCI_DEVICE_ID_CIRRUS_4610
,
5677 .subvendor
= PCI_ANY_ID
,
5678 .subdevice
= PCI_ANY_ID
,
5679 .driver_data
= CS46XX_4610
,
5682 .vendor
= PCI_VENDOR_ID_CIRRUS
,
5683 .device
= PCI_DEVICE_ID_CIRRUS_4612
,
5684 .subvendor
= PCI_ANY_ID
,
5685 .subdevice
= PCI_ANY_ID
,
5686 .driver_data
= CS46XX_4612
,
5689 .vendor
= PCI_VENDOR_ID_CIRRUS
,
5690 .device
= PCI_DEVICE_ID_CIRRUS_4615
,
5691 .subvendor
= PCI_ANY_ID
,
5692 .subdevice
= PCI_ANY_ID
,
5693 .driver_data
= CS46XX_4615
,
5698 MODULE_DEVICE_TABLE(pci
, cs46xx_pci_tbl
);
5700 static struct pci_driver cs46xx_pci_driver
= {
5702 .id_table
= cs46xx_pci_tbl
,
5703 .probe
= cs46xx_probe
,
5704 .remove
= __devexit_p(cs46xx_remove
),
5705 .suspend
= CS46XX_SUSPEND_TBL
,
5706 .resume
= CS46XX_RESUME_TBL
,
5709 static int __init
cs46xx_init_module(void)
5712 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2, printk(KERN_INFO
5713 "cs46xx: cs46xx_init_module()+ \n"));
5714 rtn
= pci_module_init(&cs46xx_pci_driver
);
5718 CS_DBGOUT(CS_ERROR
| CS_INIT
, 1, printk(
5719 "cs46xx: Unable to detect valid cs46xx device\n"));
5722 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
5723 printk(KERN_INFO
"cs46xx: cs46xx_init_module()- (%d)\n",rtn
));
5727 static void __exit
cs46xx_cleanup_module(void)
5729 pci_unregister_driver(&cs46xx_pci_driver
);
5730 cs_pm_unregister_all(cs46xx_pm_callback
);
5731 CS_DBGOUT(CS_INIT
| CS_FUNCTION
, 2,
5732 printk(KERN_INFO
"cs46xx: cleanup_cs46xx() finished\n"));
5735 module_init(cs46xx_init_module
);
5736 module_exit(cs46xx_cleanup_module
);
5738 #ifndef CS46XX_ACPI_SUPPORT
5739 static int cs46xx_pm_callback(struct pm_dev
*dev
, pm_request_t rqst
, void *data
)
5741 struct cs_card
*card
;
5743 CS_DBGOUT(CS_PM
, 2, printk(KERN_INFO
5744 "cs46xx: cs46xx_pm_callback dev=%p rqst=0x%x card=%p\n",
5745 dev
,(unsigned)rqst
,data
));
5746 card
= (struct cs_card
*) dev
->data
;
5750 CS_DBGOUT(CS_PM
, 2, printk(KERN_INFO
5751 "cs46xx: PM suspend request\n"));
5752 if(cs46xx_suspend(card
, 0))
5754 CS_DBGOUT(CS_ERROR
, 2, printk(KERN_INFO
5755 "cs46xx: PM suspend request refused\n"));
5760 CS_DBGOUT(CS_PM
, 2, printk(KERN_INFO
5761 "cs46xx: PM resume request\n"));
5762 if(cs46xx_resume(card
))
5764 CS_DBGOUT(CS_ERROR
, 2, printk(KERN_INFO
5765 "cs46xx: PM resume request refused\n"));
5776 #if CS46XX_ACPI_SUPPORT
5777 static int cs46xx_suspend_tbl(struct pci_dev
*pcidev
, pm_message_t state
)
5779 struct cs_card
*s
= PCI_GET_DRIVER_DATA(pcidev
);
5780 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 2,
5781 printk(KERN_INFO
"cs46xx: cs46xx_suspend_tbl request\n"));
5782 cs46xx_suspend(s
, 0);
5786 static int cs46xx_resume_tbl(struct pci_dev
*pcidev
)
5788 struct cs_card
*s
= PCI_GET_DRIVER_DATA(pcidev
);
5789 CS_DBGOUT(CS_PM
| CS_FUNCTION
, 2,
5790 printk(KERN_INFO
"cs46xx: cs46xx_resume_tbl request\n"));