• Home
  • Raw
  • Download

Lines Matching refs:dma

341 static int atiixp_build_dma_packets(struct atiixp *chip, struct atiixp_dma *dma,  in atiixp_build_dma_packets()  argument
353 if (dma->desc_buf.area == NULL) { in atiixp_build_dma_packets()
357 &dma->desc_buf) < 0) in atiixp_build_dma_packets()
359 dma->period_bytes = dma->periods = 0; /* clear */ in atiixp_build_dma_packets()
362 if (dma->periods == periods && dma->period_bytes == period_bytes) in atiixp_build_dma_packets()
367 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
368 dma->ops->enable_dma(chip, 0); in atiixp_build_dma_packets()
369 dma->ops->enable_dma(chip, 1); in atiixp_build_dma_packets()
374 desc_addr = (u32)dma->desc_buf.addr; in atiixp_build_dma_packets()
377 desc = &((struct atiixp_dma_desc *)dma->desc_buf.area)[i]; in atiixp_build_dma_packets()
383 desc->next = cpu_to_le32((u32)dma->desc_buf.addr); in atiixp_build_dma_packets()
389 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in atiixp_build_dma_packets()
390 chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
392 dma->period_bytes = period_bytes; in atiixp_build_dma_packets()
393 dma->periods = periods; in atiixp_build_dma_packets()
401 static void atiixp_clear_dma_packets(struct atiixp *chip, struct atiixp_dma *dma, in atiixp_clear_dma_packets() argument
404 if (dma->desc_buf.area) { in atiixp_clear_dma_packets()
405 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_clear_dma_packets()
406 snd_dma_free_pages(&dma->desc_buf); in atiixp_clear_dma_packets()
407 dma->desc_buf.area = NULL; in atiixp_clear_dma_packets()
650 struct atiixp_dma *dma = runtime->private_data; in snd_atiixp_pcm_pointer() local
655 curptr = readl(chip->remap_addr + dma->ops->dt_cur); in snd_atiixp_pcm_pointer()
656 if (curptr < dma->buf_addr) in snd_atiixp_pcm_pointer()
658 curptr -= dma->buf_addr; in snd_atiixp_pcm_pointer()
659 if (curptr >= dma->buf_bytes) in snd_atiixp_pcm_pointer()
664 readl(chip->remap_addr + dma->ops->dt_cur), dma->buf_addr); in snd_atiixp_pcm_pointer()
671 static void snd_atiixp_xrun_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_xrun_dma() argument
673 if (! dma->substream || ! dma->running) in snd_atiixp_xrun_dma()
675 dev_dbg(chip->card->dev, "XRUN detected (DMA %d)\n", dma->ops->type); in snd_atiixp_xrun_dma()
676 snd_pcm_stop_xrun(dma->substream); in snd_atiixp_xrun_dma()
682 static void snd_atiixp_update_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_update_dma() argument
684 if (! dma->substream || ! dma->running) in snd_atiixp_update_dma()
686 snd_pcm_period_elapsed(dma->substream); in snd_atiixp_update_dma()
709 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_trigger() local
712 if (snd_BUG_ON(!dma->ops->enable_transfer || in snd_atiixp_pcm_trigger()
713 !dma->ops->flush_dma)) in snd_atiixp_pcm_trigger()
721 if (dma->running && dma->suspended && in snd_atiixp_pcm_trigger()
723 writel(dma->saved_curptr, chip->remap_addr + in snd_atiixp_pcm_trigger()
724 dma->ops->dt_cur); in snd_atiixp_pcm_trigger()
725 dma->ops->enable_transfer(chip, 1); in snd_atiixp_pcm_trigger()
726 dma->running = 1; in snd_atiixp_pcm_trigger()
727 dma->suspended = 0; in snd_atiixp_pcm_trigger()
732 dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND; in snd_atiixp_pcm_trigger()
733 if (dma->running && dma->suspended) in snd_atiixp_pcm_trigger()
734 dma->saved_curptr = readl(chip->remap_addr + in snd_atiixp_pcm_trigger()
735 dma->ops->dt_cur); in snd_atiixp_pcm_trigger()
736 dma->ops->enable_transfer(chip, 0); in snd_atiixp_pcm_trigger()
737 dma->running = 0; in snd_atiixp_pcm_trigger()
746 dma->ops->flush_dma(chip); in snd_atiixp_pcm_trigger()
951 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_params() local
954 dma->buf_addr = substream->runtime->dma_addr; in snd_atiixp_pcm_hw_params()
955 dma->buf_bytes = params_buffer_bytes(hw_params); in snd_atiixp_pcm_hw_params()
957 err = atiixp_build_dma_packets(chip, dma, substream, in snd_atiixp_pcm_hw_params()
963 if (dma->ac97_pcm_type >= 0) { in snd_atiixp_pcm_hw_params()
964 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_params()
968 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_params()
970 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_params()
976 dma->pcm_open_flag = 1; in snd_atiixp_pcm_hw_params()
985 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_free() local
987 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_free()
988 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_free()
990 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_free()
992 atiixp_clear_dma_packets(chip, dma, substream); in snd_atiixp_pcm_hw_free()
1021 struct atiixp_dma *dma, int pcm_type) in snd_atiixp_pcm_open() argument
1027 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_open()
1030 if (dma->opened) in snd_atiixp_pcm_open()
1032 dma->substream = substream; in snd_atiixp_pcm_open()
1034 dma->ac97_pcm_type = pcm_type; in snd_atiixp_pcm_open()
1045 runtime->private_data = dma; in snd_atiixp_pcm_open()
1049 dma->ops->enable_dma(chip, 1); in snd_atiixp_pcm_open()
1051 dma->opened = 1; in snd_atiixp_pcm_open()
1057 struct atiixp_dma *dma) in snd_atiixp_pcm_close() argument
1061 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_close()
1064 dma->ops->enable_dma(chip, 0); in snd_atiixp_pcm_close()
1066 dma->substream = NULL; in snd_atiixp_pcm_close()
1067 dma->opened = 0; in snd_atiixp_pcm_close()
1489 struct atiixp_dma *dma = &chip->dmas[i]; in snd_atiixp_resume() local
1490 if (dma->substream && dma->suspended) { in snd_atiixp_resume()
1491 dma->ops->enable_dma(chip, 1); in snd_atiixp_resume()
1492 dma->substream->ops->prepare(dma->substream); in snd_atiixp_resume()
1493 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in snd_atiixp_resume()
1494 chip->remap_addr + dma->ops->llp_offset); in snd_atiixp_resume()