1/*
2 *   ALSA modem driver for VIA VT82xx (South Bridge)
3 *
4 *   VT82C686A/B/C, VT8233A/C, VT8235
5 *
6 *	Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
7 *	                   Tjeerd.Mulder <Tjeerd.Mulder@fujitsu-siemens.com>
8 *                    2002 Takashi Iwai <tiwai@suse.de>
9 *
10 *   This program is free software; you can redistribute it and/or modify
11 *   it under the terms of the GNU General Public License as published by
12 *   the Free Software Foundation; either version 2 of the License, or
13 *   (at your option) any later version.
14 *
15 *   This program is distributed in the hope that it will be useful,
16 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 *   GNU General Public License for more details.
19 *
20 *   You should have received a copy of the GNU General Public License
21 *   along with this program; if not, write to the Free Software
22 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23 *
24 */
25
26/*
27 * Changes:
28 *
29 * Sep. 2,  2004  Sasha Khapyorsky <sashak@alsa-project.org>
30 *      Modified from original audio driver 'via82xx.c' to support AC97
31 *      modems.
32 */
33
34#include <linux/io.h>
35#include <linux/delay.h>
36#include <linux/interrupt.h>
37#include <linux/init.h>
38#include <linux/pci.h>
39#include <linux/slab.h>
40#include <linux/module.h>
41#include <sound/core.h>
42#include <sound/pcm.h>
43#include <sound/pcm_params.h>
44#include <sound/info.h>
45#include <sound/ac97_codec.h>
46#include <sound/initval.h>
47
48#if 0
49#define POINTER_DEBUG
50#endif
51
52MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
53MODULE_DESCRIPTION("VIA VT82xx modem");
54MODULE_LICENSE("GPL");
55MODULE_SUPPORTED_DEVICE("{{VIA,VT82C686A/B/C modem,pci}}");
56
57static int index = -2; /* Exclude the first card */
58static char *id = SNDRV_DEFAULT_STR1;	/* ID for this card */
59static int ac97_clock = 48000;
60
61module_param(index, int, 0444);
62MODULE_PARM_DESC(index, "Index value for VIA 82xx bridge.");
63module_param(id, charp, 0444);
64MODULE_PARM_DESC(id, "ID string for VIA 82xx bridge.");
65module_param(ac97_clock, int, 0444);
66MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
67
68/* just for backward compatibility */
69static bool enable;
70module_param(enable, bool, 0444);
71
72
73/*
74 *  Direct registers
75 */
76
77#define VIAREG(via, x) ((via)->port + VIA_REG_##x)
78#define VIADEV_REG(viadev, x) ((viadev)->port + VIA_REG_##x)
79
80/* common offsets */
81#define VIA_REG_OFFSET_STATUS		0x00	/* byte - channel status */
82#define   VIA_REG_STAT_ACTIVE		0x80	/* RO */
83#define   VIA_REG_STAT_PAUSED		0x40	/* RO */
84#define   VIA_REG_STAT_TRIGGER_QUEUED	0x08	/* RO */
85#define   VIA_REG_STAT_STOPPED		0x04	/* RWC */
86#define   VIA_REG_STAT_EOL		0x02	/* RWC */
87#define   VIA_REG_STAT_FLAG		0x01	/* RWC */
88#define VIA_REG_OFFSET_CONTROL		0x01	/* byte - channel control */
89#define   VIA_REG_CTRL_START		0x80	/* WO */
90#define   VIA_REG_CTRL_TERMINATE	0x40	/* WO */
91#define   VIA_REG_CTRL_AUTOSTART	0x20
92#define   VIA_REG_CTRL_PAUSE		0x08	/* RW */
93#define   VIA_REG_CTRL_INT_STOP		0x04
94#define   VIA_REG_CTRL_INT_EOL		0x02
95#define   VIA_REG_CTRL_INT_FLAG		0x01
96#define   VIA_REG_CTRL_RESET		0x01	/* RW - probably reset? undocumented */
97#define   VIA_REG_CTRL_INT (VIA_REG_CTRL_INT_FLAG | VIA_REG_CTRL_INT_EOL | VIA_REG_CTRL_AUTOSTART)
98#define VIA_REG_OFFSET_TYPE		0x02	/* byte - channel type (686 only) */
99#define   VIA_REG_TYPE_AUTOSTART	0x80	/* RW - autostart at EOL */
100#define   VIA_REG_TYPE_16BIT		0x20	/* RW */
101#define   VIA_REG_TYPE_STEREO		0x10	/* RW */
102#define   VIA_REG_TYPE_INT_LLINE	0x00
103#define   VIA_REG_TYPE_INT_LSAMPLE	0x04
104#define   VIA_REG_TYPE_INT_LESSONE	0x08
105#define   VIA_REG_TYPE_INT_MASK		0x0c
106#define   VIA_REG_TYPE_INT_EOL		0x02
107#define   VIA_REG_TYPE_INT_FLAG		0x01
108#define VIA_REG_OFFSET_TABLE_PTR	0x04	/* dword - channel table pointer */
109#define VIA_REG_OFFSET_CURR_PTR		0x04	/* dword - channel current pointer */
110#define VIA_REG_OFFSET_STOP_IDX		0x08	/* dword - stop index, channel type, sample rate */
111#define VIA_REG_OFFSET_CURR_COUNT	0x0c	/* dword - channel current count (24 bit) */
112#define VIA_REG_OFFSET_CURR_INDEX	0x0f	/* byte - channel current index (for via8233 only) */
113
114#define DEFINE_VIA_REGSET(name,val) \
115enum {\
116	VIA_REG_##name##_STATUS		= (val),\
117	VIA_REG_##name##_CONTROL	= (val) + 0x01,\
118	VIA_REG_##name##_TYPE		= (val) + 0x02,\
119	VIA_REG_##name##_TABLE_PTR	= (val) + 0x04,\
120	VIA_REG_##name##_CURR_PTR	= (val) + 0x04,\
121	VIA_REG_##name##_STOP_IDX	= (val) + 0x08,\
122	VIA_REG_##name##_CURR_COUNT	= (val) + 0x0c,\
123}
124
125/* modem block */
126DEFINE_VIA_REGSET(MO, 0x40);
127DEFINE_VIA_REGSET(MI, 0x50);
128
129/* AC'97 */
130#define VIA_REG_AC97			0x80	/* dword */
131#define   VIA_REG_AC97_CODEC_ID_MASK	(3<<30)
132#define   VIA_REG_AC97_CODEC_ID_SHIFT	30
133#define   VIA_REG_AC97_CODEC_ID_PRIMARY	0x00
134#define   VIA_REG_AC97_CODEC_ID_SECONDARY 0x01
135#define   VIA_REG_AC97_SECONDARY_VALID	(1<<27)
136#define   VIA_REG_AC97_PRIMARY_VALID	(1<<25)
137#define   VIA_REG_AC97_BUSY		(1<<24)
138#define   VIA_REG_AC97_READ		(1<<23)
139#define   VIA_REG_AC97_CMD_SHIFT	16
140#define   VIA_REG_AC97_CMD_MASK		0x7e
141#define   VIA_REG_AC97_DATA_SHIFT	0
142#define   VIA_REG_AC97_DATA_MASK	0xffff
143
144#define VIA_REG_SGD_SHADOW		0x84	/* dword */
145#define   VIA_REG_SGD_STAT_PB_FLAG	(1<<0)
146#define   VIA_REG_SGD_STAT_CP_FLAG	(1<<1)
147#define   VIA_REG_SGD_STAT_FM_FLAG	(1<<2)
148#define   VIA_REG_SGD_STAT_PB_EOL	(1<<4)
149#define   VIA_REG_SGD_STAT_CP_EOL	(1<<5)
150#define   VIA_REG_SGD_STAT_FM_EOL	(1<<6)
151#define   VIA_REG_SGD_STAT_PB_STOP	(1<<8)
152#define   VIA_REG_SGD_STAT_CP_STOP	(1<<9)
153#define   VIA_REG_SGD_STAT_FM_STOP	(1<<10)
154#define   VIA_REG_SGD_STAT_PB_ACTIVE	(1<<12)
155#define   VIA_REG_SGD_STAT_CP_ACTIVE	(1<<13)
156#define   VIA_REG_SGD_STAT_FM_ACTIVE	(1<<14)
157#define   VIA_REG_SGD_STAT_MR_FLAG      (1<<16)
158#define   VIA_REG_SGD_STAT_MW_FLAG      (1<<17)
159#define   VIA_REG_SGD_STAT_MR_EOL       (1<<20)
160#define   VIA_REG_SGD_STAT_MW_EOL       (1<<21)
161#define   VIA_REG_SGD_STAT_MR_STOP      (1<<24)
162#define   VIA_REG_SGD_STAT_MW_STOP      (1<<25)
163#define   VIA_REG_SGD_STAT_MR_ACTIVE    (1<<28)
164#define   VIA_REG_SGD_STAT_MW_ACTIVE    (1<<29)
165
166#define VIA_REG_GPI_STATUS		0x88
167#define VIA_REG_GPI_INTR		0x8c
168
169#define VIA_TBL_BIT_FLAG	0x40000000
170#define VIA_TBL_BIT_EOL		0x80000000
171
172/* pci space */
173#define VIA_ACLINK_STAT		0x40
174#define  VIA_ACLINK_C11_READY	0x20
175#define  VIA_ACLINK_C10_READY	0x10
176#define  VIA_ACLINK_C01_READY	0x04 /* secondary codec ready */
177#define  VIA_ACLINK_LOWPOWER	0x02 /* low-power state */
178#define  VIA_ACLINK_C00_READY	0x01 /* primary codec ready */
179#define VIA_ACLINK_CTRL		0x41
180#define  VIA_ACLINK_CTRL_ENABLE	0x80 /* 0: disable, 1: enable */
181#define  VIA_ACLINK_CTRL_RESET	0x40 /* 0: assert, 1: de-assert */
182#define  VIA_ACLINK_CTRL_SYNC	0x20 /* 0: release SYNC, 1: force SYNC hi */
183#define  VIA_ACLINK_CTRL_SDO	0x10 /* 0: release SDO, 1: force SDO hi */
184#define  VIA_ACLINK_CTRL_VRA	0x08 /* 0: disable VRA, 1: enable VRA */
185#define  VIA_ACLINK_CTRL_PCM	0x04 /* 0: disable PCM, 1: enable PCM */
186#define  VIA_ACLINK_CTRL_FM	0x02 /* via686 only */
187#define  VIA_ACLINK_CTRL_SB	0x01 /* via686 only */
188#define  VIA_ACLINK_CTRL_INIT	(VIA_ACLINK_CTRL_ENABLE|\
189				 VIA_ACLINK_CTRL_RESET|\
190				 VIA_ACLINK_CTRL_PCM)
191#define VIA_FUNC_ENABLE		0x42
192#define  VIA_FUNC_MIDI_PNP	0x80 /* FIXME: it's 0x40 in the datasheet! */
193#define  VIA_FUNC_MIDI_IRQMASK	0x40 /* FIXME: not documented! */
194#define  VIA_FUNC_RX2C_WRITE	0x20
195#define  VIA_FUNC_SB_FIFO_EMPTY	0x10
196#define  VIA_FUNC_ENABLE_GAME	0x08
197#define  VIA_FUNC_ENABLE_FM	0x04
198#define  VIA_FUNC_ENABLE_MIDI	0x02
199#define  VIA_FUNC_ENABLE_SB	0x01
200#define VIA_PNP_CONTROL		0x43
201#define VIA_MC97_CTRL		0x44
202#define  VIA_MC97_CTRL_ENABLE   0x80
203#define  VIA_MC97_CTRL_SECONDARY 0x40
204#define  VIA_MC97_CTRL_INIT     (VIA_MC97_CTRL_ENABLE|\
205                                 VIA_MC97_CTRL_SECONDARY)
206
207
208/*
209 * pcm stream
210 */
211
212struct snd_via_sg_table {
213	unsigned int offset;
214	unsigned int size;
215} ;
216
217#define VIA_TABLE_SIZE	255
218
219struct viadev {
220	unsigned int reg_offset;
221	unsigned long port;
222	int direction;	/* playback = 0, capture = 1 */
223        struct snd_pcm_substream *substream;
224	int running;
225	unsigned int tbl_entries; /* # descriptors */
226	struct snd_dma_buffer table;
227	struct snd_via_sg_table *idx_table;
228	/* for recovery from the unexpected pointer */
229	unsigned int lastpos;
230	unsigned int bufsize;
231	unsigned int bufsize2;
232};
233
234enum { TYPE_CARD_VIA82XX_MODEM = 1 };
235
236#define VIA_MAX_MODEM_DEVS	2
237
238struct via82xx_modem {
239	int irq;
240
241	unsigned long port;
242
243	unsigned int intr_mask; /* SGD_SHADOW mask to check interrupts */
244
245	struct pci_dev *pci;
246	struct snd_card *card;
247
248	unsigned int num_devs;
249	unsigned int playback_devno, capture_devno;
250	struct viadev devs[VIA_MAX_MODEM_DEVS];
251
252	struct snd_pcm *pcms[2];
253
254	struct snd_ac97_bus *ac97_bus;
255	struct snd_ac97 *ac97;
256	unsigned int ac97_clock;
257	unsigned int ac97_secondary;	/* secondary AC'97 codec is present */
258
259	spinlock_t reg_lock;
260	struct snd_info_entry *proc_entry;
261};
262
263static const struct pci_device_id snd_via82xx_modem_ids[] = {
264	{ PCI_VDEVICE(VIA, 0x3068), TYPE_CARD_VIA82XX_MODEM, },
265	{ 0, }
266};
267
268MODULE_DEVICE_TABLE(pci, snd_via82xx_modem_ids);
269
270/*
271 */
272
273/*
274 * allocate and initialize the descriptor buffers
275 * periods = number of periods
276 * fragsize = period size in bytes
277 */
278static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substream,
279			   struct pci_dev *pci,
280			   unsigned int periods, unsigned int fragsize)
281{
282	unsigned int i, idx, ofs, rest;
283	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
284
285	if (dev->table.area == NULL) {
286		/* the start of each lists must be aligned to 8 bytes,
287		 * but the kernel pages are much bigger, so we don't care
288		 */
289		if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
290					PAGE_ALIGN(VIA_TABLE_SIZE * 2 * 8),
291					&dev->table) < 0)
292			return -ENOMEM;
293	}
294	if (! dev->idx_table) {
295		dev->idx_table = kmalloc(sizeof(*dev->idx_table) * VIA_TABLE_SIZE, GFP_KERNEL);
296		if (! dev->idx_table)
297			return -ENOMEM;
298	}
299
300	/* fill the entries */
301	idx = 0;
302	ofs = 0;
303	for (i = 0; i < periods; i++) {
304		rest = fragsize;
305		/* fill descriptors for a period.
306		 * a period can be split to several descriptors if it's
307		 * over page boundary.
308		 */
309		do {
310			unsigned int r;
311			unsigned int flag;
312			unsigned int addr;
313
314			if (idx >= VIA_TABLE_SIZE) {
315				dev_err(&pci->dev, "too much table size!\n");
316				return -EINVAL;
317			}
318			addr = snd_pcm_sgbuf_get_addr(substream, ofs);
319			((u32 *)dev->table.area)[idx << 1] = cpu_to_le32(addr);
320			r = PAGE_SIZE - (ofs % PAGE_SIZE);
321			if (rest < r)
322				r = rest;
323			rest -= r;
324			if (! rest) {
325				if (i == periods - 1)
326					flag = VIA_TBL_BIT_EOL; /* buffer boundary */
327				else
328					flag = VIA_TBL_BIT_FLAG; /* period boundary */
329			} else
330				flag = 0; /* period continues to the next */
331			/*
332			dev_dbg(&pci->dev,
333				"tbl %d: at %d  size %d (rest %d)\n",
334				idx, ofs, r, rest);
335			*/
336			((u32 *)dev->table.area)[(idx<<1) + 1] = cpu_to_le32(r | flag);
337			dev->idx_table[idx].offset = ofs;
338			dev->idx_table[idx].size = r;
339			ofs += r;
340			idx++;
341		} while (rest > 0);
342	}
343	dev->tbl_entries = idx;
344	dev->bufsize = periods * fragsize;
345	dev->bufsize2 = dev->bufsize / 2;
346	return 0;
347}
348
349
350static int clean_via_table(struct viadev *dev, struct snd_pcm_substream *substream,
351			   struct pci_dev *pci)
352{
353	if (dev->table.area) {
354		snd_dma_free_pages(&dev->table);
355		dev->table.area = NULL;
356	}
357	kfree(dev->idx_table);
358	dev->idx_table = NULL;
359	return 0;
360}
361
362/*
363 *  Basic I/O
364 */
365
366static inline unsigned int snd_via82xx_codec_xread(struct via82xx_modem *chip)
367{
368	return inl(VIAREG(chip, AC97));
369}
370
371static inline void snd_via82xx_codec_xwrite(struct via82xx_modem *chip, unsigned int val)
372{
373	outl(val, VIAREG(chip, AC97));
374}
375
376static int snd_via82xx_codec_ready(struct via82xx_modem *chip, int secondary)
377{
378	unsigned int timeout = 1000;	/* 1ms */
379	unsigned int val;
380
381	while (timeout-- > 0) {
382		udelay(1);
383		if (!((val = snd_via82xx_codec_xread(chip)) & VIA_REG_AC97_BUSY))
384			return val & 0xffff;
385	}
386	dev_err(chip->card->dev, "codec_ready: codec %i is not ready [0x%x]\n",
387		   secondary, snd_via82xx_codec_xread(chip));
388	return -EIO;
389}
390
391static int snd_via82xx_codec_valid(struct via82xx_modem *chip, int secondary)
392{
393	unsigned int timeout = 1000;	/* 1ms */
394	unsigned int val, val1;
395	unsigned int stat = !secondary ? VIA_REG_AC97_PRIMARY_VALID :
396					 VIA_REG_AC97_SECONDARY_VALID;
397
398	while (timeout-- > 0) {
399		val = snd_via82xx_codec_xread(chip);
400		val1 = val & (VIA_REG_AC97_BUSY | stat);
401		if (val1 == stat)
402			return val & 0xffff;
403		udelay(1);
404	}
405	return -EIO;
406}
407
408static void snd_via82xx_codec_wait(struct snd_ac97 *ac97)
409{
410	struct via82xx_modem *chip = ac97->private_data;
411	int err;
412	err = snd_via82xx_codec_ready(chip, ac97->num);
413	/* here we need to wait fairly for long time.. */
414	msleep(500);
415}
416
417static void snd_via82xx_codec_write(struct snd_ac97 *ac97,
418				    unsigned short reg,
419				    unsigned short val)
420{
421	struct via82xx_modem *chip = ac97->private_data;
422	unsigned int xval;
423	if(reg == AC97_GPIO_STATUS) {
424		outl(val, VIAREG(chip, GPI_STATUS));
425		return;
426	}
427	xval = !ac97->num ? VIA_REG_AC97_CODEC_ID_PRIMARY : VIA_REG_AC97_CODEC_ID_SECONDARY;
428	xval <<= VIA_REG_AC97_CODEC_ID_SHIFT;
429	xval |= reg << VIA_REG_AC97_CMD_SHIFT;
430	xval |= val << VIA_REG_AC97_DATA_SHIFT;
431	snd_via82xx_codec_xwrite(chip, xval);
432	snd_via82xx_codec_ready(chip, ac97->num);
433}
434
435static unsigned short snd_via82xx_codec_read(struct snd_ac97 *ac97, unsigned short reg)
436{
437	struct via82xx_modem *chip = ac97->private_data;
438	unsigned int xval, val = 0xffff;
439	int again = 0;
440
441	xval = ac97->num << VIA_REG_AC97_CODEC_ID_SHIFT;
442	xval |= ac97->num ? VIA_REG_AC97_SECONDARY_VALID : VIA_REG_AC97_PRIMARY_VALID;
443	xval |= VIA_REG_AC97_READ;
444	xval |= (reg & 0x7f) << VIA_REG_AC97_CMD_SHIFT;
445      	while (1) {
446      		if (again++ > 3) {
447			dev_err(chip->card->dev,
448				"codec_read: codec %i is not valid [0x%x]\n",
449				   ac97->num, snd_via82xx_codec_xread(chip));
450		      	return 0xffff;
451		}
452		snd_via82xx_codec_xwrite(chip, xval);
453		udelay (20);
454		if (snd_via82xx_codec_valid(chip, ac97->num) >= 0) {
455			udelay(25);
456			val = snd_via82xx_codec_xread(chip);
457			break;
458		}
459	}
460	return val & 0xffff;
461}
462
463static void snd_via82xx_channel_reset(struct via82xx_modem *chip, struct viadev *viadev)
464{
465	outb(VIA_REG_CTRL_PAUSE | VIA_REG_CTRL_TERMINATE | VIA_REG_CTRL_RESET,
466	     VIADEV_REG(viadev, OFFSET_CONTROL));
467	inb(VIADEV_REG(viadev, OFFSET_CONTROL));
468	udelay(50);
469	/* disable interrupts */
470	outb(0x00, VIADEV_REG(viadev, OFFSET_CONTROL));
471	/* clear interrupts */
472	outb(0x03, VIADEV_REG(viadev, OFFSET_STATUS));
473	outb(0x00, VIADEV_REG(viadev, OFFSET_TYPE)); /* for via686 */
474	// outl(0, VIADEV_REG(viadev, OFFSET_CURR_PTR));
475	viadev->lastpos = 0;
476}
477
478
479/*
480 *  Interrupt handler
481 */
482
483static irqreturn_t snd_via82xx_interrupt(int irq, void *dev_id)
484{
485	struct via82xx_modem *chip = dev_id;
486	unsigned int status;
487	unsigned int i;
488
489	status = inl(VIAREG(chip, SGD_SHADOW));
490	if (! (status & chip->intr_mask)) {
491		return IRQ_NONE;
492	}
493// _skip_sgd:
494
495	/* check status for each stream */
496	spin_lock(&chip->reg_lock);
497	for (i = 0; i < chip->num_devs; i++) {
498		struct viadev *viadev = &chip->devs[i];
499		unsigned char c_status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
500		c_status &= (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG|VIA_REG_STAT_STOPPED);
501		if (! c_status)
502			continue;
503		if (viadev->substream && viadev->running) {
504			spin_unlock(&chip->reg_lock);
505			snd_pcm_period_elapsed(viadev->substream);
506			spin_lock(&chip->reg_lock);
507		}
508		outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
509	}
510	spin_unlock(&chip->reg_lock);
511	return IRQ_HANDLED;
512}
513
514/*
515 *  PCM callbacks
516 */
517
518/*
519 * trigger callback
520 */
521static int snd_via82xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
522{
523	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
524	struct viadev *viadev = substream->runtime->private_data;
525	unsigned char val = 0;
526
527	switch (cmd) {
528	case SNDRV_PCM_TRIGGER_START:
529	case SNDRV_PCM_TRIGGER_SUSPEND:
530		val |= VIA_REG_CTRL_START;
531		viadev->running = 1;
532		break;
533	case SNDRV_PCM_TRIGGER_STOP:
534		val = VIA_REG_CTRL_TERMINATE;
535		viadev->running = 0;
536		break;
537	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
538		val |= VIA_REG_CTRL_PAUSE;
539		viadev->running = 0;
540		break;
541	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
542		viadev->running = 1;
543		break;
544	default:
545		return -EINVAL;
546	}
547	outb(val, VIADEV_REG(viadev, OFFSET_CONTROL));
548	if (cmd == SNDRV_PCM_TRIGGER_STOP)
549		snd_via82xx_channel_reset(chip, viadev);
550	return 0;
551}
552
553/*
554 * pointer callbacks
555 */
556
557/*
558 * calculate the linear position at the given sg-buffer index and the rest count
559 */
560
561#define check_invalid_pos(viadev,pos) \
562	((pos) < viadev->lastpos && ((pos) >= viadev->bufsize2 ||\
563				     viadev->lastpos < viadev->bufsize2))
564
565static inline unsigned int calc_linear_pos(struct via82xx_modem *chip,
566					   struct viadev *viadev,
567					   unsigned int idx,
568					   unsigned int count)
569{
570	unsigned int size, res;
571
572	size = viadev->idx_table[idx].size;
573	res = viadev->idx_table[idx].offset + size - count;
574
575	/* check the validity of the calculated position */
576	if (size < count) {
577		dev_err(chip->card->dev,
578			"invalid via82xx_cur_ptr (size = %d, count = %d)\n",
579			   (int)size, (int)count);
580		res = viadev->lastpos;
581	} else if (check_invalid_pos(viadev, res)) {
582#ifdef POINTER_DEBUG
583		dev_dbg(chip->card->dev,
584			"fail: idx = %i/%i, lastpos = 0x%x, bufsize2 = 0x%x, offsize = 0x%x, size = 0x%x, count = 0x%x\n",
585			idx, viadev->tbl_entries, viadev->lastpos,
586		       viadev->bufsize2, viadev->idx_table[idx].offset,
587		       viadev->idx_table[idx].size, count);
588#endif
589		if (count && size < count) {
590			dev_dbg(chip->card->dev,
591				"invalid via82xx_cur_ptr, using last valid pointer\n");
592			res = viadev->lastpos;
593		} else {
594			if (! count)
595				/* bogus count 0 on the DMA boundary? */
596				res = viadev->idx_table[idx].offset;
597			else
598				/* count register returns full size
599				 * when end of buffer is reached
600				 */
601				res = viadev->idx_table[idx].offset + size;
602			if (check_invalid_pos(viadev, res)) {
603				dev_dbg(chip->card->dev,
604					"invalid via82xx_cur_ptr (2), using last valid pointer\n");
605				res = viadev->lastpos;
606			}
607		}
608	}
609	viadev->lastpos = res; /* remember the last position */
610	if (res >= viadev->bufsize)
611		res -= viadev->bufsize;
612	return res;
613}
614
615/*
616 * get the current pointer on via686
617 */
618static snd_pcm_uframes_t snd_via686_pcm_pointer(struct snd_pcm_substream *substream)
619{
620	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
621	struct viadev *viadev = substream->runtime->private_data;
622	unsigned int idx, ptr, count, res;
623
624	if (snd_BUG_ON(!viadev->tbl_entries))
625		return 0;
626	if (!(inb(VIADEV_REG(viadev, OFFSET_STATUS)) & VIA_REG_STAT_ACTIVE))
627		return 0;
628
629	spin_lock(&chip->reg_lock);
630	count = inl(VIADEV_REG(viadev, OFFSET_CURR_COUNT)) & 0xffffff;
631	/* The via686a does not have the current index register,
632	 * so we need to calculate the index from CURR_PTR.
633	 */
634	ptr = inl(VIADEV_REG(viadev, OFFSET_CURR_PTR));
635	if (ptr <= (unsigned int)viadev->table.addr)
636		idx = 0;
637	else /* CURR_PTR holds the address + 8 */
638		idx = ((ptr - (unsigned int)viadev->table.addr) / 8 - 1) %
639			viadev->tbl_entries;
640	res = calc_linear_pos(chip, viadev, idx, count);
641	spin_unlock(&chip->reg_lock);
642
643	return bytes_to_frames(substream->runtime, res);
644}
645
646/*
647 * hw_params callback:
648 * allocate the buffer and build up the buffer description table
649 */
650static int snd_via82xx_hw_params(struct snd_pcm_substream *substream,
651				 struct snd_pcm_hw_params *hw_params)
652{
653	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
654	struct viadev *viadev = substream->runtime->private_data;
655	int err;
656
657	err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
658	if (err < 0)
659		return err;
660	err = build_via_table(viadev, substream, chip->pci,
661			      params_periods(hw_params),
662			      params_period_bytes(hw_params));
663	if (err < 0)
664		return err;
665
666	snd_ac97_write(chip->ac97, AC97_LINE1_RATE, params_rate(hw_params));
667	snd_ac97_write(chip->ac97, AC97_LINE1_LEVEL, 0);
668
669	return 0;
670}
671
672/*
673 * hw_free callback:
674 * clean up the buffer description table and release the buffer
675 */
676static int snd_via82xx_hw_free(struct snd_pcm_substream *substream)
677{
678	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
679	struct viadev *viadev = substream->runtime->private_data;
680
681	clean_via_table(viadev, substream, chip->pci);
682	snd_pcm_lib_free_pages(substream);
683	return 0;
684}
685
686
687/*
688 * set up the table pointer
689 */
690static void snd_via82xx_set_table_ptr(struct via82xx_modem *chip, struct viadev *viadev)
691{
692	snd_via82xx_codec_ready(chip, chip->ac97_secondary);
693	outl((u32)viadev->table.addr, VIADEV_REG(viadev, OFFSET_TABLE_PTR));
694	udelay(20);
695	snd_via82xx_codec_ready(chip, chip->ac97_secondary);
696}
697
698/*
699 * prepare callback for playback and capture
700 */
701static int snd_via82xx_pcm_prepare(struct snd_pcm_substream *substream)
702{
703	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
704	struct viadev *viadev = substream->runtime->private_data;
705
706	snd_via82xx_channel_reset(chip, viadev);
707	/* this must be set after channel_reset */
708	snd_via82xx_set_table_ptr(chip, viadev);
709	outb(VIA_REG_TYPE_AUTOSTART|VIA_REG_TYPE_INT_EOL|VIA_REG_TYPE_INT_FLAG,
710	     VIADEV_REG(viadev, OFFSET_TYPE));
711	return 0;
712}
713
714/*
715 * pcm hardware definition, identical for both playback and capture
716 */
717static struct snd_pcm_hardware snd_via82xx_hw =
718{
719	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
720				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
721				 SNDRV_PCM_INFO_MMAP_VALID |
722				 /* SNDRV_PCM_INFO_RESUME | */
723				 SNDRV_PCM_INFO_PAUSE),
724	.formats =		SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
725	.rates =		SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_KNOT,
726	.rate_min =		8000,
727	.rate_max =		16000,
728	.channels_min =		1,
729	.channels_max =		1,
730	.buffer_bytes_max =	128 * 1024,
731	.period_bytes_min =	32,
732	.period_bytes_max =	128 * 1024,
733	.periods_min =		2,
734	.periods_max =		VIA_TABLE_SIZE / 2,
735	.fifo_size =		0,
736};
737
738
739/*
740 * open callback skeleton
741 */
742static int snd_via82xx_modem_pcm_open(struct via82xx_modem *chip, struct viadev *viadev,
743				      struct snd_pcm_substream *substream)
744{
745	struct snd_pcm_runtime *runtime = substream->runtime;
746	int err;
747        static unsigned int rates[] = { 8000,  9600, 12000, 16000 };
748        static struct snd_pcm_hw_constraint_list hw_constraints_rates = {
749                .count = ARRAY_SIZE(rates),
750                .list = rates,
751                .mask = 0,
752        };
753
754	runtime->hw = snd_via82xx_hw;
755
756        if ((err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
757					      &hw_constraints_rates)) < 0)
758                return err;
759
760	/* we may remove following constaint when we modify table entries
761	   in interrupt */
762	if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
763		return err;
764
765	runtime->private_data = viadev;
766	viadev->substream = substream;
767
768	return 0;
769}
770
771
772/*
773 * open callback for playback
774 */
775static int snd_via82xx_playback_open(struct snd_pcm_substream *substream)
776{
777	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
778	struct viadev *viadev = &chip->devs[chip->playback_devno + substream->number];
779
780	return snd_via82xx_modem_pcm_open(chip, viadev, substream);
781}
782
783/*
784 * open callback for capture
785 */
786static int snd_via82xx_capture_open(struct snd_pcm_substream *substream)
787{
788	struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
789	struct viadev *viadev = &chip->devs[chip->capture_devno + substream->pcm->device];
790
791	return snd_via82xx_modem_pcm_open(chip, viadev, substream);
792}
793
794/*
795 * close callback
796 */
797static int snd_via82xx_pcm_close(struct snd_pcm_substream *substream)
798{
799	struct viadev *viadev = substream->runtime->private_data;
800
801	viadev->substream = NULL;
802	return 0;
803}
804
805
806/* via686 playback callbacks */
807static struct snd_pcm_ops snd_via686_playback_ops = {
808	.open =		snd_via82xx_playback_open,
809	.close =	snd_via82xx_pcm_close,
810	.ioctl =	snd_pcm_lib_ioctl,
811	.hw_params =	snd_via82xx_hw_params,
812	.hw_free =	snd_via82xx_hw_free,
813	.prepare =	snd_via82xx_pcm_prepare,
814	.trigger =	snd_via82xx_pcm_trigger,
815	.pointer =	snd_via686_pcm_pointer,
816	.page =		snd_pcm_sgbuf_ops_page,
817};
818
819/* via686 capture callbacks */
820static struct snd_pcm_ops snd_via686_capture_ops = {
821	.open =		snd_via82xx_capture_open,
822	.close =	snd_via82xx_pcm_close,
823	.ioctl =	snd_pcm_lib_ioctl,
824	.hw_params =	snd_via82xx_hw_params,
825	.hw_free =	snd_via82xx_hw_free,
826	.prepare =	snd_via82xx_pcm_prepare,
827	.trigger =	snd_via82xx_pcm_trigger,
828	.pointer =	snd_via686_pcm_pointer,
829	.page =		snd_pcm_sgbuf_ops_page,
830};
831
832
833static void init_viadev(struct via82xx_modem *chip, int idx, unsigned int reg_offset,
834			int direction)
835{
836	chip->devs[idx].reg_offset = reg_offset;
837	chip->devs[idx].direction = direction;
838	chip->devs[idx].port = chip->port + reg_offset;
839}
840
841/*
842 * create a pcm instance for via686a/b
843 */
844static int snd_via686_pcm_new(struct via82xx_modem *chip)
845{
846	struct snd_pcm *pcm;
847	int err;
848
849	chip->playback_devno = 0;
850	chip->capture_devno = 1;
851	chip->num_devs = 2;
852	chip->intr_mask = 0x330000; /* FLAGS | EOL for MR, MW */
853
854	err = snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 1, &pcm);
855	if (err < 0)
856		return err;
857	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via686_playback_ops);
858	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via686_capture_ops);
859	pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
860	pcm->private_data = chip;
861	strcpy(pcm->name, chip->card->shortname);
862	chip->pcms[0] = pcm;
863	init_viadev(chip, 0, VIA_REG_MO_STATUS, 0);
864	init_viadev(chip, 1, VIA_REG_MI_STATUS, 1);
865
866	if ((err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
867							 snd_dma_pci_data(chip->pci),
868							 64*1024, 128*1024)) < 0)
869		return err;
870
871	return 0;
872}
873
874
875/*
876 *  Mixer part
877 */
878
879
880static void snd_via82xx_mixer_free_ac97_bus(struct snd_ac97_bus *bus)
881{
882	struct via82xx_modem *chip = bus->private_data;
883	chip->ac97_bus = NULL;
884}
885
886static void snd_via82xx_mixer_free_ac97(struct snd_ac97 *ac97)
887{
888	struct via82xx_modem *chip = ac97->private_data;
889	chip->ac97 = NULL;
890}
891
892
893static int snd_via82xx_mixer_new(struct via82xx_modem *chip)
894{
895	struct snd_ac97_template ac97;
896	int err;
897	static struct snd_ac97_bus_ops ops = {
898		.write = snd_via82xx_codec_write,
899		.read = snd_via82xx_codec_read,
900		.wait = snd_via82xx_codec_wait,
901	};
902
903	if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus)) < 0)
904		return err;
905	chip->ac97_bus->private_free = snd_via82xx_mixer_free_ac97_bus;
906	chip->ac97_bus->clock = chip->ac97_clock;
907
908	memset(&ac97, 0, sizeof(ac97));
909	ac97.private_data = chip;
910	ac97.private_free = snd_via82xx_mixer_free_ac97;
911	ac97.pci = chip->pci;
912	ac97.scaps = AC97_SCAP_SKIP_AUDIO | AC97_SCAP_POWER_SAVE;
913	ac97.num = chip->ac97_secondary;
914
915	if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97)) < 0)
916		return err;
917
918	return 0;
919}
920
921
922/*
923 * proc interface
924 */
925static void snd_via82xx_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
926{
927	struct via82xx_modem *chip = entry->private_data;
928	int i;
929
930	snd_iprintf(buffer, "%s\n\n", chip->card->longname);
931	for (i = 0; i < 0xa0; i += 4) {
932		snd_iprintf(buffer, "%02x: %08x\n", i, inl(chip->port + i));
933	}
934}
935
936static void snd_via82xx_proc_init(struct via82xx_modem *chip)
937{
938	struct snd_info_entry *entry;
939
940	if (! snd_card_proc_new(chip->card, "via82xx", &entry))
941		snd_info_set_text_ops(entry, chip, snd_via82xx_proc_read);
942}
943
944/*
945 *
946 */
947
948static int snd_via82xx_chip_init(struct via82xx_modem *chip)
949{
950	unsigned int val;
951	unsigned long end_time;
952	unsigned char pval;
953
954	pci_read_config_byte(chip->pci, VIA_MC97_CTRL, &pval);
955	if((pval & VIA_MC97_CTRL_INIT) != VIA_MC97_CTRL_INIT) {
956		pci_write_config_byte(chip->pci, 0x44, pval|VIA_MC97_CTRL_INIT);
957		udelay(100);
958	}
959
960	pci_read_config_byte(chip->pci, VIA_ACLINK_STAT, &pval);
961	if (! (pval & VIA_ACLINK_C00_READY)) { /* codec not ready? */
962		/* deassert ACLink reset, force SYNC */
963		pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL,
964				      VIA_ACLINK_CTRL_ENABLE |
965				      VIA_ACLINK_CTRL_RESET |
966				      VIA_ACLINK_CTRL_SYNC);
967		udelay(100);
968#if 1 /* FIXME: should we do full reset here for all chip models? */
969		pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, 0x00);
970		udelay(100);
971#else
972		/* deassert ACLink reset, force SYNC (warm AC'97 reset) */
973		pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL,
974				      VIA_ACLINK_CTRL_RESET|VIA_ACLINK_CTRL_SYNC);
975		udelay(2);
976#endif
977		/* ACLink on, deassert ACLink reset, VSR, SGD data out */
978		pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, VIA_ACLINK_CTRL_INIT);
979		udelay(100);
980	}
981
982	pci_read_config_byte(chip->pci, VIA_ACLINK_CTRL, &pval);
983	if ((pval & VIA_ACLINK_CTRL_INIT) != VIA_ACLINK_CTRL_INIT) {
984		/* ACLink on, deassert ACLink reset, VSR, SGD data out */
985		pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, VIA_ACLINK_CTRL_INIT);
986		udelay(100);
987	}
988
989	/* wait until codec ready */
990	end_time = jiffies + msecs_to_jiffies(750);
991	do {
992		pci_read_config_byte(chip->pci, VIA_ACLINK_STAT, &pval);
993		if (pval & VIA_ACLINK_C00_READY) /* primary codec ready */
994			break;
995		schedule_timeout_uninterruptible(1);
996	} while (time_before(jiffies, end_time));
997
998	if ((val = snd_via82xx_codec_xread(chip)) & VIA_REG_AC97_BUSY)
999		dev_err(chip->card->dev,
1000			"AC'97 codec is not ready [0x%x]\n", val);
1001
1002	snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ |
1003				 VIA_REG_AC97_SECONDARY_VALID |
1004				 (VIA_REG_AC97_CODEC_ID_SECONDARY << VIA_REG_AC97_CODEC_ID_SHIFT));
1005	end_time = jiffies + msecs_to_jiffies(750);
1006	snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ |
1007				 VIA_REG_AC97_SECONDARY_VALID |
1008				 (VIA_REG_AC97_CODEC_ID_SECONDARY << VIA_REG_AC97_CODEC_ID_SHIFT));
1009	do {
1010		if ((val = snd_via82xx_codec_xread(chip)) & VIA_REG_AC97_SECONDARY_VALID) {
1011			chip->ac97_secondary = 1;
1012			goto __ac97_ok2;
1013		}
1014		schedule_timeout_uninterruptible(1);
1015	} while (time_before(jiffies, end_time));
1016	/* This is ok, the most of motherboards have only one codec */
1017
1018      __ac97_ok2:
1019
1020	/* route FM trap to IRQ, disable FM trap */
1021	// pci_write_config_byte(chip->pci, VIA_FM_NMI_CTRL, 0);
1022	/* disable all GPI interrupts */
1023	outl(0, VIAREG(chip, GPI_INTR));
1024
1025	return 0;
1026}
1027
1028#ifdef CONFIG_PM_SLEEP
1029/*
1030 * power management
1031 */
1032static int snd_via82xx_suspend(struct device *dev)
1033{
1034	struct snd_card *card = dev_get_drvdata(dev);
1035	struct via82xx_modem *chip = card->private_data;
1036	int i;
1037
1038	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1039	for (i = 0; i < 2; i++)
1040		snd_pcm_suspend_all(chip->pcms[i]);
1041	for (i = 0; i < chip->num_devs; i++)
1042		snd_via82xx_channel_reset(chip, &chip->devs[i]);
1043	synchronize_irq(chip->irq);
1044	snd_ac97_suspend(chip->ac97);
1045	return 0;
1046}
1047
1048static int snd_via82xx_resume(struct device *dev)
1049{
1050	struct snd_card *card = dev_get_drvdata(dev);
1051	struct via82xx_modem *chip = card->private_data;
1052	int i;
1053
1054	snd_via82xx_chip_init(chip);
1055
1056	snd_ac97_resume(chip->ac97);
1057
1058	for (i = 0; i < chip->num_devs; i++)
1059		snd_via82xx_channel_reset(chip, &chip->devs[i]);
1060
1061	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1062	return 0;
1063}
1064
1065static SIMPLE_DEV_PM_OPS(snd_via82xx_pm, snd_via82xx_suspend, snd_via82xx_resume);
1066#define SND_VIA82XX_PM_OPS	&snd_via82xx_pm
1067#else
1068#define SND_VIA82XX_PM_OPS	NULL
1069#endif /* CONFIG_PM_SLEEP */
1070
1071static int snd_via82xx_free(struct via82xx_modem *chip)
1072{
1073	unsigned int i;
1074
1075	if (chip->irq < 0)
1076		goto __end_hw;
1077	/* disable interrupts */
1078	for (i = 0; i < chip->num_devs; i++)
1079		snd_via82xx_channel_reset(chip, &chip->devs[i]);
1080
1081      __end_hw:
1082	if (chip->irq >= 0)
1083		free_irq(chip->irq, chip);
1084	pci_release_regions(chip->pci);
1085	pci_disable_device(chip->pci);
1086	kfree(chip);
1087	return 0;
1088}
1089
1090static int snd_via82xx_dev_free(struct snd_device *device)
1091{
1092	struct via82xx_modem *chip = device->device_data;
1093	return snd_via82xx_free(chip);
1094}
1095
1096static int snd_via82xx_create(struct snd_card *card,
1097			      struct pci_dev *pci,
1098			      int chip_type,
1099			      int revision,
1100			      unsigned int ac97_clock,
1101			      struct via82xx_modem **r_via)
1102{
1103	struct via82xx_modem *chip;
1104	int err;
1105        static struct snd_device_ops ops = {
1106		.dev_free =	snd_via82xx_dev_free,
1107        };
1108
1109	if ((err = pci_enable_device(pci)) < 0)
1110		return err;
1111
1112	if ((chip = kzalloc(sizeof(*chip), GFP_KERNEL)) == NULL) {
1113		pci_disable_device(pci);
1114		return -ENOMEM;
1115	}
1116
1117	spin_lock_init(&chip->reg_lock);
1118	chip->card = card;
1119	chip->pci = pci;
1120	chip->irq = -1;
1121
1122	if ((err = pci_request_regions(pci, card->driver)) < 0) {
1123		kfree(chip);
1124		pci_disable_device(pci);
1125		return err;
1126	}
1127	chip->port = pci_resource_start(pci, 0);
1128	if (request_irq(pci->irq, snd_via82xx_interrupt, IRQF_SHARED,
1129			KBUILD_MODNAME, chip)) {
1130		dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
1131		snd_via82xx_free(chip);
1132		return -EBUSY;
1133	}
1134	chip->irq = pci->irq;
1135	if (ac97_clock >= 8000 && ac97_clock <= 48000)
1136		chip->ac97_clock = ac97_clock;
1137	synchronize_irq(chip->irq);
1138
1139	if ((err = snd_via82xx_chip_init(chip)) < 0) {
1140		snd_via82xx_free(chip);
1141		return err;
1142	}
1143
1144	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1145		snd_via82xx_free(chip);
1146		return err;
1147	}
1148
1149	/* The 8233 ac97 controller does not implement the master bit
1150	 * in the pci command register. IMHO this is a violation of the PCI spec.
1151	 * We call pci_set_master here because it does not hurt. */
1152	pci_set_master(pci);
1153
1154	*r_via = chip;
1155	return 0;
1156}
1157
1158
1159static int snd_via82xx_probe(struct pci_dev *pci,
1160			     const struct pci_device_id *pci_id)
1161{
1162	struct snd_card *card;
1163	struct via82xx_modem *chip;
1164	int chip_type = 0, card_type;
1165	unsigned int i;
1166	int err;
1167
1168	err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card);
1169	if (err < 0)
1170		return err;
1171
1172	card_type = pci_id->driver_data;
1173	switch (card_type) {
1174	case TYPE_CARD_VIA82XX_MODEM:
1175		strcpy(card->driver, "VIA82XX-MODEM");
1176		sprintf(card->shortname, "VIA 82XX modem");
1177		break;
1178	default:
1179		dev_err(card->dev, "invalid card type %d\n", card_type);
1180		err = -EINVAL;
1181		goto __error;
1182	}
1183
1184	if ((err = snd_via82xx_create(card, pci, chip_type, pci->revision,
1185				      ac97_clock, &chip)) < 0)
1186		goto __error;
1187	card->private_data = chip;
1188	if ((err = snd_via82xx_mixer_new(chip)) < 0)
1189		goto __error;
1190
1191	if ((err = snd_via686_pcm_new(chip)) < 0 )
1192		goto __error;
1193
1194	/* disable interrupts */
1195	for (i = 0; i < chip->num_devs; i++)
1196		snd_via82xx_channel_reset(chip, &chip->devs[i]);
1197
1198	sprintf(card->longname, "%s at 0x%lx, irq %d",
1199		card->shortname, chip->port, chip->irq);
1200
1201	snd_via82xx_proc_init(chip);
1202
1203	if ((err = snd_card_register(card)) < 0) {
1204		snd_card_free(card);
1205		return err;
1206	}
1207	pci_set_drvdata(pci, card);
1208	return 0;
1209
1210 __error:
1211	snd_card_free(card);
1212	return err;
1213}
1214
1215static void snd_via82xx_remove(struct pci_dev *pci)
1216{
1217	snd_card_free(pci_get_drvdata(pci));
1218}
1219
1220static struct pci_driver via82xx_modem_driver = {
1221	.name = KBUILD_MODNAME,
1222	.id_table = snd_via82xx_modem_ids,
1223	.probe = snd_via82xx_probe,
1224	.remove = snd_via82xx_remove,
1225	.driver = {
1226		.pm = SND_VIA82XX_PM_OPS,
1227	},
1228};
1229
1230module_pci_driver(via82xx_modem_driver);
1231