Lines Matching +full:wp +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Support for Digigram Lola PCI-e boards
11 #include <linux/dma-mapping.h>
34 /* Lola-specific options */
40 [0 ... (SNDRV_CARDS - 1)] = LOLA_GRANULARITY_MAX
45 [0 ... (SNDRV_CARDS - 1) ] = 16000
70 * pseudo-codec read/write via CORB/RIRB
77 int ret = -EIO;
79 chip->last_cmd_nid = nid;
80 chip->last_verb = verb;
81 chip->last_data = data;
82 chip->last_extdata = extdata;
85 guard(spinlock_irqsave)(&chip->reg_lock);
86 if (chip->rirb.cmds < LOLA_CORB_ENTRIES - 1) {
87 unsigned int wp = chip->corb.wp + 1;
88 wp %= LOLA_CORB_ENTRIES;
89 chip->corb.wp = wp;
90 chip->corb.buf[wp * 2] = cpu_to_le32(data);
91 chip->corb.buf[wp * 2 + 1] = cpu_to_le32(extdata);
92 lola_writew(chip, BAR0, CORBWP, wp);
93 chip->rirb.cmds++;
106 /* retrieve RIRB entry - called from interrupt handler */
109 unsigned int rp, wp;
112 wp = lola_readw(chip, BAR0, RIRBWP);
113 if (wp == chip->rirb.wp)
115 chip->rirb.wp = wp;
117 while (chip->rirb.rp != wp) {
118 chip->rirb.rp++;
119 chip->rirb.rp %= LOLA_CORB_ENTRIES;
121 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
122 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
123 res = le32_to_cpu(chip->rirb.buf[rp]);
126 else if (chip->rirb.cmds) {
127 chip->res = res;
128 chip->res_ex = res_ex;
130 chip->rirb.cmds--;
143 if (chip->polling_mode) {
144 spin_lock_irq(&chip->reg_lock);
146 spin_unlock_irq(&chip->reg_lock);
148 if (!chip->rirb.cmds) {
149 *val = chip->res;
151 *extval = chip->res_ex;
153 chip->res, chip->res_ex);
154 if (chip->res_ex & LOLA_RIRB_EX_ERROR) {
155 dev_warn(chip->card->dev, "RIRB ERROR: "
157 chip->last_cmd_nid,
158 chip->last_verb, chip->last_data,
159 chip->last_extdata);
160 return -EIO;
169 dev_warn(chip->card->dev, "RIRB response error\n");
170 if (!chip->polling_mode) {
171 dev_warn(chip->card->dev, "switching to polling mode\n");
172 chip->polling_mode = 1;
175 return -EIO;
221 spin_lock(&chip->reg_lock);
227 if (!status || status == -1)
234 for (i = 0; in_sts && i < chip->pcm[CAPT].num_streams; i++) {
248 for (i = 0; out_sts && i < chip->pcm[PLAY].num_streams; i++) {
281 spin_unlock(&chip->reg_lock);
283 lola_pcm_update(chip, &chip->pcm[CAPT], notify_ins);
284 lola_pcm_update(chip, &chip->pcm[PLAY], notify_outs);
291 * controller
304 chip->cold_reset = 1;
314 dev_err(chip->card->dev, "cannot reset controller\n");
315 return -EIO;
325 val = (1 << chip->pcm[PLAY].num_streams) - 1;
327 val = (1 << chip->pcm[CAPT].num_streams) - 1;
348 chip->rb = snd_devm_alloc_pages(&chip->pci->dev, SNDRV_DMA_TYPE_DEV,
350 if (!chip->rb)
351 return -ENOMEM;
353 chip->corb.addr = chip->rb->addr;
354 chip->corb.buf = (__le32 *)chip->rb->area;
355 chip->rirb.addr = chip->rb->addr + 2048;
356 chip->rirb.buf = (__le32 *)(chip->rb->area + 2048);
371 lola_writel(chip, BAR0, CORBLBASE, (u32)chip->corb.addr);
372 lola_writel(chip, BAR0, CORBUBASE, upper_32_bits(chip->corb.addr));
385 chip->corb.wp = 0;
388 lola_writel(chip, BAR0, RIRBLBASE, (u32)chip->rirb.addr);
389 lola_writel(chip, BAR0, RIRBUBASE, upper_32_bits(chip->rirb.addr));
402 chip->rirb.rp = chip->rirb.cmds = 0;
417 lola_set_granularity(chip, chip->granularity, true);
419 lola_set_clock_index(chip, chip->clock.cur_index);
425 lola_set_src_config(chip, chip->input_src_mask, false);
437 dev_err(chip->card->dev, "Can't read VENDOR_ID\n");
442 dev_err(chip->card->dev, "Unknown codec vendor 0x%x\n", val);
443 return -EINVAL;
448 dev_err(chip->card->dev, "Can't read FUNCTION_TYPE\n");
452 dev_err(chip->card->dev, "Unknown function type %d\n", val);
453 return -EINVAL;
458 dev_err(chip->card->dev, "Can't read SPECCAPS\n");
461 chip->lola_caps = val;
462 chip->pin[CAPT].num_pins = LOLA_AFG_INPUT_PIN_COUNT(chip->lola_caps);
463 chip->pin[PLAY].num_pins = LOLA_AFG_OUTPUT_PIN_COUNT(chip->lola_caps);
464 dev_dbg(chip->card->dev, "speccaps=0x%x, pins in=%d, out=%d\n",
465 chip->lola_caps,
466 chip->pin[CAPT].num_pins, chip->pin[PLAY].num_pins);
468 if (chip->pin[CAPT].num_pins > MAX_AUDIO_INOUT_COUNT ||
469 chip->pin[PLAY].num_pins > MAX_AUDIO_INOUT_COUNT) {
470 dev_err(chip->card->dev, "Invalid Lola-spec caps 0x%x\n", val);
471 return -EINVAL;
489 if (LOLA_AFG_CLOCK_WIDGET_PRESENT(chip->lola_caps)) {
495 if (LOLA_AFG_MIXER_WIDGET_PRESENT(chip->lola_caps)) {
510 if (!chip->cold_reset) {
512 chip->cold_reset = 1;
515 if (chip->granularity != LOLA_GRANULARITY_MIN)
516 lola_set_granularity(chip, chip->granularity, true);
530 struct lola *chip = card->private_data;
532 if (chip->initialized)
539 struct lola *chip = card->private_data;
548 spin_lock_init(&chip->reg_lock);
549 mutex_init(&chip->open_mutex);
550 chip->card = card;
551 chip->pci = pci;
552 chip->irq = -1;
553 card->private_free = lola_free;
555 chip->granularity = granularity[dev];
556 switch (chip->granularity) {
558 chip->sample_rate_max = 48000;
561 chip->sample_rate_max = 96000;
564 chip->sample_rate_max = 192000;
567 dev_warn(chip->card->dev,
569 chip->granularity, LOLA_GRANULARITY_MAX);
570 chip->granularity = LOLA_GRANULARITY_MAX;
571 chip->sample_rate_max = 192000;
574 chip->sample_rate_min = sample_rate_min[dev];
575 if (chip->sample_rate_min > chip->sample_rate_max) {
576 dev_warn(chip->card->dev,
578 chip->sample_rate_min);
579 chip->sample_rate_min = 16000;
586 chip->bar[0].remap_addr = iomem;
587 chip->bar[0].addr = pci_resource_start(pci, 0);
593 chip->bar[1].remap_addr = iomem;
594 chip->bar[1].addr = pci_resource_start(pci, 2);
602 if (devm_request_irq(&pci->dev, pci->irq, lola_interrupt, IRQF_SHARED,
604 dev_err(chip->card->dev, "unable to grab IRQ %d\n", pci->irq);
605 return -EBUSY;
607 chip->irq = pci->irq;
608 card->sync_irq = chip->irq;
611 chip->pcm[CAPT].num_streams = (dever >> 0) & 0x3ff;
612 chip->pcm[PLAY].num_streams = (dever >> 10) & 0x3ff;
613 chip->version = (dever >> 24) & 0xff;
614 dev_dbg(chip->card->dev, "streams in=%d, out=%d, version=0x%x\n",
615 chip->pcm[CAPT].num_streams, chip->pcm[PLAY].num_streams,
616 chip->version);
619 if (chip->pcm[CAPT].num_streams > MAX_STREAM_IN_COUNT ||
620 chip->pcm[PLAY].num_streams > MAX_STREAM_OUT_COUNT ||
621 (!chip->pcm[CAPT].num_streams &&
622 !chip->pcm[PLAY].num_streams)) {
623 dev_err(chip->card->dev, "invalid DEVER = %x\n", dever);
624 return -EINVAL;
631 strscpy(card->driver, "Lola");
632 strscpy(card->shortname, "Digigram Lola", sizeof(card->shortname));
633 snprintf(card->longname, sizeof(card->longname),
635 card->shortname, chip->bar[0].addr, chip->irq);
636 strscpy(card->mixername, card->shortname);
640 chip->initialized = 1;
653 return -ENODEV;
656 return -ENOENT;
659 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
662 dev_err(&pci->dev, "Error creating card!\n");
665 chip = card->private_data;
697 return snd_card_free_on_error(&pci->dev, __lola_probe(pci, pci_id));