rt5514_dsp
if (cur_wp >= rt5514_dsp->buf_rp)
remain_data = (cur_wp - rt5514_dsp->buf_rp);
(rt5514_dsp->buf_limit - rt5514_dsp->buf_rp) +
(cur_wp - rt5514_dsp->buf_base);
schedule_delayed_work(&rt5514_dsp->copy_work, 5);
if (rt5514_dsp->buf_rp + period_bytes <= rt5514_dsp->buf_limit) {
rt5514_spi_burst_read(rt5514_dsp->buf_rp,
runtime->dma_area + rt5514_dsp->dma_offset,
if (rt5514_dsp->buf_rp + period_bytes == rt5514_dsp->buf_limit)
rt5514_dsp->buf_rp = rt5514_dsp->buf_base;
rt5514_dsp->buf_rp += period_bytes;
truncated_bytes = rt5514_dsp->buf_limit - rt5514_dsp->buf_rp;
rt5514_spi_burst_read(rt5514_dsp->buf_rp,
runtime->dma_area + rt5514_dsp->dma_offset,
rt5514_spi_burst_read(rt5514_dsp->buf_base,
runtime->dma_area + rt5514_dsp->dma_offset +
rt5514_dsp->buf_rp = rt5514_dsp->buf_base + period_bytes -
rt5514_dsp->get_size += period_bytes;
rt5514_dsp->dma_offset += period_bytes;
if (rt5514_dsp->dma_offset >= runtime->dma_bytes)
rt5514_dsp->dma_offset = 0;
snd_pcm_period_elapsed(rt5514_dsp->substream);
schedule_delayed_work(&rt5514_dsp->copy_work, 5);
mutex_unlock(&rt5514_dsp->dma_lock);
static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp)
if (!rt5514_dsp->substream)
rt5514_dsp->get_size = 0;
rt5514_dsp->buf_base = buf[0] | buf[1] << 8 | buf[2] << 16 |
rt5514_dsp->buf_limit = buf[0] | buf[1] << 8 | buf[2] << 16 |
rt5514_dsp->buf_rp = buf[0] | buf[1] << 8 | buf[2] << 16 |
if (rt5514_dsp->buf_rp % 8)
rt5514_dsp->buf_rp = (rt5514_dsp->buf_rp / 8) * 8;
rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base;
if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit &&
rt5514_dsp->buf_rp && rt5514_dsp->buf_size)
schedule_delayed_work(&rt5514_dsp->copy_work, 0);
struct rt5514_dsp *rt5514_dsp = data;
rt5514_schedule_copy(rt5514_dsp);
struct rt5514_dsp *rt5514_dsp =
mutex_lock(&rt5514_dsp->dma_lock);
rt5514_dsp->substream = substream;
rt5514_dsp->dma_offset = 0;
rt5514_schedule_copy(rt5514_dsp);
mutex_unlock(&rt5514_dsp->dma_lock);
struct rt5514_dsp *rt5514_dsp =
mutex_lock(&rt5514_dsp->dma_lock);
rt5514_dsp->substream = NULL;
mutex_unlock(&rt5514_dsp->dma_lock);
cancel_delayed_work_sync(&rt5514_dsp->copy_work);
struct rt5514_dsp *rt5514_dsp =
return bytes_to_frames(runtime, rt5514_dsp->dma_offset);
struct rt5514_dsp *rt5514_dsp;
rt5514_dsp = devm_kzalloc(component->dev, sizeof(*rt5514_dsp),
if (!rt5514_dsp)
rt5514_dsp->dev = &rt5514_spi->dev;
mutex_init(&rt5514_dsp->dma_lock);
INIT_DELAYED_WORK(&rt5514_dsp->copy_work, rt5514_spi_copy_work);
snd_soc_component_set_drvdata(component, rt5514_dsp);
rt5514_dsp);
device_init_wakeup(rt5514_dsp->dev, true);
struct rt5514_dsp *rt5514_dsp = dev_get_drvdata(dev);
if (rt5514_dsp) {
if (rt5514_dsp->substream) {
rt5514_schedule_copy(rt5514_dsp);
struct rt5514_dsp *rt5514_dsp =
container_of(work, struct rt5514_dsp, copy_work.work);
mutex_lock(&rt5514_dsp->dma_lock);
if (!rt5514_dsp->substream) {
dev_err(rt5514_dsp->dev, "No pcm substream\n");
runtime = rt5514_dsp->substream->runtime;
period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream);
schedule_delayed_work(&rt5514_dsp->copy_work, 5);
if (rt5514_dsp->buf_size % period_bytes)
rt5514_dsp->buf_size = (rt5514_dsp->buf_size / period_bytes) *
if (rt5514_dsp->get_size >= rt5514_dsp->buf_size) {
SND_SOC_DAILINK_DEFS(rt5514_dsp,
SND_SOC_DAILINK_REG(rt5514_dsp),