xref: /linux/sound/pci/lola/lola.c (revision 9baa3c34ac4e27f7e062f266f50cc5dbea26a6c1)
1d43f3010STakashi Iwai /*
2d43f3010STakashi Iwai  *  Support for Digigram Lola PCI-e boards
3d43f3010STakashi Iwai  *
4d43f3010STakashi Iwai  *  Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
5d43f3010STakashi Iwai  *
6d43f3010STakashi Iwai  *  This program is free software; you can redistribute it and/or modify it
7d43f3010STakashi Iwai  *  under the terms of the GNU General Public License as published by the Free
8d43f3010STakashi Iwai  *  Software Foundation; either version 2 of the License, or (at your option)
9d43f3010STakashi Iwai  *  any later version.
10d43f3010STakashi Iwai  *
11d43f3010STakashi Iwai  *  This program is distributed in the hope that it will be useful, but WITHOUT
12d43f3010STakashi Iwai  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13d43f3010STakashi Iwai  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14d43f3010STakashi Iwai  *  more details.
15d43f3010STakashi Iwai  *
16d43f3010STakashi Iwai  *  You should have received a copy of the GNU General Public License along with
17d43f3010STakashi Iwai  *  this program; if not, write to the Free Software Foundation, Inc., 59
18d43f3010STakashi Iwai  *  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19d43f3010STakashi Iwai  */
20d43f3010STakashi Iwai 
21d43f3010STakashi Iwai #include <linux/kernel.h>
22d43f3010STakashi Iwai #include <linux/init.h>
2365a77217SPaul Gortmaker #include <linux/module.h>
24d43f3010STakashi Iwai #include <linux/dma-mapping.h>
25d43f3010STakashi Iwai #include <linux/delay.h>
26d43f3010STakashi Iwai #include <linux/interrupt.h>
27d43f3010STakashi Iwai #include <linux/slab.h>
28d43f3010STakashi Iwai #include <linux/pci.h>
29d43f3010STakashi Iwai #include <sound/core.h>
30d43f3010STakashi Iwai #include <sound/control.h>
31d43f3010STakashi Iwai #include <sound/pcm.h>
32d43f3010STakashi Iwai #include <sound/initval.h>
33d43f3010STakashi Iwai #include "lola.h"
34d43f3010STakashi Iwai 
35fe3d393eSTakashi Iwai /* Standard options */
36d43f3010STakashi Iwai static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
37d43f3010STakashi Iwai static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
38a67ff6a5SRusty Russell static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
39d43f3010STakashi Iwai 
40d43f3010STakashi Iwai module_param_array(index, int, NULL, 0444);
41d43f3010STakashi Iwai MODULE_PARM_DESC(index, "Index value for Digigram Lola driver.");
42d43f3010STakashi Iwai module_param_array(id, charp, NULL, 0444);
43d43f3010STakashi Iwai MODULE_PARM_DESC(id, "ID string for Digigram Lola driver.");
44d43f3010STakashi Iwai module_param_array(enable, bool, NULL, 0444);
45d43f3010STakashi Iwai MODULE_PARM_DESC(enable, "Enable Digigram Lola driver.");
46d43f3010STakashi Iwai 
47fe3d393eSTakashi Iwai /* Lola-specific options */
48fe3d393eSTakashi Iwai 
49fe3d393eSTakashi Iwai /* for instance use always max granularity which is compatible
50fe3d393eSTakashi Iwai  * with all sample rates
51fe3d393eSTakashi Iwai  */
52fe3d393eSTakashi Iwai static int granularity[SNDRV_CARDS] = {
53fe3d393eSTakashi Iwai 	[0 ... (SNDRV_CARDS - 1)] = LOLA_GRANULARITY_MAX
54fe3d393eSTakashi Iwai };
55fe3d393eSTakashi Iwai 
56fe3d393eSTakashi Iwai /* below a sample_rate of 16kHz the analogue audio quality is NOT excellent */
57fe3d393eSTakashi Iwai static int sample_rate_min[SNDRV_CARDS] = {
58fe3d393eSTakashi Iwai 	[0 ... (SNDRV_CARDS - 1) ] = 16000
59fe3d393eSTakashi Iwai };
60fe3d393eSTakashi Iwai 
61fe3d393eSTakashi Iwai module_param_array(granularity, int, NULL, 0444);
62fe3d393eSTakashi Iwai MODULE_PARM_DESC(granularity, "Granularity value");
63fe3d393eSTakashi Iwai module_param_array(sample_rate_min, int, NULL, 0444);
64fe3d393eSTakashi Iwai MODULE_PARM_DESC(sample_rate_min, "Minimal sample rate");
65fe3d393eSTakashi Iwai 
66fe3d393eSTakashi Iwai /*
67fe3d393eSTakashi Iwai  */
68fe3d393eSTakashi Iwai 
69d43f3010STakashi Iwai MODULE_LICENSE("GPL");
70d43f3010STakashi Iwai MODULE_SUPPORTED_DEVICE("{{Digigram, Lola}}");
71d43f3010STakashi Iwai MODULE_DESCRIPTION("Digigram Lola driver");
72d43f3010STakashi Iwai MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>");
73d43f3010STakashi Iwai 
74d43f3010STakashi Iwai #ifdef CONFIG_SND_DEBUG_VERBOSE
75d43f3010STakashi Iwai static int debug;
76d43f3010STakashi Iwai module_param(debug, int, 0644);
77d43f3010STakashi Iwai #define verbose_debug(fmt, args...)			\
78f58e2fceSTakashi Iwai 	do { if (debug > 1) pr_debug(SFX fmt, ##args); } while (0)
79d43f3010STakashi Iwai #else
80d43f3010STakashi Iwai #define verbose_debug(fmt, args...)
81d43f3010STakashi Iwai #endif
82d43f3010STakashi Iwai 
83d43f3010STakashi Iwai /*
84d43f3010STakashi Iwai  * pseudo-codec read/write via CORB/RIRB
85d43f3010STakashi Iwai  */
86d43f3010STakashi Iwai 
87d43f3010STakashi Iwai static int corb_send_verb(struct lola *chip, unsigned int nid,
88d43f3010STakashi Iwai 			  unsigned int verb, unsigned int data,
89d43f3010STakashi Iwai 			  unsigned int extdata)
90d43f3010STakashi Iwai {
91d43f3010STakashi Iwai 	unsigned long flags;
92d43f3010STakashi Iwai 	int ret = -EIO;
93d43f3010STakashi Iwai 
94d43f3010STakashi Iwai 	chip->last_cmd_nid = nid;
95d43f3010STakashi Iwai 	chip->last_verb = verb;
96d43f3010STakashi Iwai 	chip->last_data = data;
97d43f3010STakashi Iwai 	chip->last_extdata = extdata;
98d43f3010STakashi Iwai 	data |= (nid << 20) | (verb << 8);
990f8f56c9STakashi Iwai 
100d43f3010STakashi Iwai 	spin_lock_irqsave(&chip->reg_lock, flags);
101d43f3010STakashi Iwai 	if (chip->rirb.cmds < LOLA_CORB_ENTRIES - 1) {
102d43f3010STakashi Iwai 		unsigned int wp = chip->corb.wp + 1;
103d43f3010STakashi Iwai 		wp %= LOLA_CORB_ENTRIES;
104d43f3010STakashi Iwai 		chip->corb.wp = wp;
105d43f3010STakashi Iwai 		chip->corb.buf[wp * 2] = cpu_to_le32(data);
106d43f3010STakashi Iwai 		chip->corb.buf[wp * 2 + 1] = cpu_to_le32(extdata);
107d43f3010STakashi Iwai 		lola_writew(chip, BAR0, CORBWP, wp);
108d43f3010STakashi Iwai 		chip->rirb.cmds++;
109d43f3010STakashi Iwai 		smp_wmb();
110d43f3010STakashi Iwai 		ret = 0;
111d43f3010STakashi Iwai 	}
112d43f3010STakashi Iwai 	spin_unlock_irqrestore(&chip->reg_lock, flags);
113d43f3010STakashi Iwai 	return ret;
114d43f3010STakashi Iwai }
115d43f3010STakashi Iwai 
116d43f3010STakashi Iwai static void lola_queue_unsol_event(struct lola *chip, unsigned int res,
117d43f3010STakashi Iwai 				   unsigned int res_ex)
118d43f3010STakashi Iwai {
119d43f3010STakashi Iwai 	lola_update_ext_clock_freq(chip, res);
120d43f3010STakashi Iwai }
121d43f3010STakashi Iwai 
122d43f3010STakashi Iwai /* retrieve RIRB entry - called from interrupt handler */
123d43f3010STakashi Iwai static void lola_update_rirb(struct lola *chip)
124d43f3010STakashi Iwai {
125d43f3010STakashi Iwai 	unsigned int rp, wp;
126d43f3010STakashi Iwai 	u32 res, res_ex;
127d43f3010STakashi Iwai 
128d43f3010STakashi Iwai 	wp = lola_readw(chip, BAR0, RIRBWP);
129d43f3010STakashi Iwai 	if (wp == chip->rirb.wp)
130d43f3010STakashi Iwai 		return;
131d43f3010STakashi Iwai 	chip->rirb.wp = wp;
132d43f3010STakashi Iwai 
133d43f3010STakashi Iwai 	while (chip->rirb.rp != wp) {
134d43f3010STakashi Iwai 		chip->rirb.rp++;
135d43f3010STakashi Iwai 		chip->rirb.rp %= LOLA_CORB_ENTRIES;
136d43f3010STakashi Iwai 
137d43f3010STakashi Iwai 		rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
138d43f3010STakashi Iwai 		res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
139d43f3010STakashi Iwai 		res = le32_to_cpu(chip->rirb.buf[rp]);
140d43f3010STakashi Iwai 		if (res_ex & LOLA_RIRB_EX_UNSOL_EV)
141d43f3010STakashi Iwai 			lola_queue_unsol_event(chip, res, res_ex);
142d43f3010STakashi Iwai 		else if (chip->rirb.cmds) {
143d43f3010STakashi Iwai 			chip->res = res;
144d43f3010STakashi Iwai 			chip->res_ex = res_ex;
145d43f3010STakashi Iwai 			smp_wmb();
146d43f3010STakashi Iwai 			chip->rirb.cmds--;
147d43f3010STakashi Iwai 		}
148d43f3010STakashi Iwai 	}
149d43f3010STakashi Iwai }
150d43f3010STakashi Iwai 
151d43f3010STakashi Iwai static int rirb_get_response(struct lola *chip, unsigned int *val,
152d43f3010STakashi Iwai 			     unsigned int *extval)
153d43f3010STakashi Iwai {
154d43f3010STakashi Iwai 	unsigned long timeout;
155d43f3010STakashi Iwai 
156fe4af1b5STakashi Iwai  again:
157d43f3010STakashi Iwai 	timeout = jiffies + msecs_to_jiffies(1000);
158d43f3010STakashi Iwai 	for (;;) {
159fe4af1b5STakashi Iwai 		if (chip->polling_mode) {
160fe4af1b5STakashi Iwai 			spin_lock_irq(&chip->reg_lock);
161fe4af1b5STakashi Iwai 			lola_update_rirb(chip);
162fe4af1b5STakashi Iwai 			spin_unlock_irq(&chip->reg_lock);
163fe4af1b5STakashi Iwai 		}
164d43f3010STakashi Iwai 		if (!chip->rirb.cmds) {
165d43f3010STakashi Iwai 			*val = chip->res;
166d43f3010STakashi Iwai 			if (extval)
167d43f3010STakashi Iwai 				*extval = chip->res_ex;
168d43f3010STakashi Iwai 			verbose_debug("get_response: %x, %x\n",
169d43f3010STakashi Iwai 				      chip->res, chip->res_ex);
170d43f3010STakashi Iwai 			if (chip->res_ex & LOLA_RIRB_EX_ERROR) {
171f58e2fceSTakashi Iwai 				dev_warn(chip->card->dev, "RIRB ERROR: "
172d43f3010STakashi Iwai 				       "NID=%x, verb=%x, data=%x, ext=%x\n",
173d43f3010STakashi Iwai 				       chip->last_cmd_nid,
174d43f3010STakashi Iwai 				       chip->last_verb, chip->last_data,
175d43f3010STakashi Iwai 				       chip->last_extdata);
176d43f3010STakashi Iwai 				return -EIO;
177d43f3010STakashi Iwai 			}
178d43f3010STakashi Iwai 			return 0;
179d43f3010STakashi Iwai 		}
180d43f3010STakashi Iwai 		if (time_after(jiffies, timeout))
181d43f3010STakashi Iwai 			break;
182d43f3010STakashi Iwai 		udelay(20);
183d43f3010STakashi Iwai 		cond_resched();
184d43f3010STakashi Iwai 	}
185f58e2fceSTakashi Iwai 	dev_warn(chip->card->dev, "RIRB response error\n");
186fe4af1b5STakashi Iwai 	if (!chip->polling_mode) {
187f58e2fceSTakashi Iwai 		dev_warn(chip->card->dev, "switching to polling mode\n");
188fe4af1b5STakashi Iwai 		chip->polling_mode = 1;
189fe4af1b5STakashi Iwai 		goto again;
190fe4af1b5STakashi Iwai 	}
191d43f3010STakashi Iwai 	return -EIO;
192d43f3010STakashi Iwai }
193d43f3010STakashi Iwai 
194d43f3010STakashi Iwai /* aynchronous write of a codec verb with data */
195d43f3010STakashi Iwai int lola_codec_write(struct lola *chip, unsigned int nid, unsigned int verb,
196d43f3010STakashi Iwai 		     unsigned int data, unsigned int extdata)
197d43f3010STakashi Iwai {
198d43f3010STakashi Iwai 	verbose_debug("codec_write NID=%x, verb=%x, data=%x, ext=%x\n",
199d43f3010STakashi Iwai 		      nid, verb, data, extdata);
200d43f3010STakashi Iwai 	return corb_send_verb(chip, nid, verb, data, extdata);
201d43f3010STakashi Iwai }
202d43f3010STakashi Iwai 
203d43f3010STakashi Iwai /* write a codec verb with data and read the returned status */
204d43f3010STakashi Iwai int lola_codec_read(struct lola *chip, unsigned int nid, unsigned int verb,
205d43f3010STakashi Iwai 		    unsigned int data, unsigned int extdata,
206d43f3010STakashi Iwai 		    unsigned int *val, unsigned int *extval)
207d43f3010STakashi Iwai {
208d43f3010STakashi Iwai 	int err;
209d43f3010STakashi Iwai 
210d43f3010STakashi Iwai 	verbose_debug("codec_read NID=%x, verb=%x, data=%x, ext=%x\n",
211d43f3010STakashi Iwai 		      nid, verb, data, extdata);
212d43f3010STakashi Iwai 	err = corb_send_verb(chip, nid, verb, data, extdata);
213d43f3010STakashi Iwai 	if (err < 0)
214d43f3010STakashi Iwai 		return err;
215d43f3010STakashi Iwai 	err = rirb_get_response(chip, val, extval);
216d43f3010STakashi Iwai 	return err;
217d43f3010STakashi Iwai }
218d43f3010STakashi Iwai 
219d43f3010STakashi Iwai /* flush all pending codec writes */
220d43f3010STakashi Iwai int lola_codec_flush(struct lola *chip)
221d43f3010STakashi Iwai {
222d43f3010STakashi Iwai 	unsigned int tmp;
223d43f3010STakashi Iwai 	return rirb_get_response(chip, &tmp, NULL);
224d43f3010STakashi Iwai }
225d43f3010STakashi Iwai 
226d43f3010STakashi Iwai /*
227d43f3010STakashi Iwai  * interrupt handler
228d43f3010STakashi Iwai  */
229d43f3010STakashi Iwai static irqreturn_t lola_interrupt(int irq, void *dev_id)
230d43f3010STakashi Iwai {
231d43f3010STakashi Iwai 	struct lola *chip = dev_id;
232d43f3010STakashi Iwai 	unsigned int notify_ins, notify_outs, error_ins, error_outs;
233d43f3010STakashi Iwai 	int handled = 0;
234d43f3010STakashi Iwai 	int i;
235d43f3010STakashi Iwai 
236d43f3010STakashi Iwai 	notify_ins = notify_outs = error_ins = error_outs = 0;
237d43f3010STakashi Iwai 	spin_lock(&chip->reg_lock);
238d43f3010STakashi Iwai 	for (;;) {
239d43f3010STakashi Iwai 		unsigned int status, in_sts, out_sts;
240d43f3010STakashi Iwai 		unsigned int reg;
241d43f3010STakashi Iwai 
242d43f3010STakashi Iwai 		status = lola_readl(chip, BAR1, DINTSTS);
243d43f3010STakashi Iwai 		if (!status || status == -1)
244d43f3010STakashi Iwai 			break;
245d43f3010STakashi Iwai 
246d43f3010STakashi Iwai 		in_sts = lola_readl(chip, BAR1, DIINTSTS);
247d43f3010STakashi Iwai 		out_sts = lola_readl(chip, BAR1, DOINTSTS);
248d43f3010STakashi Iwai 
249d43f3010STakashi Iwai 		/* clear Input Interrupts */
250d43f3010STakashi Iwai 		for (i = 0; in_sts && i < chip->pcm[CAPT].num_streams; i++) {
251d43f3010STakashi Iwai 			if (!(in_sts & (1 << i)))
252d43f3010STakashi Iwai 				continue;
253d43f3010STakashi Iwai 			in_sts &= ~(1 << i);
254d43f3010STakashi Iwai 			reg = lola_dsd_read(chip, i, STS);
255d43f3010STakashi Iwai 			if (reg & LOLA_DSD_STS_DESE) /* error */
256d43f3010STakashi Iwai 				error_ins |= (1 << i);
257d43f3010STakashi Iwai 			if (reg & LOLA_DSD_STS_BCIS) /* notify */
258d43f3010STakashi Iwai 				notify_ins |= (1 << i);
259d43f3010STakashi Iwai 			/* clear */
260d43f3010STakashi Iwai 			lola_dsd_write(chip, i, STS, reg);
261d43f3010STakashi Iwai 		}
262d43f3010STakashi Iwai 
263d43f3010STakashi Iwai 		/* clear Output Interrupts */
264d43f3010STakashi Iwai 		for (i = 0; out_sts && i < chip->pcm[PLAY].num_streams; i++) {
265d43f3010STakashi Iwai 			if (!(out_sts & (1 << i)))
266d43f3010STakashi Iwai 				continue;
267d43f3010STakashi Iwai 			out_sts &= ~(1 << i);
268d43f3010STakashi Iwai 			reg = lola_dsd_read(chip, i + MAX_STREAM_IN_COUNT, STS);
269d43f3010STakashi Iwai 			if (reg & LOLA_DSD_STS_DESE) /* error */
270d43f3010STakashi Iwai 				error_outs |= (1 << i);
271d43f3010STakashi Iwai 			if (reg & LOLA_DSD_STS_BCIS) /* notify */
272d43f3010STakashi Iwai 				notify_outs |= (1 << i);
273d43f3010STakashi Iwai 			lola_dsd_write(chip, i + MAX_STREAM_IN_COUNT, STS, reg);
274d43f3010STakashi Iwai 		}
275d43f3010STakashi Iwai 
276d43f3010STakashi Iwai 		if (status & LOLA_DINT_CTRL) {
277d43f3010STakashi Iwai 			unsigned char rbsts; /* ring status is byte access */
278d43f3010STakashi Iwai 			rbsts = lola_readb(chip, BAR0, RIRBSTS);
279d43f3010STakashi Iwai 			rbsts &= LOLA_RIRB_INT_MASK;
280d43f3010STakashi Iwai 			if (rbsts)
281d43f3010STakashi Iwai 				lola_writeb(chip, BAR0, RIRBSTS, rbsts);
282d43f3010STakashi Iwai 			rbsts = lola_readb(chip, BAR0, CORBSTS);
283d43f3010STakashi Iwai 			rbsts &= LOLA_CORB_INT_MASK;
284d43f3010STakashi Iwai 			if (rbsts)
285d43f3010STakashi Iwai 				lola_writeb(chip, BAR0, CORBSTS, rbsts);
286d43f3010STakashi Iwai 
287d43f3010STakashi Iwai 			lola_update_rirb(chip);
288d43f3010STakashi Iwai 		}
289d43f3010STakashi Iwai 
290d43f3010STakashi Iwai 		if (status & (LOLA_DINT_FIFOERR | LOLA_DINT_MUERR)) {
291d43f3010STakashi Iwai 			/* clear global fifo error interrupt */
292d43f3010STakashi Iwai 			lola_writel(chip, BAR1, DINTSTS,
293d43f3010STakashi Iwai 				    (status & (LOLA_DINT_FIFOERR | LOLA_DINT_MUERR)));
294d43f3010STakashi Iwai 		}
295d43f3010STakashi Iwai 		handled = 1;
296d43f3010STakashi Iwai 	}
297d43f3010STakashi Iwai 	spin_unlock(&chip->reg_lock);
298d43f3010STakashi Iwai 
299d43f3010STakashi Iwai 	lola_pcm_update(chip, &chip->pcm[CAPT], notify_ins);
300d43f3010STakashi Iwai 	lola_pcm_update(chip, &chip->pcm[PLAY], notify_outs);
301d43f3010STakashi Iwai 
302d43f3010STakashi Iwai 	return IRQ_RETVAL(handled);
303d43f3010STakashi Iwai }
304d43f3010STakashi Iwai 
305d43f3010STakashi Iwai 
306d43f3010STakashi Iwai /*
307d43f3010STakashi Iwai  * controller
308d43f3010STakashi Iwai  */
309d43f3010STakashi Iwai static int reset_controller(struct lola *chip)
310d43f3010STakashi Iwai {
311d43f3010STakashi Iwai 	unsigned int gctl = lola_readl(chip, BAR0, GCTL);
312d43f3010STakashi Iwai 	unsigned long end_time;
313d43f3010STakashi Iwai 
314d43f3010STakashi Iwai 	if (gctl) {
315d43f3010STakashi Iwai 		/* to be sure */
316d43f3010STakashi Iwai 		lola_writel(chip, BAR1, BOARD_MODE, 0);
317d43f3010STakashi Iwai 		return 0;
318d43f3010STakashi Iwai 	}
319d43f3010STakashi Iwai 
320d43f3010STakashi Iwai 	chip->cold_reset = 1;
321d43f3010STakashi Iwai 	lola_writel(chip, BAR0, GCTL, LOLA_GCTL_RESET);
322d43f3010STakashi Iwai 	end_time = jiffies + msecs_to_jiffies(200);
323d43f3010STakashi Iwai 	do {
324d43f3010STakashi Iwai 		msleep(1);
325d43f3010STakashi Iwai 		gctl = lola_readl(chip, BAR0, GCTL);
326d43f3010STakashi Iwai 		if (gctl)
327d43f3010STakashi Iwai 			break;
328d43f3010STakashi Iwai 	} while (time_before(jiffies, end_time));
329d43f3010STakashi Iwai 	if (!gctl) {
330f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "cannot reset controller\n");
331d43f3010STakashi Iwai 		return -EIO;
332d43f3010STakashi Iwai 	}
333d43f3010STakashi Iwai 	return 0;
334d43f3010STakashi Iwai }
335d43f3010STakashi Iwai 
336d43f3010STakashi Iwai static void lola_irq_enable(struct lola *chip)
337d43f3010STakashi Iwai {
338d43f3010STakashi Iwai 	unsigned int val;
339d43f3010STakashi Iwai 
340d43f3010STakashi Iwai 	/* enalbe all I/O streams */
341d43f3010STakashi Iwai 	val = (1 << chip->pcm[PLAY].num_streams) - 1;
342d43f3010STakashi Iwai 	lola_writel(chip, BAR1, DOINTCTL, val);
343d43f3010STakashi Iwai 	val = (1 << chip->pcm[CAPT].num_streams) - 1;
344d43f3010STakashi Iwai 	lola_writel(chip, BAR1, DIINTCTL, val);
345d43f3010STakashi Iwai 
346d43f3010STakashi Iwai 	/* enable global irqs */
347d43f3010STakashi Iwai 	val = LOLA_DINT_GLOBAL | LOLA_DINT_CTRL | LOLA_DINT_FIFOERR |
348d43f3010STakashi Iwai 		LOLA_DINT_MUERR;
349d43f3010STakashi Iwai 	lola_writel(chip, BAR1, DINTCTL, val);
350d43f3010STakashi Iwai }
351d43f3010STakashi Iwai 
352d43f3010STakashi Iwai static void lola_irq_disable(struct lola *chip)
353d43f3010STakashi Iwai {
354d43f3010STakashi Iwai 	lola_writel(chip, BAR1, DINTCTL, 0);
355d43f3010STakashi Iwai 	lola_writel(chip, BAR1, DIINTCTL, 0);
356d43f3010STakashi Iwai 	lola_writel(chip, BAR1, DOINTCTL, 0);
357d43f3010STakashi Iwai }
358d43f3010STakashi Iwai 
359d43f3010STakashi Iwai static int setup_corb_rirb(struct lola *chip)
360d43f3010STakashi Iwai {
361d43f3010STakashi Iwai 	int err;
362d43f3010STakashi Iwai 	unsigned char tmp;
363d43f3010STakashi Iwai 	unsigned long end_time;
364d43f3010STakashi Iwai 
365d43f3010STakashi Iwai 	err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
366d43f3010STakashi Iwai 				  snd_dma_pci_data(chip->pci),
367d43f3010STakashi Iwai 				  PAGE_SIZE, &chip->rb);
368d43f3010STakashi Iwai 	if (err < 0)
369d43f3010STakashi Iwai 		return err;
370d43f3010STakashi Iwai 
371d43f3010STakashi Iwai 	chip->corb.addr = chip->rb.addr;
372d43f3010STakashi Iwai 	chip->corb.buf = (u32 *)chip->rb.area;
373d43f3010STakashi Iwai 	chip->rirb.addr = chip->rb.addr + 2048;
374d43f3010STakashi Iwai 	chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
375d43f3010STakashi Iwai 
376d43f3010STakashi Iwai 	/* disable ringbuffer DMAs */
377d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, RIRBCTL, 0);
378d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, CORBCTL, 0);
379d43f3010STakashi Iwai 
380d43f3010STakashi Iwai 	end_time = jiffies + msecs_to_jiffies(200);
381d43f3010STakashi Iwai 	do {
382d43f3010STakashi Iwai 		if (!lola_readb(chip, BAR0, RIRBCTL) &&
383d43f3010STakashi Iwai 		    !lola_readb(chip, BAR0, CORBCTL))
384d43f3010STakashi Iwai 			break;
385d43f3010STakashi Iwai 		msleep(1);
386d43f3010STakashi Iwai 	} while (time_before(jiffies, end_time));
387d43f3010STakashi Iwai 
388d43f3010STakashi Iwai 	/* CORB set up */
389d43f3010STakashi Iwai 	lola_writel(chip, BAR0, CORBLBASE, (u32)chip->corb.addr);
390d43f3010STakashi Iwai 	lola_writel(chip, BAR0, CORBUBASE, upper_32_bits(chip->corb.addr));
391d43f3010STakashi Iwai 	/* set the corb size to 256 entries */
392d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, CORBSIZE, 0x02);
393d43f3010STakashi Iwai 	/* set the corb write pointer to 0 */
394d43f3010STakashi Iwai 	lola_writew(chip, BAR0, CORBWP, 0);
395d43f3010STakashi Iwai 	/* reset the corb hw read pointer */
396d43f3010STakashi Iwai 	lola_writew(chip, BAR0, CORBRP, LOLA_RBRWP_CLR);
397d43f3010STakashi Iwai 	/* enable corb dma */
398d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, CORBCTL, LOLA_RBCTL_DMA_EN);
399d43f3010STakashi Iwai 	/* clear flags if set */
400d43f3010STakashi Iwai 	tmp = lola_readb(chip, BAR0, CORBSTS) & LOLA_CORB_INT_MASK;
401d43f3010STakashi Iwai 	if (tmp)
402d43f3010STakashi Iwai 		lola_writeb(chip, BAR0, CORBSTS, tmp);
403d43f3010STakashi Iwai 	chip->corb.wp = 0;
404d43f3010STakashi Iwai 
405d43f3010STakashi Iwai 	/* RIRB set up */
406d43f3010STakashi Iwai 	lola_writel(chip, BAR0, RIRBLBASE, (u32)chip->rirb.addr);
407d43f3010STakashi Iwai 	lola_writel(chip, BAR0, RIRBUBASE, upper_32_bits(chip->rirb.addr));
408d43f3010STakashi Iwai 	/* set the rirb size to 256 entries */
409d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, RIRBSIZE, 0x02);
410d43f3010STakashi Iwai 	/* reset the rirb hw write pointer */
411d43f3010STakashi Iwai 	lola_writew(chip, BAR0, RIRBWP, LOLA_RBRWP_CLR);
412d43f3010STakashi Iwai 	/* set N=1, get RIRB response interrupt for new entry */
413d43f3010STakashi Iwai 	lola_writew(chip, BAR0, RINTCNT, 1);
414d43f3010STakashi Iwai 	/* enable rirb dma and response irq */
415d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, RIRBCTL, LOLA_RBCTL_DMA_EN | LOLA_RBCTL_IRQ_EN);
416d43f3010STakashi Iwai 	/* clear flags if set */
417d43f3010STakashi Iwai 	tmp =  lola_readb(chip, BAR0, RIRBSTS) & LOLA_RIRB_INT_MASK;
418d43f3010STakashi Iwai 	if (tmp)
419d43f3010STakashi Iwai 		lola_writeb(chip, BAR0, RIRBSTS, tmp);
420d43f3010STakashi Iwai 	chip->rirb.rp = chip->rirb.cmds = 0;
421d43f3010STakashi Iwai 
422d43f3010STakashi Iwai 	return 0;
423d43f3010STakashi Iwai }
424d43f3010STakashi Iwai 
425d43f3010STakashi Iwai static void stop_corb_rirb(struct lola *chip)
426d43f3010STakashi Iwai {
427d43f3010STakashi Iwai 	/* disable ringbuffer DMAs */
428d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, RIRBCTL, 0);
429d43f3010STakashi Iwai 	lola_writeb(chip, BAR0, CORBCTL, 0);
430d43f3010STakashi Iwai }
431d43f3010STakashi Iwai 
432d43f3010STakashi Iwai static void lola_reset_setups(struct lola *chip)
433d43f3010STakashi Iwai {
434d43f3010STakashi Iwai 	/* update the granularity */
435d43f3010STakashi Iwai 	lola_set_granularity(chip, chip->granularity, true);
436d43f3010STakashi Iwai 	/* update the sample clock */
437d43f3010STakashi Iwai 	lola_set_clock_index(chip, chip->clock.cur_index);
438d43f3010STakashi Iwai 	/* enable unsolicited events of the clock widget */
439d43f3010STakashi Iwai 	lola_enable_clock_events(chip);
440d43f3010STakashi Iwai 	/* update the analog gains */
441d43f3010STakashi Iwai 	lola_setup_all_analog_gains(chip, CAPT, false); /* input, update */
442d43f3010STakashi Iwai 	/* update SRC configuration if applicable */
443d43f3010STakashi Iwai 	lola_set_src_config(chip, chip->input_src_mask, false);
444d43f3010STakashi Iwai 	/* update the analog outputs */
445d43f3010STakashi Iwai 	lola_setup_all_analog_gains(chip, PLAY, false); /* output, update */
446d43f3010STakashi Iwai }
447d43f3010STakashi Iwai 
448e23e7a14SBill Pemberton static int lola_parse_tree(struct lola *chip)
449d43f3010STakashi Iwai {
450d43f3010STakashi Iwai 	unsigned int val;
451d43f3010STakashi Iwai 	int nid, err;
452d43f3010STakashi Iwai 
453d43f3010STakashi Iwai 	err = lola_read_param(chip, 0, LOLA_PAR_VENDOR_ID, &val);
454d43f3010STakashi Iwai 	if (err < 0) {
455f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "Can't read VENDOR_ID\n");
456d43f3010STakashi Iwai 		return err;
457d43f3010STakashi Iwai 	}
458d43f3010STakashi Iwai 	val >>= 16;
459d43f3010STakashi Iwai 	if (val != 0x1369) {
460f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "Unknown codec vendor 0x%x\n", val);
461d43f3010STakashi Iwai 		return -EINVAL;
462d43f3010STakashi Iwai 	}
463d43f3010STakashi Iwai 
464d43f3010STakashi Iwai 	err = lola_read_param(chip, 1, LOLA_PAR_FUNCTION_TYPE, &val);
465d43f3010STakashi Iwai 	if (err < 0) {
466f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "Can't read FUNCTION_TYPE\n");
467d43f3010STakashi Iwai 		return err;
468d43f3010STakashi Iwai 	}
469d43f3010STakashi Iwai 	if (val != 1) {
470f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "Unknown function type %d\n", val);
471d43f3010STakashi Iwai 		return -EINVAL;
472d43f3010STakashi Iwai 	}
473d43f3010STakashi Iwai 
474d43f3010STakashi Iwai 	err = lola_read_param(chip, 1, LOLA_PAR_SPECIFIC_CAPS, &val);
475d43f3010STakashi Iwai 	if (err < 0) {
476f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "Can't read SPECCAPS\n");
477d43f3010STakashi Iwai 		return err;
478d43f3010STakashi Iwai 	}
479d43f3010STakashi Iwai 	chip->lola_caps = val;
480d43f3010STakashi Iwai 	chip->pin[CAPT].num_pins = LOLA_AFG_INPUT_PIN_COUNT(chip->lola_caps);
481d43f3010STakashi Iwai 	chip->pin[PLAY].num_pins = LOLA_AFG_OUTPUT_PIN_COUNT(chip->lola_caps);
482f58e2fceSTakashi Iwai 	dev_dbg(chip->card->dev, "speccaps=0x%x, pins in=%d, out=%d\n",
483d43f3010STakashi Iwai 		    chip->lola_caps,
484d43f3010STakashi Iwai 		    chip->pin[CAPT].num_pins, chip->pin[PLAY].num_pins);
485d43f3010STakashi Iwai 
486d43f3010STakashi Iwai 	if (chip->pin[CAPT].num_pins > MAX_AUDIO_INOUT_COUNT ||
487d43f3010STakashi Iwai 	    chip->pin[PLAY].num_pins > MAX_AUDIO_INOUT_COUNT) {
488f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "Invalid Lola-spec caps 0x%x\n", val);
489d43f3010STakashi Iwai 		return -EINVAL;
490d43f3010STakashi Iwai 	}
491d43f3010STakashi Iwai 
492d43f3010STakashi Iwai 	nid = 0x02;
493d43f3010STakashi Iwai 	err = lola_init_pcm(chip, CAPT, &nid);
494d43f3010STakashi Iwai 	if (err < 0)
495d43f3010STakashi Iwai 		return err;
496d43f3010STakashi Iwai 	err = lola_init_pcm(chip, PLAY, &nid);
497d43f3010STakashi Iwai 	if (err < 0)
498d43f3010STakashi Iwai 		return err;
499d43f3010STakashi Iwai 
500d43f3010STakashi Iwai 	err = lola_init_pins(chip, CAPT, &nid);
501d43f3010STakashi Iwai 	if (err < 0)
502d43f3010STakashi Iwai 		return err;
503d43f3010STakashi Iwai 	err = lola_init_pins(chip, PLAY, &nid);
504d43f3010STakashi Iwai 	if (err < 0)
505d43f3010STakashi Iwai 		return err;
506d43f3010STakashi Iwai 
507d43f3010STakashi Iwai 	if (LOLA_AFG_CLOCK_WIDGET_PRESENT(chip->lola_caps)) {
508d43f3010STakashi Iwai 		err = lola_init_clock_widget(chip, nid);
509d43f3010STakashi Iwai 		if (err < 0)
510d43f3010STakashi Iwai 			return err;
511d43f3010STakashi Iwai 		nid++;
512d43f3010STakashi Iwai 	}
513d43f3010STakashi Iwai 	if (LOLA_AFG_MIXER_WIDGET_PRESENT(chip->lola_caps)) {
514d43f3010STakashi Iwai 		err = lola_init_mixer_widget(chip, nid);
515d43f3010STakashi Iwai 		if (err < 0)
516d43f3010STakashi Iwai 			return err;
517d43f3010STakashi Iwai 		nid++;
518d43f3010STakashi Iwai 	}
519d43f3010STakashi Iwai 
520d43f3010STakashi Iwai 	/* enable unsolicited events of the clock widget */
521d43f3010STakashi Iwai 	err = lola_enable_clock_events(chip);
522d43f3010STakashi Iwai 	if (err < 0)
523d43f3010STakashi Iwai 		return err;
524d43f3010STakashi Iwai 
525d43f3010STakashi Iwai 	/* if last ResetController was not a ColdReset, we don't know
526d43f3010STakashi Iwai 	 * the state of the card; initialize here again
527d43f3010STakashi Iwai 	 */
528d43f3010STakashi Iwai 	if (!chip->cold_reset) {
529d43f3010STakashi Iwai 		lola_reset_setups(chip);
530d43f3010STakashi Iwai 		chip->cold_reset = 1;
5310f8f56c9STakashi Iwai 	} else {
5320f8f56c9STakashi Iwai 		/* set the granularity if it is not the default */
5330f8f56c9STakashi Iwai 		if (chip->granularity != LOLA_GRANULARITY_MIN)
5340f8f56c9STakashi Iwai 			lola_set_granularity(chip, chip->granularity, true);
535d43f3010STakashi Iwai 	}
536d43f3010STakashi Iwai 
537d43f3010STakashi Iwai 	return 0;
538d43f3010STakashi Iwai }
539d43f3010STakashi Iwai 
540d43f3010STakashi Iwai static void lola_stop_hw(struct lola *chip)
541d43f3010STakashi Iwai {
542d43f3010STakashi Iwai 	stop_corb_rirb(chip);
543d43f3010STakashi Iwai 	lola_irq_disable(chip);
544d43f3010STakashi Iwai }
545d43f3010STakashi Iwai 
546d43f3010STakashi Iwai static void lola_free(struct lola *chip)
547d43f3010STakashi Iwai {
548d43f3010STakashi Iwai 	if (chip->initialized)
549d43f3010STakashi Iwai 		lola_stop_hw(chip);
550d43f3010STakashi Iwai 	lola_free_pcm(chip);
551d43f3010STakashi Iwai 	lola_free_mixer(chip);
552d43f3010STakashi Iwai 	if (chip->irq >= 0)
553d43f3010STakashi Iwai 		free_irq(chip->irq, (void *)chip);
554d43f3010STakashi Iwai 	if (chip->bar[0].remap_addr)
555d43f3010STakashi Iwai 		iounmap(chip->bar[0].remap_addr);
556d43f3010STakashi Iwai 	if (chip->bar[1].remap_addr)
557d43f3010STakashi Iwai 		iounmap(chip->bar[1].remap_addr);
558d43f3010STakashi Iwai 	if (chip->rb.area)
559d43f3010STakashi Iwai 		snd_dma_free_pages(&chip->rb);
560d43f3010STakashi Iwai 	pci_release_regions(chip->pci);
561d43f3010STakashi Iwai 	pci_disable_device(chip->pci);
562d43f3010STakashi Iwai 	kfree(chip);
563d43f3010STakashi Iwai }
564d43f3010STakashi Iwai 
565d43f3010STakashi Iwai static int lola_dev_free(struct snd_device *device)
566d43f3010STakashi Iwai {
567d43f3010STakashi Iwai 	lola_free(device->device_data);
568d43f3010STakashi Iwai 	return 0;
569d43f3010STakashi Iwai }
570d43f3010STakashi Iwai 
571e23e7a14SBill Pemberton static int lola_create(struct snd_card *card, struct pci_dev *pci,
572fe3d393eSTakashi Iwai 		       int dev, struct lola **rchip)
573d43f3010STakashi Iwai {
574d43f3010STakashi Iwai 	struct lola *chip;
575d43f3010STakashi Iwai 	int err;
576d43f3010STakashi Iwai 	unsigned int dever;
577d43f3010STakashi Iwai 	static struct snd_device_ops ops = {
578d43f3010STakashi Iwai 		.dev_free = lola_dev_free,
579d43f3010STakashi Iwai 	};
580d43f3010STakashi Iwai 
581d43f3010STakashi Iwai 	*rchip = NULL;
582d43f3010STakashi Iwai 
583d43f3010STakashi Iwai 	err = pci_enable_device(pci);
584d43f3010STakashi Iwai 	if (err < 0)
585d43f3010STakashi Iwai 		return err;
586d43f3010STakashi Iwai 
587d43f3010STakashi Iwai 	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
588d43f3010STakashi Iwai 	if (!chip) {
589d43f3010STakashi Iwai 		pci_disable_device(pci);
590d43f3010STakashi Iwai 		return -ENOMEM;
591d43f3010STakashi Iwai 	}
592d43f3010STakashi Iwai 
593d43f3010STakashi Iwai 	spin_lock_init(&chip->reg_lock);
594d43f3010STakashi Iwai 	mutex_init(&chip->open_mutex);
595d43f3010STakashi Iwai 	chip->card = card;
596d43f3010STakashi Iwai 	chip->pci = pci;
597d43f3010STakashi Iwai 	chip->irq = -1;
598d43f3010STakashi Iwai 
599fe3d393eSTakashi Iwai 	chip->granularity = granularity[dev];
6008bd172dcSTakashi Iwai 	switch (chip->granularity) {
6018bd172dcSTakashi Iwai 	case 8:
6028bd172dcSTakashi Iwai 		chip->sample_rate_max = 48000;
6038bd172dcSTakashi Iwai 		break;
6048bd172dcSTakashi Iwai 	case 16:
6058bd172dcSTakashi Iwai 		chip->sample_rate_max = 96000;
6068bd172dcSTakashi Iwai 		break;
6078bd172dcSTakashi Iwai 	case 32:
6088bd172dcSTakashi Iwai 		chip->sample_rate_max = 192000;
6098bd172dcSTakashi Iwai 		break;
6108bd172dcSTakashi Iwai 	default:
611f58e2fceSTakashi Iwai 		dev_warn(chip->card->dev,
6128bd172dcSTakashi Iwai 			   "Invalid granularity %d, reset to %d\n",
6138bd172dcSTakashi Iwai 			   chip->granularity, LOLA_GRANULARITY_MAX);
6140f8f56c9STakashi Iwai 		chip->granularity = LOLA_GRANULARITY_MAX;
6158bd172dcSTakashi Iwai 		chip->sample_rate_max = 192000;
6168bd172dcSTakashi Iwai 		break;
6178bd172dcSTakashi Iwai 	}
6188bd172dcSTakashi Iwai 	chip->sample_rate_min = sample_rate_min[dev];
6198bd172dcSTakashi Iwai 	if (chip->sample_rate_min > chip->sample_rate_max) {
620f58e2fceSTakashi Iwai 		dev_warn(chip->card->dev,
6218bd172dcSTakashi Iwai 			   "Invalid sample_rate_min %d, reset to 16000\n",
6228bd172dcSTakashi Iwai 			   chip->sample_rate_min);
6238bd172dcSTakashi Iwai 		chip->sample_rate_min = 16000;
624fe3d393eSTakashi Iwai 	}
625d43f3010STakashi Iwai 
626d43f3010STakashi Iwai 	err = pci_request_regions(pci, DRVNAME);
627d43f3010STakashi Iwai 	if (err < 0) {
628d43f3010STakashi Iwai 		kfree(chip);
629d43f3010STakashi Iwai 		pci_disable_device(pci);
630d43f3010STakashi Iwai 		return err;
631d43f3010STakashi Iwai 	}
632d43f3010STakashi Iwai 
633d43f3010STakashi Iwai 	chip->bar[0].addr = pci_resource_start(pci, 0);
634d43f3010STakashi Iwai 	chip->bar[0].remap_addr = pci_ioremap_bar(pci, 0);
635d43f3010STakashi Iwai 	chip->bar[1].addr = pci_resource_start(pci, 2);
636d43f3010STakashi Iwai 	chip->bar[1].remap_addr = pci_ioremap_bar(pci, 2);
637d43f3010STakashi Iwai 	if (!chip->bar[0].remap_addr || !chip->bar[1].remap_addr) {
638f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "ioremap error\n");
639d43f3010STakashi Iwai 		err = -ENXIO;
640d43f3010STakashi Iwai 		goto errout;
641d43f3010STakashi Iwai 	}
642d43f3010STakashi Iwai 
643d43f3010STakashi Iwai 	pci_set_master(pci);
644d43f3010STakashi Iwai 
645d43f3010STakashi Iwai 	err = reset_controller(chip);
646d43f3010STakashi Iwai 	if (err < 0)
647d43f3010STakashi Iwai 		goto errout;
648d43f3010STakashi Iwai 
649d43f3010STakashi Iwai 	if (request_irq(pci->irq, lola_interrupt, IRQF_SHARED,
650934c2b6dSTakashi Iwai 			KBUILD_MODNAME, chip)) {
651f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "unable to grab IRQ %d\n", pci->irq);
652d43f3010STakashi Iwai 		err = -EBUSY;
653d43f3010STakashi Iwai 		goto errout;
654d43f3010STakashi Iwai 	}
655d43f3010STakashi Iwai 	chip->irq = pci->irq;
656d43f3010STakashi Iwai 	synchronize_irq(chip->irq);
657d43f3010STakashi Iwai 
658d43f3010STakashi Iwai 	dever = lola_readl(chip, BAR1, DEVER);
659d43f3010STakashi Iwai 	chip->pcm[CAPT].num_streams = (dever >> 0) & 0x3ff;
660d43f3010STakashi Iwai 	chip->pcm[PLAY].num_streams = (dever >> 10) & 0x3ff;
661d43f3010STakashi Iwai 	chip->version = (dever >> 24) & 0xff;
662f58e2fceSTakashi Iwai 	dev_dbg(chip->card->dev, "streams in=%d, out=%d, version=0x%x\n",
663d43f3010STakashi Iwai 		    chip->pcm[CAPT].num_streams, chip->pcm[PLAY].num_streams,
664d43f3010STakashi Iwai 		    chip->version);
665d43f3010STakashi Iwai 
666d43f3010STakashi Iwai 	/* Test LOLA_BAR1_DEVER */
667d43f3010STakashi Iwai 	if (chip->pcm[CAPT].num_streams > MAX_STREAM_IN_COUNT ||
668d43f3010STakashi Iwai 	    chip->pcm[PLAY].num_streams > MAX_STREAM_OUT_COUNT ||
669d43f3010STakashi Iwai 	    (!chip->pcm[CAPT].num_streams &&
670d43f3010STakashi Iwai 	     !chip->pcm[PLAY].num_streams)) {
671f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "invalid DEVER = %x\n", dever);
672d43f3010STakashi Iwai 		err = -EINVAL;
673d43f3010STakashi Iwai 		goto errout;
674d43f3010STakashi Iwai 	}
675d43f3010STakashi Iwai 
676d43f3010STakashi Iwai 	err = setup_corb_rirb(chip);
677d43f3010STakashi Iwai 	if (err < 0)
678d43f3010STakashi Iwai 		goto errout;
679d43f3010STakashi Iwai 
680d43f3010STakashi Iwai 	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
681d43f3010STakashi Iwai 	if (err < 0) {
682f58e2fceSTakashi Iwai 		dev_err(chip->card->dev, "Error creating device [card]!\n");
683d43f3010STakashi Iwai 		goto errout;
684d43f3010STakashi Iwai 	}
685d43f3010STakashi Iwai 
686d43f3010STakashi Iwai 	strcpy(card->driver, "Lola");
687d43f3010STakashi Iwai 	strlcpy(card->shortname, "Digigram Lola", sizeof(card->shortname));
688d43f3010STakashi Iwai 	snprintf(card->longname, sizeof(card->longname),
689d43f3010STakashi Iwai 		 "%s at 0x%lx irq %i",
690d43f3010STakashi Iwai 		 card->shortname, chip->bar[0].addr, chip->irq);
691d43f3010STakashi Iwai 	strcpy(card->mixername, card->shortname);
692d43f3010STakashi Iwai 
693d43f3010STakashi Iwai 	lola_irq_enable(chip);
694d43f3010STakashi Iwai 
695d43f3010STakashi Iwai 	chip->initialized = 1;
696d43f3010STakashi Iwai 	*rchip = chip;
697d43f3010STakashi Iwai 	return 0;
698d43f3010STakashi Iwai 
699d43f3010STakashi Iwai  errout:
700d43f3010STakashi Iwai 	lola_free(chip);
701d43f3010STakashi Iwai 	return err;
702d43f3010STakashi Iwai }
703d43f3010STakashi Iwai 
704e23e7a14SBill Pemberton static int lola_probe(struct pci_dev *pci,
705d43f3010STakashi Iwai 		      const struct pci_device_id *pci_id)
706d43f3010STakashi Iwai {
707d43f3010STakashi Iwai 	static int dev;
708d43f3010STakashi Iwai 	struct snd_card *card;
709d43f3010STakashi Iwai 	struct lola *chip;
710d43f3010STakashi Iwai 	int err;
711d43f3010STakashi Iwai 
712d43f3010STakashi Iwai 	if (dev >= SNDRV_CARDS)
713d43f3010STakashi Iwai 		return -ENODEV;
714d43f3010STakashi Iwai 	if (!enable[dev]) {
715d43f3010STakashi Iwai 		dev++;
716d43f3010STakashi Iwai 		return -ENOENT;
717d43f3010STakashi Iwai 	}
718d43f3010STakashi Iwai 
71960c5772bSTakashi Iwai 	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
72060c5772bSTakashi Iwai 			   0, &card);
721d43f3010STakashi Iwai 	if (err < 0) {
722f58e2fceSTakashi Iwai 		dev_err(card->dev, "Error creating card!\n");
723d43f3010STakashi Iwai 		return err;
724d43f3010STakashi Iwai 	}
725d43f3010STakashi Iwai 
726fe3d393eSTakashi Iwai 	err = lola_create(card, pci, dev, &chip);
727d43f3010STakashi Iwai 	if (err < 0)
728d43f3010STakashi Iwai 		goto out_free;
729d43f3010STakashi Iwai 	card->private_data = chip;
730d43f3010STakashi Iwai 
731d43f3010STakashi Iwai 	err = lola_parse_tree(chip);
732d43f3010STakashi Iwai 	if (err < 0)
733d43f3010STakashi Iwai 		goto out_free;
734d43f3010STakashi Iwai 
735d43f3010STakashi Iwai 	err = lola_create_pcm(chip);
736d43f3010STakashi Iwai 	if (err < 0)
737d43f3010STakashi Iwai 		goto out_free;
738d43f3010STakashi Iwai 
739d43f3010STakashi Iwai 	err = lola_create_mixer(chip);
740d43f3010STakashi Iwai 	if (err < 0)
741d43f3010STakashi Iwai 		goto out_free;
742d43f3010STakashi Iwai 
743d43f3010STakashi Iwai 	lola_proc_debug_new(chip);
744d43f3010STakashi Iwai 
745d43f3010STakashi Iwai 	err = snd_card_register(card);
746d43f3010STakashi Iwai 	if (err < 0)
747d43f3010STakashi Iwai 		goto out_free;
748d43f3010STakashi Iwai 
749d43f3010STakashi Iwai 	pci_set_drvdata(pci, card);
750d43f3010STakashi Iwai 	dev++;
751d43f3010STakashi Iwai 	return err;
752d43f3010STakashi Iwai out_free:
753d43f3010STakashi Iwai 	snd_card_free(card);
754d43f3010STakashi Iwai 	return err;
755d43f3010STakashi Iwai }
756d43f3010STakashi Iwai 
757e23e7a14SBill Pemberton static void lola_remove(struct pci_dev *pci)
758d43f3010STakashi Iwai {
759d43f3010STakashi Iwai 	snd_card_free(pci_get_drvdata(pci));
760d43f3010STakashi Iwai }
761d43f3010STakashi Iwai 
762d43f3010STakashi Iwai /* PCI IDs */
763*9baa3c34SBenoit Taine static const struct pci_device_id lola_ids[] = {
764d43f3010STakashi Iwai 	{ PCI_VDEVICE(DIGIGRAM, 0x0001) },
765d43f3010STakashi Iwai 	{ 0, }
766d43f3010STakashi Iwai };
767d43f3010STakashi Iwai MODULE_DEVICE_TABLE(pci, lola_ids);
768d43f3010STakashi Iwai 
769d43f3010STakashi Iwai /* pci_driver definition */
770e9f66d9bSTakashi Iwai static struct pci_driver lola_driver = {
7713733e424STakashi Iwai 	.name = KBUILD_MODNAME,
772d43f3010STakashi Iwai 	.id_table = lola_ids,
773d43f3010STakashi Iwai 	.probe = lola_probe,
774e23e7a14SBill Pemberton 	.remove = lola_remove,
775d43f3010STakashi Iwai };
776d43f3010STakashi Iwai 
777e9f66d9bSTakashi Iwai module_pci_driver(lola_driver);
778