Lines Matching refs:dma
356 static int atiixp_build_dma_packets(struct atiixp *chip, struct atiixp_dma *dma, in atiixp_build_dma_packets() argument
368 if (dma->desc_buf.area == NULL) { in atiixp_build_dma_packets()
372 &dma->desc_buf) < 0) in atiixp_build_dma_packets()
374 dma->period_bytes = dma->periods = 0; /* clear */ in atiixp_build_dma_packets()
377 if (dma->periods == periods && dma->period_bytes == period_bytes) in atiixp_build_dma_packets()
382 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
383 dma->ops->enable_dma(chip, 0); in atiixp_build_dma_packets()
384 dma->ops->enable_dma(chip, 1); in atiixp_build_dma_packets()
389 desc_addr = (u32)dma->desc_buf.addr; in atiixp_build_dma_packets()
392 desc = &((struct atiixp_dma_desc *)dma->desc_buf.area)[i]; in atiixp_build_dma_packets()
398 desc->next = cpu_to_le32((u32)dma->desc_buf.addr); in atiixp_build_dma_packets()
404 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in atiixp_build_dma_packets()
405 chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
407 dma->period_bytes = period_bytes; in atiixp_build_dma_packets()
408 dma->periods = periods; in atiixp_build_dma_packets()
416 static void atiixp_clear_dma_packets(struct atiixp *chip, struct atiixp_dma *dma, in atiixp_clear_dma_packets() argument
419 if (dma->desc_buf.area) { in atiixp_clear_dma_packets()
420 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_clear_dma_packets()
421 snd_dma_free_pages(&dma->desc_buf); in atiixp_clear_dma_packets()
422 dma->desc_buf.area = NULL; in atiixp_clear_dma_packets()
665 struct atiixp_dma *dma = runtime->private_data; in snd_atiixp_pcm_pointer() local
670 curptr = readl(chip->remap_addr + dma->ops->dt_cur); in snd_atiixp_pcm_pointer()
671 if (curptr < dma->buf_addr) in snd_atiixp_pcm_pointer()
673 curptr -= dma->buf_addr; in snd_atiixp_pcm_pointer()
674 if (curptr >= dma->buf_bytes) in snd_atiixp_pcm_pointer()
679 readl(chip->remap_addr + dma->ops->dt_cur), dma->buf_addr); in snd_atiixp_pcm_pointer()
686 static void snd_atiixp_xrun_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_xrun_dma() argument
688 if (! dma->substream || ! dma->running) in snd_atiixp_xrun_dma()
690 dev_dbg(chip->card->dev, "XRUN detected (DMA %d)\n", dma->ops->type); in snd_atiixp_xrun_dma()
691 snd_pcm_stop_xrun(dma->substream); in snd_atiixp_xrun_dma()
697 static void snd_atiixp_update_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_update_dma() argument
699 if (! dma->substream || ! dma->running) in snd_atiixp_update_dma()
701 snd_pcm_period_elapsed(dma->substream); in snd_atiixp_update_dma()
724 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_trigger() local
727 if (snd_BUG_ON(!dma->ops->enable_transfer || in snd_atiixp_pcm_trigger()
728 !dma->ops->flush_dma)) in snd_atiixp_pcm_trigger()
736 dma->ops->enable_transfer(chip, 1); in snd_atiixp_pcm_trigger()
737 dma->running = 1; in snd_atiixp_pcm_trigger()
738 dma->suspended = 0; in snd_atiixp_pcm_trigger()
743 dma->ops->enable_transfer(chip, 0); in snd_atiixp_pcm_trigger()
744 dma->running = 0; in snd_atiixp_pcm_trigger()
745 dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND; in snd_atiixp_pcm_trigger()
754 dma->ops->flush_dma(chip); in snd_atiixp_pcm_trigger()
959 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_params() local
965 dma->buf_addr = substream->runtime->dma_addr; in snd_atiixp_pcm_hw_params()
966 dma->buf_bytes = params_buffer_bytes(hw_params); in snd_atiixp_pcm_hw_params()
968 err = atiixp_build_dma_packets(chip, dma, substream, in snd_atiixp_pcm_hw_params()
974 if (dma->ac97_pcm_type >= 0) { in snd_atiixp_pcm_hw_params()
975 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_params()
979 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_params()
981 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_params()
987 dma->pcm_open_flag = 1; in snd_atiixp_pcm_hw_params()
996 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_free() local
998 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_free()
999 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_free()
1001 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_free()
1003 atiixp_clear_dma_packets(chip, dma, substream); in snd_atiixp_pcm_hw_free()
1033 struct atiixp_dma *dma, int pcm_type) in snd_atiixp_pcm_open() argument
1039 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_open()
1042 if (dma->opened) in snd_atiixp_pcm_open()
1044 dma->substream = substream; in snd_atiixp_pcm_open()
1046 dma->ac97_pcm_type = pcm_type; in snd_atiixp_pcm_open()
1056 runtime->private_data = dma; in snd_atiixp_pcm_open()
1060 dma->ops->enable_dma(chip, 1); in snd_atiixp_pcm_open()
1062 dma->opened = 1; in snd_atiixp_pcm_open()
1068 struct atiixp_dma *dma) in snd_atiixp_pcm_close() argument
1072 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_close()
1075 dma->ops->enable_dma(chip, 0); in snd_atiixp_pcm_close()
1077 dma->substream = NULL; in snd_atiixp_pcm_close()
1078 dma->opened = 0; in snd_atiixp_pcm_close()
1484 struct atiixp_dma *dma = &chip->dmas[i]; in snd_atiixp_suspend() local
1485 if (dma->substream && dma->running) in snd_atiixp_suspend()
1486 dma->saved_curptr = readl(chip->remap_addr + in snd_atiixp_suspend()
1487 dma->ops->dt_cur); in snd_atiixp_suspend()
1511 struct atiixp_dma *dma = &chip->dmas[i]; in snd_atiixp_resume() local
1512 if (dma->substream && dma->suspended) { in snd_atiixp_resume()
1513 dma->ops->enable_dma(chip, 1); in snd_atiixp_resume()
1514 dma->substream->ops->prepare(dma->substream); in snd_atiixp_resume()
1515 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in snd_atiixp_resume()
1516 chip->remap_addr + dma->ops->llp_offset); in snd_atiixp_resume()
1517 writel(dma->saved_curptr, chip->remap_addr + in snd_atiixp_resume()
1518 dma->ops->dt_cur); in snd_atiixp_resume()