2 * Support for Digigram Lola PCI-e boards
4 * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc., 59
18 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include <linux/kernel.h>
22 #include <linux/init.h>
23 #include <linux/module.h>
24 #include <linux/dma-mapping.h>
25 #include <linux/delay.h>
26 #include <linux/interrupt.h>
27 #include <linux/slab.h>
28 #include <linux/pci.h>
29 #include <sound/core.h>
30 #include <sound/control.h>
31 #include <sound/pcm.h>
32 #include <sound/initval.h>
35 /* Standard options */
36 static int index
[SNDRV_CARDS
] = SNDRV_DEFAULT_IDX
;
37 static char *id
[SNDRV_CARDS
] = SNDRV_DEFAULT_STR
;
38 static bool enable
[SNDRV_CARDS
] = SNDRV_DEFAULT_ENABLE_PNP
;
40 module_param_array(index
, int, NULL
, 0444);
41 MODULE_PARM_DESC(index
, "Index value for Digigram Lola driver.");
42 module_param_array(id
, charp
, NULL
, 0444);
43 MODULE_PARM_DESC(id
, "ID string for Digigram Lola driver.");
44 module_param_array(enable
, bool, NULL
, 0444);
45 MODULE_PARM_DESC(enable
, "Enable Digigram Lola driver.");
47 /* Lola-specific options */
49 /* for instance use always max granularity which is compatible
50 * with all sample rates
52 static int granularity
[SNDRV_CARDS
] = {
53 [0 ... (SNDRV_CARDS
- 1)] = LOLA_GRANULARITY_MAX
56 /* below a sample_rate of 16kHz the analogue audio quality is NOT excellent */
57 static int sample_rate_min
[SNDRV_CARDS
] = {
58 [0 ... (SNDRV_CARDS
- 1) ] = 16000
61 module_param_array(granularity
, int, NULL
, 0444);
62 MODULE_PARM_DESC(granularity
, "Granularity value");
63 module_param_array(sample_rate_min
, int, NULL
, 0444);
64 MODULE_PARM_DESC(sample_rate_min
, "Minimal sample rate");
69 MODULE_LICENSE("GPL");
70 MODULE_SUPPORTED_DEVICE("{{Digigram, Lola}}");
71 MODULE_DESCRIPTION("Digigram Lola driver");
72 MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>");
74 #ifdef CONFIG_SND_DEBUG_VERBOSE
76 module_param(debug
, int, 0644);
77 #define verbose_debug(fmt, args...) \
78 do { if (debug > 1) pr_debug(SFX fmt, ##args); } while (0)
80 #define verbose_debug(fmt, args...)
84 * pseudo-codec read/write via CORB/RIRB
87 static int corb_send_verb(struct lola
*chip
, unsigned int nid
,
88 unsigned int verb
, unsigned int data
,
94 chip
->last_cmd_nid
= nid
;
95 chip
->last_verb
= verb
;
96 chip
->last_data
= data
;
97 chip
->last_extdata
= extdata
;
98 data
|= (nid
<< 20) | (verb
<< 8);
100 spin_lock_irqsave(&chip
->reg_lock
, flags
);
101 if (chip
->rirb
.cmds
< LOLA_CORB_ENTRIES
- 1) {
102 unsigned int wp
= chip
->corb
.wp
+ 1;
103 wp
%= LOLA_CORB_ENTRIES
;
105 chip
->corb
.buf
[wp
* 2] = cpu_to_le32(data
);
106 chip
->corb
.buf
[wp
* 2 + 1] = cpu_to_le32(extdata
);
107 lola_writew(chip
, BAR0
, CORBWP
, wp
);
112 spin_unlock_irqrestore(&chip
->reg_lock
, flags
);
116 static void lola_queue_unsol_event(struct lola
*chip
, unsigned int res
,
119 lola_update_ext_clock_freq(chip
, res
);
122 /* retrieve RIRB entry - called from interrupt handler */
123 static void lola_update_rirb(struct lola
*chip
)
128 wp
= lola_readw(chip
, BAR0
, RIRBWP
);
129 if (wp
== chip
->rirb
.wp
)
133 while (chip
->rirb
.rp
!= wp
) {
135 chip
->rirb
.rp
%= LOLA_CORB_ENTRIES
;
137 rp
= chip
->rirb
.rp
<< 1; /* an RIRB entry is 8-bytes */
138 res_ex
= le32_to_cpu(chip
->rirb
.buf
[rp
+ 1]);
139 res
= le32_to_cpu(chip
->rirb
.buf
[rp
]);
140 if (res_ex
& LOLA_RIRB_EX_UNSOL_EV
)
141 lola_queue_unsol_event(chip
, res
, res_ex
);
142 else if (chip
->rirb
.cmds
) {
144 chip
->res_ex
= res_ex
;
151 static int rirb_get_response(struct lola
*chip
, unsigned int *val
,
152 unsigned int *extval
)
154 unsigned long timeout
;
157 timeout
= jiffies
+ msecs_to_jiffies(1000);
159 if (chip
->polling_mode
) {
160 spin_lock_irq(&chip
->reg_lock
);
161 lola_update_rirb(chip
);
162 spin_unlock_irq(&chip
->reg_lock
);
164 if (!chip
->rirb
.cmds
) {
167 *extval
= chip
->res_ex
;
168 verbose_debug("get_response: %x, %x\n",
169 chip
->res
, chip
->res_ex
);
170 if (chip
->res_ex
& LOLA_RIRB_EX_ERROR
) {
171 dev_warn(chip
->card
->dev
, "RIRB ERROR: "
172 "NID=%x, verb=%x, data=%x, ext=%x\n",
174 chip
->last_verb
, chip
->last_data
,
180 if (time_after(jiffies
, timeout
))
185 dev_warn(chip
->card
->dev
, "RIRB response error\n");
186 if (!chip
->polling_mode
) {
187 dev_warn(chip
->card
->dev
, "switching to polling mode\n");
188 chip
->polling_mode
= 1;
194 /* aynchronous write of a codec verb with data */
195 int lola_codec_write(struct lola
*chip
, unsigned int nid
, unsigned int verb
,
196 unsigned int data
, unsigned int extdata
)
198 verbose_debug("codec_write NID=%x, verb=%x, data=%x, ext=%x\n",
199 nid
, verb
, data
, extdata
);
200 return corb_send_verb(chip
, nid
, verb
, data
, extdata
);
203 /* write a codec verb with data and read the returned status */
204 int lola_codec_read(struct lola
*chip
, unsigned int nid
, unsigned int verb
,
205 unsigned int data
, unsigned int extdata
,
206 unsigned int *val
, unsigned int *extval
)
210 verbose_debug("codec_read NID=%x, verb=%x, data=%x, ext=%x\n",
211 nid
, verb
, data
, extdata
);
212 err
= corb_send_verb(chip
, nid
, verb
, data
, extdata
);
215 err
= rirb_get_response(chip
, val
, extval
);
219 /* flush all pending codec writes */
220 int lola_codec_flush(struct lola
*chip
)
223 return rirb_get_response(chip
, &tmp
, NULL
);
229 static irqreturn_t
lola_interrupt(int irq
, void *dev_id
)
231 struct lola
*chip
= dev_id
;
232 unsigned int notify_ins
, notify_outs
, error_ins
, error_outs
;
236 notify_ins
= notify_outs
= error_ins
= error_outs
= 0;
237 spin_lock(&chip
->reg_lock
);
239 unsigned int status
, in_sts
, out_sts
;
242 status
= lola_readl(chip
, BAR1
, DINTSTS
);
243 if (!status
|| status
== -1)
246 in_sts
= lola_readl(chip
, BAR1
, DIINTSTS
);
247 out_sts
= lola_readl(chip
, BAR1
, DOINTSTS
);
249 /* clear Input Interrupts */
250 for (i
= 0; in_sts
&& i
< chip
->pcm
[CAPT
].num_streams
; i
++) {
251 if (!(in_sts
& (1 << i
)))
254 reg
= lola_dsd_read(chip
, i
, STS
);
255 if (reg
& LOLA_DSD_STS_DESE
) /* error */
256 error_ins
|= (1 << i
);
257 if (reg
& LOLA_DSD_STS_BCIS
) /* notify */
258 notify_ins
|= (1 << i
);
260 lola_dsd_write(chip
, i
, STS
, reg
);
263 /* clear Output Interrupts */
264 for (i
= 0; out_sts
&& i
< chip
->pcm
[PLAY
].num_streams
; i
++) {
265 if (!(out_sts
& (1 << i
)))
267 out_sts
&= ~(1 << i
);
268 reg
= lola_dsd_read(chip
, i
+ MAX_STREAM_IN_COUNT
, STS
);
269 if (reg
& LOLA_DSD_STS_DESE
) /* error */
270 error_outs
|= (1 << i
);
271 if (reg
& LOLA_DSD_STS_BCIS
) /* notify */
272 notify_outs
|= (1 << i
);
273 lola_dsd_write(chip
, i
+ MAX_STREAM_IN_COUNT
, STS
, reg
);
276 if (status
& LOLA_DINT_CTRL
) {
277 unsigned char rbsts
; /* ring status is byte access */
278 rbsts
= lola_readb(chip
, BAR0
, RIRBSTS
);
279 rbsts
&= LOLA_RIRB_INT_MASK
;
281 lola_writeb(chip
, BAR0
, RIRBSTS
, rbsts
);
282 rbsts
= lola_readb(chip
, BAR0
, CORBSTS
);
283 rbsts
&= LOLA_CORB_INT_MASK
;
285 lola_writeb(chip
, BAR0
, CORBSTS
, rbsts
);
287 lola_update_rirb(chip
);
290 if (status
& (LOLA_DINT_FIFOERR
| LOLA_DINT_MUERR
)) {
291 /* clear global fifo error interrupt */
292 lola_writel(chip
, BAR1
, DINTSTS
,
293 (status
& (LOLA_DINT_FIFOERR
| LOLA_DINT_MUERR
)));
297 spin_unlock(&chip
->reg_lock
);
299 lola_pcm_update(chip
, &chip
->pcm
[CAPT
], notify_ins
);
300 lola_pcm_update(chip
, &chip
->pcm
[PLAY
], notify_outs
);
302 return IRQ_RETVAL(handled
);
309 static int reset_controller(struct lola
*chip
)
311 unsigned int gctl
= lola_readl(chip
, BAR0
, GCTL
);
312 unsigned long end_time
;
316 lola_writel(chip
, BAR1
, BOARD_MODE
, 0);
320 chip
->cold_reset
= 1;
321 lola_writel(chip
, BAR0
, GCTL
, LOLA_GCTL_RESET
);
322 end_time
= jiffies
+ msecs_to_jiffies(200);
325 gctl
= lola_readl(chip
, BAR0
, GCTL
);
328 } while (time_before(jiffies
, end_time
));
330 dev_err(chip
->card
->dev
, "cannot reset controller\n");
336 static void lola_irq_enable(struct lola
*chip
)
340 /* enalbe all I/O streams */
341 val
= (1 << chip
->pcm
[PLAY
].num_streams
) - 1;
342 lola_writel(chip
, BAR1
, DOINTCTL
, val
);
343 val
= (1 << chip
->pcm
[CAPT
].num_streams
) - 1;
344 lola_writel(chip
, BAR1
, DIINTCTL
, val
);
346 /* enable global irqs */
347 val
= LOLA_DINT_GLOBAL
| LOLA_DINT_CTRL
| LOLA_DINT_FIFOERR
|
349 lola_writel(chip
, BAR1
, DINTCTL
, val
);
352 static void lola_irq_disable(struct lola
*chip
)
354 lola_writel(chip
, BAR1
, DINTCTL
, 0);
355 lola_writel(chip
, BAR1
, DIINTCTL
, 0);
356 lola_writel(chip
, BAR1
, DOINTCTL
, 0);
359 static int setup_corb_rirb(struct lola
*chip
)
363 unsigned long end_time
;
365 err
= snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV
,
366 snd_dma_pci_data(chip
->pci
),
367 PAGE_SIZE
, &chip
->rb
);
371 chip
->corb
.addr
= chip
->rb
.addr
;
372 chip
->corb
.buf
= (u32
*)chip
->rb
.area
;
373 chip
->rirb
.addr
= chip
->rb
.addr
+ 2048;
374 chip
->rirb
.buf
= (u32
*)(chip
->rb
.area
+ 2048);
376 /* disable ringbuffer DMAs */
377 lola_writeb(chip
, BAR0
, RIRBCTL
, 0);
378 lola_writeb(chip
, BAR0
, CORBCTL
, 0);
380 end_time
= jiffies
+ msecs_to_jiffies(200);
382 if (!lola_readb(chip
, BAR0
, RIRBCTL
) &&
383 !lola_readb(chip
, BAR0
, CORBCTL
))
386 } while (time_before(jiffies
, end_time
));
389 lola_writel(chip
, BAR0
, CORBLBASE
, (u32
)chip
->corb
.addr
);
390 lola_writel(chip
, BAR0
, CORBUBASE
, upper_32_bits(chip
->corb
.addr
));
391 /* set the corb size to 256 entries */
392 lola_writeb(chip
, BAR0
, CORBSIZE
, 0x02);
393 /* set the corb write pointer to 0 */
394 lola_writew(chip
, BAR0
, CORBWP
, 0);
395 /* reset the corb hw read pointer */
396 lola_writew(chip
, BAR0
, CORBRP
, LOLA_RBRWP_CLR
);
397 /* enable corb dma */
398 lola_writeb(chip
, BAR0
, CORBCTL
, LOLA_RBCTL_DMA_EN
);
399 /* clear flags if set */
400 tmp
= lola_readb(chip
, BAR0
, CORBSTS
) & LOLA_CORB_INT_MASK
;
402 lola_writeb(chip
, BAR0
, CORBSTS
, tmp
);
406 lola_writel(chip
, BAR0
, RIRBLBASE
, (u32
)chip
->rirb
.addr
);
407 lola_writel(chip
, BAR0
, RIRBUBASE
, upper_32_bits(chip
->rirb
.addr
));
408 /* set the rirb size to 256 entries */
409 lola_writeb(chip
, BAR0
, RIRBSIZE
, 0x02);
410 /* reset the rirb hw write pointer */
411 lola_writew(chip
, BAR0
, RIRBWP
, LOLA_RBRWP_CLR
);
412 /* set N=1, get RIRB response interrupt for new entry */
413 lola_writew(chip
, BAR0
, RINTCNT
, 1);
414 /* enable rirb dma and response irq */
415 lola_writeb(chip
, BAR0
, RIRBCTL
, LOLA_RBCTL_DMA_EN
| LOLA_RBCTL_IRQ_EN
);
416 /* clear flags if set */
417 tmp
= lola_readb(chip
, BAR0
, RIRBSTS
) & LOLA_RIRB_INT_MASK
;
419 lola_writeb(chip
, BAR0
, RIRBSTS
, tmp
);
420 chip
->rirb
.rp
= chip
->rirb
.cmds
= 0;
425 static void stop_corb_rirb(struct lola
*chip
)
427 /* disable ringbuffer DMAs */
428 lola_writeb(chip
, BAR0
, RIRBCTL
, 0);
429 lola_writeb(chip
, BAR0
, CORBCTL
, 0);
432 static void lola_reset_setups(struct lola
*chip
)
434 /* update the granularity */
435 lola_set_granularity(chip
, chip
->granularity
, true);
436 /* update the sample clock */
437 lola_set_clock_index(chip
, chip
->clock
.cur_index
);
438 /* enable unsolicited events of the clock widget */
439 lola_enable_clock_events(chip
);
440 /* update the analog gains */
441 lola_setup_all_analog_gains(chip
, CAPT
, false); /* input, update */
442 /* update SRC configuration if applicable */
443 lola_set_src_config(chip
, chip
->input_src_mask
, false);
444 /* update the analog outputs */
445 lola_setup_all_analog_gains(chip
, PLAY
, false); /* output, update */
448 static int lola_parse_tree(struct lola
*chip
)
453 err
= lola_read_param(chip
, 0, LOLA_PAR_VENDOR_ID
, &val
);
455 dev_err(chip
->card
->dev
, "Can't read VENDOR_ID\n");
460 dev_err(chip
->card
->dev
, "Unknown codec vendor 0x%x\n", val
);
464 err
= lola_read_param(chip
, 1, LOLA_PAR_FUNCTION_TYPE
, &val
);
466 dev_err(chip
->card
->dev
, "Can't read FUNCTION_TYPE\n");
470 dev_err(chip
->card
->dev
, "Unknown function type %d\n", val
);
474 err
= lola_read_param(chip
, 1, LOLA_PAR_SPECIFIC_CAPS
, &val
);
476 dev_err(chip
->card
->dev
, "Can't read SPECCAPS\n");
479 chip
->lola_caps
= val
;
480 chip
->pin
[CAPT
].num_pins
= LOLA_AFG_INPUT_PIN_COUNT(chip
->lola_caps
);
481 chip
->pin
[PLAY
].num_pins
= LOLA_AFG_OUTPUT_PIN_COUNT(chip
->lola_caps
);
482 dev_dbg(chip
->card
->dev
, "speccaps=0x%x, pins in=%d, out=%d\n",
484 chip
->pin
[CAPT
].num_pins
, chip
->pin
[PLAY
].num_pins
);
486 if (chip
->pin
[CAPT
].num_pins
> MAX_AUDIO_INOUT_COUNT
||
487 chip
->pin
[PLAY
].num_pins
> MAX_AUDIO_INOUT_COUNT
) {
488 dev_err(chip
->card
->dev
, "Invalid Lola-spec caps 0x%x\n", val
);
493 err
= lola_init_pcm(chip
, CAPT
, &nid
);
496 err
= lola_init_pcm(chip
, PLAY
, &nid
);
500 err
= lola_init_pins(chip
, CAPT
, &nid
);
503 err
= lola_init_pins(chip
, PLAY
, &nid
);
507 if (LOLA_AFG_CLOCK_WIDGET_PRESENT(chip
->lola_caps
)) {
508 err
= lola_init_clock_widget(chip
, nid
);
513 if (LOLA_AFG_MIXER_WIDGET_PRESENT(chip
->lola_caps
)) {
514 err
= lola_init_mixer_widget(chip
, nid
);
520 /* enable unsolicited events of the clock widget */
521 err
= lola_enable_clock_events(chip
);
525 /* if last ResetController was not a ColdReset, we don't know
526 * the state of the card; initialize here again
528 if (!chip
->cold_reset
) {
529 lola_reset_setups(chip
);
530 chip
->cold_reset
= 1;
532 /* set the granularity if it is not the default */
533 if (chip
->granularity
!= LOLA_GRANULARITY_MIN
)
534 lola_set_granularity(chip
, chip
->granularity
, true);
540 static void lola_stop_hw(struct lola
*chip
)
542 stop_corb_rirb(chip
);
543 lola_irq_disable(chip
);
546 static void lola_free(struct lola
*chip
)
548 if (chip
->initialized
)
551 lola_free_mixer(chip
);
553 free_irq(chip
->irq
, (void *)chip
);
554 if (chip
->bar
[0].remap_addr
)
555 iounmap(chip
->bar
[0].remap_addr
);
556 if (chip
->bar
[1].remap_addr
)
557 iounmap(chip
->bar
[1].remap_addr
);
559 snd_dma_free_pages(&chip
->rb
);
560 pci_release_regions(chip
->pci
);
561 pci_disable_device(chip
->pci
);
565 static int lola_dev_free(struct snd_device
*device
)
567 lola_free(device
->device_data
);
571 static int lola_create(struct snd_card
*card
, struct pci_dev
*pci
,
572 int dev
, struct lola
**rchip
)
577 static struct snd_device_ops ops
= {
578 .dev_free
= lola_dev_free
,
583 err
= pci_enable_device(pci
);
587 chip
= kzalloc(sizeof(*chip
), GFP_KERNEL
);
589 pci_disable_device(pci
);
593 spin_lock_init(&chip
->reg_lock
);
594 mutex_init(&chip
->open_mutex
);
599 chip
->granularity
= granularity
[dev
];
600 switch (chip
->granularity
) {
602 chip
->sample_rate_max
= 48000;
605 chip
->sample_rate_max
= 96000;
608 chip
->sample_rate_max
= 192000;
611 dev_warn(chip
->card
->dev
,
612 "Invalid granularity %d, reset to %d\n",
613 chip
->granularity
, LOLA_GRANULARITY_MAX
);
614 chip
->granularity
= LOLA_GRANULARITY_MAX
;
615 chip
->sample_rate_max
= 192000;
618 chip
->sample_rate_min
= sample_rate_min
[dev
];
619 if (chip
->sample_rate_min
> chip
->sample_rate_max
) {
620 dev_warn(chip
->card
->dev
,
621 "Invalid sample_rate_min %d, reset to 16000\n",
622 chip
->sample_rate_min
);
623 chip
->sample_rate_min
= 16000;
626 err
= pci_request_regions(pci
, DRVNAME
);
629 pci_disable_device(pci
);
633 chip
->bar
[0].addr
= pci_resource_start(pci
, 0);
634 chip
->bar
[0].remap_addr
= pci_ioremap_bar(pci
, 0);
635 chip
->bar
[1].addr
= pci_resource_start(pci
, 2);
636 chip
->bar
[1].remap_addr
= pci_ioremap_bar(pci
, 2);
637 if (!chip
->bar
[0].remap_addr
|| !chip
->bar
[1].remap_addr
) {
638 dev_err(chip
->card
->dev
, "ioremap error\n");
645 err
= reset_controller(chip
);
649 if (request_irq(pci
->irq
, lola_interrupt
, IRQF_SHARED
,
650 KBUILD_MODNAME
, chip
)) {
651 dev_err(chip
->card
->dev
, "unable to grab IRQ %d\n", pci
->irq
);
655 chip
->irq
= pci
->irq
;
656 synchronize_irq(chip
->irq
);
658 dever
= lola_readl(chip
, BAR1
, DEVER
);
659 chip
->pcm
[CAPT
].num_streams
= (dever
>> 0) & 0x3ff;
660 chip
->pcm
[PLAY
].num_streams
= (dever
>> 10) & 0x3ff;
661 chip
->version
= (dever
>> 24) & 0xff;
662 dev_dbg(chip
->card
->dev
, "streams in=%d, out=%d, version=0x%x\n",
663 chip
->pcm
[CAPT
].num_streams
, chip
->pcm
[PLAY
].num_streams
,
666 /* Test LOLA_BAR1_DEVER */
667 if (chip
->pcm
[CAPT
].num_streams
> MAX_STREAM_IN_COUNT
||
668 chip
->pcm
[PLAY
].num_streams
> MAX_STREAM_OUT_COUNT
||
669 (!chip
->pcm
[CAPT
].num_streams
&&
670 !chip
->pcm
[PLAY
].num_streams
)) {
671 dev_err(chip
->card
->dev
, "invalid DEVER = %x\n", dever
);
676 err
= setup_corb_rirb(chip
);
680 err
= snd_device_new(card
, SNDRV_DEV_LOWLEVEL
, chip
, &ops
);
682 dev_err(chip
->card
->dev
, "Error creating device [card]!\n");
686 strcpy(card
->driver
, "Lola");
687 strlcpy(card
->shortname
, "Digigram Lola", sizeof(card
->shortname
));
688 snprintf(card
->longname
, sizeof(card
->longname
),
689 "%s at 0x%lx irq %i",
690 card
->shortname
, chip
->bar
[0].addr
, chip
->irq
);
691 strcpy(card
->mixername
, card
->shortname
);
693 lola_irq_enable(chip
);
695 chip
->initialized
= 1;
704 static int lola_probe(struct pci_dev
*pci
,
705 const struct pci_device_id
*pci_id
)
708 struct snd_card
*card
;
712 if (dev
>= SNDRV_CARDS
)
719 err
= snd_card_new(&pci
->dev
, index
[dev
], id
[dev
], THIS_MODULE
,
722 dev_err(card
->dev
, "Error creating card!\n");
726 err
= lola_create(card
, pci
, dev
, &chip
);
729 card
->private_data
= chip
;
731 err
= lola_parse_tree(chip
);
735 err
= lola_create_pcm(chip
);
739 err
= lola_create_mixer(chip
);
743 lola_proc_debug_new(chip
);
745 err
= snd_card_register(card
);
749 pci_set_drvdata(pci
, card
);
757 static void lola_remove(struct pci_dev
*pci
)
759 snd_card_free(pci_get_drvdata(pci
));
763 static DEFINE_PCI_DEVICE_TABLE(lola_ids
) = {
764 { PCI_VDEVICE(DIGIGRAM
, 0x0001) },
767 MODULE_DEVICE_TABLE(pci
, lola_ids
);
769 /* pci_driver definition */
770 static struct pci_driver lola_driver
= {
771 .name
= KBUILD_MODNAME
,
772 .id_table
= lola_ids
,
774 .remove
= lola_remove
,
777 module_pci_driver(lola_driver
);