Lines Matching refs:rt5677_dsp
61 struct rt5677_dsp {
120 struct rt5677_dsp *rt5677_dsp =
123 cancel_delayed_work_sync(&rt5677_dsp->copy_work);
133 struct rt5677_dsp *rt5677_dsp =
136 mutex_lock(&rt5677_dsp->dma_lock);
137 rt5677_dsp->substream = substream;
138 mutex_unlock(&rt5677_dsp->dma_lock);
147 struct rt5677_dsp *rt5677_dsp =
150 mutex_lock(&rt5677_dsp->dma_lock);
151 rt5677_dsp->substream = NULL;
152 mutex_unlock(&rt5677_dsp->dma_lock);
166 struct rt5677_dsp *rt5677_dsp =
170 rt5677_dsp->dma_offset = 0;
171 rt5677_dsp->avail_bytes = 0;
180 struct rt5677_dsp *rt5677_dsp =
183 return bytes_to_frames(runtime, rt5677_dsp->dma_offset);
211 static int rt5677_spi_copy_block(struct rt5677_dsp *rt5677_dsp,
214 struct snd_pcm_runtime *runtime = rt5677_dsp->substream->runtime;
220 dev_err(rt5677_dsp->dev,
239 if (rt5677_dsp->dma_offset + first_chunk_len > runtime->dma_bytes) {
242 first_chunk_len = runtime->dma_bytes - rt5677_dsp->dma_offset;
248 runtime->dma_area + rt5677_dsp->dma_offset,
252 rt5677_dsp->dma_offset += first_chunk_len;
253 if (rt5677_dsp->dma_offset == runtime->dma_bytes)
254 rt5677_dsp->dma_offset = 0;
262 rt5677_dsp->dma_offset = second_chunk_len;
275 static int rt5677_spi_copy(struct rt5677_dsp *rt5677_dsp, u32 amount)
283 target = rt5677_dsp->mic_read_offset + amount;
285 ret |= rt5677_spi_copy_block(rt5677_dsp, rt5677_dsp->mic_read_offset,
291 ret |= rt5677_spi_copy_block(rt5677_dsp, 0, target);
295 rt5677_dsp->mic_read_offset = target;
305 struct rt5677_dsp *rt5677_dsp =
306 container_of(work, struct rt5677_dsp, copy_work.work);
314 mutex_lock(&rt5677_dsp->dma_lock);
315 if (!rt5677_dsp->substream) {
316 dev_err(rt5677_dsp->dev, "No pcm substream\n");
320 runtime = rt5677_dsp->substream->runtime;
323 dev_err(rt5677_dsp->dev, "No mic_write_offset\n");
331 if (rt5677_dsp->new_hotword) {
332 rt5677_dsp->new_hotword = false;
335 rt5677_dsp->mic_read_offset = RT5677_MIC_BUF_BYTES -
339 rt5677_dsp->mic_read_offset = mic_write_offset -
344 if (rt5677_dsp->mic_read_offset <= mic_write_offset)
345 new_bytes = mic_write_offset - rt5677_dsp->mic_read_offset;
348 - rt5677_dsp->mic_read_offset;
351 period_bytes = snd_pcm_lib_period_bytes(rt5677_dsp->substream);
354 - rt5677_dsp->avail_bytes);
355 ret = rt5677_spi_copy(rt5677_dsp, copy_bytes);
357 dev_err(rt5677_dsp->dev, "Copy failed %d\n", ret);
360 rt5677_dsp->avail_bytes += copy_bytes;
361 if (rt5677_dsp->avail_bytes >= period_bytes) {
362 snd_pcm_period_elapsed(rt5677_dsp->substream);
363 rt5677_dsp->avail_bytes = 0;
369 schedule_delayed_work(&rt5677_dsp->copy_work, msecs_to_jiffies(delay));
371 mutex_unlock(&rt5677_dsp->dma_lock);
384 struct rt5677_dsp *rt5677_dsp;
386 rt5677_dsp = devm_kzalloc(component->dev, sizeof(*rt5677_dsp),
388 if (!rt5677_dsp)
390 rt5677_dsp->dev = &g_spi->dev;
391 mutex_init(&rt5677_dsp->dma_lock);
392 INIT_DELAYED_WORK(&rt5677_dsp->copy_work, rt5677_spi_copy_work);
394 snd_soc_component_set_drvdata(component, rt5677_dsp);
583 struct rt5677_dsp *rt5677_dsp;
588 rt5677_dsp = dev_get_drvdata(&g_spi->dev);
589 if (!rt5677_dsp) {
590 dev_err(&g_spi->dev, "Can't get rt5677_dsp\n");
594 mutex_lock(&rt5677_dsp->dma_lock);
595 dev_info(rt5677_dsp->dev, "Hotword detected\n");
596 rt5677_dsp->new_hotword = true;
597 mutex_unlock(&rt5677_dsp->dma_lock);
599 schedule_delayed_work(&rt5677_dsp->copy_work, 0);