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