Lines Matching refs:rt5514_dsp

42 struct rt5514_dsp {  struct
79 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_copy_work() local
80 container_of(work, struct rt5514_dsp, copy_work.work); in rt5514_spi_copy_work()
86 mutex_lock(&rt5514_dsp->dma_lock); in rt5514_spi_copy_work()
87 if (!rt5514_dsp->substream) { in rt5514_spi_copy_work()
88 dev_err(rt5514_dsp->dev, "No pcm substream\n"); in rt5514_spi_copy_work()
92 runtime = rt5514_dsp->substream->runtime; in rt5514_spi_copy_work()
93 period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream); in rt5514_spi_copy_work()
95 if (rt5514_dsp->get_size >= rt5514_dsp->buf_size) { in rt5514_spi_copy_work()
101 if (cur_wp >= rt5514_dsp->buf_rp) in rt5514_spi_copy_work()
102 remain_data = (cur_wp - rt5514_dsp->buf_rp); in rt5514_spi_copy_work()
105 (rt5514_dsp->buf_limit - rt5514_dsp->buf_rp) + in rt5514_spi_copy_work()
106 (cur_wp - rt5514_dsp->buf_base); in rt5514_spi_copy_work()
109 schedule_delayed_work(&rt5514_dsp->copy_work, 5); in rt5514_spi_copy_work()
114 if (rt5514_dsp->buf_rp + period_bytes <= rt5514_dsp->buf_limit) { in rt5514_spi_copy_work()
115 rt5514_spi_burst_read(rt5514_dsp->buf_rp, in rt5514_spi_copy_work()
116 runtime->dma_area + rt5514_dsp->dma_offset, in rt5514_spi_copy_work()
119 if (rt5514_dsp->buf_rp + period_bytes == rt5514_dsp->buf_limit) in rt5514_spi_copy_work()
120 rt5514_dsp->buf_rp = rt5514_dsp->buf_base; in rt5514_spi_copy_work()
122 rt5514_dsp->buf_rp += period_bytes; in rt5514_spi_copy_work()
124 truncated_bytes = rt5514_dsp->buf_limit - rt5514_dsp->buf_rp; in rt5514_spi_copy_work()
125 rt5514_spi_burst_read(rt5514_dsp->buf_rp, in rt5514_spi_copy_work()
126 runtime->dma_area + rt5514_dsp->dma_offset, in rt5514_spi_copy_work()
129 rt5514_spi_burst_read(rt5514_dsp->buf_base, in rt5514_spi_copy_work()
130 runtime->dma_area + rt5514_dsp->dma_offset + in rt5514_spi_copy_work()
133 rt5514_dsp->buf_rp = rt5514_dsp->buf_base + period_bytes - in rt5514_spi_copy_work()
137 rt5514_dsp->get_size += period_bytes; in rt5514_spi_copy_work()
138 rt5514_dsp->dma_offset += period_bytes; in rt5514_spi_copy_work()
139 if (rt5514_dsp->dma_offset >= runtime->dma_bytes) in rt5514_spi_copy_work()
140 rt5514_dsp->dma_offset = 0; in rt5514_spi_copy_work()
142 snd_pcm_period_elapsed(rt5514_dsp->substream); in rt5514_spi_copy_work()
144 schedule_delayed_work(&rt5514_dsp->copy_work, 5); in rt5514_spi_copy_work()
147 mutex_unlock(&rt5514_dsp->dma_lock); in rt5514_spi_copy_work()
150 static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp) in rt5514_schedule_copy() argument
155 if (!rt5514_dsp->substream) in rt5514_schedule_copy()
158 period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream); in rt5514_schedule_copy()
159 rt5514_dsp->get_size = 0; in rt5514_schedule_copy()
168 rt5514_dsp->buf_base = buf[0] | buf[1] << 8 | buf[2] << 16 | in rt5514_schedule_copy()
173 rt5514_dsp->buf_limit = buf[0] | buf[1] << 8 | buf[2] << 16 | in rt5514_schedule_copy()
178 rt5514_dsp->buf_rp = buf[0] | buf[1] << 8 | buf[2] << 16 | in rt5514_schedule_copy()
181 if (rt5514_dsp->buf_rp % 8) in rt5514_schedule_copy()
182 rt5514_dsp->buf_rp = (rt5514_dsp->buf_rp / 8) * 8; in rt5514_schedule_copy()
184 rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base; in rt5514_schedule_copy()
186 if (rt5514_dsp->buf_size % period_bytes) in rt5514_schedule_copy()
187 rt5514_dsp->buf_size = (rt5514_dsp->buf_size / period_bytes) * in rt5514_schedule_copy()
190 if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit && in rt5514_schedule_copy()
191 rt5514_dsp->buf_rp && rt5514_dsp->buf_size) in rt5514_schedule_copy()
192 schedule_delayed_work(&rt5514_dsp->copy_work, 0); in rt5514_schedule_copy()
197 struct rt5514_dsp *rt5514_dsp = data; in rt5514_spi_irq() local
199 rt5514_schedule_copy(rt5514_dsp); in rt5514_spi_irq()
217 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_hw_params() local
222 mutex_lock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_params()
225 rt5514_dsp->substream = substream; in rt5514_spi_hw_params()
226 rt5514_dsp->dma_offset = 0; in rt5514_spi_hw_params()
231 rt5514_schedule_copy(rt5514_dsp); in rt5514_spi_hw_params()
233 mutex_unlock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_params()
242 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_hw_free() local
245 mutex_lock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_free()
246 rt5514_dsp->substream = NULL; in rt5514_spi_hw_free()
247 mutex_unlock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_free()
249 cancel_delayed_work_sync(&rt5514_dsp->copy_work); in rt5514_spi_hw_free()
260 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_pcm_pointer() local
263 return bytes_to_frames(runtime, rt5514_dsp->dma_offset); in rt5514_spi_pcm_pointer()
276 struct rt5514_dsp *rt5514_dsp; in rt5514_spi_pcm_probe() local
279 rt5514_dsp = devm_kzalloc(component->dev, sizeof(*rt5514_dsp), in rt5514_spi_pcm_probe()
282 rt5514_dsp->dev = &rt5514_spi->dev; in rt5514_spi_pcm_probe()
283 mutex_init(&rt5514_dsp->dma_lock); in rt5514_spi_pcm_probe()
284 INIT_DELAYED_WORK(&rt5514_dsp->copy_work, rt5514_spi_copy_work); in rt5514_spi_pcm_probe()
285 snd_soc_component_set_drvdata(component, rt5514_dsp); in rt5514_spi_pcm_probe()
291 rt5514_dsp); in rt5514_spi_pcm_probe()
297 device_init_wakeup(rt5514_dsp->dev, true); in rt5514_spi_pcm_probe()
473 struct rt5514_dsp *rt5514_dsp = in rt5514_resume() local
481 if (rt5514_dsp) { in rt5514_resume()
482 if (rt5514_dsp->substream) { in rt5514_resume()
486 rt5514_schedule_copy(rt5514_dsp); in rt5514_resume()