Lines Matching +full:rates +full:- +full:ru
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2015 VanguardiaSur - www.vanguardiasur.com.ar
6 * Copyright 2015 www.starterkit.ru <info@starterkit.ru>
10 * (c) 2011-12 liran <[email protected]> [Intersil|Techwell China]
27 #include "tw686x-regs.h"
38 struct tw686x_audio_channel *ac = &dev->audio_channels[ch]; in tw686x_audio_irq()
45 spin_lock_irqsave(&ac->lock, flags); in tw686x_audio_irq()
48 if (!ac->ss || !ac->curr_bufs[0] || !ac->curr_bufs[1]) { in tw686x_audio_irq()
49 spin_unlock_irqrestore(&ac->lock, flags); in tw686x_audio_irq()
53 if (!list_empty(&ac->buf_list)) { in tw686x_audio_irq()
54 next = list_first_entry(&ac->buf_list, in tw686x_audio_irq()
56 list_move_tail(&next->list, &ac->buf_list); in tw686x_audio_irq()
57 done = ac->curr_bufs[!pb]; in tw686x_audio_irq()
58 ac->curr_bufs[pb] = next; in tw686x_audio_irq()
60 spin_unlock_irqrestore(&ac->lock, flags); in tw686x_audio_irq()
65 * Checking for a non-nil dma_desc[pb]->virt buffer is in tw686x_audio_irq()
68 desc = &ac->dma_descs[pb]; in tw686x_audio_irq()
69 if (desc->virt) { in tw686x_audio_irq()
70 memcpy(done->virt, desc->virt, in tw686x_audio_irq()
71 dev->period_size); in tw686x_audio_irq()
74 reg_write(dev, reg, next->dma); in tw686x_audio_irq()
76 ac->ptr = done->dma - ac->buf[0].dma; in tw686x_audio_irq()
77 snd_pcm_period_elapsed(ac->ss); in tw686x_audio_irq()
92 .rates = SNDRV_PCM_RATE_8000_48000,
107 struct tw686x_audio_channel *ac = &dev->audio_channels[ss->number]; in tw686x_pcm_open()
108 struct snd_pcm_runtime *rt = ss->runtime; in tw686x_pcm_open()
111 ac->ss = ss; in tw686x_pcm_open()
112 rt->hw = tw686x_capture_hw; in tw686x_pcm_open()
124 struct tw686x_audio_channel *ac = &dev->audio_channels[ss->number]; in tw686x_pcm_close()
126 ac->ss = NULL; in tw686x_pcm_close()
133 struct tw686x_audio_channel *ac = &dev->audio_channels[ss->number]; in tw686x_pcm_prepare()
134 struct snd_pcm_runtime *rt = ss->runtime; in tw686x_pcm_prepare()
140 spin_lock_irqsave(&dev->lock, flags); in tw686x_pcm_prepare()
145 if (((dev->audio_rate != rt->rate) || in tw686x_pcm_prepare()
146 (dev->period_size != period_size)) && dev->audio_enabled) in tw686x_pcm_prepare()
149 tw686x_disable_channel(dev, AUDIO_CHANNEL_OFFSET + ac->ch); in tw686x_pcm_prepare()
150 spin_unlock_irqrestore(&dev->lock, flags); in tw686x_pcm_prepare()
152 if (dev->audio_rate != rt->rate) { in tw686x_pcm_prepare()
155 dev->audio_rate = rt->rate; in tw686x_pcm_prepare()
156 reg = ((125000000 / rt->rate) << 16) + in tw686x_pcm_prepare()
157 ((125000000 % rt->rate) << 16) / rt->rate; in tw686x_pcm_prepare()
162 if (dev->period_size != period_size) { in tw686x_pcm_prepare()
165 dev->period_size = period_size; in tw686x_pcm_prepare()
173 if (rt->periods < TW686X_AUDIO_PERIODS_MIN || in tw686x_pcm_prepare()
174 rt->periods > TW686X_AUDIO_PERIODS_MAX) in tw686x_pcm_prepare()
175 return -EINVAL; in tw686x_pcm_prepare()
177 spin_lock_irqsave(&ac->lock, flags); in tw686x_pcm_prepare()
178 INIT_LIST_HEAD(&ac->buf_list); in tw686x_pcm_prepare()
180 for (i = 0; i < rt->periods; i++) { in tw686x_pcm_prepare()
181 ac->buf[i].dma = rt->dma_addr + period_size * i; in tw686x_pcm_prepare()
182 ac->buf[i].virt = rt->dma_area + period_size * i; in tw686x_pcm_prepare()
183 INIT_LIST_HEAD(&ac->buf[i].list); in tw686x_pcm_prepare()
184 list_add_tail(&ac->buf[i].list, &ac->buf_list); in tw686x_pcm_prepare()
187 p_buf = list_first_entry(&ac->buf_list, struct tw686x_audio_buf, list); in tw686x_pcm_prepare()
188 list_move_tail(&p_buf->list, &ac->buf_list); in tw686x_pcm_prepare()
190 b_buf = list_first_entry(&ac->buf_list, struct tw686x_audio_buf, list); in tw686x_pcm_prepare()
191 list_move_tail(&b_buf->list, &ac->buf_list); in tw686x_pcm_prepare()
193 ac->curr_bufs[0] = p_buf; in tw686x_pcm_prepare()
194 ac->curr_bufs[1] = b_buf; in tw686x_pcm_prepare()
195 ac->ptr = 0; in tw686x_pcm_prepare()
197 if (dev->dma_mode != TW686X_DMA_MODE_MEMCPY) { in tw686x_pcm_prepare()
198 reg_write(dev, ADMA_P_ADDR[ac->ch], p_buf->dma); in tw686x_pcm_prepare()
199 reg_write(dev, ADMA_B_ADDR[ac->ch], b_buf->dma); in tw686x_pcm_prepare()
202 spin_unlock_irqrestore(&ac->lock, flags); in tw686x_pcm_prepare()
207 spin_unlock_irqrestore(&dev->lock, flags); in tw686x_pcm_prepare()
208 return -EBUSY; in tw686x_pcm_prepare()
214 struct tw686x_audio_channel *ac = &dev->audio_channels[ss->number]; in tw686x_pcm_trigger()
220 if (ac->curr_bufs[0] && ac->curr_bufs[1]) { in tw686x_pcm_trigger()
221 spin_lock_irqsave(&dev->lock, flags); in tw686x_pcm_trigger()
222 dev->audio_enabled = 1; in tw686x_pcm_trigger()
224 AUDIO_CHANNEL_OFFSET + ac->ch); in tw686x_pcm_trigger()
225 spin_unlock_irqrestore(&dev->lock, flags); in tw686x_pcm_trigger()
227 mod_timer(&dev->dma_delay_timer, in tw686x_pcm_trigger()
230 err = -EIO; in tw686x_pcm_trigger()
234 spin_lock_irqsave(&dev->lock, flags); in tw686x_pcm_trigger()
235 dev->audio_enabled = 0; in tw686x_pcm_trigger()
236 tw686x_disable_channel(dev, AUDIO_CHANNEL_OFFSET + ac->ch); in tw686x_pcm_trigger()
237 spin_unlock_irqrestore(&dev->lock, flags); in tw686x_pcm_trigger()
239 spin_lock_irqsave(&ac->lock, flags); in tw686x_pcm_trigger()
240 ac->curr_bufs[0] = NULL; in tw686x_pcm_trigger()
241 ac->curr_bufs[1] = NULL; in tw686x_pcm_trigger()
242 spin_unlock_irqrestore(&ac->lock, flags); in tw686x_pcm_trigger()
245 err = -EINVAL; in tw686x_pcm_trigger()
253 struct tw686x_audio_channel *ac = &dev->audio_channels[ss->number]; in tw686x_pcm_pointer()
255 return bytes_to_frames(ss->runtime, ac->ptr); in tw686x_pcm_pointer()
268 struct snd_card *card = dev->snd_card; in tw686x_snd_pcm_init()
274 err = snd_pcm_new(card, card->driver, 0, 0, max_channels(dev), &pcm); in tw686x_snd_pcm_init()
280 pcm->info_flags = 0; in tw686x_snd_pcm_init()
281 strscpy(pcm->name, "tw686x PCM", sizeof(pcm->name)); in tw686x_snd_pcm_init()
283 for (i = 0, ss = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; in tw686x_snd_pcm_init()
284 ss; ss = ss->next, i++) in tw686x_snd_pcm_init()
285 snprintf(ss->name, sizeof(ss->name), "vch%u audio", i); in tw686x_snd_pcm_init()
289 &dev->pci_dev->dev, in tw686x_snd_pcm_init()
301 if (!ac->dma_descs[pb].virt) in tw686x_audio_dma_free()
303 dma_free_coherent(&dev->pci_dev->dev, ac->dma_descs[pb].size, in tw686x_audio_dma_free()
304 ac->dma_descs[pb].virt, in tw686x_audio_dma_free()
305 ac->dma_descs[pb].phys); in tw686x_audio_dma_free()
306 ac->dma_descs[pb].virt = NULL; in tw686x_audio_dma_free()
320 if (dev->dma_mode != TW686X_DMA_MODE_MEMCPY) in tw686x_audio_dma_alloc()
324 u32 reg = pb ? ADMA_B_ADDR[ac->ch] : ADMA_P_ADDR[ac->ch]; in tw686x_audio_dma_alloc()
327 virt = dma_alloc_coherent(&dev->pci_dev->dev, in tw686x_audio_dma_alloc()
329 &ac->dma_descs[pb].phys, GFP_KERNEL); in tw686x_audio_dma_alloc()
331 dev_err(&dev->pci_dev->dev, in tw686x_audio_dma_alloc()
332 "dma%d: unable to allocate audio DMA %s-buffer\n", in tw686x_audio_dma_alloc()
333 ac->ch, pb ? "B" : "P"); in tw686x_audio_dma_alloc()
334 return -ENOMEM; in tw686x_audio_dma_alloc()
336 ac->dma_descs[pb].virt = virt; in tw686x_audio_dma_alloc()
337 ac->dma_descs[pb].size = AUDIO_DMA_SIZE_MAX; in tw686x_audio_dma_alloc()
338 reg_write(dev, reg, ac->dma_descs[pb].phys); in tw686x_audio_dma_alloc()
349 spin_lock_irqsave(&dev->lock, flags); in tw686x_audio_free()
354 spin_unlock_irqrestore(&dev->lock, flags); in tw686x_audio_free()
356 if (!dev->snd_card) in tw686x_audio_free()
358 snd_card_free(dev->snd_card); in tw686x_audio_free()
359 dev->snd_card = NULL; in tw686x_audio_free()
364 struct pci_dev *pci_dev = dev->pci_dev; in tw686x_audio_init()
371 err = snd_card_new(&pci_dev->dev, SNDRV_DEFAULT_IDX1, in tw686x_audio_init()
377 dev->snd_card = card; in tw686x_audio_init()
378 strscpy(card->driver, "tw686x", sizeof(card->driver)); in tw686x_audio_init()
379 strscpy(card->shortname, "tw686x", sizeof(card->shortname)); in tw686x_audio_init()
380 strscpy(card->longname, pci_name(pci_dev), sizeof(card->longname)); in tw686x_audio_init()
381 snd_card_set_dev(card, &pci_dev->dev); in tw686x_audio_init()
386 ac = &dev->audio_channels[ch]; in tw686x_audio_init()
387 spin_lock_init(&ac->lock); in tw686x_audio_init()
388 ac->dev = dev; in tw686x_audio_init()
389 ac->ch = ch; in tw686x_audio_init()
406 if (!dev->audio_channels[ch].dev) in tw686x_audio_init()
408 tw686x_audio_dma_free(dev, &dev->audio_channels[ch]); in tw686x_audio_init()
411 dev->snd_card = NULL; in tw686x_audio_init()