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