Lines Matching refs:dmadata

26 	struct txx9aclc_dmadata dmadata[2];  member
33 struct txx9aclc_dmadata *dmadata);
55 struct txx9aclc_dmadata *dmadata = runtime->private_data; in txx9aclc_pcm_hw_params() local
68 dmadata->substream = substream; in txx9aclc_pcm_hw_params()
69 dmadata->pos = 0; in txx9aclc_pcm_hw_params()
77 struct txx9aclc_dmadata *dmadata = runtime->private_data; in txx9aclc_pcm_prepare() local
79 dmadata->dma_addr = runtime->dma_addr; in txx9aclc_pcm_prepare()
80 dmadata->buffer_bytes = snd_pcm_lib_buffer_bytes(substream); in txx9aclc_pcm_prepare()
81 dmadata->period_bytes = snd_pcm_lib_period_bytes(substream); in txx9aclc_pcm_prepare()
83 if (dmadata->buffer_bytes == dmadata->period_bytes) { in txx9aclc_pcm_prepare()
84 dmadata->frag_bytes = dmadata->period_bytes >> 1; in txx9aclc_pcm_prepare()
85 dmadata->frags = 2; in txx9aclc_pcm_prepare()
87 dmadata->frag_bytes = dmadata->period_bytes; in txx9aclc_pcm_prepare()
88 dmadata->frags = dmadata->buffer_bytes / dmadata->period_bytes; in txx9aclc_pcm_prepare()
90 dmadata->frag_count = 0; in txx9aclc_pcm_prepare()
91 dmadata->pos = 0; in txx9aclc_pcm_prepare()
97 struct txx9aclc_dmadata *dmadata = arg; in txx9aclc_dma_complete() local
101 spin_lock_irqsave(&dmadata->dma_lock, flags); in txx9aclc_dma_complete()
102 if (dmadata->frag_count >= 0) { in txx9aclc_dma_complete()
103 dmadata->dmacount--; in txx9aclc_dma_complete()
104 if (!WARN_ON(dmadata->dmacount < 0)) in txx9aclc_dma_complete()
105 queue_work(system_highpri_wq, &dmadata->work); in txx9aclc_dma_complete()
107 spin_unlock_irqrestore(&dmadata->dma_lock, flags); in txx9aclc_dma_complete()
111 txx9aclc_dma_submit(struct txx9aclc_dmadata *dmadata, dma_addr_t buf_dma_addr) in txx9aclc_dma_submit() argument
113 struct dma_chan *chan = dmadata->dma_chan; in txx9aclc_dma_submit()
119 dmadata->frag_bytes, buf_dma_addr & (PAGE_SIZE - 1)); in txx9aclc_dma_submit()
122 dmadata->substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? in txx9aclc_dma_submit()
130 desc->callback_param = dmadata; in txx9aclc_dma_submit()
139 struct txx9aclc_dmadata *dmadata = in txx9aclc_dma_work() local
141 struct dma_chan *chan = dmadata->dma_chan; in txx9aclc_dma_work()
143 struct snd_pcm_substream *substream = dmadata->substream; in txx9aclc_dma_work()
149 spin_lock_irqsave(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
150 if (dmadata->frag_count < 0) { in txx9aclc_dma_work()
154 spin_unlock_irqrestore(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
158 desc = txx9aclc_dma_submit(dmadata, in txx9aclc_dma_work()
159 dmadata->dma_addr + i * dmadata->frag_bytes); in txx9aclc_dma_work()
163 dmadata->dmacount = NR_DMA_CHAIN; in txx9aclc_dma_work()
165 spin_lock_irqsave(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
167 dmadata->frag_count = NR_DMA_CHAIN % dmadata->frags; in txx9aclc_dma_work()
168 spin_unlock_irqrestore(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
171 if (WARN_ON(dmadata->dmacount >= NR_DMA_CHAIN)) { in txx9aclc_dma_work()
172 spin_unlock_irqrestore(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
175 while (dmadata->dmacount < NR_DMA_CHAIN) { in txx9aclc_dma_work()
176 dmadata->dmacount++; in txx9aclc_dma_work()
177 spin_unlock_irqrestore(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
178 desc = txx9aclc_dma_submit(dmadata, in txx9aclc_dma_work()
179 dmadata->dma_addr + in txx9aclc_dma_work()
180 dmadata->frag_count * dmadata->frag_bytes); in txx9aclc_dma_work()
185 spin_lock_irqsave(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
186 dmadata->frag_count++; in txx9aclc_dma_work()
187 dmadata->frag_count %= dmadata->frags; in txx9aclc_dma_work()
188 dmadata->pos += dmadata->frag_bytes; in txx9aclc_dma_work()
189 dmadata->pos %= dmadata->buffer_bytes; in txx9aclc_dma_work()
190 if ((dmadata->frag_count * dmadata->frag_bytes) % in txx9aclc_dma_work()
191 dmadata->period_bytes == 0) in txx9aclc_dma_work()
194 spin_unlock_irqrestore(&dmadata->dma_lock, flags); in txx9aclc_dma_work()
200 struct txx9aclc_dmadata *dmadata = substream->runtime->private_data; in txx9aclc_pcm_trigger() local
208 spin_lock_irqsave(&dmadata->dma_lock, flags); in txx9aclc_pcm_trigger()
211 dmadata->frag_count = -1; in txx9aclc_pcm_trigger()
212 queue_work(system_highpri_wq, &dmadata->work); in txx9aclc_pcm_trigger()
226 spin_unlock_irqrestore(&dmadata->dma_lock, flags); in txx9aclc_pcm_trigger()
234 struct txx9aclc_dmadata *dmadata = substream->runtime->private_data; in txx9aclc_pcm_pointer() local
236 return bytes_to_frames(substream->runtime, dmadata->pos); in txx9aclc_pcm_pointer()
243 struct txx9aclc_dmadata *dmadata = &dev->dmadata[substream->stream]; in txx9aclc_pcm_open() local
254 substream->runtime->private_data = dmadata; in txx9aclc_pcm_open()
261 struct txx9aclc_dmadata *dmadata = substream->runtime->private_data; in txx9aclc_pcm_close() local
262 struct dma_chan *chan = dmadata->dma_chan; in txx9aclc_pcm_close()
264 dmadata->frag_count = -1; in txx9aclc_pcm_close()
284 dev->dmadata[0].stream = SNDRV_PCM_STREAM_PLAYBACK; in txx9aclc_pcm_new()
285 dev->dmadata[1].stream = SNDRV_PCM_STREAM_CAPTURE; in txx9aclc_pcm_new()
292 dev->dmadata[i].dma_res = r; in txx9aclc_pcm_new()
293 ret = txx9aclc_dma_init(dev, &dev->dmadata[i]); in txx9aclc_pcm_new()
304 if (dev->dmadata[i].dma_chan) in txx9aclc_pcm_new()
305 dma_release_channel(dev->dmadata[i].dma_chan); in txx9aclc_pcm_new()
306 dev->dmadata[i].dma_chan = NULL; in txx9aclc_pcm_new()
313 struct txx9aclc_dmadata *dmadata = param; in filter() local
317 devname = kasprintf(GFP_KERNEL, "%s.%d", dmadata->dma_res->name, in filter()
318 (int)dmadata->dma_res->start); in filter()
320 chan->private = &dmadata->dma_slave; in filter()
328 struct txx9aclc_dmadata *dmadata) in txx9aclc_dma_init() argument
331 struct txx9dmac_slave *ds = &dmadata->dma_slave; in txx9aclc_dma_init()
334 spin_lock_init(&dmadata->dma_lock); in txx9aclc_dma_init()
337 if (dmadata->stream == SNDRV_PCM_STREAM_PLAYBACK) { in txx9aclc_dma_init()
348 dmadata->dma_chan = dma_request_channel(mask, filter, dmadata); in txx9aclc_dma_init()
349 if (!dmadata->dma_chan) { in txx9aclc_dma_init()
352 dmadata->stream == SNDRV_PCM_STREAM_PLAYBACK ? in txx9aclc_dma_init()
356 INIT_WORK(&dmadata->work, txx9aclc_dma_work); in txx9aclc_dma_init()
379 struct txx9aclc_dmadata *dmadata = &dev->dmadata[i]; in txx9aclc_pcm_remove() local
380 struct dma_chan *chan = dmadata->dma_chan; in txx9aclc_pcm_remove()
383 dmadata->frag_count = -1; in txx9aclc_pcm_remove()
387 dev->dmadata[i].dma_chan = NULL; in txx9aclc_pcm_remove()