rt5677_dsp
struct rt5677_dsp *rt5677_dsp =
cancel_delayed_work_sync(&rt5677_dsp->copy_work);
struct rt5677_dsp *rt5677_dsp =
mutex_lock(&rt5677_dsp->dma_lock);
rt5677_dsp->substream = substream;
mutex_unlock(&rt5677_dsp->dma_lock);
struct rt5677_dsp *rt5677_dsp =
mutex_lock(&rt5677_dsp->dma_lock);
rt5677_dsp->substream = NULL;
mutex_unlock(&rt5677_dsp->dma_lock);
struct rt5677_dsp *rt5677_dsp =
rt5677_dsp->dma_offset = 0;
rt5677_dsp->avail_bytes = 0;
struct rt5677_dsp *rt5677_dsp =
return bytes_to_frames(runtime, rt5677_dsp->dma_offset);
static int rt5677_spi_copy_block(struct rt5677_dsp *rt5677_dsp,
struct snd_pcm_runtime *runtime = rt5677_dsp->substream->runtime;
dev_err(rt5677_dsp->dev,
if (rt5677_dsp->dma_offset + first_chunk_len > runtime->dma_bytes) {
first_chunk_len = runtime->dma_bytes - rt5677_dsp->dma_offset;
runtime->dma_area + rt5677_dsp->dma_offset,
rt5677_dsp->dma_offset += first_chunk_len;
if (rt5677_dsp->dma_offset == runtime->dma_bytes)
rt5677_dsp->dma_offset = 0;
rt5677_dsp->dma_offset = second_chunk_len;
static int rt5677_spi_copy(struct rt5677_dsp *rt5677_dsp, u32 amount)
target = rt5677_dsp->mic_read_offset + amount;
ret |= rt5677_spi_copy_block(rt5677_dsp, rt5677_dsp->mic_read_offset,
ret |= rt5677_spi_copy_block(rt5677_dsp, 0, target);
rt5677_dsp->mic_read_offset = target;
struct rt5677_dsp *rt5677_dsp =
container_of(work, struct rt5677_dsp, copy_work.work);
mutex_lock(&rt5677_dsp->dma_lock);
if (!rt5677_dsp->substream) {
dev_err(rt5677_dsp->dev, "No pcm substream\n");
runtime = rt5677_dsp->substream->runtime;
dev_err(rt5677_dsp->dev, "No mic_write_offset\n");
if (rt5677_dsp->new_hotword) {
rt5677_dsp->new_hotword = false;
rt5677_dsp->mic_read_offset = RT5677_MIC_BUF_BYTES -
rt5677_dsp->mic_read_offset = mic_write_offset -
if (rt5677_dsp->mic_read_offset <= mic_write_offset)
new_bytes = mic_write_offset - rt5677_dsp->mic_read_offset;
- rt5677_dsp->mic_read_offset;
period_bytes = snd_pcm_lib_period_bytes(rt5677_dsp->substream);
- rt5677_dsp->avail_bytes);
ret = rt5677_spi_copy(rt5677_dsp, copy_bytes);
dev_err(rt5677_dsp->dev, "Copy failed %d\n", ret);
rt5677_dsp->avail_bytes += copy_bytes;
if (rt5677_dsp->avail_bytes >= period_bytes) {
snd_pcm_period_elapsed(rt5677_dsp->substream);
rt5677_dsp->avail_bytes = 0;
schedule_delayed_work(&rt5677_dsp->copy_work, secs_to_jiffies(delay));
mutex_unlock(&rt5677_dsp->dma_lock);
struct rt5677_dsp *rt5677_dsp;
rt5677_dsp = devm_kzalloc(component->dev, sizeof(*rt5677_dsp),
if (!rt5677_dsp)
rt5677_dsp->dev = &g_spi->dev;
mutex_init(&rt5677_dsp->dma_lock);
INIT_DELAYED_WORK(&rt5677_dsp->copy_work, rt5677_spi_copy_work);
snd_soc_component_set_drvdata(component, rt5677_dsp);
struct rt5677_dsp *rt5677_dsp;
rt5677_dsp = dev_get_drvdata(&g_spi->dev);
if (!rt5677_dsp) {
mutex_lock(&rt5677_dsp->dma_lock);
dev_info(rt5677_dsp->dev, "Hotword detected\n");
rt5677_dsp->new_hotword = true;
mutex_unlock(&rt5677_dsp->dma_lock);
schedule_delayed_work(&rt5677_dsp->copy_work, 0);