Lines Matching refs:rt5514_dsp
39 struct rt5514_dsp { struct
76 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_copy_work() local
77 container_of(work, struct rt5514_dsp, copy_work.work); in rt5514_spi_copy_work()
83 mutex_lock(&rt5514_dsp->dma_lock); in rt5514_spi_copy_work()
84 if (!rt5514_dsp->substream) { in rt5514_spi_copy_work()
85 dev_err(rt5514_dsp->dev, "No pcm substream\n"); in rt5514_spi_copy_work()
89 runtime = rt5514_dsp->substream->runtime; in rt5514_spi_copy_work()
90 period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream); in rt5514_spi_copy_work()
92 schedule_delayed_work(&rt5514_dsp->copy_work, 5); in rt5514_spi_copy_work()
96 if (rt5514_dsp->buf_size % period_bytes) in rt5514_spi_copy_work()
97 rt5514_dsp->buf_size = (rt5514_dsp->buf_size / period_bytes) * in rt5514_spi_copy_work()
100 if (rt5514_dsp->get_size >= rt5514_dsp->buf_size) { in rt5514_spi_copy_work()
106 if (cur_wp >= rt5514_dsp->buf_rp) in rt5514_spi_copy_work()
107 remain_data = (cur_wp - rt5514_dsp->buf_rp); in rt5514_spi_copy_work()
110 (rt5514_dsp->buf_limit - rt5514_dsp->buf_rp) + in rt5514_spi_copy_work()
111 (cur_wp - rt5514_dsp->buf_base); in rt5514_spi_copy_work()
114 schedule_delayed_work(&rt5514_dsp->copy_work, 5); in rt5514_spi_copy_work()
119 if (rt5514_dsp->buf_rp + period_bytes <= rt5514_dsp->buf_limit) { in rt5514_spi_copy_work()
120 rt5514_spi_burst_read(rt5514_dsp->buf_rp, in rt5514_spi_copy_work()
121 runtime->dma_area + rt5514_dsp->dma_offset, in rt5514_spi_copy_work()
124 if (rt5514_dsp->buf_rp + period_bytes == rt5514_dsp->buf_limit) in rt5514_spi_copy_work()
125 rt5514_dsp->buf_rp = rt5514_dsp->buf_base; in rt5514_spi_copy_work()
127 rt5514_dsp->buf_rp += period_bytes; in rt5514_spi_copy_work()
129 truncated_bytes = rt5514_dsp->buf_limit - rt5514_dsp->buf_rp; in rt5514_spi_copy_work()
130 rt5514_spi_burst_read(rt5514_dsp->buf_rp, in rt5514_spi_copy_work()
131 runtime->dma_area + rt5514_dsp->dma_offset, in rt5514_spi_copy_work()
134 rt5514_spi_burst_read(rt5514_dsp->buf_base, in rt5514_spi_copy_work()
135 runtime->dma_area + rt5514_dsp->dma_offset + in rt5514_spi_copy_work()
138 rt5514_dsp->buf_rp = rt5514_dsp->buf_base + period_bytes - in rt5514_spi_copy_work()
142 rt5514_dsp->get_size += period_bytes; in rt5514_spi_copy_work()
143 rt5514_dsp->dma_offset += period_bytes; in rt5514_spi_copy_work()
144 if (rt5514_dsp->dma_offset >= runtime->dma_bytes) in rt5514_spi_copy_work()
145 rt5514_dsp->dma_offset = 0; in rt5514_spi_copy_work()
147 snd_pcm_period_elapsed(rt5514_dsp->substream); in rt5514_spi_copy_work()
149 schedule_delayed_work(&rt5514_dsp->copy_work, 5); in rt5514_spi_copy_work()
152 mutex_unlock(&rt5514_dsp->dma_lock); in rt5514_spi_copy_work()
155 static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp) in rt5514_schedule_copy() argument
159 if (!rt5514_dsp->substream) in rt5514_schedule_copy()
162 rt5514_dsp->get_size = 0; in rt5514_schedule_copy()
171 rt5514_dsp->buf_base = buf[0] | buf[1] << 8 | buf[2] << 16 | in rt5514_schedule_copy()
176 rt5514_dsp->buf_limit = buf[0] | buf[1] << 8 | buf[2] << 16 | in rt5514_schedule_copy()
181 rt5514_dsp->buf_rp = buf[0] | buf[1] << 8 | buf[2] << 16 | in rt5514_schedule_copy()
184 if (rt5514_dsp->buf_rp % 8) in rt5514_schedule_copy()
185 rt5514_dsp->buf_rp = (rt5514_dsp->buf_rp / 8) * 8; in rt5514_schedule_copy()
187 rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base; in rt5514_schedule_copy()
189 if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit && in rt5514_schedule_copy()
190 rt5514_dsp->buf_rp && rt5514_dsp->buf_size) in rt5514_schedule_copy()
191 schedule_delayed_work(&rt5514_dsp->copy_work, 0); in rt5514_schedule_copy()
196 struct rt5514_dsp *rt5514_dsp = data; in rt5514_spi_irq() local
198 rt5514_schedule_copy(rt5514_dsp); in rt5514_spi_irq()
216 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_hw_params() local
220 mutex_lock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_params()
221 rt5514_dsp->substream = substream; in rt5514_spi_hw_params()
222 rt5514_dsp->dma_offset = 0; in rt5514_spi_hw_params()
227 rt5514_schedule_copy(rt5514_dsp); in rt5514_spi_hw_params()
229 mutex_unlock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_params()
237 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_hw_free() local
240 mutex_lock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_free()
241 rt5514_dsp->substream = NULL; in rt5514_spi_hw_free()
242 mutex_unlock(&rt5514_dsp->dma_lock); in rt5514_spi_hw_free()
244 cancel_delayed_work_sync(&rt5514_dsp->copy_work); in rt5514_spi_hw_free()
254 struct rt5514_dsp *rt5514_dsp = in rt5514_spi_pcm_pointer() local
257 return bytes_to_frames(runtime, rt5514_dsp->dma_offset); in rt5514_spi_pcm_pointer()
263 struct rt5514_dsp *rt5514_dsp; in rt5514_spi_pcm_probe() local
266 rt5514_dsp = devm_kzalloc(component->dev, sizeof(*rt5514_dsp), in rt5514_spi_pcm_probe()
268 if (!rt5514_dsp) in rt5514_spi_pcm_probe()
271 rt5514_dsp->dev = &rt5514_spi->dev; in rt5514_spi_pcm_probe()
272 mutex_init(&rt5514_dsp->dma_lock); in rt5514_spi_pcm_probe()
273 INIT_DELAYED_WORK(&rt5514_dsp->copy_work, rt5514_spi_copy_work); in rt5514_spi_pcm_probe()
274 snd_soc_component_set_drvdata(component, rt5514_dsp); in rt5514_spi_pcm_probe()
280 rt5514_dsp); in rt5514_spi_pcm_probe()
286 device_init_wakeup(rt5514_dsp->dev, true); in rt5514_spi_pcm_probe()
473 struct rt5514_dsp *rt5514_dsp = dev_get_drvdata(dev); in rt5514_resume() local
480 if (rt5514_dsp) { in rt5514_resume()
481 if (rt5514_dsp->substream) { in rt5514_resume()
485 rt5514_schedule_copy(rt5514_dsp); in rt5514_resume()