• Home
  • Raw
  • Download

Lines Matching refs:dma

342 static int atiixp_build_dma_packets(struct atiixp *chip, struct atiixp_dma *dma,  in atiixp_build_dma_packets()  argument
354 if (dma->desc_buf.area == NULL) { in atiixp_build_dma_packets()
358 &dma->desc_buf) < 0) in atiixp_build_dma_packets()
360 dma->period_bytes = dma->periods = 0; /* clear */ in atiixp_build_dma_packets()
363 if (dma->periods == periods && dma->period_bytes == period_bytes) in atiixp_build_dma_packets()
368 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
369 dma->ops->enable_dma(chip, 0); in atiixp_build_dma_packets()
370 dma->ops->enable_dma(chip, 1); in atiixp_build_dma_packets()
375 desc_addr = (u32)dma->desc_buf.addr; in atiixp_build_dma_packets()
378 desc = &((struct atiixp_dma_desc *)dma->desc_buf.area)[i]; in atiixp_build_dma_packets()
384 desc->next = cpu_to_le32((u32)dma->desc_buf.addr); in atiixp_build_dma_packets()
390 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in atiixp_build_dma_packets()
391 chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
393 dma->period_bytes = period_bytes; in atiixp_build_dma_packets()
394 dma->periods = periods; in atiixp_build_dma_packets()
402 static void atiixp_clear_dma_packets(struct atiixp *chip, struct atiixp_dma *dma, in atiixp_clear_dma_packets() argument
405 if (dma->desc_buf.area) { in atiixp_clear_dma_packets()
406 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_clear_dma_packets()
407 snd_dma_free_pages(&dma->desc_buf); in atiixp_clear_dma_packets()
408 dma->desc_buf.area = NULL; in atiixp_clear_dma_packets()
651 struct atiixp_dma *dma = runtime->private_data; in snd_atiixp_pcm_pointer() local
656 curptr = readl(chip->remap_addr + dma->ops->dt_cur); in snd_atiixp_pcm_pointer()
657 if (curptr < dma->buf_addr) in snd_atiixp_pcm_pointer()
659 curptr -= dma->buf_addr; in snd_atiixp_pcm_pointer()
660 if (curptr >= dma->buf_bytes) in snd_atiixp_pcm_pointer()
665 readl(chip->remap_addr + dma->ops->dt_cur), dma->buf_addr); in snd_atiixp_pcm_pointer()
672 static void snd_atiixp_xrun_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_xrun_dma() argument
674 if (! dma->substream || ! dma->running) in snd_atiixp_xrun_dma()
676 dev_dbg(chip->card->dev, "XRUN detected (DMA %d)\n", dma->ops->type); in snd_atiixp_xrun_dma()
677 snd_pcm_stop_xrun(dma->substream); in snd_atiixp_xrun_dma()
683 static void snd_atiixp_update_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_update_dma() argument
685 if (! dma->substream || ! dma->running) in snd_atiixp_update_dma()
687 snd_pcm_period_elapsed(dma->substream); in snd_atiixp_update_dma()
710 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_trigger() local
713 if (snd_BUG_ON(!dma->ops->enable_transfer || in snd_atiixp_pcm_trigger()
714 !dma->ops->flush_dma)) in snd_atiixp_pcm_trigger()
722 if (dma->running && dma->suspended && in snd_atiixp_pcm_trigger()
724 writel(dma->saved_curptr, chip->remap_addr + in snd_atiixp_pcm_trigger()
725 dma->ops->dt_cur); in snd_atiixp_pcm_trigger()
726 dma->ops->enable_transfer(chip, 1); in snd_atiixp_pcm_trigger()
727 dma->running = 1; in snd_atiixp_pcm_trigger()
728 dma->suspended = 0; in snd_atiixp_pcm_trigger()
733 dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND; in snd_atiixp_pcm_trigger()
734 if (dma->running && dma->suspended) in snd_atiixp_pcm_trigger()
735 dma->saved_curptr = readl(chip->remap_addr + in snd_atiixp_pcm_trigger()
736 dma->ops->dt_cur); in snd_atiixp_pcm_trigger()
737 dma->ops->enable_transfer(chip, 0); in snd_atiixp_pcm_trigger()
738 dma->running = 0; in snd_atiixp_pcm_trigger()
747 dma->ops->flush_dma(chip); in snd_atiixp_pcm_trigger()
952 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_params() local
958 dma->buf_addr = substream->runtime->dma_addr; in snd_atiixp_pcm_hw_params()
959 dma->buf_bytes = params_buffer_bytes(hw_params); in snd_atiixp_pcm_hw_params()
961 err = atiixp_build_dma_packets(chip, dma, substream, in snd_atiixp_pcm_hw_params()
967 if (dma->ac97_pcm_type >= 0) { in snd_atiixp_pcm_hw_params()
968 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_params()
972 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_params()
974 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_params()
980 dma->pcm_open_flag = 1; in snd_atiixp_pcm_hw_params()
989 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_free() local
991 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_free()
992 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_free()
994 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_free()
996 atiixp_clear_dma_packets(chip, dma, substream); in snd_atiixp_pcm_hw_free()
1026 struct atiixp_dma *dma, int pcm_type) in snd_atiixp_pcm_open() argument
1032 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_open()
1035 if (dma->opened) in snd_atiixp_pcm_open()
1037 dma->substream = substream; in snd_atiixp_pcm_open()
1039 dma->ac97_pcm_type = pcm_type; in snd_atiixp_pcm_open()
1049 runtime->private_data = dma; in snd_atiixp_pcm_open()
1053 dma->ops->enable_dma(chip, 1); in snd_atiixp_pcm_open()
1055 dma->opened = 1; in snd_atiixp_pcm_open()
1061 struct atiixp_dma *dma) in snd_atiixp_pcm_close() argument
1065 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_close()
1068 dma->ops->enable_dma(chip, 0); in snd_atiixp_pcm_close()
1070 dma->substream = NULL; in snd_atiixp_pcm_close()
1071 dma->opened = 0; in snd_atiixp_pcm_close()
1496 struct atiixp_dma *dma = &chip->dmas[i]; in snd_atiixp_resume() local
1497 if (dma->substream && dma->suspended) { in snd_atiixp_resume()
1498 dma->ops->enable_dma(chip, 1); in snd_atiixp_resume()
1499 dma->substream->ops->prepare(dma->substream); in snd_atiixp_resume()
1500 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in snd_atiixp_resume()
1501 chip->remap_addr + dma->ops->llp_offset); in snd_atiixp_resume()