Lines Matching +full:reset +full:- +full:bps
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
30 * als4000.c - driver for the Avance Logic ALS 4000 chipset.
59 /* ------------------------------------------------------------------------- */
68 u_int32_t format, speed, phys_buf, bps; member
104 /* ------------------------------------------------------------------------- */
110 bus_space_write_1(sc->st, sc->sh, ALS_GCR_INDEX, index); in als_gcr_rd()
111 return bus_space_read_4(sc->st, sc->sh, ALS_GCR_DATA); in als_gcr_rd()
117 bus_space_write_1(sc->st, sc->sh, ALS_GCR_INDEX, index); in als_gcr_wr()
118 bus_space_write_4(sc->st, sc->sh, ALS_GCR_DATA, data); in als_gcr_wr()
124 return bus_space_read_1(sc->st, sc->sh, ALS_SB_MPU_IRQ); in als_intr_rd()
130 bus_space_write_1(sc->st, sc->sh, ALS_SB_MPU_IRQ, data); in als_intr_wr()
136 bus_space_write_1(sc->st, sc->sh, ALS_MIXER_INDEX, index); in als_mix_rd()
137 return bus_space_read_1(sc->st, sc->sh, ALS_MIXER_DATA); in als_mix_rd()
143 bus_space_write_1(sc->st, sc->sh, ALS_MIXER_INDEX, index); in als_mix_wr()
144 bus_space_write_1(sc->st, sc->sh, ALS_MIXER_DATA, data); in als_mix_wr()
154 v = bus_space_read_1(sc->st, sc->sh, ALS_ESP_WR_STATUS); in als_esp_wr()
158 } while (--tries != 0); in als_esp_wr()
161 device_printf(sc->dev, "als_esp_wr timeout"); in als_esp_wr()
163 bus_space_write_1(sc->st, sc->sh, ALS_ESP_WR_DATA, data); in als_esp_wr()
171 bus_space_write_1(sc->st, sc->sh, ALS_ESP_RST, 1); in als_esp_reset()
173 bus_space_write_1(sc->st, sc->sh, ALS_ESP_RST, 0); in als_esp_reset()
178 u = bus_space_read_1(sc->st, sc->sh, ALS_ESP_RD_STATUS8); in als_esp_reset()
180 v = bus_space_read_1(sc->st, sc->sh, ALS_ESP_RD_DATA); in als_esp_reset()
187 } while (--tries != 0); in als_esp_reset()
190 device_printf(sc->dev, "als_esp_reset timeout"); in als_esp_reset()
197 u_int8_t r = bus_space_read_1(sc->st, sc->sh, addr); in als_ack_read()
201 /* ------------------------------------------------------------------------- */
211 snd_mtxlock(sc->lock); in alschan_init()
213 ch = &sc->pch; in alschan_init()
214 ch->gcr_fifo_status = ALS_GCR_FIFO0_STATUS; in alschan_init()
216 ch = &sc->rch; in alschan_init()
217 ch->gcr_fifo_status = ALS_GCR_FIFO1_STATUS; in alschan_init()
219 ch->dir = dir; in alschan_init()
220 ch->parent = sc; in alschan_init()
221 ch->channel = c; in alschan_init()
222 ch->bps = 1; in alschan_init()
223 ch->format = SND_FORMAT(AFMT_U8, 1, 0); in alschan_init()
224 ch->speed = DSP_DEFAULT_SPEED; in alschan_init()
225 ch->buffer = b; in alschan_init()
226 snd_mtxunlock(sc->lock); in alschan_init()
228 if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0) in alschan_init()
239 ch->format = format; in alschan_setformat()
247 struct sc_info *sc = ch->parent; in alschan_setspeed()
249 other = (ch->dir == PCMDIR_PLAY) ? &sc->rch : &sc->pch; in alschan_setspeed()
252 if (other->dma_active) { in alschan_setspeed()
253 ch->speed = other->speed; in alschan_setspeed()
254 return other->speed; in alschan_setspeed()
257 ch->speed = speed; in alschan_setspeed()
265 struct sc_info *sc = ch->parent; in alschan_setblocksize()
267 if (blocksize > sc->bufsz / 2) { in alschan_setblocksize()
268 blocksize = sc->bufsz / 2; in alschan_setblocksize()
270 sndbuf_resize(ch->buffer, 2, blocksize); in alschan_setblocksize()
278 struct sc_info *sc = ch->parent; in alschan_getptr()
281 snd_mtxlock(sc->lock); in alschan_getptr()
282 pos = als_gcr_rd(ch->parent, ch->gcr_fifo_status) & 0xffff; in alschan_getptr()
283 snd_mtxunlock(sc->lock); in alschan_getptr()
284 sz = sndbuf_getsize(ch->buffer); in alschan_getptr()
285 return (2 * sz - pos - 1) % sz; in alschan_getptr()
297 struct sc_info *sc = ch->parent; in als_set_speed()
300 other = (ch->dir == PCMDIR_PLAY) ? &sc->rch : &sc->pch; in als_set_speed()
301 if (other->dma_active == 0) { in als_set_speed()
303 als_esp_wr(sc, ch->speed >> 8); in als_set_speed()
304 als_esp_wr(sc, ch->speed & 0xff); in als_set_speed()
307 other->speed, ch->speed)); in als_set_speed()
311 /* ------------------------------------------------------------------------- */
348 struct sc_info *sc = ch->parent; in als_playback_start()
351 buf = sndbuf_getbufaddr(ch->buffer); in als_playback_start()
352 bufsz = sndbuf_getsize(ch->buffer); in als_playback_start()
354 if (ch->format & AFMT_16BIT) in als_playback_start()
356 count--; in als_playback_start()
362 als_gcr_wr(sc, ALS_GCR_DMA0_MODE, (bufsz - 1) | 0x180000); in als_playback_start()
364 p = als_get_playback_command(ch->format); in als_playback_start()
365 dma_prog = p->dma_prog | DSP_F16_DAC | DSP_F16_AUTO | DSP_F16_FIFO_ON; in als_playback_start()
368 als_esp_wr(sc, p->format_val); in als_playback_start()
372 ch->dma_active = 1; in als_playback_start()
379 struct sc_info *sc = ch->parent; in als_playback_stop()
382 active = ch->dma_active; in als_playback_stop()
384 p = als_get_playback_command(ch->format); in als_playback_stop()
385 als_esp_wr(sc, p->dma_stop); in als_playback_stop()
387 ch->dma_active = 0; in als_playback_stop()
395 struct sc_info *sc = ch->parent; in alspchan_trigger()
400 snd_mtxlock(sc->lock); in alspchan_trigger()
412 snd_mtxunlock(sc->lock); in alspchan_trigger()
428 /* ------------------------------------------------------------------------- */
444 device_printf(sc->dev, "format not found: 0x%08x\n", format); in als_get_fifo_format()
451 struct sc_info *sc = ch->parent; in als_capture_start()
454 buf = sndbuf_getbufaddr(ch->buffer); in als_capture_start()
455 bufsz = sndbuf_getsize(ch->buffer); in als_capture_start()
457 if (ch->format & AFMT_16BIT) in als_capture_start()
459 count--; in als_capture_start()
465 als_gcr_wr(sc, ALS_GCR_FIFO1_COUNT, (bufsz - 1)); in als_capture_start()
470 dma_prog = ALS_FIFO1_RUN | als_get_fifo_format(sc, ch->format); in als_capture_start()
473 ch->dma_active = 1; in als_capture_start()
479 struct sc_info *sc = ch->parent; in als_capture_stop()
482 active = ch->dma_active; in als_capture_stop()
486 ch->dma_active = 0; in als_capture_stop()
494 struct sc_info *sc = ch->parent; in alsrchan_trigger()
496 snd_mtxlock(sc->lock); in alsrchan_trigger()
506 snd_mtxunlock(sc->lock); in alsrchan_trigger()
522 /* ------------------------------------------------------------------------- */
575 mask = ((1 << amt[dev].bits) - 1) << (8 - amt[dev].bits); in alsmix_set()
631 /* ------------------------------------------------------------------------- */
640 snd_mtxlock(sc->lock); in als_intr()
644 snd_mtxunlock(sc->lock); in als_intr()
645 chn_intr(sc->pch.channel); in als_intr()
646 snd_mtxlock(sc->lock); in als_intr()
650 snd_mtxunlock(sc->lock); in als_intr()
651 chn_intr(sc->rch.channel); in als_intr()
652 snd_mtxlock(sc->lock); in als_intr()
670 snd_mtxunlock(sc->lock); in als_intr()
674 /* ------------------------------------------------------------------------- */
682 /* Reset Chip */ in als_init()
720 /* ------------------------------------------------------------------------- */
736 if (sc->reg) { in als_resource_free()
737 bus_release_resource(dev, SYS_RES_IOPORT, sc->regid, sc->reg); in als_resource_free()
738 sc->reg = NULL; in als_resource_free()
740 if (sc->ih) { in als_resource_free()
741 bus_teardown_intr(dev, sc->irq, sc->ih); in als_resource_free()
742 sc->ih = NULL; in als_resource_free()
744 if (sc->irq) { in als_resource_free()
745 bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq); in als_resource_free()
746 sc->irq = NULL; in als_resource_free()
748 if (sc->parent_dmat) { in als_resource_free()
749 bus_dma_tag_destroy(sc->parent_dmat); in als_resource_free()
750 sc->parent_dmat = 0; in als_resource_free()
752 if (sc->lock) { in als_resource_free()
753 snd_mtxfree(sc->lock); in als_resource_free()
754 sc->lock = NULL; in als_resource_free()
761 sc->regid = PCIR_BAR(0); in als_resource_grab()
762 sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->regid, in als_resource_grab()
764 if (sc->reg == NULL) { in als_resource_grab()
768 sc->st = rman_get_bustag(sc->reg); in als_resource_grab()
769 sc->sh = rman_get_bushandle(sc->reg); in als_resource_grab()
771 sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid, in als_resource_grab()
773 if (sc->irq == NULL) { in als_resource_grab()
778 if (snd_setup_intr(dev, sc->irq, INTR_MPSAFE, als_intr, in als_resource_grab()
779 sc, &sc->ih)) { in als_resource_grab()
784 sc->bufsz = pcm_getbuffersize(dev, 4096, ALS_DEFAULT_BUFSZ, 65536); in als_resource_grab()
791 /*maxsize*/sc->bufsz, in als_resource_grab()
794 /*lockarg*/NULL, &sc->parent_dmat) != 0) { in als_resource_grab()
811 sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_als4000 softc"); in als_pci_attach()
812 sc->dev = dev; in als_pci_attach()
821 /* Reset the power state. */ in als_pci_attach()
823 "-- setting to D0\n", pci_get_powerstate(dev)); in als_pci_attach()
848 rman_get_start(sc->reg), rman_get_start(sc->irq), in als_pci_attach()
885 snd_mtxlock(sc->lock); in als_pci_suspend()
886 sc->pch.dma_was_active = als_playback_stop(&sc->pch); in als_pci_suspend()
887 sc->rch.dma_was_active = als_capture_stop(&sc->rch); in als_pci_suspend()
889 snd_mtxunlock(sc->lock); in als_pci_suspend()
898 snd_mtxlock(sc->lock); in als_pci_resume()
901 snd_mtxunlock(sc->lock); in als_pci_resume()
907 snd_mtxunlock(sc->lock); in als_pci_resume()
911 if (sc->pch.dma_was_active) { in als_pci_resume()
912 als_playback_start(&sc->pch); in als_pci_resume()
915 if (sc->rch.dma_was_active) { in als_pci_resume()
916 als_capture_start(&sc->rch); in als_pci_resume()
918 snd_mtxunlock(sc->lock); in als_pci_resume()