Lines Matching refs:chip
87 static int corb_send_verb(struct lola *chip, unsigned int nid, in corb_send_verb() argument
94 chip->last_cmd_nid = nid; in corb_send_verb()
95 chip->last_verb = verb; in corb_send_verb()
96 chip->last_data = data; in corb_send_verb()
97 chip->last_extdata = extdata; in corb_send_verb()
100 spin_lock_irqsave(&chip->reg_lock, flags); in corb_send_verb()
101 if (chip->rirb.cmds < LOLA_CORB_ENTRIES - 1) { in corb_send_verb()
102 unsigned int wp = chip->corb.wp + 1; in corb_send_verb()
104 chip->corb.wp = wp; in corb_send_verb()
105 chip->corb.buf[wp * 2] = cpu_to_le32(data); in corb_send_verb()
106 chip->corb.buf[wp * 2 + 1] = cpu_to_le32(extdata); in corb_send_verb()
107 lola_writew(chip, BAR0, CORBWP, wp); in corb_send_verb()
108 chip->rirb.cmds++; in corb_send_verb()
112 spin_unlock_irqrestore(&chip->reg_lock, flags); in corb_send_verb()
116 static void lola_queue_unsol_event(struct lola *chip, unsigned int res, in lola_queue_unsol_event() argument
119 lola_update_ext_clock_freq(chip, res); in lola_queue_unsol_event()
123 static void lola_update_rirb(struct lola *chip) in lola_update_rirb() argument
128 wp = lola_readw(chip, BAR0, RIRBWP); in lola_update_rirb()
129 if (wp == chip->rirb.wp) in lola_update_rirb()
131 chip->rirb.wp = wp; in lola_update_rirb()
133 while (chip->rirb.rp != wp) { in lola_update_rirb()
134 chip->rirb.rp++; in lola_update_rirb()
135 chip->rirb.rp %= LOLA_CORB_ENTRIES; in lola_update_rirb()
137 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */ in lola_update_rirb()
138 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]); in lola_update_rirb()
139 res = le32_to_cpu(chip->rirb.buf[rp]); in lola_update_rirb()
141 lola_queue_unsol_event(chip, res, res_ex); in lola_update_rirb()
142 else if (chip->rirb.cmds) { in lola_update_rirb()
143 chip->res = res; in lola_update_rirb()
144 chip->res_ex = res_ex; in lola_update_rirb()
146 chip->rirb.cmds--; in lola_update_rirb()
151 static int rirb_get_response(struct lola *chip, unsigned int *val, in rirb_get_response() argument
159 if (chip->polling_mode) { in rirb_get_response()
160 spin_lock_irq(&chip->reg_lock); in rirb_get_response()
161 lola_update_rirb(chip); in rirb_get_response()
162 spin_unlock_irq(&chip->reg_lock); in rirb_get_response()
164 if (!chip->rirb.cmds) { in rirb_get_response()
165 *val = chip->res; in rirb_get_response()
167 *extval = chip->res_ex; in rirb_get_response()
169 chip->res, chip->res_ex); in rirb_get_response()
170 if (chip->res_ex & LOLA_RIRB_EX_ERROR) { in rirb_get_response()
173 chip->last_cmd_nid, in rirb_get_response()
174 chip->last_verb, chip->last_data, in rirb_get_response()
175 chip->last_extdata); in rirb_get_response()
186 if (!chip->polling_mode) { in rirb_get_response()
188 chip->polling_mode = 1; in rirb_get_response()
195 int lola_codec_write(struct lola *chip, unsigned int nid, unsigned int verb, in lola_codec_write() argument
200 return corb_send_verb(chip, nid, verb, data, extdata); in lola_codec_write()
204 int lola_codec_read(struct lola *chip, unsigned int nid, unsigned int verb, in lola_codec_read() argument
212 err = corb_send_verb(chip, nid, verb, data, extdata); in lola_codec_read()
215 err = rirb_get_response(chip, val, extval); in lola_codec_read()
220 int lola_codec_flush(struct lola *chip) in lola_codec_flush() argument
223 return rirb_get_response(chip, &tmp, NULL); in lola_codec_flush()
231 struct lola *chip = dev_id; in lola_interrupt() local
237 spin_lock(&chip->reg_lock); in lola_interrupt()
242 status = lola_readl(chip, BAR1, DINTSTS); in lola_interrupt()
246 in_sts = lola_readl(chip, BAR1, DIINTSTS); in lola_interrupt()
247 out_sts = lola_readl(chip, BAR1, DOINTSTS); in lola_interrupt()
250 for (i = 0; in_sts && i < chip->pcm[CAPT].num_streams; i++) { in lola_interrupt()
254 reg = lola_dsd_read(chip, i, STS); in lola_interrupt()
260 lola_dsd_write(chip, i, STS, reg); in lola_interrupt()
264 for (i = 0; out_sts && i < chip->pcm[PLAY].num_streams; i++) { in lola_interrupt()
268 reg = lola_dsd_read(chip, i + MAX_STREAM_IN_COUNT, STS); in lola_interrupt()
273 lola_dsd_write(chip, i + MAX_STREAM_IN_COUNT, STS, reg); in lola_interrupt()
278 rbsts = lola_readb(chip, BAR0, RIRBSTS); in lola_interrupt()
281 lola_writeb(chip, BAR0, RIRBSTS, rbsts); in lola_interrupt()
282 rbsts = lola_readb(chip, BAR0, CORBSTS); in lola_interrupt()
285 lola_writeb(chip, BAR0, CORBSTS, rbsts); in lola_interrupt()
287 lola_update_rirb(chip); in lola_interrupt()
292 lola_writel(chip, BAR1, DINTSTS, in lola_interrupt()
297 spin_unlock(&chip->reg_lock); in lola_interrupt()
299 lola_pcm_update(chip, &chip->pcm[CAPT], notify_ins); in lola_interrupt()
300 lola_pcm_update(chip, &chip->pcm[PLAY], notify_outs); in lola_interrupt()
309 static int reset_controller(struct lola *chip) in reset_controller() argument
311 unsigned int gctl = lola_readl(chip, BAR0, GCTL); in reset_controller()
316 lola_writel(chip, BAR1, BOARD_MODE, 0); in reset_controller()
320 chip->cold_reset = 1; in reset_controller()
321 lola_writel(chip, BAR0, GCTL, LOLA_GCTL_RESET); in reset_controller()
325 gctl = lola_readl(chip, BAR0, GCTL); in reset_controller()
336 static void lola_irq_enable(struct lola *chip) in lola_irq_enable() argument
341 val = (1 << chip->pcm[PLAY].num_streams) - 1; in lola_irq_enable()
342 lola_writel(chip, BAR1, DOINTCTL, val); in lola_irq_enable()
343 val = (1 << chip->pcm[CAPT].num_streams) - 1; in lola_irq_enable()
344 lola_writel(chip, BAR1, DIINTCTL, val); in lola_irq_enable()
349 lola_writel(chip, BAR1, DINTCTL, val); in lola_irq_enable()
352 static void lola_irq_disable(struct lola *chip) in lola_irq_disable() argument
354 lola_writel(chip, BAR1, DINTCTL, 0); in lola_irq_disable()
355 lola_writel(chip, BAR1, DIINTCTL, 0); in lola_irq_disable()
356 lola_writel(chip, BAR1, DOINTCTL, 0); in lola_irq_disable()
359 static int setup_corb_rirb(struct lola *chip) in setup_corb_rirb() argument
366 snd_dma_pci_data(chip->pci), in setup_corb_rirb()
367 PAGE_SIZE, &chip->rb); in setup_corb_rirb()
371 chip->corb.addr = chip->rb.addr; in setup_corb_rirb()
372 chip->corb.buf = (u32 *)chip->rb.area; in setup_corb_rirb()
373 chip->rirb.addr = chip->rb.addr + 2048; in setup_corb_rirb()
374 chip->rirb.buf = (u32 *)(chip->rb.area + 2048); in setup_corb_rirb()
377 lola_writeb(chip, BAR0, RIRBCTL, 0); in setup_corb_rirb()
378 lola_writeb(chip, BAR0, CORBCTL, 0); in setup_corb_rirb()
382 if (!lola_readb(chip, BAR0, RIRBCTL) && in setup_corb_rirb()
383 !lola_readb(chip, BAR0, CORBCTL)) in setup_corb_rirb()
389 lola_writel(chip, BAR0, CORBLBASE, (u32)chip->corb.addr); in setup_corb_rirb()
390 lola_writel(chip, BAR0, CORBUBASE, upper_32_bits(chip->corb.addr)); in setup_corb_rirb()
392 lola_writeb(chip, BAR0, CORBSIZE, 0x02); in setup_corb_rirb()
394 lola_writew(chip, BAR0, CORBWP, 0); in setup_corb_rirb()
396 lola_writew(chip, BAR0, CORBRP, LOLA_RBRWP_CLR); in setup_corb_rirb()
398 lola_writeb(chip, BAR0, CORBCTL, LOLA_RBCTL_DMA_EN); in setup_corb_rirb()
400 tmp = lola_readb(chip, BAR0, CORBSTS) & LOLA_CORB_INT_MASK; in setup_corb_rirb()
402 lola_writeb(chip, BAR0, CORBSTS, tmp); in setup_corb_rirb()
403 chip->corb.wp = 0; in setup_corb_rirb()
406 lola_writel(chip, BAR0, RIRBLBASE, (u32)chip->rirb.addr); in setup_corb_rirb()
407 lola_writel(chip, BAR0, RIRBUBASE, upper_32_bits(chip->rirb.addr)); in setup_corb_rirb()
409 lola_writeb(chip, BAR0, RIRBSIZE, 0x02); in setup_corb_rirb()
411 lola_writew(chip, BAR0, RIRBWP, LOLA_RBRWP_CLR); in setup_corb_rirb()
413 lola_writew(chip, BAR0, RINTCNT, 1); in setup_corb_rirb()
415 lola_writeb(chip, BAR0, RIRBCTL, LOLA_RBCTL_DMA_EN | LOLA_RBCTL_IRQ_EN); in setup_corb_rirb()
417 tmp = lola_readb(chip, BAR0, RIRBSTS) & LOLA_RIRB_INT_MASK; in setup_corb_rirb()
419 lola_writeb(chip, BAR0, RIRBSTS, tmp); in setup_corb_rirb()
420 chip->rirb.rp = chip->rirb.cmds = 0; in setup_corb_rirb()
425 static void stop_corb_rirb(struct lola *chip) in stop_corb_rirb() argument
428 lola_writeb(chip, BAR0, RIRBCTL, 0); in stop_corb_rirb()
429 lola_writeb(chip, BAR0, CORBCTL, 0); in stop_corb_rirb()
432 static void lola_reset_setups(struct lola *chip) in lola_reset_setups() argument
435 lola_set_granularity(chip, chip->granularity, true); in lola_reset_setups()
437 lola_set_clock_index(chip, chip->clock.cur_index); in lola_reset_setups()
439 lola_enable_clock_events(chip); in lola_reset_setups()
441 lola_setup_all_analog_gains(chip, CAPT, false); /* input, update */ in lola_reset_setups()
443 lola_set_src_config(chip, chip->input_src_mask, false); in lola_reset_setups()
445 lola_setup_all_analog_gains(chip, PLAY, false); /* output, update */ in lola_reset_setups()
448 static int lola_parse_tree(struct lola *chip) in lola_parse_tree() argument
453 err = lola_read_param(chip, 0, LOLA_PAR_VENDOR_ID, &val); in lola_parse_tree()
464 err = lola_read_param(chip, 1, LOLA_PAR_FUNCTION_TYPE, &val); in lola_parse_tree()
474 err = lola_read_param(chip, 1, LOLA_PAR_SPECIFIC_CAPS, &val); in lola_parse_tree()
479 chip->lola_caps = val; in lola_parse_tree()
480 chip->pin[CAPT].num_pins = LOLA_AFG_INPUT_PIN_COUNT(chip->lola_caps); in lola_parse_tree()
481 chip->pin[PLAY].num_pins = LOLA_AFG_OUTPUT_PIN_COUNT(chip->lola_caps); in lola_parse_tree()
483 chip->lola_caps, in lola_parse_tree()
484 chip->pin[CAPT].num_pins, chip->pin[PLAY].num_pins); in lola_parse_tree()
486 if (chip->pin[CAPT].num_pins > MAX_AUDIO_INOUT_COUNT || in lola_parse_tree()
487 chip->pin[PLAY].num_pins > MAX_AUDIO_INOUT_COUNT) { in lola_parse_tree()
493 err = lola_init_pcm(chip, CAPT, &nid); in lola_parse_tree()
496 err = lola_init_pcm(chip, PLAY, &nid); in lola_parse_tree()
500 err = lola_init_pins(chip, CAPT, &nid); in lola_parse_tree()
503 err = lola_init_pins(chip, PLAY, &nid); in lola_parse_tree()
507 if (LOLA_AFG_CLOCK_WIDGET_PRESENT(chip->lola_caps)) { in lola_parse_tree()
508 err = lola_init_clock_widget(chip, nid); in lola_parse_tree()
513 if (LOLA_AFG_MIXER_WIDGET_PRESENT(chip->lola_caps)) { in lola_parse_tree()
514 err = lola_init_mixer_widget(chip, nid); in lola_parse_tree()
521 err = lola_enable_clock_events(chip); in lola_parse_tree()
528 if (!chip->cold_reset) { in lola_parse_tree()
529 lola_reset_setups(chip); in lola_parse_tree()
530 chip->cold_reset = 1; in lola_parse_tree()
533 if (chip->granularity != LOLA_GRANULARITY_MIN) in lola_parse_tree()
534 lola_set_granularity(chip, chip->granularity, true); in lola_parse_tree()
540 static void lola_stop_hw(struct lola *chip) in lola_stop_hw() argument
542 stop_corb_rirb(chip); in lola_stop_hw()
543 lola_irq_disable(chip); in lola_stop_hw()
546 static void lola_free(struct lola *chip) in lola_free() argument
548 if (chip->initialized) in lola_free()
549 lola_stop_hw(chip); in lola_free()
550 lola_free_pcm(chip); in lola_free()
551 lola_free_mixer(chip); in lola_free()
552 if (chip->irq >= 0) in lola_free()
553 free_irq(chip->irq, (void *)chip); in lola_free()
554 if (chip->bar[0].remap_addr) in lola_free()
555 iounmap(chip->bar[0].remap_addr); in lola_free()
556 if (chip->bar[1].remap_addr) in lola_free()
557 iounmap(chip->bar[1].remap_addr); in lola_free()
558 if (chip->rb.area) in lola_free()
559 snd_dma_free_pages(&chip->rb); in lola_free()
560 pci_release_regions(chip->pci); in lola_free()
561 pci_disable_device(chip->pci); in lola_free()
562 kfree(chip); in lola_free()
574 struct lola *chip; in lola_create() local
587 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in lola_create()
588 if (!chip) { in lola_create()
594 spin_lock_init(&chip->reg_lock); in lola_create()
595 mutex_init(&chip->open_mutex); in lola_create()
596 chip->card = card; in lola_create()
597 chip->pci = pci; in lola_create()
598 chip->irq = -1; in lola_create()
600 chip->granularity = granularity[dev]; in lola_create()
601 switch (chip->granularity) { in lola_create()
603 chip->sample_rate_max = 48000; in lola_create()
606 chip->sample_rate_max = 96000; in lola_create()
609 chip->sample_rate_max = 192000; in lola_create()
614 chip->granularity, LOLA_GRANULARITY_MAX); in lola_create()
615 chip->granularity = LOLA_GRANULARITY_MAX; in lola_create()
616 chip->sample_rate_max = 192000; in lola_create()
619 chip->sample_rate_min = sample_rate_min[dev]; in lola_create()
620 if (chip->sample_rate_min > chip->sample_rate_max) { in lola_create()
623 chip->sample_rate_min); in lola_create()
624 chip->sample_rate_min = 16000; in lola_create()
629 kfree(chip); in lola_create()
634 chip->bar[0].addr = pci_resource_start(pci, 0); in lola_create()
635 chip->bar[0].remap_addr = pci_ioremap_bar(pci, 0); in lola_create()
636 chip->bar[1].addr = pci_resource_start(pci, 2); in lola_create()
637 chip->bar[1].remap_addr = pci_ioremap_bar(pci, 2); in lola_create()
638 if (!chip->bar[0].remap_addr || !chip->bar[1].remap_addr) { in lola_create()
646 err = reset_controller(chip); in lola_create()
651 KBUILD_MODNAME, chip)) { in lola_create()
656 chip->irq = pci->irq; in lola_create()
657 synchronize_irq(chip->irq); in lola_create()
659 dever = lola_readl(chip, BAR1, DEVER); in lola_create()
660 chip->pcm[CAPT].num_streams = (dever >> 0) & 0x3ff; in lola_create()
661 chip->pcm[PLAY].num_streams = (dever >> 10) & 0x3ff; in lola_create()
662 chip->version = (dever >> 24) & 0xff; in lola_create()
664 chip->pcm[CAPT].num_streams, chip->pcm[PLAY].num_streams, in lola_create()
665 chip->version); in lola_create()
668 if (chip->pcm[CAPT].num_streams > MAX_STREAM_IN_COUNT || in lola_create()
669 chip->pcm[PLAY].num_streams > MAX_STREAM_OUT_COUNT || in lola_create()
670 (!chip->pcm[CAPT].num_streams && in lola_create()
671 !chip->pcm[PLAY].num_streams)) { in lola_create()
677 err = setup_corb_rirb(chip); in lola_create()
681 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); in lola_create()
691 card->shortname, chip->bar[0].addr, chip->irq); in lola_create()
694 lola_irq_enable(chip); in lola_create()
696 chip->initialized = 1; in lola_create()
697 *rchip = chip; in lola_create()
701 lola_free(chip); in lola_create()
710 struct lola *chip; in lola_probe() local
728 err = lola_create(card, pci, dev, &chip); in lola_probe()
731 card->private_data = chip; in lola_probe()
733 err = lola_parse_tree(chip); in lola_probe()
737 err = lola_create_pcm(chip); in lola_probe()
741 err = lola_create_mixer(chip); in lola_probe()
745 lola_proc_debug_new(chip); in lola_probe()