1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 *  Matt Wu <Matt_Wu@acersoftech.com.cn>
4 *  Apr 26, 2001
5 *  Routines for control of ALi pci audio M5451
6 *
7 *  BUGS:
8 *    --
9 *
10 *  TODO:
11 *    --
12 */
13
14#include <linux/io.h>
15#include <linux/delay.h>
16#include <linux/interrupt.h>
17#include <linux/init.h>
18#include <linux/pci.h>
19#include <linux/slab.h>
20#include <linux/module.h>
21#include <linux/dma-mapping.h>
22#include <sound/core.h>
23#include <sound/pcm.h>
24#include <sound/info.h>
25#include <sound/ac97_codec.h>
26#include <sound/mpu401.h>
27#include <sound/initval.h>
28
29MODULE_AUTHOR("Matt Wu <Matt_Wu@acersoftech.com.cn>");
30MODULE_DESCRIPTION("ALI M5451");
31MODULE_LICENSE("GPL");
32MODULE_SUPPORTED_DEVICE("{{ALI,M5451,pci},{ALI,M5451}}");
33
34static int index = SNDRV_DEFAULT_IDX1;	/* Index */
35static char *id = SNDRV_DEFAULT_STR1;	/* ID for this card */
36static int pcm_channels = 32;
37static bool spdif;
38
39module_param(index, int, 0444);
40MODULE_PARM_DESC(index, "Index value for ALI M5451 PCI Audio.");
41module_param(id, charp, 0444);
42MODULE_PARM_DESC(id, "ID string for ALI M5451 PCI Audio.");
43module_param(pcm_channels, int, 0444);
44MODULE_PARM_DESC(pcm_channels, "PCM Channels");
45module_param(spdif, bool, 0444);
46MODULE_PARM_DESC(spdif, "Support SPDIF I/O");
47
48/* just for backward compatibility */
49static bool enable;
50module_param(enable, bool, 0444);
51
52
53/*
54 *  Constants definition
55 */
56
57#define DEVICE_ID_ALI5451	((PCI_VENDOR_ID_AL<<16)|PCI_DEVICE_ID_AL_M5451)
58
59
60#define ALI_CHANNELS		32
61
62#define ALI_PCM_IN_CHANNEL	31
63#define ALI_SPDIF_IN_CHANNEL	19
64#define ALI_SPDIF_OUT_CHANNEL	15
65#define ALI_CENTER_CHANNEL	24
66#define ALI_LEF_CHANNEL		23
67#define ALI_SURR_LEFT_CHANNEL	26
68#define ALI_SURR_RIGHT_CHANNEL	25
69#define ALI_MODEM_IN_CHANNEL    21
70#define ALI_MODEM_OUT_CHANNEL   20
71
72#define	SNDRV_ALI_VOICE_TYPE_PCM	01
73#define SNDRV_ALI_VOICE_TYPE_OTH	02
74
75#define	ALI_5451_V02		0x02
76
77/*
78 *  Direct Registers
79 */
80
81#define ALI_LEGACY_DMAR0        0x00  /* ADR0 */
82#define ALI_LEGACY_DMAR4        0x04  /* CNT0 */
83#define ALI_LEGACY_DMAR11       0x0b  /* MOD  */
84#define ALI_LEGACY_DMAR15       0x0f  /* MMR  */
85#define ALI_MPUR0		0x20
86#define ALI_MPUR1		0x21
87#define ALI_MPUR2		0x22
88#define ALI_MPUR3		0x23
89
90#define	ALI_AC97_WRITE		0x40
91#define ALI_AC97_READ		0x44
92
93#define ALI_SCTRL		0x48
94#define   ALI_SPDIF_OUT_ENABLE		0x20
95#define   ALI_SCTRL_LINE_IN2		(1 << 9)
96#define   ALI_SCTRL_GPIO_IN2		(1 << 13)
97#define   ALI_SCTRL_LINE_OUT_EN 	(1 << 20)
98#define   ALI_SCTRL_GPIO_OUT_EN 	(1 << 23)
99#define   ALI_SCTRL_CODEC1_READY	(1 << 24)
100#define   ALI_SCTRL_CODEC2_READY	(1 << 25)
101#define ALI_AC97_GPIO		0x4c
102#define   ALI_AC97_GPIO_ENABLE		0x8000
103#define   ALI_AC97_GPIO_DATA_SHIFT	16
104#define ALI_SPDIF_CS		0x70
105#define ALI_SPDIF_CTRL		0x74
106#define   ALI_SPDIF_IN_FUNC_ENABLE	0x02
107#define   ALI_SPDIF_IN_CH_STATUS	0x40
108#define   ALI_SPDIF_OUT_CH_STATUS	0xbf
109#define ALI_START		0x80
110#define ALI_STOP		0x84
111#define ALI_CSPF		0x90
112#define ALI_AINT		0x98
113#define ALI_GC_CIR		0xa0
114	#define ENDLP_IE		0x00001000
115	#define MIDLP_IE		0x00002000
116#define ALI_AINTEN		0xa4
117#define ALI_VOLUME		0xa8
118#define ALI_SBDELTA_DELTA_R     0xac
119#define ALI_MISCINT		0xb0
120	#define ADDRESS_IRQ		0x00000020
121	#define TARGET_REACHED		0x00008000
122	#define MIXER_OVERFLOW		0x00000800
123	#define MIXER_UNDERFLOW		0x00000400
124	#define GPIO_IRQ		0x01000000
125#define ALI_SBBL_SBCL           0xc0
126#define ALI_SBCTRL_SBE2R_SBDD   0xc4
127#define ALI_STIMER		0xc8
128#define ALI_GLOBAL_CONTROL	0xd4
129#define   ALI_SPDIF_OUT_SEL_PCM		0x00000400 /* bit 10 */
130#define   ALI_SPDIF_IN_SUPPORT		0x00000800 /* bit 11 */
131#define   ALI_SPDIF_OUT_CH_ENABLE	0x00008000 /* bit 15 */
132#define   ALI_SPDIF_IN_CH_ENABLE	0x00080000 /* bit 19 */
133#define   ALI_PCM_IN_ENABLE		0x80000000 /* bit 31 */
134
135#define ALI_CSO_ALPHA_FMS	0xe0
136#define ALI_LBA			0xe4
137#define ALI_ESO_DELTA		0xe8
138#define ALI_GVSEL_PAN_VOC_CTRL_EC	0xf0
139#define ALI_EBUF1		0xf4
140#define ALI_EBUF2		0xf8
141
142#define ALI_REG(codec, x) ((codec)->port + x)
143
144#define MAX_CODECS 2
145
146
147struct snd_ali;
148struct snd_ali_voice;
149
150struct snd_ali_channel_control {
151	/* register data */
152	struct REGDATA {
153		unsigned int start;
154		unsigned int stop;
155		unsigned int aint;
156		unsigned int ainten;
157	} data;
158
159	/* register addresses */
160	struct REGS {
161		unsigned int start;
162		unsigned int stop;
163		unsigned int aint;
164		unsigned int ainten;
165		unsigned int ac97read;
166		unsigned int ac97write;
167	} regs;
168
169};
170
171struct snd_ali_voice {
172	unsigned int number;
173	unsigned int use :1,
174		pcm :1,
175		midi :1,
176		mode :1,
177		synth :1,
178		running :1;
179
180	/* PCM data */
181	struct snd_ali *codec;
182	struct snd_pcm_substream *substream;
183	struct snd_ali_voice *extra;
184
185	int eso;                /* final ESO value for channel */
186	int count;              /* runtime->period_size */
187
188	/* --- */
189
190	void *private_data;
191	void (*private_free)(void *private_data);
192};
193
194
195struct snd_alidev {
196
197	struct snd_ali_voice voices[ALI_CHANNELS];
198
199	unsigned int	chcnt;			/* num of opened channels */
200	unsigned int	chmap;			/* bitmap for opened channels */
201	unsigned int synthcount;
202
203};
204
205
206#define ALI_GLOBAL_REGS		56
207#define ALI_CHANNEL_REGS	8
208struct snd_ali_image {
209	u32 regs[ALI_GLOBAL_REGS];
210	u32 channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS];
211};
212
213
214struct snd_ali {
215	int		irq;
216	unsigned long	port;
217	unsigned char	revision;
218
219	unsigned int hw_initialized :1;
220	unsigned int spdif_support :1;
221
222	struct pci_dev	*pci;
223	struct pci_dev	*pci_m1533;
224	struct pci_dev	*pci_m7101;
225
226	struct snd_card	*card;
227	struct snd_pcm	*pcm[MAX_CODECS];
228	struct snd_alidev	synth;
229	struct snd_ali_channel_control chregs;
230
231	/* S/PDIF Mask */
232	unsigned int	spdif_mask;
233
234	unsigned int spurious_irq_count;
235	unsigned int spurious_irq_max_delta;
236
237	unsigned int num_of_codecs;
238
239	struct snd_ac97_bus *ac97_bus;
240	struct snd_ac97 *ac97[MAX_CODECS];
241	unsigned short	ac97_ext_id;
242	unsigned short	ac97_ext_status;
243
244	spinlock_t	reg_lock;
245	spinlock_t	voice_alloc;
246
247#ifdef CONFIG_PM_SLEEP
248	struct snd_ali_image *image;
249#endif
250};
251
252static const struct pci_device_id snd_ali_ids[] = {
253	{PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5451), 0, 0, 0},
254	{0, }
255};
256MODULE_DEVICE_TABLE(pci, snd_ali_ids);
257
258static void snd_ali_clear_voices(struct snd_ali *, unsigned int, unsigned int);
259static unsigned short snd_ali_codec_peek(struct snd_ali *, int, unsigned short);
260static void snd_ali_codec_poke(struct snd_ali *, int, unsigned short,
261			       unsigned short);
262
263/*
264 *  AC97 ACCESS
265 */
266
267static inline unsigned int snd_ali_5451_peek(struct snd_ali *codec,
268					     unsigned int port)
269{
270	return (unsigned int)inl(ALI_REG(codec, port));
271}
272
273static inline void snd_ali_5451_poke(struct snd_ali *codec,
274				     unsigned int port,
275				     unsigned int val)
276{
277	outl((unsigned int)val, ALI_REG(codec, port));
278}
279
280static int snd_ali_codec_ready(struct snd_ali *codec,
281			       unsigned int port)
282{
283	unsigned long end_time;
284	unsigned int res;
285
286	end_time = jiffies + msecs_to_jiffies(250);
287
288	for (;;) {
289		res = snd_ali_5451_peek(codec,port);
290		if (!(res & 0x8000))
291			return 0;
292		if (!time_after_eq(end_time, jiffies))
293			break;
294		schedule_timeout_uninterruptible(1);
295	}
296
297	snd_ali_5451_poke(codec, port, res & ~0x8000);
298	dev_dbg(codec->card->dev, "ali_codec_ready: codec is not ready.\n ");
299	return -EIO;
300}
301
302static int snd_ali_stimer_ready(struct snd_ali *codec)
303{
304	unsigned long end_time;
305	unsigned long dwChk1,dwChk2;
306
307	dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER);
308	end_time = jiffies + msecs_to_jiffies(250);
309
310	for (;;) {
311		dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);
312		if (dwChk2 != dwChk1)
313			return 0;
314		if (!time_after_eq(end_time, jiffies))
315			break;
316		schedule_timeout_uninterruptible(1);
317	}
318
319	dev_err(codec->card->dev, "ali_stimer_read: stimer is not ready.\n");
320	return -EIO;
321}
322
323static void snd_ali_codec_poke(struct snd_ali *codec,int secondary,
324			       unsigned short reg,
325			       unsigned short val)
326{
327	unsigned int dwVal;
328	unsigned int port;
329
330	if (reg >= 0x80) {
331		dev_err(codec->card->dev,
332			"ali_codec_poke: reg(%xh) invalid.\n", reg);
333		return;
334	}
335
336	port = codec->chregs.regs.ac97write;
337
338	if (snd_ali_codec_ready(codec, port) < 0)
339		return;
340	if (snd_ali_stimer_ready(codec) < 0)
341		return;
342
343	dwVal  = (unsigned int) (reg & 0xff);
344	dwVal |= 0x8000 | (val << 16);
345	if (secondary)
346		dwVal |= 0x0080;
347	if (codec->revision == ALI_5451_V02)
348		dwVal |= 0x0100;
349
350	snd_ali_5451_poke(codec, port, dwVal);
351
352	return ;
353}
354
355static unsigned short snd_ali_codec_peek(struct snd_ali *codec,
356					 int secondary,
357					 unsigned short reg)
358{
359	unsigned int dwVal;
360	unsigned int port;
361
362	if (reg >= 0x80) {
363		dev_err(codec->card->dev,
364			"ali_codec_peek: reg(%xh) invalid.\n", reg);
365		return ~0;
366	}
367
368	port = codec->chregs.regs.ac97read;
369
370	if (snd_ali_codec_ready(codec, port) < 0)
371		return ~0;
372	if (snd_ali_stimer_ready(codec) < 0)
373		return ~0;
374
375	dwVal  = (unsigned int) (reg & 0xff);
376	dwVal |= 0x8000;				/* bit 15*/
377	if (secondary)
378		dwVal |= 0x0080;
379
380	snd_ali_5451_poke(codec, port, dwVal);
381
382	if (snd_ali_stimer_ready(codec) < 0)
383		return ~0;
384	if (snd_ali_codec_ready(codec, port) < 0)
385		return ~0;
386
387	return (snd_ali_5451_peek(codec, port) & 0xffff0000) >> 16;
388}
389
390static void snd_ali_codec_write(struct snd_ac97 *ac97,
391				unsigned short reg,
392				unsigned short val )
393{
394	struct snd_ali *codec = ac97->private_data;
395
396	dev_dbg(codec->card->dev, "codec_write: reg=%xh data=%xh.\n", reg, val);
397	if (reg == AC97_GPIO_STATUS) {
398		outl((val << ALI_AC97_GPIO_DATA_SHIFT) | ALI_AC97_GPIO_ENABLE,
399		     ALI_REG(codec, ALI_AC97_GPIO));
400		return;
401	}
402	snd_ali_codec_poke(codec, ac97->num, reg, val);
403	return ;
404}
405
406
407static unsigned short snd_ali_codec_read(struct snd_ac97 *ac97,
408					 unsigned short reg)
409{
410	struct snd_ali *codec = ac97->private_data;
411
412	dev_dbg(codec->card->dev, "codec_read reg=%xh.\n", reg);
413	return snd_ali_codec_peek(codec, ac97->num, reg);
414}
415
416/*
417 *	AC97 Reset
418 */
419
420static int snd_ali_reset_5451(struct snd_ali *codec)
421{
422	struct pci_dev *pci_dev;
423	unsigned short wCount, wReg;
424	unsigned int   dwVal;
425
426	pci_dev = codec->pci_m1533;
427	if (pci_dev) {
428		pci_read_config_dword(pci_dev, 0x7c, &dwVal);
429		pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);
430		mdelay(5);
431		pci_read_config_dword(pci_dev, 0x7c, &dwVal);
432		pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
433		mdelay(5);
434	}
435
436	pci_dev = codec->pci;
437	pci_read_config_dword(pci_dev, 0x44, &dwVal);
438	pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000);
439	udelay(500);
440	pci_read_config_dword(pci_dev, 0x44, &dwVal);
441	pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff);
442	mdelay(5);
443
444	wCount = 200;
445	while(wCount--) {
446		wReg = snd_ali_codec_peek(codec, 0, AC97_POWERDOWN);
447		if ((wReg & 0x000f) == 0x000f)
448			return 0;
449		mdelay(5);
450	}
451
452	/* non-fatal if you have a non PM capable codec */
453	/* dev_warn(codec->card->dev, "ali5451: reset time out\n"); */
454	return 0;
455}
456
457/*
458 *  ALI 5451 Controller
459 */
460
461static void snd_ali_enable_special_channel(struct snd_ali *codec,
462					   unsigned int channel)
463{
464	unsigned long dwVal;
465
466	dwVal  = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
467	dwVal |= 1 << (channel & 0x0000001f);
468	outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
469}
470
471static void snd_ali_disable_special_channel(struct snd_ali *codec,
472					    unsigned int channel)
473{
474	unsigned long dwVal;
475
476	dwVal  = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
477	dwVal &= ~(1 << (channel & 0x0000001f));
478	outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
479}
480
481static void snd_ali_enable_address_interrupt(struct snd_ali *codec)
482{
483	unsigned int gc;
484
485	gc  = inl(ALI_REG(codec, ALI_GC_CIR));
486	gc |= ENDLP_IE;
487	gc |= MIDLP_IE;
488	outl( gc, ALI_REG(codec, ALI_GC_CIR));
489}
490
491static void snd_ali_disable_address_interrupt(struct snd_ali *codec)
492{
493	unsigned int gc;
494
495	gc  = inl(ALI_REG(codec, ALI_GC_CIR));
496	gc &= ~ENDLP_IE;
497	gc &= ~MIDLP_IE;
498	outl(gc, ALI_REG(codec, ALI_GC_CIR));
499}
500
501static void snd_ali_disable_voice_irq(struct snd_ali *codec,
502				      unsigned int channel)
503{
504	unsigned int mask;
505	struct snd_ali_channel_control *pchregs = &(codec->chregs);
506
507	dev_dbg(codec->card->dev, "disable_voice_irq channel=%d\n", channel);
508
509	mask = 1 << (channel & 0x1f);
510	pchregs->data.ainten  = inl(ALI_REG(codec, pchregs->regs.ainten));
511	pchregs->data.ainten &= ~mask;
512	outl(pchregs->data.ainten, ALI_REG(codec, pchregs->regs.ainten));
513}
514
515static int snd_ali_alloc_pcm_channel(struct snd_ali *codec, int channel)
516{
517	unsigned int idx =  channel & 0x1f;
518
519	if (codec->synth.chcnt >= ALI_CHANNELS){
520		dev_err(codec->card->dev,
521			   "ali_alloc_pcm_channel: no free channels.\n");
522		return -1;
523	}
524
525	if (!(codec->synth.chmap & (1 << idx))) {
526		codec->synth.chmap |= 1 << idx;
527		codec->synth.chcnt++;
528		dev_dbg(codec->card->dev, "alloc_pcm_channel no. %d.\n", idx);
529		return idx;
530	}
531	return -1;
532}
533
534static int snd_ali_find_free_channel(struct snd_ali * codec, int rec)
535{
536	int idx;
537	int result = -1;
538
539	dev_dbg(codec->card->dev,
540		"find_free_channel: for %s\n", rec ? "rec" : "pcm");
541
542	/* recording */
543	if (rec) {
544		if (codec->spdif_support &&
545		    (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) &
546		     ALI_SPDIF_IN_SUPPORT))
547			idx = ALI_SPDIF_IN_CHANNEL;
548		else
549			idx = ALI_PCM_IN_CHANNEL;
550
551		result = snd_ali_alloc_pcm_channel(codec, idx);
552		if (result >= 0)
553			return result;
554		else {
555			dev_err(codec->card->dev,
556				"ali_find_free_channel: record channel is busy now.\n");
557			return -1;
558		}
559	}
560
561	/* playback... */
562	if (codec->spdif_support &&
563	    (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) &
564	     ALI_SPDIF_OUT_CH_ENABLE)) {
565		idx = ALI_SPDIF_OUT_CHANNEL;
566		result = snd_ali_alloc_pcm_channel(codec, idx);
567		if (result >= 0)
568			return result;
569		else
570			dev_err(codec->card->dev,
571				"ali_find_free_channel: S/PDIF out channel is in busy now.\n");
572	}
573
574	for (idx = 0; idx < ALI_CHANNELS; idx++) {
575		result = snd_ali_alloc_pcm_channel(codec, idx);
576		if (result >= 0)
577			return result;
578	}
579	dev_err(codec->card->dev, "ali_find_free_channel: no free channels.\n");
580	return -1;
581}
582
583static void snd_ali_free_channel_pcm(struct snd_ali *codec, int channel)
584{
585	unsigned int idx = channel & 0x0000001f;
586
587	dev_dbg(codec->card->dev, "free_channel_pcm channel=%d\n", channel);
588
589	if (channel < 0 || channel >= ALI_CHANNELS)
590		return;
591
592	if (!(codec->synth.chmap & (1 << idx))) {
593		dev_err(codec->card->dev,
594			"ali_free_channel_pcm: channel %d is not in use.\n",
595			channel);
596		return;
597	} else {
598		codec->synth.chmap &= ~(1 << idx);
599		codec->synth.chcnt--;
600	}
601}
602
603static void snd_ali_stop_voice(struct snd_ali *codec, unsigned int channel)
604{
605	unsigned int mask = 1 << (channel & 0x1f);
606
607	dev_dbg(codec->card->dev, "stop_voice: channel=%d\n", channel);
608	outl(mask, ALI_REG(codec, codec->chregs.regs.stop));
609}
610
611/*
612 *    S/PDIF Part
613 */
614
615static void snd_ali_delay(struct snd_ali *codec,int interval)
616{
617	unsigned long  begintimer,currenttimer;
618
619	begintimer   = inl(ALI_REG(codec, ALI_STIMER));
620	currenttimer = inl(ALI_REG(codec, ALI_STIMER));
621
622	while (currenttimer < begintimer + interval) {
623		if (snd_ali_stimer_ready(codec) < 0)
624			break;
625		currenttimer = inl(ALI_REG(codec,  ALI_STIMER));
626		cpu_relax();
627	}
628}
629
630static void snd_ali_detect_spdif_rate(struct snd_ali *codec)
631{
632	u16 wval;
633	u16 count = 0;
634	u8  bval, R1 = 0, R2;
635
636	bval  = inb(ALI_REG(codec, ALI_SPDIF_CTRL + 1));
637	bval |= 0x1F;
638	outb(bval, ALI_REG(codec, ALI_SPDIF_CTRL + 1));
639
640	while ((R1 < 0x0b || R1 > 0x0e) && R1 != 0x12 && count <= 50000) {
641		count ++;
642		snd_ali_delay(codec, 6);
643		bval = inb(ALI_REG(codec, ALI_SPDIF_CTRL + 1));
644		R1 = bval & 0x1F;
645	}
646
647	if (count > 50000) {
648		dev_err(codec->card->dev, "ali_detect_spdif_rate: timeout!\n");
649		return;
650	}
651
652	for (count = 0; count <= 50000; count++) {
653		snd_ali_delay(codec, 6);
654		bval = inb(ALI_REG(codec,ALI_SPDIF_CTRL + 1));
655		R2 = bval & 0x1F;
656		if (R2 != R1)
657			R1 = R2;
658		else
659			break;
660	}
661
662	if (count > 50000) {
663		dev_err(codec->card->dev, "ali_detect_spdif_rate: timeout!\n");
664		return;
665	}
666
667	if (R2 >= 0x0b && R2 <= 0x0e) {
668		wval  = inw(ALI_REG(codec, ALI_SPDIF_CTRL + 2));
669		wval &= 0xe0f0;
670		wval |= (0x09 << 8) | 0x05;
671		outw(wval, ALI_REG(codec, ALI_SPDIF_CTRL + 2));
672
673		bval  = inb(ALI_REG(codec, ALI_SPDIF_CS + 3)) & 0xf0;
674		outb(bval | 0x02, ALI_REG(codec, ALI_SPDIF_CS + 3));
675	} else if (R2 == 0x12) {
676		wval  = inw(ALI_REG(codec, ALI_SPDIF_CTRL + 2));
677		wval &= 0xe0f0;
678		wval |= (0x0e << 8) | 0x08;
679		outw(wval, ALI_REG(codec, ALI_SPDIF_CTRL + 2));
680
681		bval  = inb(ALI_REG(codec,ALI_SPDIF_CS + 3)) & 0xf0;
682		outb(bval | 0x03, ALI_REG(codec, ALI_SPDIF_CS + 3));
683	}
684}
685
686static unsigned int snd_ali_get_spdif_in_rate(struct snd_ali *codec)
687{
688	u32	dwRate;
689	u8	bval;
690
691	bval  = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
692	bval &= 0x7f;
693	bval |= 0x40;
694	outb(bval, ALI_REG(codec, ALI_SPDIF_CTRL));
695
696	snd_ali_detect_spdif_rate(codec);
697
698	bval  = inb(ALI_REG(codec, ALI_SPDIF_CS + 3));
699	bval &= 0x0f;
700
701	switch (bval) {
702	case 0: dwRate = 44100; break;
703	case 1: dwRate = 48000; break;
704	case 2: dwRate = 32000; break;
705	default: dwRate = 0; break;
706	}
707
708	return dwRate;
709}
710
711static void snd_ali_enable_spdif_in(struct snd_ali *codec)
712{
713	unsigned int dwVal;
714
715	dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
716	dwVal |= ALI_SPDIF_IN_SUPPORT;
717	outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
718
719	dwVal = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
720	dwVal |= 0x02;
721	outb(dwVal, ALI_REG(codec, ALI_SPDIF_CTRL));
722
723	snd_ali_enable_special_channel(codec, ALI_SPDIF_IN_CHANNEL);
724}
725
726static void snd_ali_disable_spdif_in(struct snd_ali *codec)
727{
728	unsigned int dwVal;
729
730	dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
731	dwVal &= ~ALI_SPDIF_IN_SUPPORT;
732	outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
733
734	snd_ali_disable_special_channel(codec, ALI_SPDIF_IN_CHANNEL);
735}
736
737
738static void snd_ali_set_spdif_out_rate(struct snd_ali *codec, unsigned int rate)
739{
740	unsigned char  bVal;
741	unsigned int  dwRate;
742
743	switch (rate) {
744	case 32000: dwRate = 0x300; break;
745	case 48000: dwRate = 0x200; break;
746	default: dwRate = 0; break;
747	}
748
749	bVal  = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
750	bVal &= (unsigned char)(~(1<<6));
751
752	bVal |= 0x80;		/* select right */
753	outb(bVal, ALI_REG(codec, ALI_SPDIF_CTRL));
754	outb(dwRate | 0x20, ALI_REG(codec, ALI_SPDIF_CS + 2));
755
756	bVal &= ~0x80;	/* select left */
757	outb(bVal, ALI_REG(codec, ALI_SPDIF_CTRL));
758	outw(rate | 0x10, ALI_REG(codec, ALI_SPDIF_CS + 2));
759}
760
761static void snd_ali_enable_spdif_out(struct snd_ali *codec)
762{
763	unsigned short wVal;
764	unsigned char bVal;
765        struct pci_dev *pci_dev;
766
767        pci_dev = codec->pci_m1533;
768        if (pci_dev == NULL)
769                return;
770        pci_read_config_byte(pci_dev, 0x61, &bVal);
771        bVal |= 0x40;
772        pci_write_config_byte(pci_dev, 0x61, bVal);
773        pci_read_config_byte(pci_dev, 0x7d, &bVal);
774        bVal |= 0x01;
775        pci_write_config_byte(pci_dev, 0x7d, bVal);
776
777        pci_read_config_byte(pci_dev, 0x7e, &bVal);
778        bVal &= (~0x20);
779        bVal |= 0x10;
780        pci_write_config_byte(pci_dev, 0x7e, bVal);
781
782	bVal = inb(ALI_REG(codec, ALI_SCTRL));
783	outb(bVal | ALI_SPDIF_OUT_ENABLE, ALI_REG(codec, ALI_SCTRL));
784
785	bVal = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
786	outb(bVal & ALI_SPDIF_OUT_CH_STATUS, ALI_REG(codec, ALI_SPDIF_CTRL));
787
788	wVal = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL));
789	wVal |= ALI_SPDIF_OUT_SEL_PCM;
790	outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
791	snd_ali_disable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL);
792}
793
794static void snd_ali_enable_spdif_chnout(struct snd_ali *codec)
795{
796	unsigned short wVal;
797
798	wVal  = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL));
799   	wVal &= ~ALI_SPDIF_OUT_SEL_PCM;
800   	outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
801/*
802	wVal = inw(ALI_REG(codec, ALI_SPDIF_CS));
803	if (flag & ALI_SPDIF_OUT_NON_PCM)
804   		wVal |= 0x0002;
805	else
806		wVal &= (~0x0002);
807   	outw(wVal, ALI_REG(codec, ALI_SPDIF_CS));
808*/
809	snd_ali_enable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL);
810}
811
812static void snd_ali_disable_spdif_chnout(struct snd_ali *codec)
813{
814	unsigned short wVal;
815
816  	wVal  = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL));
817   	wVal |= ALI_SPDIF_OUT_SEL_PCM;
818   	outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
819
820	snd_ali_enable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL);
821}
822
823static void snd_ali_disable_spdif_out(struct snd_ali *codec)
824{
825	unsigned char  bVal;
826
827	bVal = inb(ALI_REG(codec, ALI_SCTRL));
828	outb(bVal & ~ALI_SPDIF_OUT_ENABLE, ALI_REG(codec, ALI_SCTRL));
829
830	snd_ali_disable_spdif_chnout(codec);
831}
832
833static void snd_ali_update_ptr(struct snd_ali *codec, int channel)
834{
835	struct snd_ali_voice *pvoice;
836	struct snd_ali_channel_control *pchregs;
837	unsigned int old, mask;
838
839	pchregs = &(codec->chregs);
840
841	/* check if interrupt occurred for channel */
842	old  = pchregs->data.aint;
843	mask = 1U << (channel & 0x1f);
844
845	if (!(old & mask))
846		return;
847
848	pvoice = &codec->synth.voices[channel];
849
850	udelay(100);
851	spin_lock(&codec->reg_lock);
852
853	if (pvoice->pcm && pvoice->substream) {
854		/* pcm interrupt */
855		if (pvoice->running) {
856			dev_dbg(codec->card->dev,
857				"update_ptr: cso=%4.4x cspf=%d.\n",
858				inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2)),
859				(inl(ALI_REG(codec, ALI_CSPF)) & mask) == mask);
860			spin_unlock(&codec->reg_lock);
861			snd_pcm_period_elapsed(pvoice->substream);
862			spin_lock(&codec->reg_lock);
863		} else {
864			snd_ali_stop_voice(codec, channel);
865			snd_ali_disable_voice_irq(codec, channel);
866		}
867	} else if (codec->synth.voices[channel].synth) {
868		/* synth interrupt */
869	} else if (codec->synth.voices[channel].midi) {
870		/* midi interrupt */
871	} else {
872		/* unknown interrupt */
873		snd_ali_stop_voice(codec, channel);
874		snd_ali_disable_voice_irq(codec, channel);
875	}
876	spin_unlock(&codec->reg_lock);
877	outl(mask,ALI_REG(codec,pchregs->regs.aint));
878	pchregs->data.aint = old & (~mask);
879}
880
881static irqreturn_t snd_ali_card_interrupt(int irq, void *dev_id)
882{
883	struct snd_ali 	*codec = dev_id;
884	int channel;
885	unsigned int audio_int;
886	struct snd_ali_channel_control *pchregs;
887
888	if (codec == NULL || !codec->hw_initialized)
889		return IRQ_NONE;
890
891	audio_int = inl(ALI_REG(codec, ALI_MISCINT));
892	if (!audio_int)
893		return IRQ_NONE;
894
895	pchregs = &(codec->chregs);
896	if (audio_int & ADDRESS_IRQ) {
897		/* get interrupt status for all channels */
898		pchregs->data.aint = inl(ALI_REG(codec, pchregs->regs.aint));
899		for (channel = 0; channel < ALI_CHANNELS; channel++)
900			snd_ali_update_ptr(codec, channel);
901	}
902	outl((TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
903		ALI_REG(codec, ALI_MISCINT));
904
905	return IRQ_HANDLED;
906}
907
908
909static struct snd_ali_voice *snd_ali_alloc_voice(struct snd_ali * codec,
910						 int type, int rec, int channel)
911{
912	struct snd_ali_voice *pvoice;
913	int idx;
914
915	dev_dbg(codec->card->dev, "alloc_voice: type=%d rec=%d\n", type, rec);
916
917	spin_lock_irq(&codec->voice_alloc);
918	if (type == SNDRV_ALI_VOICE_TYPE_PCM) {
919		idx = channel > 0 ? snd_ali_alloc_pcm_channel(codec, channel) :
920			snd_ali_find_free_channel(codec,rec);
921		if (idx < 0) {
922			dev_err(codec->card->dev, "ali_alloc_voice: err.\n");
923			spin_unlock_irq(&codec->voice_alloc);
924			return NULL;
925		}
926		pvoice = &(codec->synth.voices[idx]);
927		pvoice->codec = codec;
928		pvoice->use = 1;
929		pvoice->pcm = 1;
930		pvoice->mode = rec;
931		spin_unlock_irq(&codec->voice_alloc);
932		return pvoice;
933	}
934	spin_unlock_irq(&codec->voice_alloc);
935	return NULL;
936}
937
938
939static void snd_ali_free_voice(struct snd_ali * codec,
940			       struct snd_ali_voice *pvoice)
941{
942	void (*private_free)(void *);
943	void *private_data;
944
945	dev_dbg(codec->card->dev, "free_voice: channel=%d\n", pvoice->number);
946	if (!pvoice->use)
947		return;
948	snd_ali_clear_voices(codec, pvoice->number, pvoice->number);
949	spin_lock_irq(&codec->voice_alloc);
950	private_free = pvoice->private_free;
951	private_data = pvoice->private_data;
952	pvoice->private_free = NULL;
953	pvoice->private_data = NULL;
954	if (pvoice->pcm)
955		snd_ali_free_channel_pcm(codec, pvoice->number);
956	pvoice->use = pvoice->pcm = pvoice->synth = 0;
957	pvoice->substream = NULL;
958	spin_unlock_irq(&codec->voice_alloc);
959	if (private_free)
960		private_free(private_data);
961}
962
963
964static void snd_ali_clear_voices(struct snd_ali *codec,
965				 unsigned int v_min,
966				 unsigned int v_max)
967{
968	unsigned int i;
969
970	for (i = v_min; i <= v_max; i++) {
971		snd_ali_stop_voice(codec, i);
972		snd_ali_disable_voice_irq(codec, i);
973	}
974}
975
976static void snd_ali_write_voice_regs(struct snd_ali *codec,
977			 unsigned int Channel,
978			 unsigned int LBA,
979			 unsigned int CSO,
980			 unsigned int ESO,
981			 unsigned int DELTA,
982			 unsigned int ALPHA_FMS,
983			 unsigned int GVSEL,
984			 unsigned int PAN,
985			 unsigned int VOL,
986			 unsigned int CTRL,
987			 unsigned int EC)
988{
989	unsigned int ctlcmds[4];
990
991	outb((unsigned char)(Channel & 0x001f), ALI_REG(codec, ALI_GC_CIR));
992
993	ctlcmds[0] =  (CSO << 16) | (ALPHA_FMS & 0x0000ffff);
994	ctlcmds[1] =  LBA;
995	ctlcmds[2] =  (ESO << 16) | (DELTA & 0x0ffff);
996	ctlcmds[3] =  (GVSEL << 31) |
997		      ((PAN & 0x0000007f) << 24) |
998		      ((VOL & 0x000000ff) << 16) |
999		      ((CTRL & 0x0000000f) << 12) |
1000		      (EC & 0x00000fff);
1001
1002	outb(Channel, ALI_REG(codec, ALI_GC_CIR));
1003
1004	outl(ctlcmds[0], ALI_REG(codec, ALI_CSO_ALPHA_FMS));
1005	outl(ctlcmds[1], ALI_REG(codec, ALI_LBA));
1006	outl(ctlcmds[2], ALI_REG(codec, ALI_ESO_DELTA));
1007	outl(ctlcmds[3], ALI_REG(codec, ALI_GVSEL_PAN_VOC_CTRL_EC));
1008
1009	outl(0x30000000, ALI_REG(codec, ALI_EBUF1));	/* Still Mode */
1010	outl(0x30000000, ALI_REG(codec, ALI_EBUF2));	/* Still Mode */
1011}
1012
1013static unsigned int snd_ali_convert_rate(unsigned int rate, int rec)
1014{
1015	unsigned int delta;
1016
1017	if (rate < 4000)
1018		rate = 4000;
1019	if (rate > 48000)
1020		rate = 48000;
1021
1022	if (rec) {
1023		if (rate == 44100)
1024			delta = 0x116a;
1025		else if (rate == 8000)
1026			delta = 0x6000;
1027		else if (rate == 48000)
1028			delta = 0x1000;
1029		else
1030			delta = ((48000 << 12) / rate) & 0x0000ffff;
1031	} else {
1032		if (rate == 44100)
1033			delta = 0xeb3;
1034		else if (rate == 8000)
1035			delta = 0x2ab;
1036		else if (rate == 48000)
1037			delta = 0x1000;
1038		else
1039			delta = (((rate << 12) + rate) / 48000) & 0x0000ffff;
1040	}
1041
1042	return delta;
1043}
1044
1045static unsigned int snd_ali_control_mode(struct snd_pcm_substream *substream)
1046{
1047	unsigned int CTRL;
1048	struct snd_pcm_runtime *runtime = substream->runtime;
1049
1050	/* set ctrl mode
1051	   CTRL default: 8-bit (unsigned) mono, loop mode enabled
1052	 */
1053	CTRL = 0x00000001;
1054	if (snd_pcm_format_width(runtime->format) == 16)
1055		CTRL |= 0x00000008;	/* 16-bit data */
1056	if (!snd_pcm_format_unsigned(runtime->format))
1057		CTRL |= 0x00000002;	/* signed data */
1058	if (runtime->channels > 1)
1059		CTRL |= 0x00000004;	/* stereo data */
1060	return CTRL;
1061}
1062
1063/*
1064 *  PCM part
1065 */
1066
1067static int snd_ali_trigger(struct snd_pcm_substream *substream,
1068			       int cmd)
1069
1070{
1071	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1072	struct snd_pcm_substream *s;
1073	unsigned int what, whati;
1074	struct snd_ali_voice *pvoice, *evoice;
1075	unsigned int val;
1076	int do_start;
1077
1078	switch (cmd) {
1079	case SNDRV_PCM_TRIGGER_START:
1080	case SNDRV_PCM_TRIGGER_RESUME:
1081		do_start = 1;
1082		break;
1083	case SNDRV_PCM_TRIGGER_STOP:
1084	case SNDRV_PCM_TRIGGER_SUSPEND:
1085		do_start = 0;
1086		break;
1087	default:
1088		return -EINVAL;
1089	}
1090
1091	what = whati = 0;
1092	snd_pcm_group_for_each_entry(s, substream) {
1093		if ((struct snd_ali *) snd_pcm_substream_chip(s) == codec) {
1094			pvoice = s->runtime->private_data;
1095			evoice = pvoice->extra;
1096			what |= 1 << (pvoice->number & 0x1f);
1097			if (evoice == NULL)
1098				whati |= 1 << (pvoice->number & 0x1f);
1099			else {
1100				whati |= 1 << (evoice->number & 0x1f);
1101				what |= 1 << (evoice->number & 0x1f);
1102			}
1103			if (do_start) {
1104				pvoice->running = 1;
1105				if (evoice != NULL)
1106					evoice->running = 1;
1107			} else {
1108				pvoice->running = 0;
1109				if (evoice != NULL)
1110					evoice->running = 0;
1111			}
1112			snd_pcm_trigger_done(s, substream);
1113		}
1114	}
1115	spin_lock(&codec->reg_lock);
1116	if (!do_start)
1117		outl(what, ALI_REG(codec, ALI_STOP));
1118	val = inl(ALI_REG(codec, ALI_AINTEN));
1119	if (do_start)
1120		val |= whati;
1121	else
1122		val &= ~whati;
1123	outl(val, ALI_REG(codec, ALI_AINTEN));
1124	if (do_start)
1125		outl(what, ALI_REG(codec, ALI_START));
1126	dev_dbg(codec->card->dev, "trigger: what=%xh whati=%xh\n", what, whati);
1127	spin_unlock(&codec->reg_lock);
1128
1129	return 0;
1130}
1131
1132static int snd_ali_playback_hw_params(struct snd_pcm_substream *substream,
1133				      struct snd_pcm_hw_params *hw_params)
1134{
1135	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1136	struct snd_pcm_runtime *runtime = substream->runtime;
1137	struct snd_ali_voice *pvoice = runtime->private_data;
1138	struct snd_ali_voice *evoice = pvoice->extra;
1139
1140	/* voice management */
1141
1142	if (params_buffer_size(hw_params) / 2 !=
1143	    params_period_size(hw_params)) {
1144		if (!evoice) {
1145			evoice = snd_ali_alloc_voice(codec,
1146						     SNDRV_ALI_VOICE_TYPE_PCM,
1147						     0, -1);
1148			if (!evoice)
1149				return -ENOMEM;
1150			pvoice->extra = evoice;
1151			evoice->substream = substream;
1152		}
1153	} else {
1154		if (evoice) {
1155			snd_ali_free_voice(codec, evoice);
1156			pvoice->extra = evoice = NULL;
1157		}
1158	}
1159
1160	return 0;
1161}
1162
1163static int snd_ali_playback_hw_free(struct snd_pcm_substream *substream)
1164{
1165	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1166	struct snd_pcm_runtime *runtime = substream->runtime;
1167	struct snd_ali_voice *pvoice = runtime->private_data;
1168	struct snd_ali_voice *evoice = pvoice ? pvoice->extra : NULL;
1169
1170	if (evoice) {
1171		snd_ali_free_voice(codec, evoice);
1172		pvoice->extra = NULL;
1173	}
1174	return 0;
1175}
1176
1177static int snd_ali_playback_prepare(struct snd_pcm_substream *substream)
1178{
1179	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1180	struct snd_pcm_runtime *runtime = substream->runtime;
1181	struct snd_ali_voice *pvoice = runtime->private_data;
1182	struct snd_ali_voice *evoice = pvoice->extra;
1183
1184	unsigned int LBA;
1185	unsigned int Delta;
1186	unsigned int ESO;
1187	unsigned int CTRL;
1188	unsigned int GVSEL;
1189	unsigned int PAN;
1190	unsigned int VOL;
1191	unsigned int EC;
1192
1193	dev_dbg(codec->card->dev, "playback_prepare ...\n");
1194
1195	spin_lock_irq(&codec->reg_lock);
1196
1197	/* set Delta (rate) value */
1198	Delta = snd_ali_convert_rate(runtime->rate, 0);
1199
1200	if (pvoice->number == ALI_SPDIF_IN_CHANNEL ||
1201	    pvoice->number == ALI_PCM_IN_CHANNEL)
1202		snd_ali_disable_special_channel(codec, pvoice->number);
1203	else if (codec->spdif_support &&
1204		 (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) &
1205		  ALI_SPDIF_OUT_CH_ENABLE)
1206		 && pvoice->number == ALI_SPDIF_OUT_CHANNEL) {
1207		snd_ali_set_spdif_out_rate(codec, runtime->rate);
1208		Delta = 0x1000;
1209	}
1210
1211	/* set Loop Back Address */
1212	LBA = runtime->dma_addr;
1213
1214	/* set interrupt count size */
1215	pvoice->count = runtime->period_size;
1216
1217	/* set target ESO for channel */
1218	pvoice->eso = runtime->buffer_size;
1219
1220	dev_dbg(codec->card->dev, "playback_prepare: eso=%xh count=%xh\n",
1221		       pvoice->eso, pvoice->count);
1222
1223	/* set ESO to capture first MIDLP interrupt */
1224	ESO = pvoice->eso -1;
1225	/* set ctrl mode */
1226	CTRL = snd_ali_control_mode(substream);
1227
1228	GVSEL = 1;
1229	PAN = 0;
1230	VOL = 0;
1231	EC = 0;
1232	dev_dbg(codec->card->dev, "playback_prepare:\n");
1233	dev_dbg(codec->card->dev,
1234		"ch=%d, Rate=%d Delta=%xh,GVSEL=%xh,PAN=%xh,CTRL=%xh\n",
1235		       pvoice->number,runtime->rate,Delta,GVSEL,PAN,CTRL);
1236	snd_ali_write_voice_regs(codec,
1237				 pvoice->number,
1238				 LBA,
1239				 0,	/* cso */
1240				 ESO,
1241				 Delta,
1242				 0,	/* alpha */
1243				 GVSEL,
1244				 PAN,
1245				 VOL,
1246				 CTRL,
1247				 EC);
1248	if (evoice) {
1249		evoice->count = pvoice->count;
1250		evoice->eso = pvoice->count << 1;
1251		ESO = evoice->eso - 1;
1252		snd_ali_write_voice_regs(codec,
1253					 evoice->number,
1254					 LBA,
1255					 0,	/* cso */
1256					 ESO,
1257					 Delta,
1258					 0,	/* alpha */
1259					 GVSEL,
1260					 0x7f,
1261					 0x3ff,
1262					 CTRL,
1263					 EC);
1264	}
1265	spin_unlock_irq(&codec->reg_lock);
1266	return 0;
1267}
1268
1269
1270static int snd_ali_prepare(struct snd_pcm_substream *substream)
1271{
1272	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1273	struct snd_pcm_runtime *runtime = substream->runtime;
1274	struct snd_ali_voice *pvoice = runtime->private_data;
1275	unsigned int LBA;
1276	unsigned int Delta;
1277	unsigned int ESO;
1278	unsigned int CTRL;
1279	unsigned int GVSEL;
1280	unsigned int PAN;
1281	unsigned int VOL;
1282	unsigned int EC;
1283	u8	 bValue;
1284
1285	spin_lock_irq(&codec->reg_lock);
1286
1287	dev_dbg(codec->card->dev, "ali_prepare...\n");
1288
1289	snd_ali_enable_special_channel(codec,pvoice->number);
1290
1291	Delta = (pvoice->number == ALI_MODEM_IN_CHANNEL ||
1292		 pvoice->number == ALI_MODEM_OUT_CHANNEL) ?
1293		0x1000 : snd_ali_convert_rate(runtime->rate, pvoice->mode);
1294
1295	/* Prepare capture intr channel */
1296	if (pvoice->number == ALI_SPDIF_IN_CHANNEL) {
1297
1298		unsigned int rate;
1299
1300		spin_unlock_irq(&codec->reg_lock);
1301		if (codec->revision != ALI_5451_V02)
1302			return -1;
1303
1304		rate = snd_ali_get_spdif_in_rate(codec);
1305		if (rate == 0) {
1306			dev_warn(codec->card->dev,
1307				 "ali_capture_prepare: spdif rate detect err!\n");
1308			rate = 48000;
1309		}
1310		spin_lock_irq(&codec->reg_lock);
1311		bValue = inb(ALI_REG(codec,ALI_SPDIF_CTRL));
1312		if (bValue & 0x10) {
1313			outb(bValue,ALI_REG(codec,ALI_SPDIF_CTRL));
1314			dev_warn(codec->card->dev,
1315				 "clear SPDIF parity error flag.\n");
1316		}
1317
1318		if (rate != 48000)
1319			Delta = ((rate << 12) / runtime->rate) & 0x00ffff;
1320	}
1321
1322	/* set target ESO for channel  */
1323	pvoice->eso = runtime->buffer_size;
1324
1325	/* set interrupt count size  */
1326	pvoice->count = runtime->period_size;
1327
1328	/* set Loop Back Address  */
1329	LBA = runtime->dma_addr;
1330
1331	/* set ESO to capture first MIDLP interrupt  */
1332	ESO = pvoice->eso - 1;
1333	CTRL = snd_ali_control_mode(substream);
1334	GVSEL = 0;
1335	PAN = 0x00;
1336	VOL = 0x00;
1337	EC = 0;
1338
1339	snd_ali_write_voice_regs(    codec,
1340				     pvoice->number,
1341				     LBA,
1342				     0,	/* cso */
1343				     ESO,
1344				     Delta,
1345				     0,	/* alpha */
1346				     GVSEL,
1347				     PAN,
1348				     VOL,
1349				     CTRL,
1350				     EC);
1351
1352	spin_unlock_irq(&codec->reg_lock);
1353
1354	return 0;
1355}
1356
1357
1358static snd_pcm_uframes_t
1359snd_ali_playback_pointer(struct snd_pcm_substream *substream)
1360{
1361	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1362	struct snd_pcm_runtime *runtime = substream->runtime;
1363	struct snd_ali_voice *pvoice = runtime->private_data;
1364	unsigned int cso;
1365
1366	spin_lock(&codec->reg_lock);
1367	if (!pvoice->running) {
1368		spin_unlock(&codec->reg_lock);
1369		return 0;
1370	}
1371	outb(pvoice->number, ALI_REG(codec, ALI_GC_CIR));
1372	cso = inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2));
1373	spin_unlock(&codec->reg_lock);
1374	dev_dbg(codec->card->dev, "playback pointer returned cso=%xh.\n", cso);
1375
1376	cso %= runtime->buffer_size;
1377	return cso;
1378}
1379
1380
1381static snd_pcm_uframes_t snd_ali_pointer(struct snd_pcm_substream *substream)
1382{
1383	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1384	struct snd_pcm_runtime *runtime = substream->runtime;
1385	struct snd_ali_voice *pvoice = runtime->private_data;
1386	unsigned int cso;
1387
1388	spin_lock(&codec->reg_lock);
1389	if (!pvoice->running) {
1390		spin_unlock(&codec->reg_lock);
1391		return 0;
1392	}
1393	outb(pvoice->number, ALI_REG(codec, ALI_GC_CIR));
1394	cso = inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2));
1395	spin_unlock(&codec->reg_lock);
1396
1397	cso %= runtime->buffer_size;
1398	return cso;
1399}
1400
1401static const struct snd_pcm_hardware snd_ali_playback =
1402{
1403	.info =		(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1404			 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1405			 SNDRV_PCM_INFO_MMAP_VALID |
1406			 SNDRV_PCM_INFO_RESUME |
1407			 SNDRV_PCM_INFO_SYNC_START),
1408	.formats =	(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
1409			 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
1410	.rates =	SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
1411	.rate_min =		4000,
1412	.rate_max =		48000,
1413	.channels_min =		1,
1414	.channels_max =		2,
1415	.buffer_bytes_max =	(256*1024),
1416	.period_bytes_min =	64,
1417	.period_bytes_max =	(256*1024),
1418	.periods_min =		1,
1419	.periods_max =		1024,
1420	.fifo_size =		0,
1421};
1422
1423/*
1424 *  Capture support device description
1425 */
1426
1427static const struct snd_pcm_hardware snd_ali_capture =
1428{
1429	.info =		(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1430			 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1431			 SNDRV_PCM_INFO_MMAP_VALID |
1432			 SNDRV_PCM_INFO_RESUME |
1433			 SNDRV_PCM_INFO_SYNC_START),
1434	.formats =	(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
1435			 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
1436	.rates =	SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
1437	.rate_min =		4000,
1438	.rate_max =		48000,
1439	.channels_min =		1,
1440	.channels_max =		2,
1441	.buffer_bytes_max =	(128*1024),
1442	.period_bytes_min =	64,
1443	.period_bytes_max =	(128*1024),
1444	.periods_min =		1,
1445	.periods_max =		1024,
1446	.fifo_size =		0,
1447};
1448
1449static void snd_ali_pcm_free_substream(struct snd_pcm_runtime *runtime)
1450{
1451	struct snd_ali_voice *pvoice = runtime->private_data;
1452
1453	if (pvoice)
1454		snd_ali_free_voice(pvoice->codec, pvoice);
1455}
1456
1457static int snd_ali_open(struct snd_pcm_substream *substream, int rec,
1458			int channel, const struct snd_pcm_hardware *phw)
1459{
1460	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1461	struct snd_pcm_runtime *runtime = substream->runtime;
1462	struct snd_ali_voice *pvoice;
1463
1464	pvoice = snd_ali_alloc_voice(codec, SNDRV_ALI_VOICE_TYPE_PCM, rec,
1465				     channel);
1466	if (!pvoice)
1467		return -EAGAIN;
1468
1469	pvoice->substream = substream;
1470	runtime->private_data = pvoice;
1471	runtime->private_free = snd_ali_pcm_free_substream;
1472
1473	runtime->hw = *phw;
1474	snd_pcm_set_sync(substream);
1475	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
1476				     0, 64*1024);
1477	return 0;
1478}
1479
1480static int snd_ali_playback_open(struct snd_pcm_substream *substream)
1481{
1482	return snd_ali_open(substream, 0, -1, &snd_ali_playback);
1483}
1484
1485static int snd_ali_capture_open(struct snd_pcm_substream *substream)
1486{
1487	return snd_ali_open(substream, 1, -1, &snd_ali_capture);
1488}
1489
1490static int snd_ali_playback_close(struct snd_pcm_substream *substream)
1491{
1492	return 0;
1493}
1494
1495static int snd_ali_close(struct snd_pcm_substream *substream)
1496{
1497	struct snd_ali *codec = snd_pcm_substream_chip(substream);
1498	struct snd_ali_voice *pvoice = substream->runtime->private_data;
1499
1500	snd_ali_disable_special_channel(codec,pvoice->number);
1501
1502	return 0;
1503}
1504
1505static const struct snd_pcm_ops snd_ali_playback_ops = {
1506	.open =		snd_ali_playback_open,
1507	.close =	snd_ali_playback_close,
1508	.hw_params =	snd_ali_playback_hw_params,
1509	.hw_free =	snd_ali_playback_hw_free,
1510	.prepare =	snd_ali_playback_prepare,
1511	.trigger =	snd_ali_trigger,
1512	.pointer =	snd_ali_playback_pointer,
1513};
1514
1515static const struct snd_pcm_ops snd_ali_capture_ops = {
1516	.open =		snd_ali_capture_open,
1517	.close =	snd_ali_close,
1518	.prepare =	snd_ali_prepare,
1519	.trigger =	snd_ali_trigger,
1520	.pointer =	snd_ali_pointer,
1521};
1522
1523/*
1524 * Modem PCM
1525 */
1526
1527static int snd_ali_modem_hw_params(struct snd_pcm_substream *substream,
1528				 struct snd_pcm_hw_params *hw_params)
1529{
1530	struct snd_ali *chip = snd_pcm_substream_chip(substream);
1531	unsigned int modem_num = chip->num_of_codecs - 1;
1532	snd_ac97_write(chip->ac97[modem_num], AC97_LINE1_RATE,
1533		       params_rate(hw_params));
1534	snd_ac97_write(chip->ac97[modem_num], AC97_LINE1_LEVEL, 0);
1535	return 0;
1536}
1537
1538static const struct snd_pcm_hardware snd_ali_modem =
1539{
1540	.info =		(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1541			 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1542			 SNDRV_PCM_INFO_MMAP_VALID |
1543			 SNDRV_PCM_INFO_RESUME |
1544			 SNDRV_PCM_INFO_SYNC_START),
1545	.formats =	SNDRV_PCM_FMTBIT_S16_LE,
1546	.rates =	(SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000 |
1547			 SNDRV_PCM_RATE_16000),
1548	.rate_min =		8000,
1549	.rate_max =		16000,
1550	.channels_min =		1,
1551	.channels_max =		1,
1552	.buffer_bytes_max =	(256*1024),
1553	.period_bytes_min =	64,
1554	.period_bytes_max =	(256*1024),
1555	.periods_min =		1,
1556	.periods_max =		1024,
1557	.fifo_size =		0,
1558};
1559
1560static int snd_ali_modem_open(struct snd_pcm_substream *substream, int rec,
1561			      int channel)
1562{
1563	static const unsigned int rates[] = {8000, 9600, 12000, 16000};
1564	static const struct snd_pcm_hw_constraint_list hw_constraint_rates = {
1565		.count = ARRAY_SIZE(rates),
1566		.list = rates,
1567		.mask = 0,
1568	};
1569	int err = snd_ali_open(substream, rec, channel, &snd_ali_modem);
1570
1571	if (err)
1572		return err;
1573	return snd_pcm_hw_constraint_list(substream->runtime, 0,
1574			SNDRV_PCM_HW_PARAM_RATE, &hw_constraint_rates);
1575}
1576
1577static int snd_ali_modem_playback_open(struct snd_pcm_substream *substream)
1578{
1579	return snd_ali_modem_open(substream, 0, ALI_MODEM_OUT_CHANNEL);
1580}
1581
1582static int snd_ali_modem_capture_open(struct snd_pcm_substream *substream)
1583{
1584	return snd_ali_modem_open(substream, 1, ALI_MODEM_IN_CHANNEL);
1585}
1586
1587static const struct snd_pcm_ops snd_ali_modem_playback_ops = {
1588	.open =		snd_ali_modem_playback_open,
1589	.close =	snd_ali_close,
1590	.hw_params =	snd_ali_modem_hw_params,
1591	.prepare =	snd_ali_prepare,
1592	.trigger =	snd_ali_trigger,
1593	.pointer =	snd_ali_pointer,
1594};
1595
1596static const struct snd_pcm_ops snd_ali_modem_capture_ops = {
1597	.open =		snd_ali_modem_capture_open,
1598	.close =	snd_ali_close,
1599	.hw_params =	snd_ali_modem_hw_params,
1600	.prepare =	snd_ali_prepare,
1601	.trigger =	snd_ali_trigger,
1602	.pointer =	snd_ali_pointer,
1603};
1604
1605
1606struct ali_pcm_description {
1607	char *name;
1608	unsigned int playback_num;
1609	unsigned int capture_num;
1610	const struct snd_pcm_ops *playback_ops;
1611	const struct snd_pcm_ops *capture_ops;
1612	unsigned short class;
1613};
1614
1615
1616static void snd_ali_pcm_free(struct snd_pcm *pcm)
1617{
1618	struct snd_ali *codec = pcm->private_data;
1619	codec->pcm[pcm->device] = NULL;
1620}
1621
1622
1623static int snd_ali_pcm(struct snd_ali *codec, int device,
1624		       struct ali_pcm_description *desc)
1625{
1626	struct snd_pcm *pcm;
1627	int err;
1628
1629	err = snd_pcm_new(codec->card, desc->name, device,
1630			  desc->playback_num, desc->capture_num, &pcm);
1631	if (err < 0) {
1632		dev_err(codec->card->dev,
1633			"snd_ali_pcm: err called snd_pcm_new.\n");
1634		return err;
1635	}
1636	pcm->private_data = codec;
1637	pcm->private_free = snd_ali_pcm_free;
1638	if (desc->playback_ops)
1639		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
1640				desc->playback_ops);
1641	if (desc->capture_ops)
1642		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
1643				desc->capture_ops);
1644
1645	snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
1646				       &codec->pci->dev, 64*1024, 128*1024);
1647
1648	pcm->info_flags = 0;
1649	pcm->dev_class = desc->class;
1650	pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
1651	strcpy(pcm->name, desc->name);
1652	codec->pcm[0] = pcm;
1653	return 0;
1654}
1655
1656static struct ali_pcm_description ali_pcms[] = {
1657	{ .name = "ALI 5451",
1658	  .playback_num = ALI_CHANNELS,
1659	  .capture_num = 1,
1660	  .playback_ops = &snd_ali_playback_ops,
1661	  .capture_ops = &snd_ali_capture_ops
1662	},
1663	{ .name = "ALI 5451 modem",
1664	  .playback_num = 1,
1665	  .capture_num = 1,
1666	  .playback_ops = &snd_ali_modem_playback_ops,
1667	  .capture_ops = &snd_ali_modem_capture_ops,
1668	  .class = SNDRV_PCM_CLASS_MODEM
1669	}
1670};
1671
1672static int snd_ali_build_pcms(struct snd_ali *codec)
1673{
1674	int i, err;
1675	for (i = 0; i < codec->num_of_codecs && i < ARRAY_SIZE(ali_pcms); i++) {
1676		err = snd_ali_pcm(codec, i, &ali_pcms[i]);
1677		if (err < 0)
1678			return err;
1679	}
1680	return 0;
1681}
1682
1683
1684#define ALI5451_SPDIF(xname, xindex, value) \
1685{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex,\
1686.info = snd_ali5451_spdif_info, .get = snd_ali5451_spdif_get, \
1687.put = snd_ali5451_spdif_put, .private_value = value}
1688
1689#define snd_ali5451_spdif_info		snd_ctl_boolean_mono_info
1690
1691static int snd_ali5451_spdif_get(struct snd_kcontrol *kcontrol,
1692				 struct snd_ctl_elem_value *ucontrol)
1693{
1694	struct snd_ali *codec = kcontrol->private_data;
1695	unsigned int spdif_enable;
1696
1697	spdif_enable = ucontrol->value.integer.value[0] ? 1 : 0;
1698
1699	spin_lock_irq(&codec->reg_lock);
1700	switch (kcontrol->private_value) {
1701	case 0:
1702		spdif_enable = (codec->spdif_mask & 0x02) ? 1 : 0;
1703		break;
1704	case 1:
1705		spdif_enable = ((codec->spdif_mask & 0x02) &&
1706			  (codec->spdif_mask & 0x04)) ? 1 : 0;
1707		break;
1708	case 2:
1709		spdif_enable = (codec->spdif_mask & 0x01) ? 1 : 0;
1710		break;
1711	default:
1712		break;
1713	}
1714	ucontrol->value.integer.value[0] = spdif_enable;
1715	spin_unlock_irq(&codec->reg_lock);
1716	return 0;
1717}
1718
1719static int snd_ali5451_spdif_put(struct snd_kcontrol *kcontrol,
1720				 struct snd_ctl_elem_value *ucontrol)
1721{
1722	struct snd_ali *codec = kcontrol->private_data;
1723	unsigned int change = 0, spdif_enable = 0;
1724
1725	spdif_enable = ucontrol->value.integer.value[0] ? 1 : 0;
1726
1727	spin_lock_irq(&codec->reg_lock);
1728	switch (kcontrol->private_value) {
1729	case 0:
1730		change = (codec->spdif_mask & 0x02) ? 1 : 0;
1731		change = change ^ spdif_enable;
1732		if (change) {
1733			if (spdif_enable) {
1734				codec->spdif_mask |= 0x02;
1735				snd_ali_enable_spdif_out(codec);
1736			} else {
1737				codec->spdif_mask &= ~(0x02);
1738				codec->spdif_mask &= ~(0x04);
1739				snd_ali_disable_spdif_out(codec);
1740			}
1741		}
1742		break;
1743	case 1:
1744		change = (codec->spdif_mask & 0x04) ? 1 : 0;
1745		change = change ^ spdif_enable;
1746		if (change && (codec->spdif_mask & 0x02)) {
1747			if (spdif_enable) {
1748				codec->spdif_mask |= 0x04;
1749				snd_ali_enable_spdif_chnout(codec);
1750			} else {
1751				codec->spdif_mask &= ~(0x04);
1752				snd_ali_disable_spdif_chnout(codec);
1753			}
1754		}
1755		break;
1756	case 2:
1757		change = (codec->spdif_mask & 0x01) ? 1 : 0;
1758		change = change ^ spdif_enable;
1759		if (change) {
1760			if (spdif_enable) {
1761				codec->spdif_mask |= 0x01;
1762				snd_ali_enable_spdif_in(codec);
1763			} else {
1764				codec->spdif_mask &= ~(0x01);
1765				snd_ali_disable_spdif_in(codec);
1766			}
1767		}
1768		break;
1769	default:
1770		break;
1771	}
1772	spin_unlock_irq(&codec->reg_lock);
1773
1774	return change;
1775}
1776
1777static const struct snd_kcontrol_new snd_ali5451_mixer_spdif[] = {
1778	/* spdif aplayback switch */
1779	/* FIXME: "IEC958 Playback Switch" may conflict with one on ac97_codec */
1780	ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH), 0, 0),
1781	/* spdif out to spdif channel */
1782	ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Channel Output ",NONE,SWITCH), 0, 1),
1783	/* spdif in from spdif channel */
1784	ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), 0, 2)
1785};
1786
1787static int snd_ali_mixer(struct snd_ali *codec)
1788{
1789	struct snd_ac97_template ac97;
1790	unsigned int idx;
1791	int i, err;
1792	static const struct snd_ac97_bus_ops ops = {
1793		.write = snd_ali_codec_write,
1794		.read = snd_ali_codec_read,
1795	};
1796
1797	err = snd_ac97_bus(codec->card, 0, &ops, codec, &codec->ac97_bus);
1798	if (err < 0)
1799		return err;
1800
1801	memset(&ac97, 0, sizeof(ac97));
1802	ac97.private_data = codec;
1803
1804	for (i = 0; i < codec->num_of_codecs; i++) {
1805		ac97.num = i;
1806		err = snd_ac97_mixer(codec->ac97_bus, &ac97, &codec->ac97[i]);
1807		if (err < 0) {
1808			dev_err(codec->card->dev,
1809				   "ali mixer %d creating error.\n", i);
1810			if (i == 0)
1811				return err;
1812			codec->num_of_codecs = 1;
1813			break;
1814		}
1815	}
1816
1817	if (codec->spdif_support) {
1818		for (idx = 0; idx < ARRAY_SIZE(snd_ali5451_mixer_spdif); idx++) {
1819			err = snd_ctl_add(codec->card,
1820					  snd_ctl_new1(&snd_ali5451_mixer_spdif[idx], codec));
1821			if (err < 0)
1822				return err;
1823		}
1824	}
1825	return 0;
1826}
1827
1828#ifdef CONFIG_PM_SLEEP
1829static int ali_suspend(struct device *dev)
1830{
1831	struct snd_card *card = dev_get_drvdata(dev);
1832	struct snd_ali *chip = card->private_data;
1833	struct snd_ali_image *im;
1834	int i, j;
1835
1836	im = chip->image;
1837	if (!im)
1838		return 0;
1839
1840	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1841	for (i = 0; i < chip->num_of_codecs; i++)
1842		snd_ac97_suspend(chip->ac97[i]);
1843
1844	spin_lock_irq(&chip->reg_lock);
1845
1846	im->regs[ALI_MISCINT >> 2] = inl(ALI_REG(chip, ALI_MISCINT));
1847	/* im->regs[ALI_START >> 2] = inl(ALI_REG(chip, ALI_START)); */
1848	im->regs[ALI_STOP >> 2] = inl(ALI_REG(chip, ALI_STOP));
1849
1850	/* disable all IRQ bits */
1851	outl(0, ALI_REG(chip, ALI_MISCINT));
1852
1853	for (i = 0; i < ALI_GLOBAL_REGS; i++) {
1854		if ((i*4 == ALI_MISCINT) || (i*4 == ALI_STOP))
1855			continue;
1856		im->regs[i] = inl(ALI_REG(chip, i*4));
1857	}
1858
1859	for (i = 0; i < ALI_CHANNELS; i++) {
1860		outb(i, ALI_REG(chip, ALI_GC_CIR));
1861		for (j = 0; j < ALI_CHANNEL_REGS; j++)
1862			im->channel_regs[i][j] = inl(ALI_REG(chip, j*4 + 0xe0));
1863	}
1864
1865	/* stop all HW channel */
1866	outl(0xffffffff, ALI_REG(chip, ALI_STOP));
1867
1868	spin_unlock_irq(&chip->reg_lock);
1869	return 0;
1870}
1871
1872static int ali_resume(struct device *dev)
1873{
1874	struct snd_card *card = dev_get_drvdata(dev);
1875	struct snd_ali *chip = card->private_data;
1876	struct snd_ali_image *im;
1877	int i, j;
1878
1879	im = chip->image;
1880	if (!im)
1881		return 0;
1882
1883	spin_lock_irq(&chip->reg_lock);
1884
1885	for (i = 0; i < ALI_CHANNELS; i++) {
1886		outb(i, ALI_REG(chip, ALI_GC_CIR));
1887		for (j = 0; j < ALI_CHANNEL_REGS; j++)
1888			outl(im->channel_regs[i][j], ALI_REG(chip, j*4 + 0xe0));
1889	}
1890
1891	for (i = 0; i < ALI_GLOBAL_REGS; i++) {
1892		if ((i*4 == ALI_MISCINT) || (i*4 == ALI_STOP) ||
1893		    (i*4 == ALI_START))
1894			continue;
1895		outl(im->regs[i], ALI_REG(chip, i*4));
1896	}
1897
1898	/* start HW channel */
1899	outl(im->regs[ALI_START >> 2], ALI_REG(chip, ALI_START));
1900	/* restore IRQ enable bits */
1901	outl(im->regs[ALI_MISCINT >> 2], ALI_REG(chip, ALI_MISCINT));
1902
1903	spin_unlock_irq(&chip->reg_lock);
1904
1905	for (i = 0 ; i < chip->num_of_codecs; i++)
1906		snd_ac97_resume(chip->ac97[i]);
1907
1908	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1909	return 0;
1910}
1911
1912static SIMPLE_DEV_PM_OPS(ali_pm, ali_suspend, ali_resume);
1913#define ALI_PM_OPS	&ali_pm
1914#else
1915#define ALI_PM_OPS	NULL
1916#endif /* CONFIG_PM_SLEEP */
1917
1918static int snd_ali_free(struct snd_ali * codec)
1919{
1920	if (codec->hw_initialized)
1921		snd_ali_disable_address_interrupt(codec);
1922	if (codec->irq >= 0)
1923		free_irq(codec->irq, codec);
1924	if (codec->port)
1925		pci_release_regions(codec->pci);
1926	pci_disable_device(codec->pci);
1927#ifdef CONFIG_PM_SLEEP
1928	kfree(codec->image);
1929#endif
1930	pci_dev_put(codec->pci_m1533);
1931	pci_dev_put(codec->pci_m7101);
1932	kfree(codec);
1933	return 0;
1934}
1935
1936static int snd_ali_chip_init(struct snd_ali *codec)
1937{
1938	unsigned int legacy;
1939	unsigned char temp;
1940	struct pci_dev *pci_dev;
1941
1942	dev_dbg(codec->card->dev, "chip initializing ...\n");
1943
1944	if (snd_ali_reset_5451(codec)) {
1945		dev_err(codec->card->dev, "ali_chip_init: reset 5451 error.\n");
1946		return -1;
1947	}
1948
1949	if (codec->revision == ALI_5451_V02) {
1950        	pci_dev = codec->pci_m1533;
1951		pci_read_config_byte(pci_dev, 0x59, &temp);
1952		temp |= 0x80;
1953		pci_write_config_byte(pci_dev, 0x59, temp);
1954
1955		pci_dev = codec->pci_m7101;
1956		pci_read_config_byte(pci_dev, 0xb8, &temp);
1957		temp |= 0x20;
1958		pci_write_config_byte(pci_dev, 0xB8, temp);
1959	}
1960
1961	pci_read_config_dword(codec->pci, 0x44, &legacy);
1962	legacy &= 0xff00ff00;
1963	legacy |= 0x000800aa;
1964	pci_write_config_dword(codec->pci, 0x44, legacy);
1965
1966	outl(0x80000001, ALI_REG(codec, ALI_GLOBAL_CONTROL));
1967	outl(0x00000000, ALI_REG(codec, ALI_AINTEN));
1968	outl(0xffffffff, ALI_REG(codec, ALI_AINT));
1969	outl(0x00000000, ALI_REG(codec, ALI_VOLUME));
1970	outb(0x10, 	 ALI_REG(codec, ALI_MPUR2));
1971
1972	codec->ac97_ext_id = snd_ali_codec_peek(codec, 0, AC97_EXTENDED_ID);
1973	codec->ac97_ext_status = snd_ali_codec_peek(codec, 0,
1974						    AC97_EXTENDED_STATUS);
1975	if (codec->spdif_support) {
1976		snd_ali_enable_spdif_out(codec);
1977		codec->spdif_mask = 0x00000002;
1978	}
1979
1980	codec->num_of_codecs = 1;
1981
1982	/* secondary codec - modem */
1983	if (inl(ALI_REG(codec, ALI_SCTRL)) & ALI_SCTRL_CODEC2_READY) {
1984		codec->num_of_codecs++;
1985		outl(inl(ALI_REG(codec, ALI_SCTRL)) |
1986		     (ALI_SCTRL_LINE_IN2 | ALI_SCTRL_GPIO_IN2 |
1987		      ALI_SCTRL_LINE_OUT_EN),
1988		     ALI_REG(codec, ALI_SCTRL));
1989	}
1990
1991	dev_dbg(codec->card->dev, "chip initialize succeed.\n");
1992	return 0;
1993
1994}
1995
1996/* proc for register dump */
1997static void snd_ali_proc_read(struct snd_info_entry *entry,
1998			      struct snd_info_buffer *buf)
1999{
2000	struct snd_ali *codec = entry->private_data;
2001	int i;
2002	for (i = 0; i < 256 ; i+= 4)
2003		snd_iprintf(buf, "%02x: %08x\n", i, inl(ALI_REG(codec, i)));
2004}
2005
2006static void snd_ali_proc_init(struct snd_ali *codec)
2007{
2008	snd_card_ro_proc_new(codec->card, "ali5451", codec, snd_ali_proc_read);
2009}
2010
2011static int snd_ali_resources(struct snd_ali *codec)
2012{
2013	int err;
2014
2015	dev_dbg(codec->card->dev, "resources allocation ...\n");
2016	err = pci_request_regions(codec->pci, "ALI 5451");
2017	if (err < 0)
2018		return err;
2019	codec->port = pci_resource_start(codec->pci, 0);
2020
2021	if (request_irq(codec->pci->irq, snd_ali_card_interrupt,
2022			IRQF_SHARED, KBUILD_MODNAME, codec)) {
2023		dev_err(codec->card->dev, "Unable to request irq.\n");
2024		return -EBUSY;
2025	}
2026	codec->irq = codec->pci->irq;
2027	codec->card->sync_irq = codec->irq;
2028	dev_dbg(codec->card->dev, "resources allocated.\n");
2029	return 0;
2030}
2031static int snd_ali_dev_free(struct snd_device *device)
2032{
2033	struct snd_ali *codec = device->device_data;
2034	snd_ali_free(codec);
2035	return 0;
2036}
2037
2038static int snd_ali_create(struct snd_card *card,
2039			  struct pci_dev *pci,
2040			  int pcm_streams,
2041			  int spdif_support,
2042			  struct snd_ali **r_ali)
2043{
2044	struct snd_ali *codec;
2045	int i, err;
2046	unsigned short cmdw;
2047	static const struct snd_device_ops ops = {
2048		.dev_free = snd_ali_dev_free,
2049        };
2050
2051	*r_ali = NULL;
2052
2053	dev_dbg(card->dev, "creating ...\n");
2054
2055	/* enable PCI device */
2056	err = pci_enable_device(pci);
2057	if (err < 0)
2058		return err;
2059	/* check, if we can restrict PCI DMA transfers to 31 bits */
2060	if (dma_set_mask(&pci->dev, DMA_BIT_MASK(31)) < 0 ||
2061	    dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(31)) < 0) {
2062		dev_err(card->dev,
2063			"architecture does not support 31bit PCI busmaster DMA\n");
2064		pci_disable_device(pci);
2065		return -ENXIO;
2066	}
2067
2068	codec = kzalloc(sizeof(*codec), GFP_KERNEL);
2069	if (!codec) {
2070		pci_disable_device(pci);
2071		return -ENOMEM;
2072	}
2073
2074	spin_lock_init(&codec->reg_lock);
2075	spin_lock_init(&codec->voice_alloc);
2076
2077	codec->card = card;
2078	codec->pci = pci;
2079	codec->irq = -1;
2080	codec->revision = pci->revision;
2081	codec->spdif_support = spdif_support;
2082
2083	if (pcm_streams < 1)
2084		pcm_streams = 1;
2085	if (pcm_streams > 32)
2086		pcm_streams = 32;
2087
2088	pci_set_master(pci);
2089	pci_read_config_word(pci, PCI_COMMAND, &cmdw);
2090	if ((cmdw & PCI_COMMAND_IO) != PCI_COMMAND_IO) {
2091		cmdw |= PCI_COMMAND_IO;
2092		pci_write_config_word(pci, PCI_COMMAND, cmdw);
2093	}
2094	pci_set_master(pci);
2095
2096	if (snd_ali_resources(codec)) {
2097		snd_ali_free(codec);
2098		return -EBUSY;
2099	}
2100
2101	codec->synth.chmap = 0;
2102	codec->synth.chcnt = 0;
2103	codec->spdif_mask = 0;
2104	codec->synth.synthcount = 0;
2105
2106	if (codec->revision == ALI_5451_V02)
2107		codec->chregs.regs.ac97read = ALI_AC97_WRITE;
2108	else
2109		codec->chregs.regs.ac97read = ALI_AC97_READ;
2110	codec->chregs.regs.ac97write = ALI_AC97_WRITE;
2111
2112	codec->chregs.regs.start  = ALI_START;
2113	codec->chregs.regs.stop   = ALI_STOP;
2114	codec->chregs.regs.aint   = ALI_AINT;
2115	codec->chregs.regs.ainten = ALI_AINTEN;
2116
2117	codec->chregs.data.start  = 0x00;
2118	codec->chregs.data.stop   = 0x00;
2119	codec->chregs.data.aint   = 0x00;
2120	codec->chregs.data.ainten = 0x00;
2121
2122	/* M1533: southbridge */
2123	codec->pci_m1533 = pci_get_device(0x10b9, 0x1533, NULL);
2124	if (!codec->pci_m1533) {
2125		dev_err(card->dev, "cannot find ALi 1533 chip.\n");
2126		snd_ali_free(codec);
2127		return -ENODEV;
2128	}
2129	/* M7101: power management */
2130	codec->pci_m7101 = pci_get_device(0x10b9, 0x7101, NULL);
2131	if (!codec->pci_m7101 && codec->revision == ALI_5451_V02) {
2132		dev_err(card->dev, "cannot find ALi 7101 chip.\n");
2133		snd_ali_free(codec);
2134		return -ENODEV;
2135	}
2136
2137	dev_dbg(card->dev, "snd_device_new is called.\n");
2138	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, codec, &ops);
2139	if (err < 0) {
2140		snd_ali_free(codec);
2141		return err;
2142	}
2143
2144	/* initialise synth voices*/
2145	for (i = 0; i < ALI_CHANNELS; i++)
2146		codec->synth.voices[i].number = i;
2147
2148	err = snd_ali_chip_init(codec);
2149	if (err < 0) {
2150		dev_err(card->dev, "ali create: chip init error.\n");
2151		return err;
2152	}
2153
2154#ifdef CONFIG_PM_SLEEP
2155	codec->image = kmalloc(sizeof(*codec->image), GFP_KERNEL);
2156	if (!codec->image)
2157		dev_warn(card->dev, "can't allocate apm buffer\n");
2158#endif
2159
2160	snd_ali_enable_address_interrupt(codec);
2161	codec->hw_initialized = 1;
2162
2163	*r_ali = codec;
2164	dev_dbg(card->dev, "created.\n");
2165	return 0;
2166}
2167
2168static int snd_ali_probe(struct pci_dev *pci,
2169			 const struct pci_device_id *pci_id)
2170{
2171	struct snd_card *card;
2172	struct snd_ali *codec;
2173	int err;
2174
2175	dev_dbg(&pci->dev, "probe ...\n");
2176
2177	err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card);
2178	if (err < 0)
2179		return err;
2180
2181	err = snd_ali_create(card, pci, pcm_channels, spdif, &codec);
2182	if (err < 0)
2183		goto error;
2184	card->private_data = codec;
2185
2186	dev_dbg(&pci->dev, "mixer building ...\n");
2187	err = snd_ali_mixer(codec);
2188	if (err < 0)
2189		goto error;
2190
2191	dev_dbg(&pci->dev, "pcm building ...\n");
2192	err = snd_ali_build_pcms(codec);
2193	if (err < 0)
2194		goto error;
2195
2196	snd_ali_proc_init(codec);
2197
2198	strcpy(card->driver, "ALI5451");
2199	strcpy(card->shortname, "ALI 5451");
2200
2201	sprintf(card->longname, "%s at 0x%lx, irq %i",
2202		card->shortname, codec->port, codec->irq);
2203
2204	dev_dbg(&pci->dev, "register card.\n");
2205	err = snd_card_register(card);
2206	if (err < 0)
2207		goto error;
2208
2209	pci_set_drvdata(pci, card);
2210	return 0;
2211
2212 error:
2213	snd_card_free(card);
2214	return err;
2215}
2216
2217static void snd_ali_remove(struct pci_dev *pci)
2218{
2219	snd_card_free(pci_get_drvdata(pci));
2220}
2221
2222static struct pci_driver ali5451_driver = {
2223	.name = KBUILD_MODNAME,
2224	.id_table = snd_ali_ids,
2225	.probe = snd_ali_probe,
2226	.remove = snd_ali_remove,
2227	.driver = {
2228		.pm = ALI_PM_OPS,
2229	},
2230};
2231
2232module_pci_driver(ali5451_driver);
2233