1 /*
2  *	Crystal SoundFusion CS46xx driver
3  *
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>
8  *
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>
12  *
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.
17  *
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.
22  *
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>
29  *		Nils Faerber (nf)
30  *			<nils@kernelconcepts.de>
31  *		Thanks to David Pollard for testing.
32  *
33  *	Changes:
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.
37  *			Added Capture.
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
43  *			underruns.
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.
59  *
60  *	Status:
61  *	Playback/Capture supported from 8k-48k.
62  *	16Bit Signed LE & 8Bit Unsigned, with Mono or Stereo supported.
63  *
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
66  *	definition.
67  *
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.
71  *
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
75  *	turned on.
76  */
77 
78 #include <linux/list.h>
79 #include <linux/version.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 <asm/io.h>
91 #include <asm/dma.h>
92 #include <linux/init.h>
93 #include <linux/poll.h>
94 #include <linux/smp_lock.h>
95 #include <linux/wrapper.h>
96 #include <asm/uaccess.h>
97 #include <asm/hardirq.h>
98 #include <linux/ac97_codec.h>
99 #include "cs46xxpm-24.h"
100 #include "cs46xx_wrapper-24.h"
101 
102 #include "cs461x.h"
103 
104 /* MIDI buffer sizes */
105 #define CS_MIDIINBUF  500
106 #define CS_MIDIOUTBUF 500
107 
108 #define ADC_RUNNING	1
109 #define DAC_RUNNING	2
110 
111 #define CS_FMT_16BIT	1		/* These are fixed in fact */
112 #define CS_FMT_STEREO	2
113 #define CS_FMT_MASK	3
114 
115 #define CS_TYPE_ADC	1
116 #define CS_TYPE_DAC	2
117 
118 #define CS_TRUE 	1
119 #define CS_FALSE 	0
120 
121 #define CS_INC_USE_COUNT(m) (atomic_inc(m))
122 #define CS_DEC_USE_COUNT(m) (atomic_dec(m))
123 #define CS_DEC_AND_TEST(m) (atomic_dec_and_test(m))
124 #define CS_IN_USE(m) (atomic_read(m) != 0)
125 
126 #define CS_DBGBREAKPOINT {__asm__("INT $3");}
127 /*
128  *	CS461x definitions
129  */
130 
131 #define CS461X_BA0_SIZE		0x2000
132 #define CS461X_BA1_DATA0_SIZE	0x3000
133 #define CS461X_BA1_DATA1_SIZE	0x3800
134 #define CS461X_BA1_PRG_SIZE	0x7000
135 #define CS461X_BA1_REG_SIZE	0x0100
136 
137 #define GOF_PER_SEC	200
138 
139 #define CSDEBUG_INTERFACE 1
140 #define CSDEBUG 1
141 /*
142  * Turn on/off debugging compilation by using 1/0 respectively for CSDEBUG
143  *
144  *
145  * CSDEBUG is usual mode is set to 1, then use the
146  * cs_debuglevel and cs_debugmask to turn on or off debugging.
147  * Debug level of 1 has been defined to be kernel errors and info
148  * that should be printed on any released driver.
149  */
150 #if CSDEBUG
151 #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;}
152 #else
153 #define CS_DBGOUT(mask,level,x)
154 #endif
155 /*
156  * cs_debugmask areas
157  */
158 #define CS_INIT	 	0x00000001		/* initialization and probe functions */
159 #define CS_ERROR 	0x00000002		/* tmp debugging bit placeholder */
160 #define CS_INTERRUPT	0x00000004		/* interrupt handler (separate from all other) */
161 #define CS_FUNCTION 	0x00000008		/* enter/leave functions */
162 #define CS_WAVE_WRITE 	0x00000010		/* write information for wave */
163 #define CS_WAVE_READ 	0x00000020		/* read information for wave */
164 #define CS_MIDI_WRITE 	0x00000040		/* write information for midi */
165 #define CS_MIDI_READ 	0x00000080		/* read information for midi */
166 #define CS_MPU401_WRITE 0x00000100		/* write information for mpu401 */
167 #define CS_MPU401_READ 	0x00000200		/* read information for mpu401 */
168 #define CS_OPEN		0x00000400		/* all open functions in the driver */
169 #define CS_RELEASE	0x00000800		/* all release functions in the driver */
170 #define CS_PARMS	0x00001000		/* functional and operational parameters */
171 #define CS_IOCTL	0x00002000		/* ioctl (non-mixer) */
172 #define CS_PM		0x00004000		/* PM */
173 #define CS_TMP		0x10000000		/* tmp debug mask bit */
174 
175 #define CS_IOCTL_CMD_SUSPEND	0x1	// suspend
176 #define CS_IOCTL_CMD_RESUME	0x2	// resume
177 
178 #if CSDEBUG
179 static unsigned long cs_debuglevel=1;			/* levels range from 1-9 */
180 MODULE_PARM(cs_debuglevel, "i");
181 static unsigned long cs_debugmask=CS_INIT | CS_ERROR;	/* use CS_DBGOUT with various mask values */
182 MODULE_PARM(cs_debugmask, "i");
183 #endif
184 static unsigned long hercules_egpio_disable=0;  /* if non-zero set all EGPIO to 0 */
185 MODULE_PARM(hercules_egpio_disable, "i");
186 static unsigned long initdelay=700;  /* PM delay in millisecs */
187 MODULE_PARM(initdelay, "i");
188 static unsigned long powerdown=-1;  /* turn on/off powerdown processing in driver */
189 MODULE_PARM(powerdown, "i");
190 #define DMABUF_DEFAULTORDER 3
191 static unsigned long defaultorder=DMABUF_DEFAULTORDER;
192 MODULE_PARM(defaultorder, "i");
193 
194 static int external_amp;
195 MODULE_PARM(external_amp, "i");
196 static int thinkpad;
197 MODULE_PARM(thinkpad, "i");
198 
199 /*
200 * set the powerdown module parm to 0 to disable all
201 * powerdown. also set thinkpad to 1 to disable powerdown,
202 * but also to enable the clkrun functionality.
203 */
204 static unsigned cs_powerdown=1;
205 static unsigned cs_laptop_wait=1;
206 
207 /* An instance of the 4610 channel */
208 struct cs_channel
209 {
210 	int used;
211 	int num;
212 	void *state;
213 };
214 
215 #define CS46XX_MAJOR_VERSION "1"
216 #define CS46XX_MINOR_VERSION "28"
217 
218 #ifdef __ia64__
219 #define CS46XX_ARCH	     	"64"	//architecture key
220 #else
221 #define CS46XX_ARCH	     	"32"	//architecture key
222 #endif
223 
224 struct list_head cs46xx_devs = { &cs46xx_devs, &cs46xx_devs };
225 
226 /* magic numbers to protect our data structures */
227 #define CS_CARD_MAGIC		0x43525553 /* "CRUS" */
228 #define CS_STATE_MAGIC		0x4c4f4749 /* "LOGI" */
229 #define NR_HW_CH		3
230 
231 /* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
232 #define NR_AC97		2
233 
234 static const unsigned sample_size[] = { 1, 2, 2, 4 };
235 static const unsigned sample_shift[] = { 0, 1, 1, 2 };
236 
237 /* "software" or virtual channel, an instance of opened /dev/dsp */
238 struct cs_state {
239 	unsigned int magic;
240 	struct cs_card *card;	/* Card info */
241 
242 	/* single open lock mechanism, only used for recording */
243 	struct semaphore open_sem;
244 	wait_queue_head_t open_wait;
245 
246 	/* file mode */
247 	mode_t open_mode;
248 
249 	/* virtual channel number */
250 	int virt;
251 
252 	struct dmabuf {
253 		/* wave sample stuff */
254 		unsigned int rate;
255 		unsigned char fmt, enable;
256 
257 		/* hardware channel */
258 		struct cs_channel *channel;
259 		int pringbuf;		/* Software ring slot */
260 		void *pbuf;		/* 4K hardware DMA buffer */
261 
262 		/* OSS buffer management stuff */
263 		void *rawbuf;
264 		dma_addr_t dma_handle;
265 		unsigned buforder;
266 		unsigned numfrag;
267 		unsigned fragshift;
268 		unsigned divisor;
269 		unsigned type;
270 		void *tmpbuff;			/* tmp buffer for sample conversions */
271 		dma_addr_t dmaaddr;
272 		dma_addr_t dmaaddr_tmpbuff;
273 		unsigned buforder_tmpbuff;	/* Log base 2 of size in bytes.. */
274 
275 		/* our buffer acts like a circular ring */
276 		unsigned hwptr;		/* where dma last started, updated by update_ptr */
277 		unsigned swptr;		/* where driver last clear/filled, updated by read/write */
278 		int count;		/* bytes to be comsumed or been generated by dma machine */
279 		unsigned total_bytes;	/* total bytes dmaed by hardware */
280 		unsigned blocks;	/* total blocks */
281 
282 		unsigned error;		/* number of over/underruns */
283 		unsigned underrun;	/* underrun pending before next write has occurred */
284 		wait_queue_head_t wait;	/* put process on wait queue when no more space in buffer */
285 
286 		/* redundant, but makes calculations easier */
287 		unsigned fragsize;
288 		unsigned dmasize;
289 		unsigned fragsamples;
290 
291 		/* OSS stuff */
292 		unsigned mapped:1;
293 		unsigned ready:1;
294 		unsigned endcleared:1;
295 		unsigned SGok:1;
296 		unsigned update_flag;
297 		unsigned ossfragshift;
298 		int ossmaxfrags;
299 		unsigned subdivision;
300 	} dmabuf;
301 	/* Guard against mmap/write/read races */
302 	struct semaphore sem;
303 };
304 
305 struct cs_card {
306 	struct cs_channel channel[2];
307 	unsigned int magic;
308 
309 	/* We keep cs461x cards in a linked list */
310 	struct cs_card *next;
311 
312 	/* The cs461x has a certain amount of cross channel interaction
313 	   so we use a single per card lock */
314 	spinlock_t lock;
315 
316 	/* Keep AC97 sane */
317 	spinlock_t ac97_lock;
318 
319 	/* mixer use count */
320 	atomic_t mixer_use_cnt;
321 
322 	/* PCI device stuff */
323 	struct pci_dev * pci_dev;
324 	struct list_head list;
325 
326 	unsigned int pctl, cctl;	/* Hardware DMA flag sets */
327 
328 	/* soundcore stuff */
329 	int dev_audio;
330 	int dev_midi;
331 
332 	/* structures for abstraction of hardware facilities, codecs, banks and channels*/
333 	struct ac97_codec *ac97_codec[NR_AC97];
334 	struct cs_state *states[2];
335 
336 	u16 ac97_features;
337 
338 	int amplifier;			/* Amplifier control */
339 	void (*amplifier_ctrl)(struct cs_card *, int);
340 	void (*amp_init)(struct cs_card *);
341 
342 	int active;			/* Active clocking */
343 	void (*active_ctrl)(struct cs_card *, int);
344 
345 	/* hardware resources */
346 	unsigned long ba0_addr;
347 	unsigned long ba1_addr;
348 	u32 irq;
349 
350 	/* mappings */
351 	void *ba0;
352 	union
353 	{
354 		struct
355 		{
356 			u8 *data0;
357 			u8 *data1;
358 			u8 *pmem;
359 			u8 *reg;
360 		} name;
361 		u8 *idx[4];
362 	} ba1;
363 
364 	/* Function support */
365 	struct cs_channel *(*alloc_pcm_channel)(struct cs_card *);
366 	struct cs_channel *(*alloc_rec_pcm_channel)(struct cs_card *);
367 	void (*free_pcm_channel)(struct cs_card *, int chan);
368 
369 	/* /dev/midi stuff */
370 	struct {
371 		unsigned ird, iwr, icnt;
372 		unsigned ord, owr, ocnt;
373 		wait_queue_head_t open_wait;
374 		wait_queue_head_t iwait;
375 		wait_queue_head_t owait;
376 		spinlock_t lock;
377 		unsigned char ibuf[CS_MIDIINBUF];
378 		unsigned char obuf[CS_MIDIOUTBUF];
379 		mode_t open_mode;
380 		struct semaphore open_sem;
381 	} midi;
382 	struct cs46xx_pm pm;
383 };
384 
385 static int cs_open_mixdev(struct inode *inode, struct file *file);
386 static int cs_release_mixdev(struct inode *inode, struct file *file);
387 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
388 				unsigned long arg);
389 static int cs_hardware_init(struct cs_card *card);
390 static int cs46xx_powerup(struct cs_card *card, unsigned int type);
391 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag);
392 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type);
393 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state);
394 static int cs46xx_resume_tbl(struct pci_dev *pcidev);
395 
ld2(unsigned int x)396 static inline unsigned ld2(unsigned int x)
397 {
398 	unsigned r = 0;
399 
400 	if (x >= 0x10000) {
401 		x >>= 16;
402 		r += 16;
403 	}
404 	if (x >= 0x100) {
405 		x >>= 8;
406 		r += 8;
407 	}
408 	if (x >= 0x10) {
409 		x >>= 4;
410 		r += 4;
411 	}
412 	if (x >= 4) {
413 		x >>= 2;
414 		r += 2;
415 	}
416 	if (x >= 2)
417 		r++;
418 	return r;
419 }
420 
421 #if CSDEBUG
422 
423 /* DEBUG ROUTINES */
424 
425 #define SOUND_MIXER_CS_GETDBGLEVEL 	_SIOWR('M',120, int)
426 #define SOUND_MIXER_CS_SETDBGLEVEL 	_SIOWR('M',121, int)
427 #define SOUND_MIXER_CS_GETDBGMASK 	_SIOWR('M',122, int)
428 #define SOUND_MIXER_CS_SETDBGMASK 	_SIOWR('M',123, int)
429 #define SOUND_MIXER_CS_APM	 	_SIOWR('M',124, int)
430 
printioctl(unsigned int x)431 void printioctl(unsigned int x)
432 {
433     unsigned int i;
434     unsigned char vidx;
435 	/* these values are incorrect for the ac97 driver, fix.
436          * Index of mixtable1[] member is Device ID
437          * and must be <= SOUND_MIXER_NRDEVICES.
438          * Value of array member is index into s->mix.vol[]
439          */
440         static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
441                 [SOUND_MIXER_PCM]     = 1,   /* voice */
442                 [SOUND_MIXER_LINE1]   = 2,   /* AUX */
443                 [SOUND_MIXER_CD]      = 3,   /* CD */
444                 [SOUND_MIXER_LINE]    = 4,   /* Line */
445                 [SOUND_MIXER_SYNTH]   = 5,   /* FM */
446                 [SOUND_MIXER_MIC]     = 6,   /* Mic */
447                 [SOUND_MIXER_SPEAKER] = 7,   /* Speaker */
448                 [SOUND_MIXER_RECLEV]  = 8,   /* Recording level */
449                 [SOUND_MIXER_VOLUME]  = 9    /* Master Volume */
450         };
451 
452     switch(x)
453     {
454 	case SOUND_MIXER_CS_GETDBGMASK:
455 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") );
456 		break;
457 	case SOUND_MIXER_CS_GETDBGLEVEL:
458 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGLEVEL: ") );
459 		break;
460 	case SOUND_MIXER_CS_SETDBGMASK:
461 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGMASK: ") );
462 		break;
463 	case SOUND_MIXER_CS_SETDBGLEVEL:
464 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGLEVEL: ") );
465 		break;
466         case OSS_GETVERSION:
467 		CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION: ") );
468 		break;
469         case SNDCTL_DSP_SYNC:
470 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC: ") );
471 		break;
472         case SNDCTL_DSP_SETDUPLEX:
473 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX: ") );
474 		break;
475         case SNDCTL_DSP_GETCAPS:
476 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS: ") );
477 		break;
478         case SNDCTL_DSP_RESET:
479 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET: ") );
480 		break;
481         case SNDCTL_DSP_SPEED:
482 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED: ") );
483 		break;
484         case SNDCTL_DSP_STEREO:
485 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO: ") );
486 		break;
487         case SNDCTL_DSP_CHANNELS:
488 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS: ") );
489 		break;
490         case SNDCTL_DSP_GETFMTS:
491 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS: ") );
492 		break;
493         case SNDCTL_DSP_SETFMT:
494 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT: ") );
495 		break;
496         case SNDCTL_DSP_POST:
497 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST: ") );
498 		break;
499         case SNDCTL_DSP_GETTRIGGER:
500 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER: ") );
501 		break;
502         case SNDCTL_DSP_SETTRIGGER:
503 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER: ") );
504 		break;
505         case SNDCTL_DSP_GETOSPACE:
506 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE: ") );
507 		break;
508         case SNDCTL_DSP_GETISPACE:
509 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE: ") );
510 		break;
511         case SNDCTL_DSP_NONBLOCK:
512 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK: ") );
513 		break;
514         case SNDCTL_DSP_GETODELAY:
515 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY: ") );
516 		break;
517         case SNDCTL_DSP_GETIPTR:
518 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR: ") );
519 		break;
520         case SNDCTL_DSP_GETOPTR:
521 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR: ") );
522 		break;
523         case SNDCTL_DSP_GETBLKSIZE:
524 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE: ") );
525 		break;
526         case SNDCTL_DSP_SETFRAGMENT:
527 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFRAGMENT: ") );
528 		break;
529         case SNDCTL_DSP_SUBDIVIDE:
530 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE: ") );
531 		break;
532         case SOUND_PCM_READ_RATE:
533 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE: ") );
534 		break;
535         case SOUND_PCM_READ_CHANNELS:
536 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_CHANNELS: ") );
537 		break;
538         case SOUND_PCM_READ_BITS:
539 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS: ") );
540 		break;
541         case SOUND_PCM_WRITE_FILTER:
542 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_WRITE_FILTER: ") );
543 		break;
544         case SNDCTL_DSP_SETSYNCRO:
545 		CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO: ") );
546 		break;
547         case SOUND_PCM_READ_FILTER:
548 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") );
549 		break;
550 
551         case SOUND_MIXER_PRIVATE1:
552 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") );
553 		break;
554         case SOUND_MIXER_PRIVATE2:
555 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2: ") );
556 		break;
557         case SOUND_MIXER_PRIVATE3:
558 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3: ") );
559 		break;
560         case SOUND_MIXER_PRIVATE4:
561 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4: ") );
562 		break;
563         case SOUND_MIXER_PRIVATE5:
564 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5: ") );
565 		break;
566         case SOUND_MIXER_INFO:
567 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO: ") );
568 		break;
569         case SOUND_OLD_MIXER_INFO:
570 		CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") );
571 		break;
572 
573 	default:
574 		switch (_IOC_NR(x))
575 		{
576 			case SOUND_MIXER_VOLUME:
577 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") );
578 				break;
579 			case SOUND_MIXER_SPEAKER:
580 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SPEAKER: ") );
581 				break;
582 			case SOUND_MIXER_RECLEV:
583 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECLEV: ") );
584 				break;
585 			case SOUND_MIXER_MIC:
586 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_MIC: ") );
587 				break;
588 			case SOUND_MIXER_SYNTH:
589 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SYNTH: ") );
590 				break;
591 			case SOUND_MIXER_RECSRC:
592 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECSRC: ") );
593 				break;
594 			case SOUND_MIXER_DEVMASK:
595 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_DEVMASK: ") );
596 				break;
597 			case SOUND_MIXER_RECMASK:
598 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECMASK: ") );
599 				break;
600 			case SOUND_MIXER_STEREODEVS:
601 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_STEREODEVS: ") );
602 				break;
603 			case SOUND_MIXER_CAPS:
604 				CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:") );
605 				break;
606 			default:
607 				i = _IOC_NR(x);
608 				if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
609 				{
610 					CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) );
611 				}
612 				else
613 				{
614 					CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ",
615 							x,i) );
616 				}
617 				break;
618 		}
619     }
620     CS_DBGOUT(CS_IOCTL, 4, printk("command = 0x%x IOC_NR=%d\n",x, _IOC_NR(x)) );
621 }
622 #endif
623 
624 /*
625  *  common I/O routines
626  */
627 
cs461x_poke(struct cs_card * codec,unsigned long reg,unsigned int val)628 static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
629 {
630 	writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
631 }
632 
cs461x_peek(struct cs_card * codec,unsigned long reg)633 static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
634 {
635 	return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff));
636 }
637 
cs461x_pokeBA0(struct cs_card * codec,unsigned long reg,unsigned int val)638 static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
639 {
640 	writel(val, codec->ba0+reg);
641 }
642 
cs461x_peekBA0(struct cs_card * codec,unsigned long reg)643 static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
644 {
645 	return readl(codec->ba0+reg);
646 }
647 
648 
649 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
650 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
651 
cs_alloc_pcm_channel(struct cs_card * card)652 static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
653 {
654 	if(card->channel[1].used==1)
655 		return NULL;
656 	card->channel[1].used=1;
657 	card->channel[1].num=1;
658 	return &card->channel[1];
659 }
660 
cs_alloc_rec_pcm_channel(struct cs_card * card)661 static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
662 {
663 	if(card->channel[0].used==1)
664 		return NULL;
665 	card->channel[0].used=1;
666 	card->channel[0].num=0;
667 	return &card->channel[0];
668 }
669 
cs_free_pcm_channel(struct cs_card * card,int channel)670 static void cs_free_pcm_channel(struct cs_card *card, int channel)
671 {
672 	card->channel[channel].state = NULL;
673 	card->channel[channel].used=0;
674 }
675 
676 /*
677  * setup a divisor value to help with conversion from
678  * 16bit Stereo, down to 8bit stereo/mono or 16bit mono.
679  * assign a divisor of 1 if using 16bit Stereo as that is
680  * the only format that the static image will capture.
681  */
cs_set_divisor(struct dmabuf * dmabuf)682 static void cs_set_divisor(struct dmabuf *dmabuf)
683 {
684 	if(dmabuf->type == CS_TYPE_DAC)
685 		dmabuf->divisor = 1;
686 	else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
687 	    (dmabuf->fmt & CS_FMT_16BIT))
688 		dmabuf->divisor = 2;
689 	else if( (dmabuf->fmt & CS_FMT_STEREO) &&
690 	    !(dmabuf->fmt & CS_FMT_16BIT))
691 		dmabuf->divisor = 2;
692 	else if( !(dmabuf->fmt & CS_FMT_STEREO) &&
693 	    !(dmabuf->fmt & CS_FMT_16BIT))
694 		dmabuf->divisor = 4;
695 	else
696 		dmabuf->divisor = 1;
697 
698 	CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, printk(
699 		"cs46xx: cs_set_divisor()- %s %d\n",
700 			(dmabuf->type == CS_TYPE_ADC) ? "ADC" : "DAC",
701 			dmabuf->divisor) );
702 }
703 
704 /*
705 * mute some of the more prevalent registers to avoid popping.
706 */
cs_mute(struct cs_card * card,int state)707 static void cs_mute(struct cs_card *card, int state)
708 {
709 	struct ac97_codec *dev=card->ac97_codec[0];
710 
711 	CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n",
712 		(state == CS_TRUE) ? "Muting" : "UnMuting") );
713 
714 	if(state == CS_TRUE)
715 	{
716 	/*
717 	* fix pops when powering up on thinkpads
718 	*/
719 		card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
720 				(u8)BA0_AC97_MASTER_VOLUME);
721 		card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
722 				(u8)BA0_AC97_HEADPHONE_VOLUME);
723 		card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
724 				(u8)BA0_AC97_MASTER_VOLUME_MONO);
725 		card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
726 				(u8)BA0_AC97_PCM_OUT_VOLUME);
727 
728 		cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
729 		cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
730 		cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
731 		cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
732 	}
733 	else
734 	{
735 		cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume);
736 		cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume);
737 		cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono);
738 		cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, card->pm.u32AC97_pcm_out_volume);
739 	}
740 	CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()-\n"));
741 }
742 
743 /* set playback sample rate */
cs_set_dac_rate(struct cs_state * state,unsigned int rate)744 static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
745 {
746 	struct dmabuf *dmabuf = &state->dmabuf;
747 	unsigned int tmp1, tmp2;
748 	unsigned int phiIncr;
749 	unsigned int correctionPerGOF, correctionPerSec;
750 	unsigned long flags;
751 
752 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()+ %d\n",rate) );
753 
754 	/*
755 	 *  Compute the values used to drive the actual sample rate conversion.
756 	 *  The following formulas are being computed, using inline assembly
757 	 *  since we need to use 64 bit arithmetic to compute the values:
758 	 *
759 	 *  phiIncr = floor((Fs,in * 2^26) / Fs,out)
760 	 *  correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
761          *                                   GOF_PER_SEC)
762          *  ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
763          *                       GOF_PER_SEC * correctionPerGOF
764 	 *
765 	 *  i.e.
766 	 *
767 	 *  phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
768 	 *  correctionPerGOF:correctionPerSec =
769 	 *      dividend:remainder(ulOther / GOF_PER_SEC)
770 	 */
771 	tmp1 = rate << 16;
772 	phiIncr = tmp1 / 48000;
773 	tmp1 -= phiIncr * 48000;
774 	tmp1 <<= 10;
775 	phiIncr <<= 10;
776 	tmp2 = tmp1 / 48000;
777 	phiIncr += tmp2;
778 	tmp1 -= tmp2 * 48000;
779 	correctionPerGOF = tmp1 / GOF_PER_SEC;
780 	tmp1 -= correctionPerGOF * GOF_PER_SEC;
781 	correctionPerSec = tmp1;
782 
783 	/*
784 	 *  Fill in the SampleRateConverter control block.
785 	 */
786 
787 	spin_lock_irqsave(&state->card->lock, flags);
788 	cs461x_poke(state->card, BA1_PSRC,
789 	  ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
790 	cs461x_poke(state->card, BA1_PPI, phiIncr);
791 	spin_unlock_irqrestore(&state->card->lock, flags);
792 	dmabuf->rate = rate;
793 
794 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()- %d\n",rate) );
795 	return rate;
796 }
797 
798 /* set recording sample rate */
cs_set_adc_rate(struct cs_state * state,unsigned int rate)799 static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate)
800 {
801 	struct dmabuf *dmabuf = &state->dmabuf;
802 	struct cs_card *card = state->card;
803 	unsigned int phiIncr, coeffIncr, tmp1, tmp2;
804 	unsigned int correctionPerGOF, correctionPerSec, initialDelay;
805 	unsigned int frameGroupLength, cnt;
806 	unsigned long flags;
807 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()+ %d\n",rate) );
808 
809 	/*
810 	 *  We can only decimate by up to a factor of 1/9th the hardware rate.
811 	 *  Correct the value if an attempt is made to stray outside that limit.
812 	 */
813 	if ((rate * 9) < 48000)
814 		rate = 48000 / 9;
815 
816 	/*
817 	 *  We can not capture at at rate greater than the Input Rate (48000).
818 	 *  Return an error if an attempt is made to stray outside that limit.
819 	 */
820 	if (rate > 48000)
821 		rate = 48000;
822 
823 	/*
824 	 *  Compute the values used to drive the actual sample rate conversion.
825 	 *  The following formulas are being computed, using inline assembly
826 	 *  since we need to use 64 bit arithmetic to compute the values:
827 	 *
828 	 *     coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
829 	 *     phiIncr = floor((Fs,in * 2^26) / Fs,out)
830 	 *     correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
831 	 *                                GOF_PER_SEC)
832 	 *     correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
833 	 *                          GOF_PER_SEC * correctionPerGOF
834 	 *     initialDelay = ceil((24 * Fs,in) / Fs,out)
835 	 *
836 	 * i.e.
837 	 *
838 	 *     coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
839 	 *     phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
840 	 *     correctionPerGOF:correctionPerSec =
841 	 * 	    dividend:remainder(ulOther / GOF_PER_SEC)
842 	 *     initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
843 	 */
844 
845 	tmp1 = rate << 16;
846 	coeffIncr = tmp1 / 48000;
847 	tmp1 -= coeffIncr * 48000;
848 	tmp1 <<= 7;
849 	coeffIncr <<= 7;
850 	coeffIncr += tmp1 / 48000;
851 	coeffIncr ^= 0xFFFFFFFF;
852 	coeffIncr++;
853 	tmp1 = 48000 << 16;
854 	phiIncr = tmp1 / rate;
855 	tmp1 -= phiIncr * rate;
856 	tmp1 <<= 10;
857 	phiIncr <<= 10;
858 	tmp2 = tmp1 / rate;
859 	phiIncr += tmp2;
860 	tmp1 -= tmp2 * rate;
861 	correctionPerGOF = tmp1 / GOF_PER_SEC;
862 	tmp1 -= correctionPerGOF * GOF_PER_SEC;
863 	correctionPerSec = tmp1;
864 	initialDelay = ((48000 * 24) + rate - 1) / rate;
865 
866 	/*
867 	 *  Fill in the VariDecimate control block.
868 	 */
869 	spin_lock_irqsave(&card->lock, flags);
870 	cs461x_poke(card, BA1_CSRC,
871 		((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
872 	cs461x_poke(card, BA1_CCI, coeffIncr);
873 	cs461x_poke(card, BA1_CD,
874 		(((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
875 	cs461x_poke(card, BA1_CPI, phiIncr);
876 	spin_unlock_irqrestore(&card->lock, flags);
877 
878 	/*
879 	 *  Figure out the frame group length for the write back task.  Basically,
880 	 *  this is just the factors of 24000 (2^6*3*5^3) that are not present in
881 	 *  the output sample rate.
882 	 */
883 	frameGroupLength = 1;
884 	for (cnt = 2; cnt <= 64; cnt *= 2) {
885 		if (((rate / cnt) * cnt) != rate)
886 			frameGroupLength *= 2;
887 	}
888 	if (((rate / 3) * 3) != rate) {
889 		frameGroupLength *= 3;
890 	}
891 	for (cnt = 5; cnt <= 125; cnt *= 5) {
892 		if (((rate / cnt) * cnt) != rate)
893 			frameGroupLength *= 5;
894         }
895 
896 	/*
897 	 * Fill in the WriteBack control block.
898 	 */
899 	spin_lock_irqsave(&card->lock, flags);
900 	cs461x_poke(card, BA1_CFG1, frameGroupLength);
901 	cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
902 	cs461x_poke(card, BA1_CCST, 0x0000FFFF);
903 	cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
904 	cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
905 	spin_unlock_irqrestore(&card->lock, flags);
906 	dmabuf->rate = rate;
907 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()- %d\n",rate) );
908 	return rate;
909 }
910 
911 /* prepare channel attributes for playback */
cs_play_setup(struct cs_state * state)912 static void cs_play_setup(struct cs_state *state)
913 {
914 	struct dmabuf *dmabuf = &state->dmabuf;
915 	struct cs_card *card = state->card;
916         unsigned int tmp, Count, playFormat;
917 
918 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") );
919         cs461x_poke(card, BA1_PVOL, 0x80008000);
920         if(!dmabuf->SGok)
921                cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
922 
923         Count = 4;
924         playFormat=cs461x_peek(card, BA1_PFIE);
925         if ((dmabuf->fmt & CS_FMT_STEREO)) {
926                 playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO;
927                 Count *= 2;
928         }
929         else
930                 playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO;
931 
932         if ((dmabuf->fmt & CS_FMT_16BIT)) {
933                 playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT
934                            | DMA_RQ_C2_AC_SIGNED_CONVERT);
935                 Count *= 2;
936         }
937         else
938                 playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT
939                            | DMA_RQ_C2_AC_SIGNED_CONVERT);
940 
941         cs461x_poke(card, BA1_PFIE, playFormat);
942 
943         tmp = cs461x_peek(card, BA1_PDTC);
944         tmp &= 0xfffffe00;
945         cs461x_poke(card, BA1_PDTC, tmp | --Count);
946 
947 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") );
948 
949 }
950 
951 struct InitStruct
952 {
953     u32 off;
954     u32 val;
955 } InitArray[] = { {0x00000040, 0x3fc0000f},
956                   {0x0000004c, 0x04800000},
957 
958                   {0x000000b3, 0x00000780},
959                   {0x000000b7, 0x00000000},
960                   {0x000000bc, 0x07800000},
961 
962                   {0x000000cd, 0x00800000},
963                 };
964 
965 /*
966  * "SetCaptureSPValues()" -- Initialize record task values before each
967  * 	capture startup.
968  */
SetCaptureSPValues(struct cs_card * card)969 void SetCaptureSPValues(struct cs_card *card)
970 {
971 	unsigned i, offset;
972 	CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") );
973 	for(i=0; i<sizeof(InitArray)/sizeof(struct InitStruct); i++)
974 	{
975 		offset = InitArray[i].off*4; /* 8bit to 32bit offset value */
976 		cs461x_poke(card, offset, InitArray[i].val );
977 	}
978 	CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()-\n") );
979 }
980 
981 /* prepare channel attributes for recording */
cs_rec_setup(struct cs_state * state)982 static void cs_rec_setup(struct cs_state *state)
983 {
984 	struct cs_card *card = state->card;
985 	struct dmabuf *dmabuf = &state->dmabuf;
986 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n") );
987 
988 	SetCaptureSPValues(card);
989 
990 	/*
991 	 * set the attenuation to 0dB
992 	 */
993 	cs461x_poke(card, BA1_CVOL, 0x80008000);
994 
995 	/*
996 	 * set the physical address of the capture buffer into the SP
997 	 */
998 	cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->rawbuf));
999 
1000 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()-\n") );
1001 }
1002 
1003 
1004 /* get current playback/recording dma buffer pointer (byte offset from LBA),
1005    called with spinlock held! */
1006 
cs_get_dma_addr(struct cs_state * state)1007 static inline unsigned cs_get_dma_addr(struct cs_state *state)
1008 {
1009 	struct dmabuf *dmabuf = &state->dmabuf;
1010 	u32 offset;
1011 
1012 	if ( (!(dmabuf->enable & DAC_RUNNING)) &&
1013 	     (!(dmabuf->enable & ADC_RUNNING) ) )
1014 	{
1015 		CS_DBGOUT(CS_ERROR, 2, printk(
1016 			"cs46xx: ERROR cs_get_dma_addr(): not enabled \n") );
1017 		return 0;
1018 	}
1019 
1020 	/*
1021 	 * ganularity is byte boundry, good part.
1022 	 */
1023 	if(dmabuf->enable & DAC_RUNNING)
1024 	{
1025 		offset = cs461x_peek(state->card, BA1_PBA);
1026 	}
1027 	else /* ADC_RUNNING must be set */
1028 	{
1029 		offset = cs461x_peek(state->card, BA1_CBA);
1030 	}
1031 	CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9,
1032 		printk("cs46xx: cs_get_dma_addr() %d\n",offset) );
1033 	offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf;
1034 	CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8,
1035 		printk("cs46xx: cs_get_dma_addr()- %d\n",offset) );
1036 	return offset;
1037 }
1038 
resync_dma_ptrs(struct cs_state * state)1039 static void resync_dma_ptrs(struct cs_state *state)
1040 {
1041 	struct dmabuf *dmabuf;
1042 
1043 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") );
1044 	if(state)
1045 	{
1046 		dmabuf = &state->dmabuf;
1047 		dmabuf->hwptr=dmabuf->swptr = 0;
1048 		dmabuf->pringbuf = 0;
1049 	}
1050 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()- \n") );
1051 }
1052 
1053 /* Stop recording (lock held) */
__stop_adc(struct cs_state * state)1054 static inline void __stop_adc(struct cs_state *state)
1055 {
1056 	struct dmabuf *dmabuf = &state->dmabuf;
1057 	struct cs_card *card = state->card;
1058 	unsigned int tmp;
1059 
1060 	dmabuf->enable &= ~ADC_RUNNING;
1061 
1062 	tmp = cs461x_peek(card, BA1_CCTL);
1063 	tmp &= 0xFFFF0000;
1064 	cs461x_poke(card, BA1_CCTL, tmp );
1065 }
1066 
stop_adc(struct cs_state * state)1067 static void stop_adc(struct cs_state *state)
1068 {
1069 	unsigned long flags;
1070 
1071 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()+ \n") );
1072 	spin_lock_irqsave(&state->card->lock, flags);
1073 	__stop_adc(state);
1074 	spin_unlock_irqrestore(&state->card->lock, flags);
1075 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()- \n") );
1076 }
1077 
start_adc(struct cs_state * state)1078 static void start_adc(struct cs_state *state)
1079 {
1080 	struct dmabuf *dmabuf = &state->dmabuf;
1081 	struct cs_card *card = state->card;
1082 	unsigned long flags;
1083 	unsigned int tmp;
1084 
1085 	spin_lock_irqsave(&card->lock, flags);
1086 	if (!(dmabuf->enable & ADC_RUNNING) &&
1087 	     ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize)
1088 	       && dmabuf->ready) &&
1089 	       ((card->pm.flags & CS46XX_PM_IDLE) ||
1090 	        (card->pm.flags & CS46XX_PM_RESUMED)) )
1091 	{
1092 		dmabuf->enable |= ADC_RUNNING;
1093 		cs_set_divisor(dmabuf);
1094 		tmp = cs461x_peek(card, BA1_CCTL);
1095 		tmp &= 0xFFFF0000;
1096 		tmp |= card->cctl;
1097 		CS_DBGOUT(CS_FUNCTION, 2, printk(
1098 			"cs46xx: start_adc() poke 0x%x \n",tmp) );
1099 		cs461x_poke(card, BA1_CCTL, tmp);
1100 	}
1101 	spin_unlock_irqrestore(&card->lock, flags);
1102 }
1103 
1104 /* stop playback (lock held) */
__stop_dac(struct cs_state * state)1105 static inline void __stop_dac(struct cs_state *state)
1106 {
1107 	struct dmabuf *dmabuf = &state->dmabuf;
1108 	struct cs_card *card = state->card;
1109 	unsigned int tmp;
1110 
1111 	dmabuf->enable &= ~DAC_RUNNING;
1112 
1113 	tmp=cs461x_peek(card, BA1_PCTL);
1114 	tmp&=0xFFFF;
1115 	cs461x_poke(card, BA1_PCTL, tmp);
1116 }
1117 
stop_dac(struct cs_state * state)1118 static void stop_dac(struct cs_state *state)
1119 {
1120 	unsigned long flags;
1121 
1122 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()+ \n") );
1123 	spin_lock_irqsave(&state->card->lock, flags);
1124 	__stop_dac(state);
1125 	spin_unlock_irqrestore(&state->card->lock, flags);
1126 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()- \n") );
1127 }
1128 
start_dac(struct cs_state * state)1129 static void start_dac(struct cs_state *state)
1130 {
1131 	struct dmabuf *dmabuf = &state->dmabuf;
1132 	struct cs_card *card = state->card;
1133 	unsigned long flags;
1134 	int tmp;
1135 
1136 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()+ \n") );
1137 	spin_lock_irqsave(&card->lock, flags);
1138 	if (!(dmabuf->enable & DAC_RUNNING) &&
1139 	    ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) &&
1140 	       ((card->pm.flags & CS46XX_PM_IDLE) ||
1141 	        (card->pm.flags & CS46XX_PM_RESUMED)) )
1142 	{
1143 		dmabuf->enable |= DAC_RUNNING;
1144 		tmp = cs461x_peek(card, BA1_PCTL);
1145 		tmp &= 0xFFFF;
1146 		tmp |= card->pctl;
1147 		CS_DBGOUT(CS_PARMS, 6, printk(
1148 		    "cs46xx: start_dac() poke card=0x%.08x tmp=0x%.08x addr=0x%.08x \n",
1149 		    (unsigned)card, (unsigned)tmp,
1150 		    (unsigned)card->ba1.idx[(BA1_PCTL >> 16) & 3]+(BA1_PCTL&0xffff) ) );
1151 		cs461x_poke(card, BA1_PCTL, tmp);
1152 	}
1153 	spin_unlock_irqrestore(&card->lock, flags);
1154 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()- \n") );
1155 }
1156 
1157 #define DMABUF_MINORDER 1
1158 
1159 /*
1160  * allocate DMA buffer, playback and recording buffers are separate.
1161  */
alloc_dmabuf(struct cs_state * state)1162 static int alloc_dmabuf(struct cs_state *state)
1163 {
1164 
1165 	struct cs_card *card=state->card;
1166 	struct dmabuf *dmabuf = &state->dmabuf;
1167 	void *rawbuf = NULL;
1168 	void *tmpbuff = NULL;
1169 	int order;
1170 	struct page *map, *mapend;
1171 	unsigned long df;
1172 
1173 	dmabuf->ready  = dmabuf->mapped = 0;
1174 	dmabuf->SGok = 0;
1175 /*
1176 * check for order within limits, but do not overwrite value.
1177 */
1178 	if((defaultorder > 1) && (defaultorder < 12))
1179 		df = defaultorder;
1180 	else
1181 		df = 2;
1182 
1183 	for (order = df; order >= DMABUF_MINORDER; order--)
1184 		if ( (rawbuf = (void *) pci_alloc_consistent(
1185 			card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr)))
1186 			    break;
1187 	if (!rawbuf) {
1188 		CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
1189 			"cs46xx: alloc_dmabuf(): unable to allocate rawbuf\n"));
1190 		return -ENOMEM;
1191 	}
1192 	dmabuf->buforder = order;
1193 	dmabuf->rawbuf = rawbuf;
1194 	// Now mark the pages as reserved; otherwise the
1195 	// remap_page_range() in cs46xx_mmap doesn't work.
1196 	// 1. get index to last page in mem_map array for rawbuf.
1197 	mapend = virt_to_page(dmabuf->rawbuf +
1198 		(PAGE_SIZE << dmabuf->buforder) - 1);
1199 
1200 	// 2. mark each physical page in range as 'reserved'.
1201 	for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1202 		cs4x_mem_map_reserve(map);
1203 
1204 	CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: alloc_dmabuf(): allocated %ld (order = %d) bytes at %p\n",
1205 	       PAGE_SIZE << order, order, rawbuf) );
1206 
1207 /*
1208 *  only allocate the conversion buffer for the ADC
1209 */
1210 	if(dmabuf->type == CS_TYPE_DAC)
1211 	{
1212 		dmabuf->tmpbuff = NULL;
1213 		dmabuf->buforder_tmpbuff = 0;
1214 		return 0;
1215 	}
1216 /*
1217  * now the temp buffer for 16/8 conversions
1218  */
1219 
1220 	tmpbuff = (void *) pci_alloc_consistent(
1221 		card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr_tmpbuff);
1222 
1223 	if (!tmpbuff)
1224 		return -ENOMEM;
1225 	CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: allocated %ld (order = %d) bytes at %p\n",
1226 	       PAGE_SIZE << order, order, tmpbuff) );
1227 
1228 	dmabuf->tmpbuff = tmpbuff;
1229 	dmabuf->buforder_tmpbuff = order;
1230 
1231 	// Now mark the pages as reserved; otherwise the
1232 	// remap_page_range() in cs46xx_mmap doesn't work.
1233 	// 1. get index to last page in mem_map array for rawbuf.
1234 	mapend = virt_to_page(dmabuf->tmpbuff +
1235 		(PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1236 
1237 	// 2. mark each physical page in range as 'reserved'.
1238 	for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1239 		cs4x_mem_map_reserve(map);
1240 	return 0;
1241 }
1242 
1243 /* free DMA buffer */
dealloc_dmabuf(struct cs_state * state)1244 static void dealloc_dmabuf(struct cs_state *state)
1245 {
1246 	struct dmabuf *dmabuf = &state->dmabuf;
1247 	struct page *map, *mapend;
1248 
1249 	if (dmabuf->rawbuf) {
1250 		// Undo prog_dmabuf()'s marking the pages as reserved
1251 		mapend = virt_to_page(dmabuf->rawbuf +
1252 				(PAGE_SIZE << dmabuf->buforder) - 1);
1253 		for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
1254 			cs4x_mem_map_unreserve(map);
1255 		free_dmabuf(state->card, dmabuf);
1256 	}
1257 
1258 	if (dmabuf->tmpbuff) {
1259 		// Undo prog_dmabuf()'s marking the pages as reserved
1260 		mapend = virt_to_page(dmabuf->tmpbuff +
1261 				(PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
1262 		for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
1263 			cs4x_mem_map_unreserve(map);
1264 		free_dmabuf2(state->card, dmabuf);
1265 	}
1266 
1267 	dmabuf->rawbuf = NULL;
1268 	dmabuf->tmpbuff = NULL;
1269 	dmabuf->mapped = dmabuf->ready = 0;
1270 	dmabuf->SGok = 0;
1271 }
1272 
__prog_dmabuf(struct cs_state * state)1273 static int __prog_dmabuf(struct cs_state *state)
1274 {
1275         struct dmabuf *dmabuf = &state->dmabuf;
1276         unsigned long flags;
1277         unsigned long allocated_pages, allocated_bytes;
1278         unsigned long tmp1, tmp2, fmt=0;
1279         unsigned long *ptmp = (unsigned long *) dmabuf->pbuf;
1280         unsigned long SGarray[9], nSGpages=0;
1281         int ret;
1282 
1283 	CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()+ \n"));
1284 /*
1285  * check for CAPTURE and use only non-sg for initial release
1286  */
1287 	if(dmabuf->type == CS_TYPE_ADC)
1288 	{
1289 		CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n"));
1290 		/*
1291 		 * add in non-sg support for capture.
1292 		 */
1293 		spin_lock_irqsave(&state->card->lock, flags);
1294 	/* add code to reset the rawbuf memory. TRW */
1295 		resync_dma_ptrs(state);
1296 		dmabuf->total_bytes = dmabuf->blocks = 0;
1297 		dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1298 
1299 		dmabuf->SGok = 0;
1300 
1301 		spin_unlock_irqrestore(&state->card->lock, flags);
1302 
1303 		/* allocate DMA buffer if not allocated yet */
1304 		if (!dmabuf->rawbuf || !dmabuf->tmpbuff)
1305 			if ((ret = alloc_dmabuf(state)))
1306 				return ret;
1307 	/*
1308 	 * static image only supports 16Bit signed, stereo - hard code fmt
1309 	 */
1310 		fmt = CS_FMT_16BIT | CS_FMT_STEREO;
1311 
1312 		dmabuf->numfrag = 2;
1313 		dmabuf->fragsize = 2048;
1314 		dmabuf->fragsamples = 2048 >> sample_shift[fmt];
1315 		dmabuf->dmasize = 4096;
1316 		dmabuf->fragshift = 11;
1317 
1318 		memset(dmabuf->rawbuf, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1319 		       dmabuf->dmasize);
1320         	memset(dmabuf->tmpbuff, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
1321 			PAGE_SIZE<<dmabuf->buforder_tmpbuff);
1322 
1323 		/*
1324 		 *      Now set up the ring
1325 		 */
1326 
1327 		spin_lock_irqsave(&state->card->lock, flags);
1328 		cs_rec_setup(state);
1329 		spin_unlock_irqrestore(&state->card->lock, flags);
1330 
1331 		/* set the ready flag for the dma buffer */
1332 		dmabuf->ready = 1;
1333 
1334 		CS_DBGOUT(CS_PARMS, 4, printk(
1335 			"cs46xx: prog_dmabuf(): CAPTURE rate=%d fmt=0x%x numfrag=%d "
1336 			"fragsize=%d dmasize=%d\n",
1337 			    dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1338 			    dmabuf->fragsize, dmabuf->dmasize) );
1339 
1340 		CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n"));
1341 		return 0;
1342 	}
1343 	else if (dmabuf->type == CS_TYPE_DAC)
1344 	{
1345 	/*
1346 	 * Must be DAC
1347 	 */
1348 		CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() DAC\n"));
1349 		spin_lock_irqsave(&state->card->lock, flags);
1350 		resync_dma_ptrs(state);
1351 		dmabuf->total_bytes = dmabuf->blocks = 0;
1352 		dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
1353 
1354 		dmabuf->SGok = 0;
1355 
1356 		spin_unlock_irqrestore(&state->card->lock, flags);
1357 
1358 		/* allocate DMA buffer if not allocated yet */
1359 		if (!dmabuf->rawbuf)
1360 			if ((ret = alloc_dmabuf(state)))
1361 				return ret;
1362 
1363 		allocated_pages = 1 << dmabuf->buforder;
1364 		allocated_bytes = allocated_pages*PAGE_SIZE;
1365 
1366 		if(allocated_pages < 2)
1367 		{
1368 			CS_DBGOUT(CS_FUNCTION, 4, printk(
1369 			    "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n",
1370 				(unsigned)allocated_pages));
1371 			return -ENOMEM;
1372 		}
1373 
1374 		/* Use all the pages allocated, fragsize 4k. */
1375 		/* Use 'pbuf' for S/G page map table. */
1376 		dmabuf->SGok = 1;           /* Use S/G. */
1377 
1378 		nSGpages = allocated_bytes/4096;    /* S/G pages always 4k. */
1379 
1380 		     /* Set up S/G variables. */
1381 		*ptmp = virt_to_bus(dmabuf->rawbuf);
1382 		*(ptmp+1) = 0x00000008;
1383 		for(tmp1= 1; tmp1 < nSGpages; tmp1++) {
1384 			*(ptmp+2*tmp1) = virt_to_bus( (dmabuf->rawbuf)+4096*tmp1);
1385 			if( tmp1 == nSGpages-1)
1386 				tmp2 = 0xbfff0000;
1387 			else
1388 				tmp2 = 0x80000000+8*(tmp1+1);
1389 			*(ptmp+2*tmp1+1) = tmp2;
1390 		}
1391 		SGarray[0] = 0x82c0200d;
1392 		SGarray[1] = 0xffff0000;
1393 		SGarray[2] = *ptmp;
1394 		SGarray[3] = 0x00010600;
1395 		SGarray[4] = *(ptmp+2);
1396 		SGarray[5] = 0x80000010;
1397 		SGarray[6] = *ptmp;
1398 		SGarray[7] = *(ptmp+2);
1399 		SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10;
1400 
1401 		if (dmabuf->SGok) {
1402 			dmabuf->numfrag = nSGpages;
1403 			dmabuf->fragsize = 4096;
1404 			dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt];
1405 			dmabuf->fragshift = 12;
1406 			dmabuf->dmasize = dmabuf->numfrag*4096;
1407 		}
1408 		else {
1409 			SGarray[0] = 0xf2c0000f;
1410 			SGarray[1] = 0x00000200;
1411 			SGarray[2] = 0;
1412 			SGarray[3] = 0x00010600;
1413 			SGarray[4]=SGarray[5]=SGarray[6]=SGarray[7]=SGarray[8] = 0;
1414 			dmabuf->numfrag = 2;
1415 			dmabuf->fragsize = 2048;
1416 			dmabuf->fragsamples = 2048 >> sample_shift[dmabuf->fmt];
1417 			dmabuf->dmasize = 4096;
1418 			dmabuf->fragshift = 11;
1419 		}
1420 		for(tmp1 = 0; tmp1 < sizeof(SGarray)/4; tmp1++)
1421 			cs461x_poke( state->card, BA1_PDTC+tmp1*4, SGarray[tmp1]);
1422 
1423 		memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1424 		       dmabuf->dmasize);
1425 
1426 		/*
1427 		 *      Now set up the ring
1428 		 */
1429 
1430 		spin_lock_irqsave(&state->card->lock, flags);
1431 		cs_play_setup(state);
1432 		spin_unlock_irqrestore(&state->card->lock, flags);
1433 
1434 		/* set the ready flag for the dma buffer */
1435 		dmabuf->ready = 1;
1436 
1437 		CS_DBGOUT(CS_PARMS, 4, printk(
1438 			"cs46xx: prog_dmabuf(): PLAYBACK rate=%d fmt=0x%x numfrag=%d "
1439 			"fragsize=%d dmasize=%d\n",
1440 			    dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1441 			    dmabuf->fragsize, dmabuf->dmasize) );
1442 
1443 		CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n"));
1444 		return 0;
1445 	}
1446 	else
1447 	{
1448 		CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n",
1449 			dmabuf->type));
1450 	}
1451 	return 1;
1452 }
1453 
prog_dmabuf(struct cs_state * state)1454 static int prog_dmabuf(struct cs_state *state)
1455 {
1456 	int ret;
1457 
1458 	down(&state->sem);
1459 	ret = __prog_dmabuf(state);
1460 	up(&state->sem);
1461 
1462 	return ret;
1463 }
1464 
cs_clear_tail(struct cs_state * state)1465 static void cs_clear_tail(struct cs_state *state)
1466 {
1467 }
1468 
drain_dac(struct cs_state * state,int nonblock)1469 static int drain_dac(struct cs_state *state, int nonblock)
1470 {
1471 	DECLARE_WAITQUEUE(wait, current);
1472 	struct dmabuf *dmabuf = &state->dmabuf;
1473 	struct cs_card *card=state->card;
1474 	unsigned long flags;
1475 	unsigned long tmo;
1476 	int count;
1477 
1478 	CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()+ \n"));
1479 	if (dmabuf->mapped || !dmabuf->ready)
1480 	{
1481 		CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0, not ready\n"));
1482 		return 0;
1483 	}
1484 
1485 	add_wait_queue(&dmabuf->wait, &wait);
1486 	for (;;) {
1487 		/* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1488 		   every time to make the process really go to sleep */
1489 		current->state = TASK_INTERRUPTIBLE;
1490 
1491 		spin_lock_irqsave(&state->card->lock, flags);
1492 		count = dmabuf->count;
1493 		spin_unlock_irqrestore(&state->card->lock, flags);
1494 
1495 		if (count <= 0)
1496 			break;
1497 
1498 		if (signal_pending(current))
1499 			break;
1500 
1501 		if (nonblock) {
1502 			remove_wait_queue(&dmabuf->wait, &wait);
1503 			current->state = TASK_RUNNING;
1504 			return -EBUSY;
1505 		}
1506 
1507 		tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1508 		tmo >>= sample_shift[dmabuf->fmt];
1509 		tmo += (2048*HZ)/dmabuf->rate;
1510 
1511 		if (!schedule_timeout(tmo ? tmo : 1) && tmo){
1512 			printk(KERN_ERR "cs46xx: drain_dac, dma timeout? %d\n", count);
1513 			break;
1514 		}
1515 	}
1516 	remove_wait_queue(&dmabuf->wait, &wait);
1517 	current->state = TASK_RUNNING;
1518 	if (signal_pending(current))
1519 	{
1520 		CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n"));
1521 		/*
1522 		* set to silence and let that clear the fifos.
1523 		*/
1524 		cs461x_clear_serial_FIFOs(card, CS_TYPE_DAC);
1525 		return -ERESTARTSYS;
1526 	}
1527 
1528 	CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0\n"));
1529 	return 0;
1530 }
1531 
1532 
1533 /* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
cs_update_ptr(struct cs_card * card,int wake)1534 static void cs_update_ptr(struct cs_card *card, int wake)
1535 {
1536 	struct cs_state *state;
1537 	struct dmabuf *dmabuf;
1538 	unsigned hwptr;
1539 	int diff;
1540 
1541 	/* error handling and process wake up for ADC */
1542 	state = card->states[0];
1543 	if(state)
1544 	{
1545 		dmabuf = &state->dmabuf;
1546 		if (dmabuf->enable & ADC_RUNNING) {
1547 			/* update hardware pointer */
1548 			hwptr = cs_get_dma_addr(state);
1549 
1550 			diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1551 			CS_DBGOUT(CS_PARMS, 9, printk(
1552 				"cs46xx: cs_update_ptr()+ ADC hwptr=%d diff=%d\n",
1553 				hwptr,diff) );
1554 			dmabuf->hwptr = hwptr;
1555 			dmabuf->total_bytes += diff;
1556 			dmabuf->count += diff;
1557 			if (dmabuf->count > dmabuf->dmasize)
1558 				dmabuf->count = dmabuf->dmasize;
1559 
1560 			if(dmabuf->mapped)
1561 			{
1562 				if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1563 					wake_up(&dmabuf->wait);
1564 			} else
1565 			{
1566 				if (wake && dmabuf->count > 0)
1567 					wake_up(&dmabuf->wait);
1568 			}
1569 		}
1570 	}
1571 
1572 /*
1573  * Now the DAC
1574  */
1575 	state = card->states[1];
1576 	if(state)
1577 	{
1578 		dmabuf = &state->dmabuf;
1579 		/* error handling and process wake up for DAC */
1580 		if (dmabuf->enable & DAC_RUNNING) {
1581 			/* update hardware pointer */
1582 			hwptr = cs_get_dma_addr(state);
1583 
1584 			diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1585 			CS_DBGOUT(CS_PARMS, 9, printk(
1586 				"cs46xx: cs_update_ptr()+ DAC hwptr=%d diff=%d\n",
1587 				hwptr,diff) );
1588 			dmabuf->hwptr = hwptr;
1589 			dmabuf->total_bytes += diff;
1590 			if (dmabuf->mapped) {
1591 				dmabuf->count += diff;
1592 				if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
1593 					wake_up(&dmabuf->wait);
1594 				/*
1595 				 * other drivers use fragsize, but don't see any sense
1596 				 * in that, since dmasize is the buffer asked for
1597 				 * via mmap.
1598 				 */
1599 				if( dmabuf->count > dmabuf->dmasize)
1600 					dmabuf->count &= dmabuf->dmasize-1;
1601 			} else {
1602 				dmabuf->count -= diff;
1603 				/*
1604 				 * backfill with silence and clear out the last
1605 				 * "diff" number of bytes.
1606 				 */
1607 				if(hwptr >= diff)
1608 				{
1609 					memset(dmabuf->rawbuf + hwptr - diff,
1610 						(dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff);
1611 				}
1612 				else
1613 				{
1614 					memset(dmabuf->rawbuf,
1615 						(dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1616 						(unsigned)hwptr);
1617 					memset((void *)((unsigned)dmabuf->rawbuf +
1618 							dmabuf->dmasize + hwptr - diff),
1619 						(dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
1620 						diff - hwptr);
1621 				}
1622 
1623 				if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
1624 					CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
1625 					  "cs46xx: ERROR DAC count<0 or count > dmasize (%d)\n",
1626 					  	dmabuf->count));
1627 					/*
1628 					* buffer underrun or buffer overrun, reset the
1629 					* count of bytes written back to 0.
1630 					*/
1631 					if(dmabuf->count < 0)
1632 						dmabuf->underrun=1;
1633 					dmabuf->count = 0;
1634 					dmabuf->error++;
1635 				}
1636 				if (wake && dmabuf->count < (signed)dmabuf->dmasize/2)
1637 					wake_up(&dmabuf->wait);
1638 			}
1639 		}
1640 	}
1641 }
1642 
1643 
1644 /* hold spinlock for the following! */
cs_handle_midi(struct cs_card * card)1645 static void cs_handle_midi(struct cs_card *card)
1646 {
1647         unsigned char ch;
1648         int wake;
1649         unsigned temp1;
1650 
1651         wake = 0;
1652         while (!(cs461x_peekBA0(card,  BA0_MIDSR) & MIDSR_RBE)) {
1653                 ch = cs461x_peekBA0(card, BA0_MIDRP);
1654                 if (card->midi.icnt < CS_MIDIINBUF) {
1655                         card->midi.ibuf[card->midi.iwr] = ch;
1656                         card->midi.iwr = (card->midi.iwr + 1) % CS_MIDIINBUF;
1657                         card->midi.icnt++;
1658                 }
1659                 wake = 1;
1660         }
1661         if (wake)
1662                 wake_up(&card->midi.iwait);
1663         wake = 0;
1664         while (!(cs461x_peekBA0(card,  BA0_MIDSR) & MIDSR_TBF) && card->midi.ocnt > 0) {
1665                 temp1 = ( card->midi.obuf[card->midi.ord] ) & 0x000000ff;
1666                 cs461x_pokeBA0(card, BA0_MIDWP,temp1);
1667                 card->midi.ord = (card->midi.ord + 1) % CS_MIDIOUTBUF;
1668                 card->midi.ocnt--;
1669                 if (card->midi.ocnt < CS_MIDIOUTBUF-16)
1670                         wake = 1;
1671         }
1672         if (wake)
1673                 wake_up(&card->midi.owait);
1674 }
1675 
cs_interrupt(int irq,void * dev_id,struct pt_regs * regs)1676 static void cs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1677 {
1678 	struct cs_card *card = (struct cs_card *)dev_id;
1679 	/* Single channel card */
1680 	struct cs_state *recstate = card->channel[0].state;
1681 	struct cs_state *playstate = card->channel[1].state;
1682 	u32 status;
1683 
1684 	CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()+ \n"));
1685 
1686 	spin_lock(&card->lock);
1687 
1688 	status = cs461x_peekBA0(card, BA0_HISR);
1689 
1690 	if ((status & 0x7fffffff) == 0)
1691 	{
1692 		cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1693 		spin_unlock(&card->lock);
1694 		return;
1695 	}
1696 
1697 	/*
1698 	 * check for playback or capture interrupt only
1699 	 */
1700 	if( ((status & HISR_VC0) && playstate && playstate->dmabuf.ready) ||
1701 	    (((status & HISR_VC1) && recstate && recstate->dmabuf.ready)) )
1702 	{
1703 		CS_DBGOUT(CS_INTERRUPT, 8, printk(
1704 			"cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status));
1705 		cs_update_ptr(card, CS_TRUE);
1706 	}
1707 
1708         if( status & HISR_MIDI )
1709                 cs_handle_midi(card);
1710 
1711  	/* clear 'em */
1712 	cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
1713 	spin_unlock(&card->lock);
1714 	CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n"));
1715 }
1716 
1717 
1718 /**********************************************************************/
1719 
cs_midi_read(struct file * file,char * buffer,size_t count,loff_t * ppos)1720 static ssize_t cs_midi_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
1721 {
1722         struct cs_card *card = (struct cs_card *)file->private_data;
1723         ssize_t ret;
1724         unsigned long flags;
1725         unsigned ptr;
1726         int cnt;
1727 
1728         if (ppos != &file->f_pos)
1729                 return -ESPIPE;
1730         if (!access_ok(VERIFY_WRITE, buffer, count))
1731                 return -EFAULT;
1732         ret = 0;
1733         while (count > 0) {
1734                 spin_lock_irqsave(&card->lock, flags);
1735                 ptr = card->midi.ird;
1736                 cnt = CS_MIDIINBUF - ptr;
1737                 if (card->midi.icnt < cnt)
1738                         cnt = card->midi.icnt;
1739                 spin_unlock_irqrestore(&card->lock, flags);
1740                 if (cnt > count)
1741                         cnt = count;
1742                 if (cnt <= 0) {
1743                         if (file->f_flags & O_NONBLOCK)
1744                                 return ret ? ret : -EAGAIN;
1745                         interruptible_sleep_on(&card->midi.iwait);
1746                         if (signal_pending(current))
1747                                 return ret ? ret : -ERESTARTSYS;
1748                         continue;
1749                 }
1750                 if (copy_to_user(buffer, card->midi.ibuf + ptr, cnt))
1751                         return ret ? ret : -EFAULT;
1752                 ptr = (ptr + cnt) % CS_MIDIINBUF;
1753                 spin_lock_irqsave(&card->lock, flags);
1754                 card->midi.ird = ptr;
1755                 card->midi.icnt -= cnt;
1756                 spin_unlock_irqrestore(&card->lock, flags);
1757                 count -= cnt;
1758                 buffer += cnt;
1759                 ret += cnt;
1760         }
1761         return ret;
1762 }
1763 
1764 
cs_midi_write(struct file * file,const char * buffer,size_t count,loff_t * ppos)1765 static ssize_t cs_midi_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
1766 {
1767         struct cs_card *card = (struct cs_card *)file->private_data;
1768         ssize_t ret;
1769         unsigned long flags;
1770         unsigned ptr;
1771         int cnt;
1772 
1773         if (ppos != &file->f_pos)
1774                 return -ESPIPE;
1775         if (!access_ok(VERIFY_READ, buffer, count))
1776                 return -EFAULT;
1777         ret = 0;
1778         while (count > 0) {
1779                 spin_lock_irqsave(&card->lock, flags);
1780                 ptr = card->midi.owr;
1781                 cnt = CS_MIDIOUTBUF - ptr;
1782                 if (card->midi.ocnt + cnt > CS_MIDIOUTBUF)
1783                         cnt = CS_MIDIOUTBUF - card->midi.ocnt;
1784                 if (cnt <= 0)
1785                         cs_handle_midi(card);
1786                 spin_unlock_irqrestore(&card->lock, flags);
1787                 if (cnt > count)
1788                         cnt = count;
1789                 if (cnt <= 0) {
1790                         if (file->f_flags & O_NONBLOCK)
1791                                 return ret ? ret : -EAGAIN;
1792                         interruptible_sleep_on(&card->midi.owait);
1793                         if (signal_pending(current))
1794                                 return ret ? ret : -ERESTARTSYS;
1795                         continue;
1796                 }
1797                 if (copy_from_user(card->midi.obuf + ptr, buffer, cnt))
1798                         return ret ? ret : -EFAULT;
1799                 ptr = (ptr + cnt) % CS_MIDIOUTBUF;
1800                 spin_lock_irqsave(&card->lock, flags);
1801                 card->midi.owr = ptr;
1802                 card->midi.ocnt += cnt;
1803                 spin_unlock_irqrestore(&card->lock, flags);
1804                 count -= cnt;
1805                 buffer += cnt;
1806                 ret += cnt;
1807                 spin_lock_irqsave(&card->lock, flags);
1808                 cs_handle_midi(card);
1809                 spin_unlock_irqrestore(&card->lock, flags);
1810         }
1811         return ret;
1812 }
1813 
1814 
cs_midi_poll(struct file * file,struct poll_table_struct * wait)1815 static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait)
1816 {
1817         struct cs_card *card = (struct cs_card *)file->private_data;
1818         unsigned long flags;
1819         unsigned int mask = 0;
1820 
1821         if (file->f_flags & FMODE_WRITE)
1822                 poll_wait(file, &card->midi.owait, wait);
1823         if (file->f_flags & FMODE_READ)
1824                 poll_wait(file, &card->midi.iwait, wait);
1825         spin_lock_irqsave(&card->lock, flags);
1826         if (file->f_flags & FMODE_READ) {
1827                 if (card->midi.icnt > 0)
1828                         mask |= POLLIN | POLLRDNORM;
1829         }
1830         if (file->f_flags & FMODE_WRITE) {
1831                 if (card->midi.ocnt < CS_MIDIOUTBUF)
1832                         mask |= POLLOUT | POLLWRNORM;
1833         }
1834         spin_unlock_irqrestore(&card->lock, flags);
1835         return mask;
1836 }
1837 
1838 
cs_midi_open(struct inode * inode,struct file * file)1839 static int cs_midi_open(struct inode *inode, struct file *file)
1840 {
1841         int minor = MINOR(inode->i_rdev);
1842         struct cs_card *card=NULL;
1843         unsigned long flags;
1844 	struct list_head *entry;
1845 
1846 	list_for_each(entry, &cs46xx_devs)
1847 	{
1848 		card = list_entry(entry, struct cs_card, list);
1849 		if (card->dev_midi == minor)
1850 			break;
1851 	}
1852 
1853 	if (entry == &cs46xx_devs)
1854 		return -ENODEV;
1855 	if (!card)
1856 	{
1857 		CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
1858 			"cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n"));
1859 		return -ENODEV;
1860 	}
1861 
1862         file->private_data = card;
1863         /* wait for device to become free */
1864         down(&card->midi.open_sem);
1865         while (card->midi.open_mode & file->f_mode) {
1866                 if (file->f_flags & O_NONBLOCK) {
1867                         up(&card->midi.open_sem);
1868                         return -EBUSY;
1869                 }
1870                 up(&card->midi.open_sem);
1871                 interruptible_sleep_on(&card->midi.open_wait);
1872                 if (signal_pending(current))
1873                         return -ERESTARTSYS;
1874                 down(&card->midi.open_sem);
1875         }
1876         spin_lock_irqsave(&card->midi.lock, flags);
1877         if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) {
1878                 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1879                 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1880                 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1881                 cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f);            /* Enable xmit, rcv. */
1882                 cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);   /* Enable interrupts */
1883         }
1884         if (file->f_mode & FMODE_READ) {
1885                 card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
1886         }
1887         if (file->f_mode & FMODE_WRITE) {
1888                 card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
1889         }
1890         spin_unlock_irqrestore(&card->midi.lock, flags);
1891         card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
1892         up(&card->midi.open_sem);
1893         MOD_INC_USE_COUNT; /* for 2.2 */
1894         return 0;
1895 }
1896 
1897 
cs_midi_release(struct inode * inode,struct file * file)1898 static int cs_midi_release(struct inode *inode, struct file *file)
1899 {
1900         struct cs_card *card = (struct cs_card *)file->private_data;
1901         DECLARE_WAITQUEUE(wait, current);
1902         unsigned long flags;
1903         unsigned count, tmo;
1904 
1905         if (file->f_mode & FMODE_WRITE) {
1906                 current->state = TASK_INTERRUPTIBLE;
1907                 add_wait_queue(&card->midi.owait, &wait);
1908                 for (;;) {
1909                         spin_lock_irqsave(&card->midi.lock, flags);
1910                         count = card->midi.ocnt;
1911                         spin_unlock_irqrestore(&card->midi.lock, flags);
1912                         if (count <= 0)
1913                                 break;
1914                         if (signal_pending(current))
1915                                 break;
1916                         if (file->f_flags & O_NONBLOCK)
1917                         	break;
1918                         tmo = (count * HZ) / 3100;
1919                         if (!schedule_timeout(tmo ? : 1) && tmo)
1920                                 printk(KERN_DEBUG "cs46xx: midi timed out??\n");
1921                 }
1922                 remove_wait_queue(&card->midi.owait, &wait);
1923                 current->state = TASK_RUNNING;
1924         }
1925         down(&card->midi.open_sem);
1926         card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE)));
1927         up(&card->midi.open_sem);
1928         wake_up(&card->midi.open_wait);
1929         MOD_DEC_USE_COUNT; /* for 2.2 */
1930         return 0;
1931 }
1932 
1933 /*
1934  *   Midi file operations struct.
1935  */
1936 static /*const*/ struct file_operations cs_midi_fops = {
1937 	CS_OWNER	CS_THIS_MODULE
1938 	llseek:		no_llseek,
1939 	read:		cs_midi_read,
1940 	write:		cs_midi_write,
1941 	poll:		cs_midi_poll,
1942 	open:		cs_midi_open,
1943 	release:	cs_midi_release,
1944 };
1945 
1946 /*
1947  *
1948  * CopySamples copies 16-bit stereo signed samples from the source to the
1949  * destination, possibly converting down to unsigned 8-bit and/or mono.
1950  * count specifies the number of output bytes to write.
1951  *
1952  *  Arguments:
1953  *
1954  *  dst             - Pointer to a destination buffer.
1955  *  src             - Pointer to a source buffer
1956  *  count           - The number of bytes to copy into the destination buffer.
1957  *  fmt             - CS_FMT_16BIT and/or CS_FMT_STEREO bits
1958  *  dmabuf          - pointer to the dma buffer structure
1959  *
1960  * NOTES: only call this routine if the output desired is not 16 Signed Stereo
1961  *
1962  *
1963  */
CopySamples(char * dst,char * src,int count,unsigned fmt,struct dmabuf * dmabuf)1964 static void CopySamples(char *dst, char *src, int count, unsigned fmt,
1965 		struct dmabuf *dmabuf)
1966 {
1967 
1968     s32 s32AudioSample;
1969     s16 *psSrc=(s16 *)src;
1970     s16 *psDst=(s16 *)dst;
1971     u8 *pucDst=(u8 *)dst;
1972 
1973     CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") );
1974     CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
1975 	" dst=0x%x src=0x%x count=%d fmt=0x%x\n",
1976 	(unsigned)dst,(unsigned)src,(unsigned)count,(unsigned)fmt) );
1977 
1978     /*
1979      * See if the data should be output as 8-bit unsigned stereo.
1980      */
1981     if((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1982     {
1983         /*
1984          * Convert each 16-bit signed stereo sample to 8-bit unsigned
1985 	 * stereo using rounding.
1986          */
1987         psSrc = (s16 *)src;
1988 	count = count/2;
1989         while(count--)
1990         {
1991             *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8);
1992         }
1993     }
1994     /*
1995      * See if the data should be output at 8-bit unsigned mono.
1996      */
1997     else if(!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT))
1998     {
1999         /*
2000          * Convert each 16-bit signed stereo sample to 8-bit unsigned
2001 	 * mono using averaging and rounding.
2002          */
2003         psSrc = (s16 *)src;
2004 	count = count/2;
2005         while(count--)
2006         {
2007 	    s32AudioSample = ((*psSrc)+(*(psSrc + 1)))/2 + (s32)0x80;
2008 	    if(s32AudioSample > 0x7fff)
2009 	    	s32AudioSample = 0x7fff;
2010             *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8);
2011 	    psSrc += 2;
2012         }
2013     }
2014     /*
2015      * See if the data should be output at 16-bit signed mono.
2016      */
2017     else if(!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT))
2018     {
2019         /*
2020          * Convert each 16-bit signed stereo sample to 16-bit signed
2021 	 * mono using averaging.
2022          */
2023         psSrc = (s16 *)src;
2024 	count = count/2;
2025         while(count--)
2026         {
2027             *(psDst++) = (s16)((*psSrc)+(*(psSrc + 1)))/2;
2028 	    psSrc += 2;
2029         }
2030     }
2031 }
2032 
2033 /*
2034  * cs_copy_to_user()
2035  * replacement for the standard copy_to_user, to allow for a conversion from
2036  * 16 bit to 8 bit and from stereo to mono, if the record conversion is active.
2037  * The current CS46xx/CS4280 static image only records in 16bit unsigned Stereo,
2038  * so we convert from any of the other format combinations.
2039  */
cs_copy_to_user(struct cs_state * s,void * dest,void * hwsrc,unsigned cnt,unsigned * copied)2040 static unsigned cs_copy_to_user(
2041 	struct cs_state *s,
2042 	void *dest,
2043 	void *hwsrc,
2044 	unsigned cnt,
2045 	unsigned *copied)
2046 {
2047 	struct dmabuf *dmabuf = &s->dmabuf;
2048 	void *src = hwsrc;  /* default to the standard destination buffer addr */
2049 
2050 	CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
2051 		"cs_copy_to_user()+ fmt=0x%x cnt=%d dest=0x%.8x\n",
2052 		dmabuf->fmt,(unsigned)cnt,(unsigned)dest) );
2053 
2054 	if(cnt > dmabuf->dmasize)
2055 	{
2056 		cnt = dmabuf->dmasize;
2057 	}
2058 	if(!cnt)
2059 	{
2060 		*copied = 0;
2061 		return 0;
2062 	}
2063 	if(dmabuf->divisor != 1)
2064 	{
2065 		if(!dmabuf->tmpbuff)
2066 		{
2067 			*copied = cnt/dmabuf->divisor;
2068 			return 0;
2069 		}
2070 
2071 		CopySamples((char *)dmabuf->tmpbuff, (char *)hwsrc, cnt,
2072 			dmabuf->fmt, dmabuf);
2073 		src = dmabuf->tmpbuff;
2074 		cnt = cnt/dmabuf->divisor;
2075 	}
2076         if (copy_to_user(dest, src, cnt))
2077 	{
2078 		CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
2079 			"cs46xx: cs_copy_to_user()- fault dest=0x%x src=0x%x cnt=%d\n",
2080 				(unsigned)dest,(unsigned)src,cnt) );
2081 		*copied = 0;
2082 		return -EFAULT;
2083 	}
2084 	*copied = cnt;
2085 	CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
2086 		"cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt) );
2087 	return 0;
2088 }
2089 
2090 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
2091    the user's buffer.  it is filled by the dma machine and drained by this loop. */
cs_read(struct file * file,char * buffer,size_t count,loff_t * ppos)2092 static ssize_t cs_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
2093 {
2094 	struct cs_card *card = (struct cs_card *) file->private_data;
2095 	struct cs_state *state;
2096 	DECLARE_WAITQUEUE(wait, current);
2097 	struct dmabuf *dmabuf;
2098 	ssize_t ret = 0;
2099 	unsigned long flags;
2100 	unsigned swptr;
2101 	int cnt;
2102 	unsigned copied=0;
2103 
2104 	CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2105 		printk("cs46xx: cs_read()+ %d\n",count) );
2106 	state = (struct cs_state *)card->states[0];
2107 	if(!state)
2108 		return -ENODEV;
2109 	dmabuf = &state->dmabuf;
2110 
2111 	if (ppos != &file->f_pos)
2112 		return -ESPIPE;
2113 	if (dmabuf->mapped)
2114 		return -ENXIO;
2115 	if (!access_ok(VERIFY_WRITE, buffer, count))
2116 		return -EFAULT;
2117 
2118 	down(&state->sem);
2119 	if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2120 		goto out2;
2121 
2122 	add_wait_queue(&state->dmabuf.wait, &wait);
2123 	while (count > 0) {
2124 		while(!(card->pm.flags & CS46XX_PM_IDLE))
2125 		{
2126 			schedule();
2127 			if (signal_pending(current)) {
2128 				if(!ret) ret = -ERESTARTSYS;
2129 				goto out;
2130 			}
2131 		}
2132 		spin_lock_irqsave(&state->card->lock, flags);
2133 		swptr = dmabuf->swptr;
2134 		cnt = dmabuf->dmasize - swptr;
2135 		if (dmabuf->count < cnt)
2136 			cnt = dmabuf->count;
2137 		if (cnt <= 0)
2138 			__set_current_state(TASK_INTERRUPTIBLE);
2139 		spin_unlock_irqrestore(&state->card->lock, flags);
2140 
2141 		if (cnt > (count * dmabuf->divisor))
2142 			cnt = count * dmabuf->divisor;
2143 		if (cnt <= 0) {
2144 			/* buffer is empty, start the dma machine and wait for data to be
2145 			   recorded */
2146 			start_adc(state);
2147 			if (file->f_flags & O_NONBLOCK) {
2148 				if (!ret) ret = -EAGAIN;
2149 				goto out;
2150  			}
2151 			up(&state->sem);
2152 			schedule();
2153 			if (signal_pending(current)) {
2154 				if(!ret) ret = -ERESTARTSYS;
2155 				goto out;
2156 			}
2157 			down(&state->sem);
2158 			if (dmabuf->mapped)
2159 			{
2160 				if(!ret)
2161 					ret = -ENXIO;
2162 				goto out;
2163 			}
2164  			continue;
2165 		}
2166 
2167 		CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
2168 			"_read() copy_to cnt=%d count=%d ", cnt,count) );
2169 		CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
2170 			" .dmasize=%d .count=%d buffer=0x%.8x ret=%d\n",
2171 			dmabuf->dmasize,dmabuf->count,(unsigned)buffer,ret) );
2172 
2173                 if (cs_copy_to_user(state, buffer,
2174 			(void *)((unsigned)dmabuf->rawbuf + swptr), cnt, &copied))
2175 		{
2176 			if (!ret) ret = -EFAULT;
2177 			goto out;
2178 		}
2179                 swptr = (swptr + cnt) % dmabuf->dmasize;
2180                 spin_lock_irqsave(&card->lock, flags);
2181                 dmabuf->swptr = swptr;
2182                 dmabuf->count -= cnt;
2183                 spin_unlock_irqrestore(&card->lock, flags);
2184                 count -= copied;
2185                 buffer += copied;
2186                 ret += copied;
2187                 start_adc(state);
2188 	}
2189 out:
2190 	remove_wait_queue(&state->dmabuf.wait, &wait);
2191 out2:
2192 	up(&state->sem);
2193 	set_current_state(TASK_RUNNING);
2194 	CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4,
2195 		printk("cs46xx: cs_read()- %d\n",ret) );
2196 	return ret;
2197 }
2198 
2199 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
2200    the soundcard.  it is drained by the dma machine and filled by this loop. */
cs_write(struct file * file,const char * buffer,size_t count,loff_t * ppos)2201 static ssize_t cs_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
2202 {
2203 	struct cs_card *card = (struct cs_card *) file->private_data;
2204 	struct cs_state *state;
2205 	DECLARE_WAITQUEUE(wait, current);
2206 	struct dmabuf *dmabuf;
2207 	ssize_t ret;
2208 	unsigned long flags;
2209 	unsigned swptr;
2210 	int cnt;
2211 
2212 	CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4,
2213 		printk("cs46xx: cs_write called, count = %d\n", count) );
2214 	state = (struct cs_state *)card->states[1];
2215 	if(!state)
2216 		return -ENODEV;
2217 	if (!access_ok(VERIFY_READ, buffer, count))
2218 		return -EFAULT;
2219 	dmabuf = &state->dmabuf;
2220 
2221 	if (ppos != &file->f_pos)
2222 		return -ESPIPE;
2223 
2224 	down(&state->sem);
2225 	if (dmabuf->mapped)
2226 	{
2227 		ret = -ENXIO;
2228 		goto out;
2229 	}
2230 
2231 	if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
2232 		goto out;
2233 	add_wait_queue(&state->dmabuf.wait, &wait);
2234 	ret = 0;
2235 /*
2236 * Start the loop to read from the user's buffer and write to the dma buffer.
2237 * check for PM events and underrun/overrun in the loop.
2238 */
2239 	while (count > 0) {
2240 		while(!(card->pm.flags & CS46XX_PM_IDLE))
2241 		{
2242 			schedule();
2243 			if (signal_pending(current)) {
2244 				if(!ret) ret = -ERESTARTSYS;
2245 				goto out;
2246 			}
2247 		}
2248 		spin_lock_irqsave(&state->card->lock, flags);
2249 		if (dmabuf->count < 0) {
2250 			/* buffer underrun, we are recovering from sleep_on_timeout,
2251 			   resync hwptr and swptr */
2252 			dmabuf->count = 0;
2253 			dmabuf->swptr = dmabuf->hwptr;
2254 		}
2255 		if (dmabuf->underrun)
2256 		{
2257 			dmabuf->underrun = 0;
2258 			dmabuf->hwptr = cs_get_dma_addr(state);
2259 			dmabuf->swptr = dmabuf->hwptr;
2260 		}
2261 
2262 		swptr = dmabuf->swptr;
2263 		cnt = dmabuf->dmasize - swptr;
2264 		if (dmabuf->count + cnt > dmabuf->dmasize)
2265 			cnt = dmabuf->dmasize - dmabuf->count;
2266 		if (cnt <= 0)
2267 			__set_current_state(TASK_INTERRUPTIBLE);
2268 		spin_unlock_irqrestore(&state->card->lock, flags);
2269 
2270 		if (cnt > count)
2271 			cnt = count;
2272 		if (cnt <= 0) {
2273 			/* buffer is full, start the dma machine and wait for data to be
2274 			   played */
2275 			start_dac(state);
2276 			if (file->f_flags & O_NONBLOCK) {
2277 				if (!ret) ret = -EAGAIN;
2278 				goto out;
2279  			}
2280 			up(&state->sem);
2281 			schedule();
2282  			if (signal_pending(current)) {
2283 				if(!ret) ret = -ERESTARTSYS;
2284 				goto out;
2285  			}
2286 			down(&state->sem);
2287 			if (dmabuf->mapped)
2288 			{
2289 				if(!ret)
2290 					ret = -ENXIO;
2291 				goto out;
2292 			}
2293  			continue;
2294  		}
2295 		if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
2296 			if (!ret) ret = -EFAULT;
2297 			goto out;
2298 		}
2299 		spin_lock_irqsave(&state->card->lock, flags);
2300 		swptr = (swptr + cnt) % dmabuf->dmasize;
2301 		dmabuf->swptr = swptr;
2302 		dmabuf->count += cnt;
2303 		if(dmabuf->count > dmabuf->dmasize)
2304 		{
2305 			CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk(
2306 			    "cs46xx: cs_write() d->count > dmasize - resetting\n"));
2307 			dmabuf->count = dmabuf->dmasize;
2308 		}
2309 		dmabuf->endcleared = 0;
2310 		spin_unlock_irqrestore(&state->card->lock, flags);
2311 
2312 		count -= cnt;
2313 		buffer += cnt;
2314 		ret += cnt;
2315 		start_dac(state);
2316 	}
2317 out:
2318 	up(&state->sem);
2319 	remove_wait_queue(&state->dmabuf.wait, &wait);
2320 	set_current_state(TASK_RUNNING);
2321 
2322 	CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2,
2323 		printk("cs46xx: cs_write()- ret=0x%x\n", ret) );
2324 	return ret;
2325 }
2326 
cs_poll(struct file * file,struct poll_table_struct * wait)2327 static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
2328 {
2329 	struct cs_card *card = (struct cs_card *)file->private_data;
2330 	struct dmabuf *dmabuf;
2331 	struct cs_state *state;
2332 
2333 	unsigned long flags;
2334 	unsigned int mask = 0;
2335 
2336 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n"));
2337 	if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
2338 	{
2339 		return -EINVAL;
2340 	}
2341 	if (file->f_mode & FMODE_WRITE)
2342 	{
2343 		state = card->states[1];
2344 		if(state)
2345 		{
2346 			dmabuf = &state->dmabuf;
2347 			poll_wait(file, &dmabuf->wait, wait);
2348 		}
2349 	}
2350 	if (file->f_mode & FMODE_READ)
2351 	{
2352 		state = card->states[0];
2353 		if(state)
2354 		{
2355 			dmabuf = &state->dmabuf;
2356 			poll_wait(file, &dmabuf->wait, wait);
2357 		}
2358 	}
2359 
2360 	spin_lock_irqsave(&card->lock, flags);
2361 	cs_update_ptr(card, CS_FALSE);
2362 	if (file->f_mode & FMODE_READ) {
2363 		state = card->states[0];
2364 		if(state)
2365 		{
2366 			dmabuf = &state->dmabuf;
2367 			if (dmabuf->count >= (signed)dmabuf->fragsize)
2368 				mask |= POLLIN | POLLRDNORM;
2369 		}
2370 	}
2371 	if (file->f_mode & FMODE_WRITE) {
2372 		state = card->states[1];
2373 		if(state)
2374 		{
2375 			dmabuf = &state->dmabuf;
2376 			if (dmabuf->mapped) {
2377 				if (dmabuf->count >= (signed)dmabuf->fragsize)
2378 				    mask |= POLLOUT | POLLWRNORM;
2379 			} else {
2380 				if ((signed)dmabuf->dmasize >= dmabuf->count
2381 					+ (signed)dmabuf->fragsize)
2382 				    mask |= POLLOUT | POLLWRNORM;
2383 			}
2384 		}
2385 	}
2386 	spin_unlock_irqrestore(&card->lock, flags);
2387 
2388 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()- (0x%x) \n",
2389 		mask));
2390 	return mask;
2391 }
2392 
2393 /*
2394  *	We let users mmap the ring buffer. Its not the real DMA buffer but
2395  *	that side of the code is hidden in the IRQ handling. We do a software
2396  *	emulation of DMA from a 64K or so buffer into a 2K FIFO.
2397  *	(the hardware probably deserves a moan here but Crystal send me nice
2398  *	toys ;)).
2399  */
2400 
cs_mmap(struct file * file,struct vm_area_struct * vma)2401 static int cs_mmap(struct file *file, struct vm_area_struct *vma)
2402 {
2403 	struct cs_card *card = (struct cs_card *)file->private_data;
2404 	struct cs_state *state;
2405 	struct dmabuf *dmabuf;
2406 	int ret = 0;
2407 	unsigned long size;
2408 
2409 	CS_DBGOUT(CS_FUNCTION | CS_PARMS, 2, printk("cs46xx: cs_mmap()+ file=0x%x %s %s\n",
2410 		(unsigned)file, vma->vm_flags & VM_WRITE ? "VM_WRITE" : "",
2411 		vma->vm_flags & VM_READ ? "VM_READ" : "") );
2412 
2413 	if (vma->vm_flags & VM_WRITE) {
2414 		state = card->states[1];
2415 		if(state)
2416 		{
2417 			CS_DBGOUT(CS_OPEN, 2, printk(
2418 			  "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") );
2419 			if ((ret = prog_dmabuf(state)) != 0)
2420 				return ret;
2421 		}
2422 	} else if (vma->vm_flags & VM_READ) {
2423 		state = card->states[0];
2424 		if(state)
2425 		{
2426 			CS_DBGOUT(CS_OPEN, 2, printk(
2427 			  "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") );
2428 			if ((ret = prog_dmabuf(state)) != 0)
2429 				return ret;
2430 		}
2431 	} else {
2432 		CS_DBGOUT(CS_ERROR, 2, printk(
2433 		  "cs46xx: cs_mmap() return -EINVAL\n") );
2434 		return -EINVAL;
2435 	}
2436 
2437 /*
2438  * For now ONLY support playback, but seems like the only way to use
2439  * mmap() is to open an FD with RDWR, just read or just write access
2440  * does not function, get an error back from the kernel.
2441  * Also, QuakeIII opens with RDWR!  So, there must be something
2442  * to needing read/write access mapping.  So, allow read/write but
2443  * use the DAC only.
2444  */
2445 	state = card->states[1];
2446 	if(!(unsigned)state)
2447 	{
2448 		ret = -EINVAL;
2449 		goto out;
2450 	}
2451 
2452 	down(&state->sem);
2453 	dmabuf = &state->dmabuf;
2454 	if (cs4x_pgoff(vma) != 0)
2455 	{
2456 		ret = -EINVAL;
2457 		goto out;
2458 	}
2459 	size = vma->vm_end - vma->vm_start;
2460 
2461 	CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) );
2462 
2463 	if (size > (PAGE_SIZE << dmabuf->buforder))
2464 	{
2465 		ret = -EINVAL;
2466 		goto out;
2467 	}
2468 	if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
2469 			     size, vma->vm_page_prot))
2470 	{
2471 		ret = -EAGAIN;
2472 		goto out;
2473 	}
2474 	dmabuf->mapped = 1;
2475 
2476 	CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") );
2477 out:
2478 	up(&state->sem);
2479 	return ret;
2480 }
2481 
cs_ioctl(struct inode * inode,struct file * file,unsigned int cmd,unsigned long arg)2482 static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2483 {
2484 	struct cs_card *card = (struct cs_card *)file->private_data;
2485 	struct cs_state *state;
2486 	struct dmabuf *dmabuf=0;
2487 	unsigned long flags;
2488 	audio_buf_info abinfo;
2489 	count_info cinfo;
2490 	int val, valsave, mapped, ret;
2491 
2492 	state = (struct cs_state *)card->states[0];
2493 	if(state)
2494 	{
2495 		dmabuf = &state->dmabuf;
2496 		mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped;
2497 	}
2498 	state = (struct cs_state *)card->states[1];
2499 	if(state)
2500 	{
2501 		dmabuf = &state->dmabuf;
2502 		mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped;
2503 	}
2504 
2505 #if CSDEBUG
2506 	printioctl(cmd);
2507 #endif
2508 
2509 	switch (cmd)
2510 	{
2511 	case OSS_GETVERSION:
2512 		return put_user(SOUND_VERSION, (int *)arg);
2513 
2514 	case SNDCTL_DSP_RESET:
2515 		/* FIXME: spin_lock ? */
2516 		if (file->f_mode & FMODE_WRITE) {
2517 			state = (struct cs_state *)card->states[1];
2518 			if(state)
2519 			{
2520 				dmabuf = &state->dmabuf;
2521 				stop_dac(state);
2522 				synchronize_irq();
2523 				dmabuf->ready = 0;
2524 				resync_dma_ptrs(state);
2525 				dmabuf->swptr = dmabuf->hwptr = 0;
2526 				dmabuf->count = dmabuf->total_bytes = 0;
2527 				dmabuf->blocks = 0;
2528 				dmabuf->SGok = 0;
2529 			}
2530 		}
2531 		if (file->f_mode & FMODE_READ) {
2532 			state = (struct cs_state *)card->states[0];
2533 			if(state)
2534 			{
2535 				dmabuf = &state->dmabuf;
2536 				stop_adc(state);
2537 				synchronize_irq();
2538 				resync_dma_ptrs(state);
2539 				dmabuf->ready = 0;
2540 				dmabuf->swptr = dmabuf->hwptr = 0;
2541 				dmabuf->count = dmabuf->total_bytes = 0;
2542 				dmabuf->blocks = 0;
2543 				dmabuf->SGok = 0;
2544 			}
2545 		}
2546 		CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") );
2547 		return 0;
2548 
2549 	case SNDCTL_DSP_SYNC:
2550 		if (file->f_mode & FMODE_WRITE)
2551 			return drain_dac(state, file->f_flags & O_NONBLOCK);
2552 		return 0;
2553 
2554 	case SNDCTL_DSP_SPEED: /* set sample rate */
2555 		if (get_user(val, (int *)arg))
2556 			return -EFAULT;
2557 		if (val >= 0) {
2558 			if (file->f_mode & FMODE_READ) {
2559 				state = (struct cs_state *)card->states[0];
2560 				if(state)
2561 				{
2562 					dmabuf = &state->dmabuf;
2563 					stop_adc(state);
2564 					dmabuf->ready = 0;
2565 					dmabuf->SGok = 0;
2566 					cs_set_adc_rate(state, val);
2567 					cs_set_divisor(dmabuf);
2568 				}
2569 			}
2570 			if (file->f_mode & FMODE_WRITE) {
2571 				state = (struct cs_state *)card->states[1];
2572 				if(state)
2573 				{
2574 					dmabuf = &state->dmabuf;
2575 					stop_dac(state);
2576 					dmabuf->ready = 0;
2577 					dmabuf->SGok = 0;
2578 					cs_set_dac_rate(state, val);
2579 					cs_set_divisor(dmabuf);
2580 				}
2581 			}
2582 			CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2583 			    "cs46xx: cs_ioctl() DSP_SPEED %s %s %d\n",
2584 				file->f_mode & FMODE_WRITE ? "DAC" : "",
2585 				file->f_mode & FMODE_READ ? "ADC" : "",
2586 				dmabuf->rate ) );
2587 			return put_user(dmabuf->rate, (int *)arg);
2588 		}
2589 		return put_user(0, (int *)arg);
2590 
2591 	case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2592 		if (get_user(val, (int *)arg))
2593 			return -EFAULT;
2594 		if (file->f_mode & FMODE_WRITE) {
2595 			state = (struct cs_state *)card->states[1];
2596 			if(state)
2597 			{
2598 				dmabuf = &state->dmabuf;
2599 				stop_dac(state);
2600 				dmabuf->ready = 0;
2601 				dmabuf->SGok = 0;
2602 				if(val)
2603 					dmabuf->fmt |= CS_FMT_STEREO;
2604 				else
2605 					dmabuf->fmt &= ~CS_FMT_STEREO;
2606 				cs_set_divisor(dmabuf);
2607 				CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2608 				    "cs46xx: DSP_STEREO() DAC %s\n",
2609 				    (dmabuf->fmt & CS_FMT_STEREO) ?
2610 					"STEREO":"MONO") );
2611 			}
2612 		}
2613 		if (file->f_mode & FMODE_READ) {
2614 			state = (struct cs_state *)card->states[0];
2615 			if(state)
2616 			{
2617 				dmabuf = &state->dmabuf;
2618 				stop_adc(state);
2619 				dmabuf->ready = 0;
2620 				dmabuf->SGok = 0;
2621 				if(val)
2622 					dmabuf->fmt |= CS_FMT_STEREO;
2623 				else
2624 					dmabuf->fmt &= ~CS_FMT_STEREO;
2625 				cs_set_divisor(dmabuf);
2626 				CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2627 				    "cs46xx: DSP_STEREO() ADC %s\n",
2628 				    (dmabuf->fmt & CS_FMT_STEREO) ?
2629 					"STEREO":"MONO") );
2630 			}
2631 		}
2632 		return 0;
2633 
2634 	case SNDCTL_DSP_GETBLKSIZE:
2635 		if (file->f_mode & FMODE_WRITE) {
2636 			state = (struct cs_state *)card->states[1];
2637 			if(state)
2638 			{
2639 				dmabuf = &state->dmabuf;
2640 				if ((val = prog_dmabuf(state)))
2641 					return val;
2642 				return put_user(dmabuf->fragsize, (int *)arg);
2643 			}
2644 		}
2645 		if (file->f_mode & FMODE_READ) {
2646 			state = (struct cs_state *)card->states[0];
2647 			if(state)
2648 			{
2649 				dmabuf = &state->dmabuf;
2650 				if ((val = prog_dmabuf(state)))
2651 					return val;
2652 				return put_user(dmabuf->fragsize/dmabuf->divisor,
2653 						(int *)arg);
2654 			}
2655 		}
2656 		return put_user(0, (int *)arg);
2657 
2658 	case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
2659 		return put_user(AFMT_S16_LE | AFMT_U8, (int *)arg);
2660 
2661 	case SNDCTL_DSP_SETFMT: /* Select sample format */
2662 		if (get_user(val, (int *)arg))
2663 			return -EFAULT;
2664 		CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
2665 		    "cs46xx: cs_ioctl() DSP_SETFMT %s %s %s %s\n",
2666 			file->f_mode & FMODE_WRITE ? "DAC" : "",
2667 			file->f_mode & FMODE_READ ? "ADC" : "",
2668 			val == AFMT_S16_LE ? "16Bit Signed" : "",
2669 			val == AFMT_U8 ? "8Bit Unsigned" : "") );
2670 		valsave = val;
2671 		if (val != AFMT_QUERY) {
2672 			if(val==AFMT_S16_LE || val==AFMT_U8)
2673 			{
2674 				if (file->f_mode & FMODE_WRITE) {
2675 					state = (struct cs_state *)card->states[1];
2676 					if(state)
2677 					{
2678 						dmabuf = &state->dmabuf;
2679 						stop_dac(state);
2680 						dmabuf->ready = 0;
2681 						dmabuf->SGok = 0;
2682 						if(val==AFMT_S16_LE)
2683 							dmabuf->fmt |= CS_FMT_16BIT;
2684 						else
2685 							dmabuf->fmt &= ~CS_FMT_16BIT;
2686 						cs_set_divisor(dmabuf);
2687 						if((ret = prog_dmabuf(state)))
2688 							return ret;
2689 					}
2690 				}
2691 				if (file->f_mode & FMODE_READ) {
2692 					val = valsave;
2693 					state = (struct cs_state *)card->states[0];
2694 					if(state)
2695 					{
2696 						dmabuf = &state->dmabuf;
2697 						stop_adc(state);
2698 						dmabuf->ready = 0;
2699 						dmabuf->SGok = 0;
2700 						if(val==AFMT_S16_LE)
2701 							dmabuf->fmt |= CS_FMT_16BIT;
2702 						else
2703 							dmabuf->fmt &= ~CS_FMT_16BIT;
2704 						cs_set_divisor(dmabuf);
2705 						if((ret = prog_dmabuf(state)))
2706 							return ret;
2707 					}
2708 				}
2709 			}
2710 			else
2711 			{
2712 				CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk(
2713 				    "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n",
2714 					valsave) );
2715 			}
2716 		}
2717 		else
2718 		{
2719 			if(file->f_mode & FMODE_WRITE)
2720 			{
2721 				state = (struct cs_state *)card->states[1];
2722 				if(state)
2723 					dmabuf = &state->dmabuf;
2724 			}
2725 			else if(file->f_mode & FMODE_READ)
2726 			{
2727 				state = (struct cs_state *)card->states[0];
2728 				if(state)
2729 					dmabuf = &state->dmabuf;
2730 			}
2731 		}
2732 		if(dmabuf)
2733 		{
2734 			if(dmabuf->fmt & CS_FMT_16BIT)
2735 				return put_user(AFMT_S16_LE, (int *)arg);
2736 			else
2737 				return put_user(AFMT_U8, (int *)arg);
2738 		}
2739 		return put_user(0, (int *)arg);
2740 
2741 	case SNDCTL_DSP_CHANNELS:
2742 		if (get_user(val, (int *)arg))
2743 			return -EFAULT;
2744 		if (val != 0) {
2745 			if (file->f_mode & FMODE_WRITE) {
2746 				state = (struct cs_state *)card->states[1];
2747 				if(state)
2748 				{
2749 					dmabuf = &state->dmabuf;
2750 					stop_dac(state);
2751 					dmabuf->ready = 0;
2752 					dmabuf->SGok = 0;
2753 					if(val>1)
2754 						dmabuf->fmt |= CS_FMT_STEREO;
2755 					else
2756 						dmabuf->fmt &= ~CS_FMT_STEREO;
2757 					cs_set_divisor(dmabuf);
2758 					if (prog_dmabuf(state))
2759 						return 0;
2760 				}
2761 			}
2762 			if (file->f_mode & FMODE_READ) {
2763 				state = (struct cs_state *)card->states[0];
2764 				if(state)
2765 				{
2766 					dmabuf = &state->dmabuf;
2767 					stop_adc(state);
2768 					dmabuf->ready = 0;
2769 					dmabuf->SGok = 0;
2770 					if(val>1)
2771 						dmabuf->fmt |= CS_FMT_STEREO;
2772 					else
2773 						dmabuf->fmt &= ~CS_FMT_STEREO;
2774 					cs_set_divisor(dmabuf);
2775 					if (prog_dmabuf(state))
2776 						return 0;
2777 				}
2778 			}
2779 		}
2780 		return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
2781 				(int *)arg);
2782 
2783 	case SNDCTL_DSP_POST:
2784 		/*
2785 		 * There will be a longer than normal pause in the data.
2786 		 * so... do nothing, because there is nothing that we can do.
2787 		 */
2788 		return 0;
2789 
2790 	case SNDCTL_DSP_SUBDIVIDE:
2791 		if (file->f_mode & FMODE_WRITE) {
2792 			state = (struct cs_state *)card->states[1];
2793 			if(state)
2794 			{
2795 				dmabuf = &state->dmabuf;
2796 				if (dmabuf->subdivision)
2797 					return -EINVAL;
2798 				if (get_user(val, (int *)arg))
2799 					return -EFAULT;
2800 				if (val != 1 && val != 2)
2801 					return -EINVAL;
2802 				dmabuf->subdivision = val;
2803 			}
2804 		}
2805 		if (file->f_mode & FMODE_READ) {
2806 			state = (struct cs_state *)card->states[0];
2807 			if(state)
2808 			{
2809 				dmabuf = &state->dmabuf;
2810 				if (dmabuf->subdivision)
2811 					return -EINVAL;
2812 				if (get_user(val, (int *)arg))
2813 					return -EFAULT;
2814 				if (val != 1 && val != 2)
2815 					return -EINVAL;
2816 				dmabuf->subdivision = val;
2817 			}
2818 		}
2819 		return 0;
2820 
2821 	case SNDCTL_DSP_SETFRAGMENT:
2822 		if (get_user(val, (int *)arg))
2823 			return -EFAULT;
2824 
2825 		if (file->f_mode & FMODE_WRITE) {
2826 			state = (struct cs_state *)card->states[1];
2827 			if(state)
2828 			{
2829 				dmabuf = &state->dmabuf;
2830 				dmabuf->ossfragshift = val & 0xffff;
2831 				dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2832 			}
2833 		}
2834 		if (file->f_mode & FMODE_READ) {
2835 			state = (struct cs_state *)card->states[0];
2836 			if(state)
2837 			{
2838 				dmabuf = &state->dmabuf;
2839 				dmabuf->ossfragshift = val & 0xffff;
2840 				dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2841 			}
2842 		}
2843 		return 0;
2844 
2845 	case SNDCTL_DSP_GETOSPACE:
2846 		if (!(file->f_mode & FMODE_WRITE))
2847 			return -EINVAL;
2848 		state = (struct cs_state *)card->states[1];
2849 		if(state)
2850 		{
2851 			dmabuf = &state->dmabuf;
2852 			spin_lock_irqsave(&state->card->lock, flags);
2853 			cs_update_ptr(card, CS_TRUE);
2854 			abinfo.fragsize = dmabuf->fragsize;
2855 			abinfo.fragstotal = dmabuf->numfrag;
2856 		/*
2857 		 * for mmap we always have total space available
2858 		 */
2859 			if (dmabuf->mapped)
2860 				abinfo.bytes = dmabuf->dmasize;
2861 			else
2862 				abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2863 
2864 			abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2865 			spin_unlock_irqrestore(&state->card->lock, flags);
2866 			return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2867 		}
2868 		return -ENODEV;
2869 
2870 	case SNDCTL_DSP_GETISPACE:
2871 		if (!(file->f_mode & FMODE_READ))
2872 			return -EINVAL;
2873 		state = (struct cs_state *)card->states[0];
2874 		if(state)
2875 		{
2876 			dmabuf = &state->dmabuf;
2877 			spin_lock_irqsave(&state->card->lock, flags);
2878 			cs_update_ptr(card, CS_TRUE);
2879 			abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
2880 			abinfo.bytes = dmabuf->count/dmabuf->divisor;
2881 			abinfo.fragstotal = dmabuf->numfrag;
2882 			abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2883 			spin_unlock_irqrestore(&state->card->lock, flags);
2884 			return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2885 		}
2886 		return -ENODEV;
2887 
2888 	case SNDCTL_DSP_NONBLOCK:
2889 		file->f_flags |= O_NONBLOCK;
2890 		return 0;
2891 
2892 	case SNDCTL_DSP_GETCAPS:
2893 		return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
2894 			    (int *)arg);
2895 
2896 	case SNDCTL_DSP_GETTRIGGER:
2897 		val = 0;
2898 		CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") );
2899 		if (file->f_mode & FMODE_WRITE)
2900 		{
2901 			state = (struct cs_state *)card->states[1];
2902 			if(state)
2903 			{
2904 				dmabuf = &state->dmabuf;
2905 				if(dmabuf->enable & DAC_RUNNING)
2906 					val |= PCM_ENABLE_INPUT;
2907 			}
2908 		}
2909 		if (file->f_mode & FMODE_READ)
2910 		{
2911 			if(state)
2912 			{
2913 				state = (struct cs_state *)card->states[0];
2914 				dmabuf = &state->dmabuf;
2915 				if(dmabuf->enable & ADC_RUNNING)
2916 					val |= PCM_ENABLE_OUTPUT;
2917 			}
2918 		}
2919 		CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) );
2920 		return put_user(val, (int *)arg);
2921 
2922 	case SNDCTL_DSP_SETTRIGGER:
2923 		if (get_user(val, (int *)arg))
2924 			return -EFAULT;
2925 		if (file->f_mode & FMODE_READ) {
2926 			state = (struct cs_state *)card->states[0];
2927 			if(state)
2928 			{
2929 				dmabuf = &state->dmabuf;
2930 				if (val & PCM_ENABLE_INPUT) {
2931 					if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2932 						return ret;
2933 					start_adc(state);
2934 				} else
2935 					stop_adc(state);
2936 			}
2937 		}
2938 		if (file->f_mode & FMODE_WRITE) {
2939 			state = (struct cs_state *)card->states[1];
2940 			if(state)
2941 			{
2942 				dmabuf = &state->dmabuf;
2943 				if (val & PCM_ENABLE_OUTPUT) {
2944 					if (!dmabuf->ready && (ret = prog_dmabuf(state)))
2945 						return ret;
2946 					start_dac(state);
2947 				} else
2948 					stop_dac(state);
2949 			}
2950 		}
2951 		return 0;
2952 
2953 	case SNDCTL_DSP_GETIPTR:
2954 		if (!(file->f_mode & FMODE_READ))
2955 			return -EINVAL;
2956 		state = (struct cs_state *)card->states[0];
2957 		if(state)
2958 		{
2959 			dmabuf = &state->dmabuf;
2960 			spin_lock_irqsave(&state->card->lock, flags);
2961 			cs_update_ptr(card, CS_TRUE);
2962 			cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
2963 			cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
2964 			cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
2965 			spin_unlock_irqrestore(&state->card->lock, flags);
2966 			return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2967 		}
2968 		return -ENODEV;
2969 
2970 	case SNDCTL_DSP_GETOPTR:
2971 		if (!(file->f_mode & FMODE_WRITE))
2972 			return -EINVAL;
2973 		state = (struct cs_state *)card->states[1];
2974 		if(state)
2975 		{
2976 			dmabuf = &state->dmabuf;
2977 			spin_lock_irqsave(&state->card->lock, flags);
2978 			cs_update_ptr(card, CS_TRUE);
2979 			cinfo.bytes = dmabuf->total_bytes;
2980 			if (dmabuf->mapped)
2981 			{
2982 				cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift)
2983 							- dmabuf->blocks;
2984 				CS_DBGOUT(CS_PARMS, 8,
2985 					printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n",
2986 					cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
2987 				dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
2988 			}
2989 			else
2990 			{
2991 				cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2992 			}
2993 			cinfo.ptr = dmabuf->hwptr;
2994 
2995 			CS_DBGOUT(CS_PARMS, 4, printk(
2996 			    "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%d\n",
2997 				cinfo.bytes,cinfo.blocks,cinfo.ptr) );
2998 			spin_unlock_irqrestore(&state->card->lock, flags);
2999 			return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
3000 		}
3001 		return -ENODEV;
3002 
3003 	case SNDCTL_DSP_SETDUPLEX:
3004 		return 0;
3005 
3006 	case SNDCTL_DSP_GETODELAY:
3007 		if (!(file->f_mode & FMODE_WRITE))
3008 			return -EINVAL;
3009 		state = (struct cs_state *)card->states[1];
3010 		if(state)
3011 		{
3012 			dmabuf = &state->dmabuf;
3013 			spin_lock_irqsave(&state->card->lock, flags);
3014 			cs_update_ptr(card, CS_TRUE);
3015 			val = dmabuf->count;
3016 			spin_unlock_irqrestore(&state->card->lock, flags);
3017 		}
3018 		else
3019 			val = 0;
3020 		return put_user(val, (int *)arg);
3021 
3022 	case SOUND_PCM_READ_RATE:
3023 		if(file->f_mode & FMODE_READ)
3024 			state = (struct cs_state *)card->states[0];
3025 		else
3026 			state = (struct cs_state *)card->states[1];
3027 		if(state)
3028 		{
3029 			dmabuf = &state->dmabuf;
3030 			return put_user(dmabuf->rate, (int *)arg);
3031 		}
3032 		return put_user(0, (int *)arg);
3033 
3034 
3035 	case SOUND_PCM_READ_CHANNELS:
3036 		if(file->f_mode & FMODE_READ)
3037 			state = (struct cs_state *)card->states[0];
3038 		else
3039 			state = (struct cs_state *)card->states[1];
3040 		if(state)
3041 		{
3042 			dmabuf = &state->dmabuf;
3043 			return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
3044 				(int *)arg);
3045 		}
3046 		return put_user(0, (int *)arg);
3047 
3048 	case SOUND_PCM_READ_BITS:
3049 		if(file->f_mode & FMODE_READ)
3050 			state = (struct cs_state *)card->states[0];
3051 		else
3052 			state = (struct cs_state *)card->states[1];
3053 		if(state)
3054 		{
3055 			dmabuf = &state->dmabuf;
3056 			return put_user((dmabuf->fmt & CS_FMT_16BIT) ?
3057 			  	AFMT_S16_LE : AFMT_U8, (int *)arg);
3058 
3059 		}
3060 		return put_user(0, (int *)arg);
3061 
3062 	case SNDCTL_DSP_MAPINBUF:
3063 	case SNDCTL_DSP_MAPOUTBUF:
3064 	case SNDCTL_DSP_SETSYNCRO:
3065 	case SOUND_PCM_WRITE_FILTER:
3066 	case SOUND_PCM_READ_FILTER:
3067 		return -EINVAL;
3068 	}
3069 	return -EINVAL;
3070 }
3071 
3072 
3073 /*
3074  *	AMP control - null AMP
3075  */
3076 
amp_none(struct cs_card * card,int change)3077 static void amp_none(struct cs_card *card, int change)
3078 {
3079 }
3080 
3081 /*
3082  *	Crystal EAPD mode
3083  */
3084 
amp_voyetra(struct cs_card * card,int change)3085 static void amp_voyetra(struct cs_card *card, int change)
3086 {
3087 	/* Manage the EAPD bit on the Crystal 4297
3088 	   and the Analog AD1885 */
3089 
3090 	int old=card->amplifier;
3091 
3092 	card->amplifier+=change;
3093 	if(card->amplifier && !old)
3094 	{
3095 		/* Turn the EAPD amp on */
3096 		cs_ac97_set(card->ac97_codec[0],  AC97_POWER_CONTROL,
3097 			cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
3098 				0x8000);
3099 	}
3100 	else if(old && !card->amplifier)
3101 	{
3102 		/* Turn the EAPD amp off */
3103 		cs_ac97_set(card->ac97_codec[0],  AC97_POWER_CONTROL,
3104 			cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
3105 				~0x8000);
3106 	}
3107 }
3108 
3109 
3110 /*
3111  *	Game Theatre XP card - EGPIO[2] is used to enable the external amp.
3112  */
3113 
amp_hercules(struct cs_card * card,int change)3114 static void amp_hercules(struct cs_card *card, int change)
3115 {
3116 	int old=card->amplifier;
3117 	if(!card)
3118 	{
3119 		CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
3120 			"cs46xx: amp_hercules() called before initialized.\n"));
3121 		return;
3122 	}
3123 	card->amplifier+=change;
3124 	if( (card->amplifier && !old) && !(hercules_egpio_disable))
3125 	{
3126 		CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3127 			"cs46xx: amp_hercules() external amp enabled\n"));
3128 		cs461x_pokeBA0(card, BA0_EGPIODR,
3129 			EGPIODR_GPOE2);     /* enable EGPIO2 output */
3130 		cs461x_pokeBA0(card, BA0_EGPIOPTR,
3131 			EGPIOPTR_GPPT2);   /* open-drain on output */
3132 	}
3133 	else if(old && !card->amplifier)
3134 	{
3135 		CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
3136 			"cs46xx: amp_hercules() external amp disabled\n"));
3137 		cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
3138 		cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
3139 	}
3140 }
3141 
3142 /*
3143  *	Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
3144  *	whenever we need to beat on the chip.
3145  *
3146  *	The original idea and code for this hack comes from David Kaiser at
3147  *	Linuxcare. Perhaps one day Crystal will document their chips well
3148  *	enough to make them useful.
3149  */
3150 
clkrun_hack(struct cs_card * card,int change)3151 static void clkrun_hack(struct cs_card *card, int change)
3152 {
3153 	struct pci_dev *acpi_dev;
3154 	u16 control;
3155 	u8 pp;
3156 	unsigned long port;
3157 	int old=card->active;
3158 
3159 	card->active+=change;
3160 
3161 	acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
3162 	if(acpi_dev == NULL)
3163 		return;		/* Not a thinkpad thats for sure */
3164 
3165 	/* Find the control port */
3166 	pci_read_config_byte(acpi_dev, 0x41, &pp);
3167 	port=pp<<8;
3168 
3169 	/* Read ACPI port */
3170 	control=inw(port+0x10);
3171 
3172 	/* Flip CLKRUN off while running */
3173 	if(!card->active && old)
3174 	{
3175 		CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3176 			"cs46xx: clkrun() enable clkrun - change=%d active=%d\n",
3177 				change,card->active));
3178 		outw(control|0x2000, port+0x10);
3179 	}
3180 	else
3181 	{
3182 	/*
3183 	* sometimes on a resume the bit is set, so always reset the bit.
3184 	*/
3185 		CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
3186 			"cs46xx: clkrun() disable clkrun - change=%d active=%d\n",
3187 				change,card->active));
3188 		outw(control&~0x2000, port+0x10);
3189 	}
3190 }
3191 
3192 
cs_open(struct inode * inode,struct file * file)3193 static int cs_open(struct inode *inode, struct file *file)
3194 {
3195 	struct cs_card *card = (struct cs_card *)file->private_data;
3196 	struct cs_state *state = NULL;
3197 	struct dmabuf *dmabuf = NULL;
3198 	struct list_head *entry;
3199         int minor = MINOR(inode->i_rdev);
3200 	int ret=0;
3201 	unsigned int tmp;
3202 
3203 	CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=0x%x %s %s\n",
3204 		(unsigned)file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3205 		file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3206 
3207 	list_for_each(entry, &cs46xx_devs)
3208 	{
3209 		card = list_entry(entry, struct cs_card, list);
3210 
3211 		if (!((card->dev_audio ^ minor) & ~0xf))
3212 			break;
3213 	}
3214 	if (entry == &cs46xx_devs)
3215 		return -ENODEV;
3216 	if (!card) {
3217 		CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
3218 			"cs46xx: cs_open(): Error - unable to find audio card struct\n"));
3219 		return -ENODEV;
3220 	}
3221 
3222 	/*
3223 	 * hardcode state[0] for capture, [1] for playback
3224 	 */
3225 	if(file->f_mode & FMODE_READ)
3226 	{
3227 		CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
3228 		if (card->states[0] == NULL) {
3229 			state = card->states[0] = (struct cs_state *)
3230 				kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3231 			if (state == NULL)
3232 				return -ENOMEM;
3233 			memset(state, 0, sizeof(struct cs_state));
3234 			init_MUTEX(&state->sem);
3235 			dmabuf = &state->dmabuf;
3236 			dmabuf->pbuf = (void *)get_free_page(GFP_KERNEL | GFP_DMA);
3237 			if(dmabuf->pbuf==NULL)
3238 			{
3239 				kfree(state);
3240 				card->states[0]=NULL;
3241 				return -ENOMEM;
3242 			}
3243 		}
3244 		else
3245 		{
3246 			state = card->states[0];
3247 			if(state->open_mode & FMODE_READ)
3248 				return -EBUSY;
3249 		}
3250 		dmabuf->channel = card->alloc_rec_pcm_channel(card);
3251 
3252 		if (dmabuf->channel == NULL) {
3253 			kfree (card->states[0]);
3254 			card->states[0] = NULL;;
3255 			return -ENODEV;
3256 		}
3257 
3258 		/* Now turn on external AMP if needed */
3259 		state->card = card;
3260 		state->card->active_ctrl(state->card,1);
3261 		state->card->amplifier_ctrl(state->card,1);
3262 
3263 		if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) )
3264 		{
3265 			CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3266 				"cs46xx: cs46xx_powerup of ADC failed (0x%x)\n",tmp) );
3267 			return -EIO;
3268 		}
3269 
3270 		dmabuf->channel->state = state;
3271 		/* initialize the virtual channel */
3272 		state->virt = 0;
3273 		state->magic = CS_STATE_MAGIC;
3274 		init_waitqueue_head(&dmabuf->wait);
3275 		init_MUTEX(&state->open_sem);
3276 		file->private_data = card;
3277 
3278 		down(&state->open_sem);
3279 
3280 		/* set default sample format. According to OSS Programmer's Guide  /dev/dsp
3281 		   should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3282 		   /dev/dspW will accept 16-bits sample */
3283 
3284 		/* Default input is 8bit mono */
3285 		dmabuf->fmt &= ~CS_FMT_MASK;
3286 		dmabuf->type = CS_TYPE_ADC;
3287 		dmabuf->ossfragshift = 0;
3288 		dmabuf->ossmaxfrags  = 0;
3289 		dmabuf->subdivision  = 0;
3290 		cs_set_adc_rate(state, 8000);
3291 		cs_set_divisor(dmabuf);
3292 
3293 		state->open_mode |= FMODE_READ;
3294 		up(&state->open_sem);
3295 	}
3296 	if(file->f_mode & FMODE_WRITE)
3297 	{
3298 		CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
3299 		if (card->states[1] == NULL) {
3300 			state = card->states[1] = (struct cs_state *)
3301 				kmalloc(sizeof(struct cs_state), GFP_KERNEL);
3302 			if (state == NULL)
3303 				return -ENOMEM;
3304 			memset(state, 0, sizeof(struct cs_state));
3305 			init_MUTEX(&state->sem);
3306 			dmabuf = &state->dmabuf;
3307 			dmabuf->pbuf = (void *)get_free_page(GFP_KERNEL | GFP_DMA);
3308 			if(dmabuf->pbuf==NULL)
3309 			{
3310 				kfree(state);
3311 				card->states[1]=NULL;
3312 				return -ENOMEM;
3313 			}
3314 		}
3315 		else
3316 		{
3317 			state = card->states[1];
3318 			if(state->open_mode & FMODE_WRITE)
3319 				return -EBUSY;
3320 		}
3321 		dmabuf->channel = card->alloc_pcm_channel(card);
3322 
3323 		if (dmabuf->channel == NULL) {
3324 			kfree (card->states[1]);
3325 			card->states[1] = NULL;;
3326 			return -ENODEV;
3327 		}
3328 
3329 		/* Now turn on external AMP if needed */
3330 		state->card = card;
3331 		state->card->active_ctrl(state->card,1);
3332 		state->card->amplifier_ctrl(state->card,1);
3333 
3334 		if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) )
3335 		{
3336 			CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3337 				"cs46xx: cs46xx_powerup of DAC failed (0x%x)\n",tmp) );
3338 			return -EIO;
3339 		}
3340 
3341 		dmabuf->channel->state = state;
3342 		/* initialize the virtual channel */
3343 		state->virt = 1;
3344 		state->magic = CS_STATE_MAGIC;
3345 		init_waitqueue_head(&dmabuf->wait);
3346 		init_MUTEX(&state->open_sem);
3347 		file->private_data = card;
3348 
3349 		down(&state->open_sem);
3350 
3351 		/* set default sample format. According to OSS Programmer's Guide  /dev/dsp
3352 		   should be default to unsigned 8-bits, mono, with sample rate 8kHz and
3353 		   /dev/dspW will accept 16-bits sample */
3354 
3355 		/* Default output is 8bit mono. */
3356 		dmabuf->fmt &= ~CS_FMT_MASK;
3357 		dmabuf->type = CS_TYPE_DAC;
3358 		dmabuf->ossfragshift = 0;
3359 		dmabuf->ossmaxfrags  = 0;
3360 		dmabuf->subdivision  = 0;
3361 		cs_set_dac_rate(state, 8000);
3362 		cs_set_divisor(dmabuf);
3363 
3364 		state->open_mode |= FMODE_WRITE;
3365 		up(&state->open_sem);
3366 		if((ret = prog_dmabuf(state)))
3367 			return ret;
3368 	}
3369 	MOD_INC_USE_COUNT;	/* for 2.2 */
3370 	CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n") );
3371 	return 0;
3372 }
3373 
cs_release(struct inode * inode,struct file * file)3374 static int cs_release(struct inode *inode, struct file *file)
3375 {
3376 	struct cs_card *card = (struct cs_card *)file->private_data;
3377 	struct dmabuf *dmabuf;
3378 	struct cs_state *state;
3379 	unsigned int tmp;
3380 	CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=0x%x %s %s\n",
3381 		(unsigned)file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
3382 		file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
3383 
3384 	if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
3385 	{
3386 		return -EINVAL;
3387 	}
3388 	state = card->states[1];
3389 	if(state)
3390 	{
3391 		if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) )
3392 		{
3393 			CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n") );
3394 			dmabuf = &state->dmabuf;
3395 			cs_clear_tail(state);
3396 			drain_dac(state, file->f_flags & O_NONBLOCK);
3397 			/* stop DMA state machine and free DMA buffers/channels */
3398 			down(&state->open_sem);
3399 			stop_dac(state);
3400 			dealloc_dmabuf(state);
3401 			state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3402 			free_page((unsigned long)state->dmabuf.pbuf);
3403 
3404 			/* we're covered by the open_sem */
3405 			up(&state->open_sem);
3406 			state->card->states[state->virt] = NULL;
3407 			state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3408 
3409 			if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) )
3410 			{
3411 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3412 					"cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) );
3413 			}
3414 
3415 			/* Now turn off external AMP if needed */
3416 			state->card->amplifier_ctrl(state->card, -1);
3417 			state->card->active_ctrl(state->card, -1);
3418 
3419 			kfree(state);
3420 		}
3421 	}
3422 
3423 	state = card->states[0];
3424 	if(state)
3425 	{
3426 		if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) )
3427 		{
3428 			CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n") );
3429 			dmabuf = &state->dmabuf;
3430 			down(&state->open_sem);
3431 			stop_adc(state);
3432 			dealloc_dmabuf(state);
3433 			state->card->free_pcm_channel(state->card, dmabuf->channel->num);
3434 			free_page((unsigned long)state->dmabuf.pbuf);
3435 
3436 			/* we're covered by the open_sem */
3437 			up(&state->open_sem);
3438 			state->card->states[state->virt] = NULL;
3439 			state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
3440 
3441 			if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) )
3442 			{
3443 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
3444 					"cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) );
3445 			}
3446 
3447 			/* Now turn off external AMP if needed */
3448 			state->card->amplifier_ctrl(state->card, -1);
3449 			state->card->active_ctrl(state->card, -1);
3450 
3451 			kfree(state);
3452 		}
3453 	}
3454 
3455 	CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n") );
3456 	MOD_DEC_USE_COUNT;	/* For 2.2 */
3457 	return 0;
3458 }
3459 
printpm(struct cs_card * s)3460 static void printpm(struct cs_card *s)
3461 {
3462 	CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
3463 	CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
3464 		(unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
3465 	CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
3466 		s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
3467 	CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
3468 		s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
3469 	CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
3470 		s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
3471 	CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
3472 		s->pm.u32SSCR,s->pm.u32SRCSA));
3473 	CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
3474 		s->pm.u32DacASR,s->pm.u32AdcASR));
3475 	CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
3476 		s->pm.u32DacSR,s->pm.u32AdcSR));
3477 	CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
3478 		s->pm.u32MIDCR_Save));
3479 	CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%x\n",
3480 		s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
3481 	CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%x\n",
3482 		s->pm.u32AC97_master_volume));
3483 	CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%x\n",
3484 		s->pm.u32AC97_headphone_volume));
3485 	CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%x\n",
3486 		s->pm.u32AC97_master_volume_mono));
3487 	CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%x\n",
3488 		s->pm.u32AC97_pcm_out_volume));
3489 	CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %d\n",
3490 		s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
3491 	CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %d\n",
3492 		s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
3493 
3494 }
3495 
3496 /****************************************************************************
3497 *
3498 *  Suspend - save the ac97 regs, mute the outputs and power down the part.
3499 *
3500 ****************************************************************************/
cs46xx_ac97_suspend(struct cs_card * card)3501 void cs46xx_ac97_suspend(struct cs_card *card)
3502 {
3503 	int Count,i;
3504 	struct ac97_codec *dev=card->ac97_codec[0];
3505 	unsigned int tmp;
3506 
3507 	CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n"));
3508 
3509 	if(card->states[1])
3510 	{
3511 		stop_dac(card->states[1]);
3512 		resync_dma_ptrs(card->states[1]);
3513 	}
3514 	if(card->states[0])
3515 	{
3516 		stop_adc(card->states[0]);
3517 		resync_dma_ptrs(card->states[0]);
3518 	}
3519 
3520 	for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3521 			&& (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3522 		Count += 2, i++)
3523 	{
3524 		card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
3525 	}
3526 /*
3527 * Save the ac97 volume registers as well as the current powerdown state.
3528 * Now, mute the all the outputs (master, headphone, and mono), as well
3529 * as the PCM volume, in preparation for powering down the entire part.
3530 	card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev,
3531 			(u8)BA0_AC97_MASTER_VOLUME);
3532 	card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev,
3533 			(u8)BA0_AC97_HEADPHONE_VOLUME);
3534 	card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev,
3535 			(u8)BA0_AC97_MASTER_VOLUME_MONO);
3536 	card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev,
3537 			(u8)BA0_AC97_PCM_OUT_VOLUME);
3538 */
3539 /*
3540 * mute the outputs
3541 */
3542 	cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
3543 	cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
3544 	cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
3545 	cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
3546 
3547 /*
3548 * save the registers that cause pops
3549 */
3550 	card->pm.u32AC97_powerdown = (u32)cs_ac97_get(dev, (u8)AC97_POWER_CONTROL);
3551 	card->pm.u32AC97_general_purpose = (u32)cs_ac97_get(dev, (u8)BA0_AC97_GENERAL_PURPOSE);
3552 /*
3553 * And power down everything on the AC97 codec.
3554 * well, for now, only power down the DAC/ADC and MIXER VREFON components.
3555 * trouble with removing VREF.
3556 */
3557 	if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
3558 			CS_POWER_MIXVON, CS_TRUE )) )
3559 	{
3560 		CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
3561 			"cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp) );
3562 	}
3563 
3564 	CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n"));
3565 }
3566 
3567 /****************************************************************************
3568 *
3569 *  Resume - power up the part and restore its registers..
3570 *
3571 ****************************************************************************/
cs46xx_ac97_resume(struct cs_card * card)3572 void cs46xx_ac97_resume(struct cs_card *card)
3573 {
3574 	int Count,i;
3575 	struct ac97_codec *dev=card->ac97_codec[0];
3576 
3577 	CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()+\n"));
3578 
3579 /*
3580 * First, we restore the state of the general purpose register.  This
3581 * contains the mic select (mic1 or mic2) and if we restore this after
3582 * we restore the mic volume/boost state and mic2 was selected at
3583 * suspend time, we will end up with a brief period of time where mic1
3584 * is selected with the volume/boost settings for mic2, causing
3585 * acoustic feedback.  So we restore the general purpose register
3586 * first, thereby getting the correct mic selected before we restore
3587 * the mic volume/boost.
3588 */
3589 	cs_ac97_set(dev, (u8)BA0_AC97_GENERAL_PURPOSE,
3590 		(u16)card->pm.u32AC97_general_purpose);
3591 /*
3592 * Now, while the outputs are still muted, restore the state of power
3593 * on the AC97 part.
3594 */
3595 	cs_ac97_set(dev, (u8)BA0_AC97_POWERDOWN, (u16)card->pm.u32AC97_powerdown);
3596 	mdelay(5 * cs_laptop_wait);
3597 /*
3598 * Restore just the first set of registers, from register number
3599 * 0x02 to the register number that ulHighestRegToRestore specifies.
3600 */
3601 	for(	Count = 0x2, i=0;
3602 		(Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
3603 			&& (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
3604 		Count += 2, i++)
3605 	{
3606 		cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]);
3607 	}
3608 
3609 	/* Check if we have to init the amplifier */
3610 	if(card->amp_init)
3611 		card->amp_init(card);
3612 
3613 	CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-\n"));
3614 }
3615 
3616 
cs46xx_restart_part(struct cs_card * card)3617 static int cs46xx_restart_part(struct cs_card *card)
3618 {
3619 	struct dmabuf *dmabuf;
3620 	CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3621 		printk( "cs46xx: cs46xx_restart_part()+\n"));
3622 	if(card->states[1])
3623 	{
3624 		dmabuf = &card->states[1]->dmabuf;
3625 		dmabuf->ready = 0;
3626 		resync_dma_ptrs(card->states[1]);
3627 		cs_set_divisor(dmabuf);
3628 		if(__prog_dmabuf(card->states[1]))
3629 		{
3630 			CS_DBGOUT(CS_PM | CS_ERROR, 1,
3631 				printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n"));
3632 			return -1;
3633 		}
3634 		cs_set_dac_rate(card->states[1], dmabuf->rate);
3635 	}
3636 	if(card->states[0])
3637 	{
3638 		dmabuf = &card->states[0]->dmabuf;
3639 		dmabuf->ready = 0;
3640 		resync_dma_ptrs(card->states[0]);
3641 		cs_set_divisor(dmabuf);
3642 		if(__prog_dmabuf(card->states[0]))
3643 		{
3644 			CS_DBGOUT(CS_PM | CS_ERROR, 1,
3645 				printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n"));
3646 			return -1;
3647 		}
3648 		cs_set_adc_rate(card->states[0], dmabuf->rate);
3649 	}
3650 	card->pm.flags |= CS46XX_PM_RESUMED;
3651 	if(card->states[0])
3652 		start_adc(card->states[0]);
3653 	if(card->states[1])
3654 		start_dac(card->states[1]);
3655 
3656 	card->pm.flags |= CS46XX_PM_IDLE;
3657 	card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED
3658 			| CS46XX_PM_RESUMING | CS46XX_PM_RESUMED);
3659 	if(card->states[0])
3660 		wake_up(&card->states[0]->dmabuf.wait);
3661 	if(card->states[1])
3662 		wake_up(&card->states[1]->dmabuf.wait);
3663 
3664 	CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3665 		printk( "cs46xx: cs46xx_restart_part()-\n"));
3666 	return 0;
3667 }
3668 
3669 
3670 static void cs461x_reset(struct cs_card *card);
3671 static void cs461x_proc_stop(struct cs_card *card);
cs46xx_suspend(struct cs_card * card,u32 state)3672 static int cs46xx_suspend(struct cs_card *card, u32 state)
3673 {
3674 	unsigned int tmp;
3675 	CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3676 		printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=0x%x\n",
3677 			(unsigned)card->pm.flags,(unsigned)card));
3678 /*
3679 * check the current state, only suspend if IDLE
3680 */
3681 	if(!(card->pm.flags & CS46XX_PM_IDLE))
3682 	{
3683 		CS_DBGOUT(CS_PM | CS_ERROR, 2,
3684 			printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n"));
3685 		return 1;
3686 	}
3687 	card->pm.flags &= ~CS46XX_PM_IDLE;
3688 	card->pm.flags |= CS46XX_PM_SUSPENDING;
3689 
3690 	card->active_ctrl(card,1);
3691 
3692 	tmp = cs461x_peek(card, BA1_PFIE);
3693 	tmp &= ~0x0000f03f;
3694 	tmp |=  0x00000010;
3695 	cs461x_poke(card, BA1_PFIE, tmp);	/* playback interrupt disable */
3696 
3697 	tmp = cs461x_peek(card, BA1_CIE);
3698 	tmp &= ~0x0000003f;
3699 	tmp |=  0x00000011;
3700 	cs461x_poke(card, BA1_CIE, tmp);	/* capture interrupt disable */
3701 
3702 	/*
3703          *  Stop playback DMA.
3704 	 */
3705 	tmp = cs461x_peek(card, BA1_PCTL);
3706 	cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
3707 
3708 	/*
3709          *  Stop capture DMA.
3710 	 */
3711 	tmp = cs461x_peek(card, BA1_CCTL);
3712 	cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
3713 
3714 	if(card->states[1])
3715 	{
3716 		card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr;
3717 		card->pm.dmabuf_count_play = card->states[1]->dmabuf.count;
3718 	}
3719 	if(card->states[0])
3720 	{
3721 		card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr;
3722 		card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count;
3723 	}
3724 
3725 	cs46xx_ac97_suspend(card);
3726 
3727 	/*
3728          *  Reset the processor.
3729          */
3730 	cs461x_reset(card);
3731 
3732 	cs461x_proc_stop(card);
3733 
3734 	/*
3735 	 *  Power down the DAC and ADC.  For now leave the other areas on.
3736 	 */
3737 	cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x0300);
3738 
3739 	/*
3740 	 *  Power down the PLL.
3741 	 */
3742 	cs461x_pokeBA0(card, BA0_CLKCR1, 0);
3743 
3744 	/*
3745 	 *  Turn off the Processor by turning off the software clock enable flag in
3746 	 *  the clock control register.
3747 	 */
3748 	tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
3749 	cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
3750 
3751 	card->active_ctrl(card,-1);
3752 
3753 	card->pm.flags &= ~CS46XX_PM_SUSPENDING;
3754 	card->pm.flags |= CS46XX_PM_SUSPENDED;
3755 
3756 	printpm(card);
3757 
3758 	CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3759 		printk("cs46xx: cs46xx_suspend()- flags=0x%x\n",
3760 			(unsigned)card->pm.flags));
3761 	return 0;
3762 }
3763 
cs46xx_resume(struct cs_card * card)3764 static int cs46xx_resume(struct cs_card *card)
3765 {
3766 	int i;
3767 
3768 	CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
3769 		printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n",
3770 			(unsigned)card->pm.flags));
3771 	if(!(card->pm.flags & CS46XX_PM_SUSPENDED))
3772 	{
3773 		CS_DBGOUT(CS_PM | CS_ERROR, 2,
3774 			printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n"));
3775 		return 1;
3776 	}
3777 	card->pm.flags |= CS46XX_PM_RESUMING;
3778 	card->pm.flags &= ~CS46XX_PM_SUSPENDED;
3779 	printpm(card);
3780 	card->active_ctrl(card, 1);
3781 
3782 	for(i=0;i<5;i++)
3783 	{
3784 		if (cs_hardware_init(card) != 0)
3785 		{
3786 			CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3787 				"cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n"));
3788 			mdelay(10 * cs_laptop_wait);
3789 			cs461x_reset(card);
3790 			continue;
3791 		}
3792 		break;
3793 	}
3794 	if(i>=4)
3795 	{
3796 		CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
3797 			"cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i));
3798 		return 0;
3799 	}
3800 
3801 	if(cs46xx_restart_part(card))
3802 	{
3803 		CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
3804 			"cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n"));
3805 	}
3806 
3807 	card->active_ctrl(card, -1);
3808 
3809 	CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_resume()- flags=0x%x\n",
3810 		(unsigned)card->pm.flags));
3811 	return 0;
3812 }
3813 
3814 static /*const*/ struct file_operations cs461x_fops = {
3815 	CS_OWNER	CS_THIS_MODULE
3816 	llseek:		no_llseek,
3817 	read:		cs_read,
3818 	write:		cs_write,
3819 	poll:		cs_poll,
3820 	ioctl:		cs_ioctl,
3821 	mmap:		cs_mmap,
3822 	open:		cs_open,
3823 	release:	cs_release,
3824 };
3825 
3826 /* Write AC97 codec registers */
3827 
3828 
_cs_ac97_get(struct ac97_codec * dev,u8 reg)3829 static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg)
3830 {
3831 	struct cs_card *card = dev->private_data;
3832 	int count,loopcnt;
3833 	unsigned int tmp;
3834 	u16 ret;
3835 
3836 	/*
3837 	 *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3838 	 *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
3839 	 *  3. Write ACCTL = Control Register = 460h for initiating the write
3840 	 *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
3841 	 *  5. if DCV not cleared, break and return error
3842 	 *  6. Read ACSTS = Status Register = 464h, check VSTS bit
3843 	 */
3844 
3845 	cs461x_peekBA0(card, BA0_ACSDA);
3846 
3847 	/*
3848 	 *  Setup the AC97 control registers on the CS461x to send the
3849 	 *  appropriate command to the AC97 to perform the read.
3850 	 *  ACCAD = Command Address Register = 46Ch
3851 	 *  ACCDA = Command Data Register = 470h
3852 	 *  ACCTL = Control Register = 460h
3853 	 *  set DCV - will clear when process completed
3854 	 *  set CRW - Read command
3855 	 *  set VFRM - valid frame enabled
3856 	 *  set ESYN - ASYNC generation enabled
3857 	 *  set RSTN - ARST# inactive, AC97 codec not reset
3858 	 */
3859 
3860 	cs461x_pokeBA0(card, BA0_ACCAD, reg);
3861 	cs461x_pokeBA0(card, BA0_ACCDA, 0);
3862 	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
3863 					     ACCTL_VFRM | ACCTL_ESYN |
3864 					     ACCTL_RSTN);
3865 
3866 
3867 	/*
3868 	 *  Wait for the read to occur.
3869 	 */
3870 	if(!(card->pm.flags & CS46XX_PM_IDLE))
3871 		loopcnt = 2000;
3872 	else
3873 		loopcnt = 500 * cs_laptop_wait;
3874  	loopcnt *= cs_laptop_wait;
3875 	for (count = 0; count < loopcnt; count++) {
3876 		/*
3877 		 *  First, we want to wait for a short time.
3878 	 	 */
3879 		udelay(10 * cs_laptop_wait);
3880 		/*
3881 		 *  Now, check to see if the read has completed.
3882 		 *  ACCTL = 460h, DCV should be reset by now and 460h = 17h
3883 		 */
3884 		if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
3885 			break;
3886 	}
3887 
3888 	/*
3889 	 *  Make sure the read completed.
3890 	 */
3891 	if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
3892 		CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
3893 			"cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffff\n", reg));
3894 		return 0xffff;
3895 	}
3896 
3897 	/*
3898 	 *  Wait for the valid status bit to go active.
3899 	 */
3900 
3901 	if(!(card->pm.flags & CS46XX_PM_IDLE))
3902 		loopcnt = 2000;
3903 	else
3904 		loopcnt = 1000;
3905  	loopcnt *= cs_laptop_wait;
3906 	for (count = 0; count < loopcnt; count++) {
3907 		/*
3908 		 *  Read the AC97 status register.
3909 		 *  ACSTS = Status Register = 464h
3910 		 *  VSTS - Valid Status
3911 		 */
3912 		if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
3913 			break;
3914 		udelay(10 * cs_laptop_wait);
3915 	}
3916 
3917 	/*
3918 	 *  Make sure we got valid status.
3919 	 */
3920 	if (!( (tmp=cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) {
3921 		CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING
3922 			"cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n",
3923 				reg, tmp));
3924 		return 0xffff;
3925 	}
3926 
3927 	/*
3928 	 *  Read the data returned from the AC97 register.
3929 	 *  ACSDA = Status Data Register = 474h
3930 	 */
3931 	CS_DBGOUT(CS_FUNCTION, 9, printk(KERN_INFO
3932 		"cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n",
3933 			reg, cs461x_peekBA0(card, BA0_ACSDA),
3934 			cs461x_peekBA0(card, BA0_ACCAD)));
3935 	ret = cs461x_peekBA0(card, BA0_ACSDA);
3936 	return ret;
3937 }
3938 
cs_ac97_get(struct ac97_codec * dev,u8 reg)3939 static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
3940 {
3941 	u16 ret;
3942 	struct cs_card *card = dev->private_data;
3943 
3944 	spin_lock(&card->ac97_lock);
3945 	ret = _cs_ac97_get(dev, reg);
3946 	spin_unlock(&card->ac97_lock);
3947 	return ret;
3948 }
3949 
cs_ac97_set(struct ac97_codec * dev,u8 reg,u16 val)3950 static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
3951 {
3952 	struct cs_card *card = dev->private_data;
3953 	int count;
3954 	int val2 = 0;
3955 
3956 	spin_lock(&card->ac97_lock);
3957 
3958 	if(reg == AC97_CD_VOL)
3959 	{
3960 		val2 = _cs_ac97_get(dev, AC97_CD_VOL);
3961 	}
3962 
3963 
3964 	/*
3965 	 *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
3966 	 *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
3967 	 *  3. Write ACCTL = Control Register = 460h for initiating the write
3968 	 *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
3969 	 *  5. if DCV not cleared, break and return error
3970 	 */
3971 
3972 	/*
3973 	 *  Setup the AC97 control registers on the CS461x to send the
3974 	 *  appropriate command to the AC97 to perform the read.
3975 	 *  ACCAD = Command Address Register = 46Ch
3976 	 *  ACCDA = Command Data Register = 470h
3977 	 *  ACCTL = Control Register = 460h
3978 	 *  set DCV - will clear when process completed
3979 	 *  reset CRW - Write command
3980 	 *  set VFRM - valid frame enabled
3981 	 *  set ESYN - ASYNC generation enabled
3982 	 *  set RSTN - ARST# inactive, AC97 codec not reset
3983          */
3984 	cs461x_pokeBA0(card, BA0_ACCAD, reg);
3985 	cs461x_pokeBA0(card, BA0_ACCDA, val);
3986 	cs461x_peekBA0(card, BA0_ACCTL);
3987 	cs461x_pokeBA0(card, BA0_ACCTL, 0 | ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
3988 	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
3989 				             ACCTL_ESYN | ACCTL_RSTN);
3990 	for (count = 0; count < 1000; count++) {
3991 		/*
3992 		 *  First, we want to wait for a short time.
3993 		 */
3994 		udelay(10 * cs_laptop_wait);
3995 		/*
3996 		 *  Now, check to see if the write has completed.
3997 		 *  ACCTL = 460h, DCV should be reset by now and 460h = 07h
3998 		 */
3999 		if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
4000 			break;
4001 	}
4002 	/*
4003 	 *  Make sure the write completed.
4004 	 */
4005 	if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV)
4006 	{
4007 		CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4008 			"cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val));
4009 	}
4010 
4011 	spin_unlock(&card->ac97_lock);
4012 
4013 	/*
4014 	 *	Adjust power if the mixer is selected/deselected according
4015 	 *	to the CD.
4016 	 *
4017 	 *	IF the CD is a valid input source (mixer or direct) AND
4018 	 *		the CD is not muted THEN power is needed
4019 	 *
4020 	 *	We do two things. When record select changes the input to
4021 	 *	add/remove the CD we adjust the power count if the CD is
4022 	 *	unmuted.
4023 	 *
4024 	 *	When the CD mute changes we adjust the power level if the
4025 	 *	CD was a valid input.
4026 	 *
4027 	 *      We also check for CD volume != 0, as the CD mute isn't
4028 	 *      normally tweaked from userspace.
4029 	 */
4030 
4031 	/* CD mute change ? */
4032 
4033 	if(reg==AC97_CD_VOL)
4034 	{
4035 		/* Mute bit change ? */
4036 		if((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val))
4037 		{
4038 			/* This is a hack but its cleaner than the alternatives.
4039 			   Right now card->ac97_codec[0] might be NULL as we are
4040 			   still doing codec setup. This does an early assignment
4041 			   to avoid the problem if it occurs */
4042 
4043 			if(card->ac97_codec[0]==NULL)
4044 				card->ac97_codec[0]=dev;
4045 
4046 			/* Mute on */
4047 			if(val&0x8000 || val == 0x1f1f)
4048 				card->amplifier_ctrl(card, -1);
4049 			else /* Mute off power on */
4050 			{
4051 				if(card->amp_init)
4052 					card->amp_init(card);
4053 				card->amplifier_ctrl(card, 1);
4054 			}
4055 		}
4056 	}
4057 }
4058 
4059 
4060 /* OSS /dev/mixer file operation methods */
4061 
cs_open_mixdev(struct inode * inode,struct file * file)4062 static int cs_open_mixdev(struct inode *inode, struct file *file)
4063 {
4064 	int i=0;
4065 	int minor = MINOR(inode->i_rdev);
4066 	struct cs_card *card=NULL;
4067 	struct list_head *entry;
4068 	unsigned int tmp;
4069 
4070 	CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4071 		  printk(KERN_INFO "cs46xx: cs_open_mixdev()+\n"));
4072 
4073 	list_for_each(entry, &cs46xx_devs)
4074 	{
4075 		card = list_entry(entry, struct cs_card, list);
4076 		for (i = 0; i < NR_AC97; i++)
4077 			if (card->ac97_codec[i] != NULL &&
4078 			    card->ac97_codec[i]->dev_mixer == minor)
4079 				goto match;
4080 	}
4081 	if (!card)
4082 	{
4083 		CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4084 			printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4085 		return -ENODEV;
4086 	}
4087  match:
4088 	if(!card->ac97_codec[i])
4089 		return -ENODEV;
4090 	file->private_data = card->ac97_codec[i];
4091 
4092 	card->active_ctrl(card,1);
4093 	if(!CS_IN_USE(&card->mixer_use_cnt))
4094 	{
4095 		if( (tmp = cs46xx_powerup(card, CS_POWER_MIXVON )) )
4096 		{
4097 			CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4098 				"cs46xx: cs_open_mixdev() powerup failure (0x%x)\n",tmp) );
4099 			return -EIO;
4100 		}
4101 	}
4102 	card->amplifier_ctrl(card, 1);
4103 	CS_INC_USE_COUNT(&card->mixer_use_cnt);
4104 	MOD_INC_USE_COUNT; /* for 2.2 */
4105 	CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
4106 		  printk(KERN_INFO "cs46xx: cs_open_mixdev()- 0\n"));
4107 	return 0;
4108 }
4109 
cs_release_mixdev(struct inode * inode,struct file * file)4110 static int cs_release_mixdev(struct inode *inode, struct file *file)
4111 {
4112 	int minor = MINOR(inode->i_rdev);
4113 	struct cs_card *card=NULL;
4114 	struct list_head *entry;
4115 	int i;
4116 	unsigned int tmp;
4117 
4118 	CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4119 		  printk(KERN_INFO "cs46xx: cs_release_mixdev()+\n"));
4120 	list_for_each(entry, &cs46xx_devs)
4121 	{
4122 		card = list_entry(entry, struct cs_card, list);
4123 		for (i = 0; i < NR_AC97; i++)
4124 			if (card->ac97_codec[i] != NULL &&
4125 			    card->ac97_codec[i]->dev_mixer == minor)
4126 				goto match;
4127 	}
4128 	if (!card)
4129 	{
4130 		CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
4131 			printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
4132 		return -ENODEV;
4133 	}
4134 match:
4135 	MOD_DEC_USE_COUNT; /* for 2.2 */
4136 	if(!CS_DEC_AND_TEST(&card->mixer_use_cnt))
4137 	{
4138 		CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4139 			  printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n"));
4140 		card->active_ctrl(card, -1);
4141 		card->amplifier_ctrl(card, -1);
4142 		return 0;
4143 	}
4144 /*
4145 * ok, no outstanding mixer opens, so powerdown.
4146 */
4147 	if( (tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE )) )
4148 	{
4149 		CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
4150 			"cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n",tmp) );
4151 		card->active_ctrl(card, -1);
4152 		card->amplifier_ctrl(card, -1);
4153 		return -EIO;
4154 	}
4155 	card->active_ctrl(card, -1);
4156 	card->amplifier_ctrl(card, -1);
4157 	CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
4158 		  printk(KERN_INFO "cs46xx: cs_release_mixdev()- 0\n"));
4159 	return 0;
4160 }
4161 
4162 void __exit cs46xx_cleanup_module(void);
cs_ioctl_mixdev(struct inode * inode,struct file * file,unsigned int cmd,unsigned long arg)4163 static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4164 				unsigned long arg)
4165 {
4166 	struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
4167 	struct cs_card *card=NULL;
4168 	struct list_head *entry;
4169 
4170 #if CSDEBUG_INTERFACE
4171         int val;
4172 
4173 	if( 	(cmd == SOUND_MIXER_CS_GETDBGMASK) ||
4174 		(cmd == SOUND_MIXER_CS_SETDBGMASK) ||
4175 		(cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
4176 		(cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
4177 		(cmd == SOUND_MIXER_CS_APM))
4178 	{
4179 	    switch(cmd)
4180 	    {
4181 
4182 		case SOUND_MIXER_CS_GETDBGMASK:
4183 			return put_user(cs_debugmask, (unsigned long *)arg);
4184 
4185 		case SOUND_MIXER_CS_GETDBGLEVEL:
4186 			return put_user(cs_debuglevel, (unsigned long *)arg);
4187 
4188 		case SOUND_MIXER_CS_SETDBGMASK:
4189 			if (get_user(val, (unsigned long *)arg))
4190 				return -EFAULT;
4191 			cs_debugmask = val;
4192 			return 0;
4193 
4194 		case SOUND_MIXER_CS_SETDBGLEVEL:
4195 			if (get_user(val, (unsigned long *)arg))
4196 				return -EFAULT;
4197 			cs_debuglevel = val;
4198 			return 0;
4199 
4200 		case SOUND_MIXER_CS_APM:
4201 			if (get_user(val, (unsigned long *) arg))
4202 				return -EFAULT;
4203 			if(val == CS_IOCTL_CMD_SUSPEND)
4204 			{
4205 				list_for_each(entry, &cs46xx_devs)
4206 				{
4207 					card = list_entry(entry, struct cs_card, list);
4208 					cs46xx_suspend(card, 0);
4209 				}
4210 
4211 			}
4212 			else if(val == CS_IOCTL_CMD_RESUME)
4213 			{
4214 				list_for_each(entry, &cs46xx_devs)
4215 				{
4216 					card = list_entry(entry, struct cs_card, list);
4217 					cs46xx_resume(card);
4218 				}
4219 			}
4220 			else
4221 			{
4222 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4223 				    "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n",
4224 					val));
4225 			}
4226 			return 0;
4227 
4228 		default:
4229 			CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
4230 				"cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n") );
4231 			return 0;
4232 	    }
4233 	}
4234 #endif
4235 	return codec->mixer_ioctl(codec, cmd, arg);
4236 }
4237 
4238 static /*const*/ struct file_operations cs_mixer_fops = {
4239 	CS_OWNER	CS_THIS_MODULE
4240 	llseek:		no_llseek,
4241 	ioctl:		cs_ioctl_mixdev,
4242 	open:		cs_open_mixdev,
4243 	release:	cs_release_mixdev,
4244 };
4245 
4246 /* AC97 codec initialisation. */
cs_ac97_init(struct cs_card * card)4247 static int __init cs_ac97_init(struct cs_card *card)
4248 {
4249 	int num_ac97 = 0;
4250 	int ready_2nd = 0;
4251 	struct ac97_codec *codec;
4252 	u16 eid;
4253 
4254 	CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4255 		"cs46xx: cs_ac97_init()+\n") );
4256 
4257 	for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4258 		if ((codec = ac97_alloc_codec()) == NULL)
4259 			return -ENOMEM;
4260 
4261 		/* initialize some basic codec information, other fields will be filled
4262 		   in ac97_probe_codec */
4263 		codec->private_data = card;
4264 		codec->id = num_ac97;
4265 
4266 		codec->codec_read = cs_ac97_get;
4267 		codec->codec_write = cs_ac97_set;
4268 
4269 		if (ac97_probe_codec(codec) == 0)
4270 		{
4271 			CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4272 				"cs46xx: cs_ac97_init()- codec number %d not found\n",
4273 					num_ac97) );
4274 			card->ac97_codec[num_ac97] = 0;
4275 			break;
4276 		}
4277 		CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4278 			"cs46xx: cs_ac97_init() found codec %d\n",num_ac97) );
4279 
4280 		eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
4281 
4282 		if(eid==0xFFFF)
4283 		{
4284 			printk(KERN_WARNING "cs46xx: codec %d not present\n",num_ac97);
4285 			ac97_release_codec(codec);
4286 			break;
4287 		}
4288 
4289 		card->ac97_features = eid;
4290 
4291 		if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
4292 			printk(KERN_ERR "cs46xx: couldn't register mixer!\n");
4293 			ac97_release_codec(codec);
4294 			break;
4295 		}
4296 		card->ac97_codec[num_ac97] = codec;
4297 
4298 		CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4299 			"cs46xx: cs_ac97_init() ac97_codec[%d] set to 0x%x\n",
4300 				(unsigned int)num_ac97,
4301 				(unsigned int)codec));
4302 		/* if there is no secondary codec at all, don't probe any more */
4303 		if (!ready_2nd)
4304 		{
4305 			num_ac97 += 1;
4306 			break;
4307 		}
4308 	}
4309 	CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4310 		"cs46xx: cs_ac97_init()- %d\n", (unsigned int)num_ac97));
4311 	return num_ac97;
4312 }
4313 
4314 /*
4315  * load the static image into the DSP
4316  */
4317 #include "cs461x_image.h"
cs461x_download_image(struct cs_card * card)4318 static void cs461x_download_image(struct cs_card *card)
4319 {
4320     unsigned i, j, temp1, temp2, offset, count;
4321     unsigned char *pBA1 = ioremap(card->ba1_addr, 0x40000);
4322     for( i=0; i < CLEAR__COUNT; i++)
4323     {
4324         offset = ClrStat[i].BA1__DestByteOffset;
4325         count  = ClrStat[i].BA1__SourceSize;
4326         for(  temp1 = offset; temp1<(offset+count); temp1+=4 )
4327               writel(0, pBA1+temp1);
4328     }
4329 
4330     for(i=0; i<FILL__COUNT; i++)
4331     {
4332         temp2 = FillStat[i].Offset;
4333         for(j=0; j<(FillStat[i].Size)/4; j++)
4334         {
4335             temp1 = (FillStat[i]).pFill[j];
4336             writel(temp1, pBA1+temp2+j*4);
4337         }
4338     }
4339     iounmap(pBA1);
4340 }
4341 
4342 
4343 /*
4344  *  Chip reset
4345  */
4346 
cs461x_reset(struct cs_card * card)4347 static void cs461x_reset(struct cs_card *card)
4348 {
4349 	int idx;
4350 
4351 	/*
4352 	 *  Write the reset bit of the SP control register.
4353 	 */
4354 	cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
4355 
4356 	/*
4357 	 *  Write the control register.
4358 	 */
4359 	cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
4360 
4361 	/*
4362 	 *  Clear the trap registers.
4363 	 */
4364 	for (idx = 0; idx < 8; idx++) {
4365 		cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
4366 		cs461x_poke(card, BA1_TWPR, 0xFFFF);
4367 	}
4368 	cs461x_poke(card, BA1_DREG, 0);
4369 
4370 	/*
4371 	 *  Set the frame timer to reflect the number of cycles per frame.
4372 	 */
4373 	cs461x_poke(card, BA1_FRMT, 0xadf);
4374 }
4375 
cs461x_clear_serial_FIFOs(struct cs_card * card,int type)4376 static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type)
4377 {
4378 	int idx, loop, startfifo=0, endfifo=0, powerdown1 = 0;
4379 	unsigned int tmp;
4380 
4381 	/*
4382 	 *  See if the devices are powered down.  If so, we must power them up first
4383 	 *  or they will not respond.
4384 	 */
4385 	if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
4386 		cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
4387 		powerdown1 = 1;
4388 	}
4389 
4390 	/*
4391 	 *  We want to clear out the serial port FIFOs so we don't end up playing
4392 	 *  whatever random garbage happens to be in them.  We fill the sample FIFOS
4393 	 *  with zero (silence).
4394          */
4395 	cs461x_pokeBA0(card, BA0_SERBWP, 0);
4396 
4397 	/*
4398 	* Check for which FIFO locations to clear, if we are currently
4399 	* playing or capturing then we don't want to put in 128 bytes of
4400 	* "noise".
4401 	 */
4402 	if(type & CS_TYPE_DAC)
4403 	{
4404 		startfifo = 128;
4405 		endfifo = 256;
4406 	}
4407 	if(type & CS_TYPE_ADC)
4408 	{
4409 		startfifo = 0;
4410 		if(!endfifo)
4411 			endfifo = 128;
4412 	}
4413 	/*
4414 	 *  Fill sample FIFO locations (256 locations total).
4415 	 */
4416 	for (idx = startfifo; idx < endfifo; idx++) {
4417 		/*
4418 		 *  Make sure the previous FIFO write operation has completed.
4419 		 */
4420 		for (loop = 0; loop < 5; loop++) {
4421 			udelay(50);
4422 			if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
4423 				break;
4424 		}
4425 		if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
4426 			if (powerdown1)
4427 				cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4428 		}
4429 		/*
4430 		 *  Write the serial port FIFO index.
4431 		 */
4432 		cs461x_pokeBA0(card, BA0_SERBAD, idx);
4433 		/*
4434 		 *  Tell the serial port to load the new value into the FIFO location.
4435 		 */
4436 		cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
4437 	}
4438 	/*
4439 	 *  Now, if we powered up the devices, then power them back down again.
4440 	 *  This is kinda ugly, but should never happen.
4441 	 */
4442 	if (powerdown1)
4443 		cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
4444 }
4445 
4446 
cs461x_powerdown(struct cs_card * card,unsigned int type,int suspendflag)4447 static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag)
4448 {
4449 	int count;
4450 	unsigned int tmp=0,muted=0;
4451 
4452 	CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4453 		"cs46xx: cs461x_powerdown()+ type=0x%x\n",type));
4454 	if(!cs_powerdown && !suspendflag)
4455 	{
4456 		CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4457 			"cs46xx: cs461x_powerdown() DISABLED exiting\n"));
4458 		return 0;
4459 	}
4460 	tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4461 	CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4462 		"cs46xx: cs461x_powerdown() powerdown reg=0x%x\n",tmp));
4463 /*
4464 * if powering down only the VREF, and not powering down the DAC/ADC,
4465 * then do not power down the VREF, UNLESS both the DAC and ADC are not
4466 * currently powered down.  If powering down DAC and ADC, then
4467 * it is possible to power down the VREF (ON).
4468 */
4469 	if (    ((type & CS_POWER_MIXVON) &&
4470 		 (!(type & CS_POWER_ADC) || (!(type & CS_POWER_DAC))) )
4471 	      &&
4472 		((tmp & CS_AC97_POWER_CONTROL_ADC_ON) ||
4473 		 (tmp & CS_AC97_POWER_CONTROL_DAC_ON) ) )
4474 	{
4475 		CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4476 			"cs46xx: cs461x_powerdown()- 0  unable to powerdown. tmp=0x%x\n",tmp));
4477 		return 0;
4478 	}
4479 /*
4480 * for now, always keep power to the mixer block.
4481 * not sure why it's a problem but it seems to be if we power off.
4482 */
4483 	type &= ~CS_POWER_MIXVON;
4484 	type &= ~CS_POWER_MIXVOFF;
4485 
4486 	/*
4487 	 *  Power down indicated areas.
4488 	 */
4489 	if(type & CS_POWER_MIXVOFF)
4490 	{
4491 
4492 		CS_DBGOUT(CS_FUNCTION, 4,
4493 			printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVOFF\n"));
4494 		/*
4495 		 *  Power down the MIXER (VREF ON) on the AC97 card.
4496 		 */
4497 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4498 		if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4499 		{
4500 			if(!muted)
4501 			{
4502 				cs_mute(card, CS_TRUE);
4503 				muted=1;
4504 			}
4505 			tmp |= CS_AC97_POWER_CONTROL_MIXVOFF;
4506 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4507 			/*
4508 			 *  Now, we wait until we sample a ready state.
4509 			 */
4510 			for (count = 0; count < 32; count++) {
4511 				/*
4512 				 *  First, lets wait a short while to let things settle out a
4513 				 *  bit, and to prevent retrying the read too quickly.
4514 				 */
4515 				udelay(500);
4516 
4517 				/*
4518 				 *  Read the current state of the power control register.
4519 				 */
4520 				if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4521 					CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4522 					break;
4523 			}
4524 
4525 			/*
4526 			 *  Check the status..
4527 			 */
4528 			if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4529 				CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4530 			{
4531 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4532 					"cs46xx: powerdown MIXVOFF failed\n"));
4533 				return 1;
4534 			}
4535 		}
4536 	}
4537 	if(type & CS_POWER_MIXVON)
4538 	{
4539 
4540 		CS_DBGOUT(CS_FUNCTION, 4,
4541 			printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVON\n"));
4542 		/*
4543 		 *  Power down the MIXER (VREF ON) on the AC97 card.
4544 		 */
4545 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4546 		if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)
4547 		{
4548 			if(!muted)
4549 			{
4550 				cs_mute(card, CS_TRUE);
4551 				muted=1;
4552 			}
4553 			tmp |= CS_AC97_POWER_CONTROL_MIXVON;
4554 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4555 			/*
4556 			 *  Now, we wait until we sample a ready state.
4557 			 */
4558 			for (count = 0; count < 32; count++) {
4559 				/*
4560 				 *  First, lets wait a short while to let things settle out a
4561 				 *  bit, and to prevent retrying the read too quickly.
4562 				 */
4563 				udelay(500);
4564 
4565 				/*
4566 				 *  Read the current state of the power control register.
4567 				 */
4568 				if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4569 					CS_AC97_POWER_CONTROL_MIXVON_ON))
4570 					break;
4571 			}
4572 
4573 			/*
4574 			 *  Check the status..
4575 			 */
4576 			if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4577 				CS_AC97_POWER_CONTROL_MIXVON_ON)
4578 			{
4579 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4580 					"cs46xx: powerdown MIXVON failed\n"));
4581 				return 1;
4582 			}
4583 		}
4584 	}
4585 	if(type & CS_POWER_ADC)
4586 	{
4587 		/*
4588 		 *  Power down the ADC on the AC97 card.
4589 		 */
4590 		CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADC\n"));
4591 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4592 		if (tmp & CS_AC97_POWER_CONTROL_ADC_ON)
4593 		{
4594 			if(!muted)
4595 			{
4596 				cs_mute(card, CS_TRUE);
4597 				muted=1;
4598 			}
4599 			tmp |= CS_AC97_POWER_CONTROL_ADC;
4600 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4601 
4602 			/*
4603 			 *  Now, we wait until we sample a ready state.
4604 			 */
4605 			for (count = 0; count < 32; count++) {
4606 				/*
4607 				 *  First, lets wait a short while to let things settle out a
4608 				 *  bit, and to prevent retrying the read too quickly.
4609 				 */
4610 				udelay(500);
4611 
4612 				/*
4613 				 *  Read the current state of the power control register.
4614 				 */
4615 				if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4616 					CS_AC97_POWER_CONTROL_ADC_ON))
4617 					break;
4618 			}
4619 
4620 			/*
4621 			 *  Check the status..
4622 			 */
4623 			if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4624 				CS_AC97_POWER_CONTROL_ADC_ON)
4625 			{
4626 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4627 					"cs46xx: powerdown ADC failed\n"));
4628 				return 1;
4629 			}
4630 		}
4631 	}
4632 	if(type & CS_POWER_DAC)
4633 	{
4634 		/*
4635 		 *  Power down the DAC on the AC97 card.
4636 		 */
4637 
4638 		CS_DBGOUT(CS_FUNCTION, 4,
4639 			printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DAC\n"));
4640 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4641 		if (tmp & CS_AC97_POWER_CONTROL_DAC_ON)
4642 		{
4643 			if(!muted)
4644 			{
4645 				cs_mute(card, CS_TRUE);
4646 				muted=1;
4647 			}
4648 			tmp |= CS_AC97_POWER_CONTROL_DAC;
4649 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4650 			/*
4651 			 *  Now, we wait until we sample a ready state.
4652 			 */
4653 			for (count = 0; count < 32; count++) {
4654 				/*
4655 				 *  First, lets wait a short while to let things settle out a
4656 				 *  bit, and to prevent retrying the read too quickly.
4657 				 */
4658 				udelay(500);
4659 
4660 				/*
4661 				 *  Read the current state of the power control register.
4662 				 */
4663 				if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4664 					CS_AC97_POWER_CONTROL_DAC_ON))
4665 					break;
4666 			}
4667 
4668 			/*
4669 			 *  Check the status..
4670 			 */
4671 			if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4672 				CS_AC97_POWER_CONTROL_DAC_ON)
4673 			{
4674 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4675 					"cs46xx: powerdown DAC failed\n"));
4676 				return 1;
4677 			}
4678 		}
4679 	}
4680 	tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4681 	if(muted)
4682 		cs_mute(card, CS_FALSE);
4683 	CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4684 		"cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp));
4685 	return 0;
4686 }
4687 
cs46xx_powerup(struct cs_card * card,unsigned int type)4688 static int cs46xx_powerup(struct cs_card *card, unsigned int type)
4689 {
4690 	int count;
4691 	unsigned int tmp=0,muted=0;
4692 
4693 	CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO
4694 		"cs46xx: cs46xx_powerup()+ type=0x%x\n",type));
4695 	/*
4696 	* check for VREF and powerup if need to.
4697 	*/
4698 	if(type & CS_POWER_MIXVON)
4699 		type |= CS_POWER_MIXVOFF;
4700 	if(type & (CS_POWER_DAC | CS_POWER_ADC))
4701 		type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF;
4702 
4703 	/*
4704 	 *  Power up indicated areas.
4705 	 */
4706 	if(type & CS_POWER_MIXVOFF)
4707 	{
4708 
4709 		CS_DBGOUT(CS_FUNCTION, 4,
4710 			printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFF\n"));
4711 		/*
4712 		 *  Power up the MIXER (VREF ON) on the AC97 card.
4713 		 */
4714 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4715 		if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4716 		{
4717 			if(!muted)
4718 			{
4719 				cs_mute(card, CS_TRUE);
4720 				muted=1;
4721 			}
4722 			tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF;
4723 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4724 			/*
4725 			 *  Now, we wait until we sample a ready state.
4726 			 */
4727 			for (count = 0; count < 32; count++) {
4728 				/*
4729 				 *  First, lets wait a short while to let things settle out a
4730 				 *  bit, and to prevent retrying the read too quickly.
4731 				 */
4732 				udelay(500);
4733 
4734 				/*
4735 				 *  Read the current state of the power control register.
4736 				 */
4737 				if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4738 					CS_AC97_POWER_CONTROL_MIXVOFF_ON)
4739 					break;
4740 			}
4741 
4742 			/*
4743 			 *  Check the status..
4744 			 */
4745 			if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4746 				CS_AC97_POWER_CONTROL_MIXVOFF_ON))
4747 			{
4748 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4749 					"cs46xx: powerup MIXVOFF failed\n"));
4750 				return 1;
4751 			}
4752 		}
4753 	}
4754 	if(type & CS_POWER_MIXVON)
4755 	{
4756 
4757 		CS_DBGOUT(CS_FUNCTION, 4,
4758 			printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVON\n"));
4759 		/*
4760 		 *  Power up the MIXER (VREF ON) on the AC97 card.
4761 		 */
4762 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4763 		if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON))
4764 		{
4765 			if(!muted)
4766 			{
4767 				cs_mute(card, CS_TRUE);
4768 				muted=1;
4769 			}
4770 			tmp &= ~CS_AC97_POWER_CONTROL_MIXVON;
4771 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4772 			/*
4773 			 *  Now, we wait until we sample a ready state.
4774 			 */
4775 			for (count = 0; count < 32; count++) {
4776 				/*
4777 				 *  First, lets wait a short while to let things settle out a
4778 				 *  bit, and to prevent retrying the read too quickly.
4779 				 */
4780 				udelay(500);
4781 
4782 				/*
4783 				 *  Read the current state of the power control register.
4784 				 */
4785 				if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4786 					CS_AC97_POWER_CONTROL_MIXVON_ON)
4787 					break;
4788 			}
4789 
4790 			/*
4791 			 *  Check the status..
4792 			 */
4793 			if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4794 				CS_AC97_POWER_CONTROL_MIXVON_ON))
4795 			{
4796 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4797 					"cs46xx: powerup MIXVON failed\n"));
4798 				return 1;
4799 			}
4800 		}
4801 	}
4802 	if(type & CS_POWER_ADC)
4803 	{
4804 		/*
4805 		 *  Power up the ADC on the AC97 card.
4806 		 */
4807 		CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADC\n"));
4808 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4809 		if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON))
4810 		{
4811 			if(!muted)
4812 			{
4813 				cs_mute(card, CS_TRUE);
4814 				muted=1;
4815 			}
4816 			tmp &= ~CS_AC97_POWER_CONTROL_ADC;
4817 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4818 
4819 			/*
4820 			 *  Now, we wait until we sample a ready state.
4821 			 */
4822 			for (count = 0; count < 32; count++) {
4823 				/*
4824 				 *  First, lets wait a short while to let things settle out a
4825 				 *  bit, and to prevent retrying the read too quickly.
4826 				 */
4827 				udelay(500);
4828 
4829 				/*
4830 				 *  Read the current state of the power control register.
4831 				 */
4832 				if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4833 					CS_AC97_POWER_CONTROL_ADC_ON)
4834 					break;
4835 			}
4836 
4837 			/*
4838 			 *  Check the status..
4839 			 */
4840 			if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4841 				CS_AC97_POWER_CONTROL_ADC_ON))
4842 			{
4843 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4844 					"cs46xx: powerup ADC failed\n"));
4845 				return 1;
4846 			}
4847 		}
4848 	}
4849 	if(type & CS_POWER_DAC)
4850 	{
4851 		/*
4852 		 *  Power up the DAC on the AC97 card.
4853 		 */
4854 
4855 		CS_DBGOUT(CS_FUNCTION, 4,
4856 			printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DAC\n"));
4857 		tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4858 		if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON))
4859 		{
4860 			if(!muted)
4861 			{
4862 				cs_mute(card, CS_TRUE);
4863 				muted=1;
4864 			}
4865 			tmp &= ~CS_AC97_POWER_CONTROL_DAC;
4866 			cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
4867 			/*
4868 			 *  Now, we wait until we sample a ready state.
4869 			 */
4870 			for (count = 0; count < 32; count++) {
4871 				/*
4872 				 *  First, lets wait a short while to let things settle out a
4873 				 *  bit, and to prevent retrying the read too quickly.
4874 				 */
4875 				udelay(500);
4876 
4877 				/*
4878 				 *  Read the current state of the power control register.
4879 				 */
4880 				if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4881 					CS_AC97_POWER_CONTROL_DAC_ON)
4882 					break;
4883 			}
4884 
4885 			/*
4886 			 *  Check the status..
4887 			 */
4888 			if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
4889 				CS_AC97_POWER_CONTROL_DAC_ON))
4890 			{
4891 				CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING
4892 					"cs46xx: powerup DAC failed\n"));
4893 				return 1;
4894 			}
4895 		}
4896 	}
4897 	tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
4898 	if(muted)
4899 		cs_mute(card, CS_FALSE);
4900 	CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
4901 		"cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp));
4902 	return 0;
4903 }
4904 
4905 
cs461x_proc_start(struct cs_card * card)4906 static void cs461x_proc_start(struct cs_card *card)
4907 {
4908 	int cnt;
4909 
4910 	/*
4911 	 *  Set the frame timer to reflect the number of cycles per frame.
4912 	 */
4913 	cs461x_poke(card, BA1_FRMT, 0xadf);
4914 	/*
4915 	 *  Turn on the run, run at frame, and DMA enable bits in the local copy of
4916 	 *  the SP control register.
4917 	 */
4918 	cs461x_poke(card, BA1_SPCR, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
4919 	/*
4920 	 *  Wait until the run at frame bit resets itself in the SP control
4921 	 *  register.
4922 	 */
4923 	for (cnt = 0; cnt < 25; cnt++) {
4924 		udelay(50);
4925 		if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
4926 			break;
4927 	}
4928 
4929 	if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
4930 		printk(KERN_WARNING "cs46xx: SPCR_RUNFR never reset\n");
4931 }
4932 
cs461x_proc_stop(struct cs_card * card)4933 static void cs461x_proc_stop(struct cs_card *card)
4934 {
4935 	/*
4936 	 *  Turn off the run, run at frame, and DMA enable bits in the local copy of
4937 	 *  the SP control register.
4938 	 */
4939 	cs461x_poke(card, BA1_SPCR, 0);
4940 }
4941 
cs_hardware_init(struct cs_card * card)4942 static int cs_hardware_init(struct cs_card *card)
4943 {
4944 	unsigned long end_time;
4945 	unsigned int tmp,count;
4946 
4947 	CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
4948 		"cs46xx: cs_hardware_init()+\n") );
4949 	/*
4950 	 *  First, blast the clock control register to zero so that the PLL starts
4951          *  out in a known state, and blast the master serial port control register
4952          *  to zero so that the serial ports also start out in a known state.
4953          */
4954         cs461x_pokeBA0(card, BA0_CLKCR1, 0);
4955         cs461x_pokeBA0(card, BA0_SERMC1, 0);
4956 
4957 	/*
4958 	 *  If we are in AC97 mode, then we must set the part to a host controlled
4959          *  AC-link.  Otherwise, we won't be able to bring up the link.
4960          */
4961         cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03);	/* 1.03 card */
4962         /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
4963 
4964         /*
4965          *  Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
4966          *  spec) and then drive it high.  This is done for non AC97 modes since
4967          *  there might be logic external to the CS461x that uses the ARST# line
4968          *  for a reset.
4969          */
4970         cs461x_pokeBA0(card, BA0_ACCTL, 1);
4971         udelay(50);
4972         cs461x_pokeBA0(card, BA0_ACCTL, 0);
4973         udelay(50);
4974         cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
4975 
4976 	/*
4977 	 *  The first thing we do here is to enable sync generation.  As soon
4978 	 *  as we start receiving bit clock, we'll start producing the SYNC
4979 	 *  signal.
4980 	 */
4981 	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
4982 
4983 	/*
4984 	 *  Now wait for a short while to allow the AC97 part to start
4985 	 *  generating bit clock (so we don't try to start the PLL without an
4986 	 *  input clock).
4987 	 */
4988 	mdelay(5 * cs_laptop_wait);		/* 1 should be enough ?? (and pigs might fly) */
4989 
4990 	/*
4991 	 *  Set the serial port timing configuration, so that
4992 	 *  the clock control circuit gets its clock from the correct place.
4993 	 */
4994 	cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
4995 
4996 	/*
4997 	* The part seems to not be ready for a while after a resume.
4998 	* so, if we are resuming, then wait for 700 mils.  Note that 600 mils
4999 	* is not enough for some platforms! tested on an IBM Thinkpads and
5000 	* reference cards.
5001 	*/
5002 	if(!(card->pm.flags & CS46XX_PM_IDLE))
5003 		mdelay(initdelay);
5004 	/*
5005 	 *  Write the selected clock control setup to the hardware.  Do not turn on
5006 	 *  SWCE yet (if requested), so that the devices clocked by the output of
5007 	 *  PLL are not clocked until the PLL is stable.
5008 	 */
5009 	cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
5010 	cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
5011 	cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
5012 
5013 	/*
5014 	 *  Power up the PLL.
5015 	 */
5016 	cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
5017 
5018 	/*
5019          *  Wait until the PLL has stabilized.
5020 	 */
5021 	mdelay(5 * cs_laptop_wait);		/* Again 1 should be enough ?? */
5022 
5023 	/*
5024 	 *  Turn on clocking of the core so that we can setup the serial ports.
5025 	 */
5026 	tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
5027 	cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5028 
5029 	/*
5030 	 *  Fill the serial port FIFOs with silence.
5031 	 */
5032 	cs461x_clear_serial_FIFOs(card,CS_TYPE_DAC | CS_TYPE_ADC);
5033 
5034 	/*
5035 	 *  Set the serial port FIFO pointer to the first sample in the FIFO.
5036 	 */
5037 	/* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
5038 
5039 	/*
5040 	 *  Write the serial port configuration to the part.  The master
5041 	 *  enable bit is not set until all other values have been written.
5042 	 */
5043 	cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
5044 	cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
5045 	cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
5046 
5047 
5048 	mdelay(5 * cs_laptop_wait);		/* Shouldnt be needed ?? */
5049 
5050 /*
5051 * If we are resuming under 2.2.x then we can not schedule a timeout.
5052 * so, just spin the CPU.
5053 */
5054 	if(card->pm.flags & CS46XX_PM_IDLE)
5055 	{
5056 	/*
5057 	 * Wait for the card ready signal from the AC97 card.
5058 	 */
5059 		end_time = jiffies + 3 * (HZ >> 2);
5060 		do {
5061 		/*
5062 		 *  Read the AC97 status register to see if we've seen a CODEC READY
5063 		 *  signal from the AC97 card.
5064 		 */
5065 			if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5066 				break;
5067 			current->state = TASK_UNINTERRUPTIBLE;
5068 			schedule_timeout(1);
5069 		} while (time_before(jiffies, end_time));
5070 	}
5071 	else
5072 	{
5073 		for (count = 0; count < 100; count++) {
5074 		// First, we want to wait for a short time.
5075 			udelay(25 * cs_laptop_wait);
5076 
5077 			if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
5078 				break;
5079 		}
5080 	}
5081 
5082 	/*
5083 	 *  Make sure CODEC is READY.
5084 	 */
5085 	if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
5086 		CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5087 			"cs46xx: create - never read card ready from AC'97\n"));
5088 		CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5089 			"cs46xx: probably not a bug, try using the CS4232 driver,\n"));
5090 		CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING
5091 			"cs46xx: or turn off any automatic Power Management support in the BIOS.\n"));
5092 		return -EIO;
5093 	}
5094 
5095 	/*
5096 	 *  Assert the vaid frame signal so that we can start sending commands
5097 	 *  to the AC97 card.
5098 	 */
5099 	cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
5100 
5101 	if(card->pm.flags & CS46XX_PM_IDLE)
5102 	{
5103 	/*
5104 	 *  Wait until we've sampled input slots 3 and 4 as valid, meaning that
5105 	 *  the card is pumping ADC data across the AC-link.
5106 	 */
5107 		end_time = jiffies + 3 * (HZ >> 2);
5108 		do {
5109 			/*
5110 			 *  Read the input slot valid register and see if input slots 3 and
5111 			 *  4 are valid yet.
5112 			 */
5113 			if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5114 				break;
5115 			current->state = TASK_UNINTERRUPTIBLE;
5116 			schedule_timeout(1);
5117 		} while (time_before(jiffies, end_time));
5118 	}
5119 	else
5120 	{
5121 		for (count = 0; count < 100; count++) {
5122 		// First, we want to wait for a short time.
5123 			udelay(25 * cs_laptop_wait);
5124 
5125 			if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
5126 				break;
5127 		}
5128 	}
5129 	/*
5130 	 *  Make sure input slots 3 and 4 are valid.  If not, then return
5131 	 *  an error.
5132 	 */
5133 	if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
5134 		printk(KERN_WARNING "cs46xx: create - never read ISV3 & ISV4 from AC'97\n");
5135 		return -EIO;
5136 	}
5137 
5138 	/*
5139 	 *  Now, assert valid frame and the slot 3 and 4 valid bits.  This will
5140 	 *  commense the transfer of digital audio data to the AC97 card.
5141 	 */
5142 	cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
5143 
5144 	/*
5145 	 *  Turn off the Processor by turning off the software clock enable flag in
5146 	 *  the clock control register.
5147 	 */
5148 	/* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
5149 	/* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
5150 
5151 	/*
5152          *  Reset the processor.
5153          */
5154 	cs461x_reset(card);
5155 
5156 	/*
5157          *  Download the image to the processor.
5158 	 */
5159 
5160 	cs461x_download_image(card);
5161 
5162 	/*
5163          *  Stop playback DMA.
5164 	 */
5165 	tmp = cs461x_peek(card, BA1_PCTL);
5166 	card->pctl = tmp & 0xffff0000;
5167 	cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5168 
5169 	/*
5170          *  Stop capture DMA.
5171 	 */
5172 	tmp = cs461x_peek(card, BA1_CCTL);
5173 	card->cctl = tmp & 0x0000ffff;
5174 	cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5175 
5176 	/* initialize AC97 codec and register /dev/mixer */
5177 	if(card->pm.flags & CS46XX_PM_IDLE)
5178 	{
5179 		if (cs_ac97_init(card) <= 0)
5180 		{
5181 			CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5182 				"cs46xx: cs_ac97_init() failure\n") );
5183 			return -EIO;
5184 		}
5185 	}
5186 	else
5187 	{
5188 		cs46xx_ac97_resume(card);
5189 	}
5190 
5191 	cs461x_proc_start(card);
5192 
5193 	/*
5194 	 *  Enable interrupts on the part.
5195 	 */
5196 	cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
5197 
5198 	tmp = cs461x_peek(card, BA1_PFIE);
5199 	tmp &= ~0x0000f03f;
5200 	cs461x_poke(card, BA1_PFIE, tmp);	/* playback interrupt enable */
5201 
5202 	tmp = cs461x_peek(card, BA1_CIE);
5203 	tmp &= ~0x0000003f;
5204 	tmp |=  0x00000001;
5205 	cs461x_poke(card, BA1_CIE, tmp);	/* capture interrupt enable */
5206 
5207 	/*
5208 	 *  If IDLE then Power down the part.  We will power components up
5209 	 *  when we need them.
5210 	 */
5211 	if(card->pm.flags & CS46XX_PM_IDLE)
5212 	{
5213 		if(!cs_powerdown)
5214 		{
5215 			if( (tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC |
5216 					CS_POWER_MIXVON )) )
5217 			{
5218 				CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5219 					"cs46xx: cs461x_powerup() failure (0x%x)\n",tmp) );
5220 				return -EIO;
5221 			}
5222 		}
5223 		else
5224 		{
5225 			if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5226 					CS_POWER_MIXVON, CS_FALSE )) )
5227 			{
5228 				CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5229 					"cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5230 				return -EIO;
5231 			}
5232 		}
5233 	}
5234 	CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO
5235 		"cs46xx: cs_hardware_init()- 0\n"));
5236 	return 0;
5237 }
5238 
5239 /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered
5240    until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
5241 
5242 /*
5243  *	Card subid table
5244  */
5245 
5246 struct cs_card_type
5247 {
5248 	u16 vendor;
5249 	u16 id;
5250 	char *name;
5251 	void (*amp)(struct cs_card *, int);
5252 	void (*amp_init)(struct cs_card *);
5253 	void (*active)(struct cs_card *, int);
5254 };
5255 
5256 static struct cs_card_type cards[]={
5257 	{0x1489, 0x7001, "Genius Soundmaker 128 value", amp_none, NULL, NULL},
5258 	{0x5053, 0x3357, "Voyetra", amp_voyetra, NULL, NULL},
5259 	{0x1071, 0x6003, "Mitac MI6020/21", amp_voyetra, NULL, NULL},
5260 	{0x14AF, 0x0050, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5261 	{0x1681, 0x0050, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5262 	{0x1681, 0x0051, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5263 	{0x1681, 0x0052, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5264 	{0x1681, 0x0053, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5265 	{0x1681, 0x0054, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
5266 	{0x1681, 0xa010, "Hercules Fortissimo II", amp_none, NULL, NULL},
5267 
5268 	/* Not sure if the 570 needs the clkrun hack */
5269 	{PCI_VENDOR_ID_IBM, 0x0132, "Thinkpad 570", amp_none, NULL, clkrun_hack},
5270 	{PCI_VENDOR_ID_IBM, 0x0153, "Thinkpad 600X/A20/T20", amp_none, NULL, clkrun_hack},
5271 	{PCI_VENDOR_ID_IBM, 0x1010, "Thinkpad 600E (unsupported)", NULL, NULL, NULL},
5272 	{0, 0, "Card without SSID set", NULL, NULL, NULL },
5273 	{0, 0, NULL, NULL, NULL}
5274 };
5275 
5276 MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
5277 MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
5278 MODULE_LICENSE("GPL");
5279 
5280 
5281 static const char cs46xx_banner[] = KERN_INFO "Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION "." CS46XX_MINOR_VERSION "." CS46XX_ARCH ", " __TIME__ " " __DATE__ "\n";
5282 static const char fndmsg[] = KERN_INFO "cs46xx: Found %d audio device(s).\n";
5283 
cs46xx_probe(struct pci_dev * pci_dev,const struct pci_device_id * pciid)5284 static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
5285 				  const struct pci_device_id *pciid)
5286 {
5287 	struct pm_dev *pmdev;
5288 	int i,j;
5289 	u16 ss_card, ss_vendor;
5290 	struct cs_card *card;
5291 	dma_addr_t dma_mask;
5292 	struct cs_card_type *cp = &cards[0];
5293 
5294 	CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
5295 		  printk(KERN_INFO "cs46xx: probe()+\n"));
5296 
5297 	dma_mask = 0xffffffff;	/* this enables playback and recording */
5298 	if (pci_enable_device(pci_dev)) {
5299 		CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
5300 			 "cs46xx: pci_enable_device() failed\n"));
5301 		return -1;
5302 	}
5303 	if (!RSRCISMEMORYREGION(pci_dev, 0) ||
5304 	    !RSRCISMEMORYREGION(pci_dev, 1)) {
5305 		CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5306 			 "cs46xx: probe()- Memory region not assigned\n"));
5307 		return -1;
5308 	}
5309 	if (pci_dev->irq == 0) {
5310 		CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5311 			 "cs46xx: probe() IRQ not assigned\n"));
5312 		return -1;
5313 	}
5314 	if (!pci_dma_supported(pci_dev, 0xffffffff)) {
5315 		CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
5316 		      "cs46xx: probe() architecture does not support 32bit PCI busmaster DMA\n"));
5317 		return -1;
5318 	}
5319 	pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
5320 	pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
5321 
5322 	if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
5323 		printk(KERN_ERR "cs46xx: out of memory\n");
5324 		return -ENOMEM;
5325 	}
5326 	memset(card, 0, sizeof(*card));
5327 	card->ba0_addr = RSRCADDRESS(pci_dev, 0);
5328 	card->ba1_addr = RSRCADDRESS(pci_dev, 1);
5329 	card->pci_dev = pci_dev;
5330 	card->irq = pci_dev->irq;
5331 	card->magic = CS_CARD_MAGIC;
5332 	spin_lock_init(&card->lock);
5333 	spin_lock_init(&card->ac97_lock);
5334 
5335 	pci_set_master(pci_dev);
5336 
5337 	printk(cs46xx_banner);
5338 	printk(KERN_INFO "cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %d\n",
5339 	       card->ba0_addr, card->ba1_addr, card->irq);
5340 
5341 	card->alloc_pcm_channel = cs_alloc_pcm_channel;
5342 	card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
5343 	card->free_pcm_channel = cs_free_pcm_channel;
5344 	card->amplifier_ctrl = amp_none;
5345 	card->active_ctrl = amp_none;
5346 
5347 	while (cp->name)
5348 	{
5349 		if(cp->vendor == ss_vendor && cp->id == ss_card)
5350 		{
5351 			card->amplifier_ctrl = cp->amp;
5352 			if(cp->active)
5353 				card->active_ctrl = cp->active;
5354 			if(cp->amp_init)
5355 				card->amp_init = cp->amp_init;
5356 			break;
5357 		}
5358 		cp++;
5359 	}
5360 	if (cp->name==NULL)
5361 	{
5362 		printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5363 			ss_vendor, ss_card, card->ba0_addr, card->ba1_addr,  card->irq);
5364 	}
5365 	else
5366 	{
5367 		printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
5368 			cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
5369 	}
5370 
5371 	if (card->amplifier_ctrl==NULL)
5372 	{
5373 		card->amplifier_ctrl = amp_none;
5374 		card->active_ctrl = clkrun_hack;
5375 	}
5376 
5377 	if (external_amp == 1)
5378 	{
5379 		printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.\n");
5380 		card->amplifier_ctrl = amp_voyetra;
5381 	}
5382 
5383 	if (thinkpad == 1)
5384 	{
5385 		printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.\n");
5386 		card->active_ctrl = clkrun_hack;
5387 	}
5388 /*
5389 * The thinkpads don't work well without runtime updating on their kernel
5390 * delay values (or any laptop with variable CPU speeds really).
5391 * so, just to be safe set the init delay to 2100.  Eliminates
5392 * failures on T21 Thinkpads.  remove this code when the udelay
5393 * and mdelay kernel code is replaced by a pm timer, or the delays
5394 * work well for battery and/or AC power both.
5395 */
5396 	if(card->active_ctrl == clkrun_hack)
5397 	{
5398 		initdelay = 2100;
5399 		cs_laptop_wait = 5;
5400 	}
5401 	if((card->active_ctrl == clkrun_hack) && !(powerdown == 1))
5402 	{
5403 /*
5404 * for some currently unknown reason, powering down the DAC and ADC component
5405 * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97
5406 * codec access problems.  probably the serial clock becomes unsynced.
5407 * added code to sync the chips back up, but only helped about 70% the time.
5408 */
5409 		cs_powerdown = 0;
5410 	}
5411 	if(powerdown == 0)
5412 		cs_powerdown = 0;
5413 	card->active_ctrl(card, 1);
5414 
5415 	/* claim our iospace and irq */
5416 
5417 	card->ba0 = ioremap_nocache(card->ba0_addr, CS461X_BA0_SIZE);
5418 	card->ba1.name.data0 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
5419 	card->ba1.name.data1 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
5420 	card->ba1.name.pmem = ioremap_nocache(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
5421 	card->ba1.name.reg = ioremap_nocache(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
5422 
5423 	CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5424 		"cs46xx: card=0x%x card->ba0=0x%.08x\n",(unsigned)card,(unsigned)card->ba0) );
5425 	CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO
5426 		"cs46xx: card->ba1=0x%.08x 0x%.08x 0x%.08x 0x%.08x\n",
5427 			(unsigned)card->ba1.name.data0,
5428 			(unsigned)card->ba1.name.data1,
5429 			(unsigned)card->ba1.name.pmem,
5430 			(unsigned)card->ba1.name.reg) );
5431 
5432 	if(card->ba0 == 0 || card->ba1.name.data0 == 0 ||
5433 		card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
5434 		card->ba1.name.reg == 0)
5435 		goto fail2;
5436 
5437 	if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) {
5438 		printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq);
5439 		goto fail2;
5440 	}
5441 	/* register /dev/dsp */
5442 	if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
5443 		printk(KERN_ERR "cs46xx: unable to register dsp\n");
5444 		goto fail;
5445 	}
5446 
5447         /* register /dev/midi */
5448         if((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0)
5449                 printk(KERN_ERR "cs46xx: unable to register midi\n");
5450 
5451 	card->pm.flags |= CS46XX_PM_IDLE;
5452 	for(i=0;i<5;i++)
5453 	{
5454 		if (cs_hardware_init(card) != 0)
5455 		{
5456 			CS_DBGOUT(CS_ERROR, 4, printk(
5457 				"cs46xx: ERROR in cs_hardware_init()... retrying\n"));
5458 			for (j = 0; j < NR_AC97; j++)
5459 				if (card->ac97_codec[j] != NULL) {
5460 					unregister_sound_mixer(card->ac97_codec[j]->dev_mixer);
5461 					ac97_release_codec(card->ac97_codec[j]);
5462 				}
5463 			mdelay(10 * cs_laptop_wait);
5464 			continue;
5465 		}
5466 		break;
5467 	}
5468 	if(i>=4)
5469 	{
5470 		CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
5471 			"cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i));
5472                 unregister_sound_dsp(card->dev_audio);
5473                 if(card->dev_midi)
5474                         unregister_sound_midi(card->dev_midi);
5475                 goto fail;
5476 	}
5477 
5478         init_waitqueue_head(&card->midi.open_wait);
5479         init_MUTEX(&card->midi.open_sem);
5480         init_waitqueue_head(&card->midi.iwait);
5481         init_waitqueue_head(&card->midi.owait);
5482         cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST);
5483         cs461x_pokeBA0(card, BA0_MIDCR, 0);
5484 
5485 	/*
5486 	* Check if we have to init the amplifier, but probably already done
5487 	* since the CD logic in the ac97 init code will turn on the ext amp.
5488 	*/
5489 	if(cp->amp_init)
5490 		cp->amp_init(card);
5491         card->active_ctrl(card, -1);
5492 
5493 	PCI_SET_DRIVER_DATA(pci_dev, card);
5494 	PCI_SET_DMA_MASK(pci_dev, dma_mask);
5495 	list_add(&card->list, &cs46xx_devs);
5496 
5497 	pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), cs46xx_pm_callback);
5498 	if (pmdev)
5499 	{
5500 		CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
5501 			 "cs46xx: probe() pm_register() succeeded (0x%x).\n",
5502 				(unsigned)pmdev));
5503 		pmdev->data = card;
5504 	}
5505 	else
5506 	{
5507 		CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 2, printk(KERN_INFO
5508 			 "cs46xx: probe() pm_register() failed (0x%x).\n",
5509 				(unsigned)pmdev));
5510 		card->pm.flags |= CS46XX_PM_NOT_REGISTERED;
5511 	}
5512 
5513 	CS_DBGOUT(CS_PM, 9, printk(KERN_INFO "cs46xx: pm.flags=0x%x card=0x%x\n",
5514 		(unsigned)card->pm.flags,(unsigned)card));
5515 
5516 	CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5517 		"cs46xx: probe()- device allocated successfully\n"));
5518         return 0;
5519 
5520 fail:
5521 	free_irq(card->irq, card);
5522 fail2:
5523 	if(card->ba0)
5524 		iounmap(card->ba0);
5525 	if(card->ba1.name.data0)
5526 		iounmap(card->ba1.name.data0);
5527 	if(card->ba1.name.data1)
5528 		iounmap(card->ba1.name.data1);
5529 	if(card->ba1.name.pmem)
5530 		iounmap(card->ba1.name.pmem);
5531 	if(card->ba1.name.reg)
5532 		iounmap(card->ba1.name.reg);
5533 	kfree(card);
5534 	CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
5535 		"cs46xx: probe()- no device allocated\n"));
5536 	return -ENODEV;
5537 } // probe_cs46xx
5538 
5539 // ---------------------------------------------------------------------
5540 
cs46xx_remove(struct pci_dev * pci_dev)5541 static void __devinit cs46xx_remove(struct pci_dev *pci_dev)
5542 {
5543 	struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
5544 	int i;
5545 	unsigned int tmp;
5546 
5547 	CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5548 		 "cs46xx: cs46xx_remove()+\n"));
5549 
5550 	card->active_ctrl(card,1);
5551 
5552 	tmp = cs461x_peek(card, BA1_PFIE);
5553 	tmp &= ~0x0000f03f;
5554 	tmp |=  0x00000010;
5555 	cs461x_poke(card, BA1_PFIE, tmp);	/* playback interrupt disable */
5556 
5557 	tmp = cs461x_peek(card, BA1_CIE);
5558 	tmp &= ~0x0000003f;
5559 	tmp |=  0x00000011;
5560 	cs461x_poke(card, BA1_CIE, tmp);	/* capture interrupt disable */
5561 
5562 	/*
5563          *  Stop playback DMA.
5564 	 */
5565 	tmp = cs461x_peek(card, BA1_PCTL);
5566 	cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
5567 
5568 	/*
5569          *  Stop capture DMA.
5570 	 */
5571 	tmp = cs461x_peek(card, BA1_CCTL);
5572 	cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
5573 
5574 	/*
5575          *  Reset the processor.
5576          */
5577 	cs461x_reset(card);
5578 
5579 	cs461x_proc_stop(card);
5580 
5581 	/*
5582 	 *  Power down the DAC and ADC.  We will power them up (if) when we need
5583 	 *  them.
5584 	 */
5585 	if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
5586 			CS_POWER_MIXVON, CS_TRUE )) )
5587 	{
5588 		CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO
5589 			"cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
5590 	}
5591 
5592 	/*
5593 	 *  Power down the PLL.
5594 	 */
5595 	cs461x_pokeBA0(card, BA0_CLKCR1, 0);
5596 
5597 	/*
5598 	 *  Turn off the Processor by turning off the software clock enable flag in
5599 	 *  the clock control register.
5600 	 */
5601 	tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
5602 	cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
5603 
5604 	card->active_ctrl(card,-1);
5605 
5606 	/* free hardware resources */
5607 	free_irq(card->irq, card);
5608 	iounmap(card->ba0);
5609 	iounmap(card->ba1.name.data0);
5610 	iounmap(card->ba1.name.data1);
5611 	iounmap(card->ba1.name.pmem);
5612 	iounmap(card->ba1.name.reg);
5613 
5614 	/* unregister audio devices */
5615 	for (i = 0; i < NR_AC97; i++)
5616 		if (card->ac97_codec[i] != NULL) {
5617 			unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
5618 			ac97_release_codec(card->ac97_codec[i]);
5619 		}
5620 	unregister_sound_dsp(card->dev_audio);
5621         if(card->dev_midi)
5622                 unregister_sound_midi(card->dev_midi);
5623 	list_del(&card->list);
5624 	kfree(card);
5625 	PCI_SET_DRIVER_DATA(pci_dev,NULL);
5626 
5627 	CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5628 		 "cs46xx: cs46xx_remove()-: remove successful\n"));
5629 }
5630 
5631 enum {
5632 	CS46XX_4610 = 0,
5633 	CS46XX_4612,  	/* same as 4630 */
5634 	CS46XX_4615,  	/* same as 4624 */
5635 };
5636 
5637 static struct pci_device_id cs46xx_pci_tbl[] __devinitdata = {
5638 
5639 	{PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4610},
5640 	{PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4612, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4612},
5641 	{PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4615},
5642 	{0,}
5643 };
5644 
5645 MODULE_DEVICE_TABLE(pci, cs46xx_pci_tbl);
5646 
5647 struct pci_driver cs46xx_pci_driver = {
5648 	name:"cs46xx",
5649 	id_table:cs46xx_pci_tbl,
5650 	probe:cs46xx_probe,
5651 	remove:cs46xx_remove,
5652 	suspend:CS46XX_SUSPEND_TBL,
5653 	resume:CS46XX_RESUME_TBL,
5654 };
5655 
cs46xx_init_module(void)5656 int __init cs46xx_init_module(void)
5657 {
5658 	int rtn = 0;
5659 	CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5660 		"cs46xx: cs46xx_init_module()+ \n"));
5661 	if (!pci_present()) {	/* No PCI bus in this machine! */
5662 		CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
5663 			"cs46xx: cs46xx_init_module()- no pci bus found\n"));
5664 		return -ENODEV;
5665 	}
5666 	rtn = pci_module_init(&cs46xx_pci_driver);
5667 
5668 	if(rtn == -ENODEV)
5669 	{
5670 		CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(
5671 			"cs46xx: Unable to detect valid cs46xx device\n"));
5672 	}
5673 
5674 	CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5675 		  printk(KERN_INFO "cs46xx: cs46xx_init_module()- (%d)\n",rtn));
5676 	return rtn;
5677 }
5678 
cs46xx_cleanup_module(void)5679 void __exit cs46xx_cleanup_module(void)
5680 {
5681 	pci_unregister_driver(&cs46xx_pci_driver);
5682 	cs_pm_unregister_all(cs46xx_pm_callback);
5683 	CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
5684 		  printk(KERN_INFO "cs46xx: cleanup_cs46xx() finished\n"));
5685 }
5686 
5687 module_init(cs46xx_init_module);
5688 module_exit(cs46xx_cleanup_module);
5689 
cs46xx_pm_callback(struct pm_dev * dev,pm_request_t rqst,void * data)5690 int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
5691 {
5692 	struct cs_card *card;
5693 
5694 	CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5695 		"cs46xx: cs46xx_pm_callback dev=0x%x rqst=0x%x card=%d\n",
5696 			(unsigned)dev,(unsigned)rqst,(unsigned)data));
5697 	card = (struct cs_card *) dev->data;
5698 	if (card) {
5699 		switch(rqst) {
5700 			case PM_SUSPEND:
5701 				CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5702 					"cs46xx: PM suspend request\n"));
5703 				if(cs46xx_suspend(card, 0))
5704 				{
5705 				    CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5706 					"cs46xx: PM suspend request refused\n"));
5707 					return 1;
5708 				}
5709 				break;
5710 			case PM_RESUME:
5711 				CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
5712 					"cs46xx: PM resume request\n"));
5713 				if(cs46xx_resume(card))
5714 				{
5715 				    CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
5716 					"cs46xx: PM resume request refused\n"));
5717 					return 1;
5718 				}
5719 				break;
5720 		}
5721 	}
5722 
5723 	return 0;
5724 }
5725 
5726 #if CS46XX_ACPI_SUPPORT
cs46xx_suspend_tbl(struct pci_dev * pcidev,u32 state)5727 static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state)
5728 {
5729 	struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5730 	CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5731 		printk(KERN_INFO "cs46xx: cs46xx_suspend_tbl request\n"));
5732 	cs46xx_suspend(s, 0);
5733 	return 0;
5734 }
5735 
cs46xx_resume_tbl(struct pci_dev * pcidev)5736 static int cs46xx_resume_tbl(struct pci_dev *pcidev)
5737 {
5738 	struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
5739 	CS_DBGOUT(CS_PM | CS_FUNCTION, 2,
5740 		printk(KERN_INFO "cs46xx: cs46xx_resume_tbl request\n"));
5741 	cs46xx_resume(s);
5742 	return 0;
5743 }
5744 #endif
5745