Lines Matching refs:drv_data

64 static uint8_t dmic_mcux_hw_chan(struct mcux_dmic_drv_data *drv_data,  in dmic_mcux_hw_chan()  argument
74 dmic_parse_channel_map(drv_data->chan_map_lo, in dmic_mcux_hw_chan()
75 drv_data->chan_map_hi, in dmic_mcux_hw_chan()
84 static void dmic_mcux_activate_channels(struct mcux_dmic_drv_data *drv_data, in dmic_mcux_activate_channels() argument
95 for (uint8_t chan = 0; chan < drv_data->act_num_chan; chan++) { in dmic_mcux_activate_channels()
97 mask |= BIT(dmic_mcux_hw_chan(drv_data, chan)); in dmic_mcux_activate_channels()
101 DMIC_EnableChannnel(drv_data->base_address, mask); in dmic_mcux_activate_channels()
104 drv_data->base_address->CHANEN &= ~mask; in dmic_mcux_activate_channels()
108 static int dmic_mcux_enable_dma(struct mcux_dmic_drv_data *drv_data, bool enable) in dmic_mcux_enable_dma() argument
111 uint8_t num_chan = drv_data->act_num_chan; in dmic_mcux_enable_dma()
117 hw_chan = dmic_mcux_hw_chan(drv_data, chan); in dmic_mcux_enable_dma()
118 pdm_channel = drv_data->pdm_channels[hw_chan]; in dmic_mcux_enable_dma()
131 DMIC_EnableChannelDma(drv_data->base_address, in dmic_mcux_enable_dma()
139 static void dmic_mcux_reload_dma(struct mcux_dmic_drv_data *drv_data, in dmic_mcux_reload_dma() argument
145 uint8_t num_chan = drv_data->act_num_chan; in dmic_mcux_reload_dma()
146 uint32_t dma_buf_size = drv_data->block_size / num_chan; in dmic_mcux_reload_dma()
155 hw_chan = dmic_mcux_hw_chan(drv_data, chan); in dmic_mcux_reload_dma()
156 pdm_channel = drv_data->pdm_channels[hw_chan]; in dmic_mcux_reload_dma()
157 src = DMIC_FifoGetAddress(drv_data->base_address, hw_chan); in dmic_mcux_reload_dma()
177 static int dmic_mcux_stop(struct mcux_dmic_drv_data *drv_data) in dmic_mcux_stop() argument
180 dmic_mcux_activate_channels(drv_data, false); in dmic_mcux_stop()
182 dmic_mcux_enable_dma(drv_data, false); in dmic_mcux_stop()
186 k_mem_slab_free(drv_data->mem_slab, drv_data->dma_bufs[i]); in dmic_mcux_stop()
190 k_msgq_purge(drv_data->rx_queue); in dmic_mcux_stop()
192 drv_data->dmic_state = DMIC_STATE_CONFIGURED; in dmic_mcux_stop()
201 struct mcux_dmic_drv_data *drv_data = (struct mcux_dmic_drv_data *)user_data; in dmic_mcux_dma_cb() local
203 void *done_buffer = drv_data->dma_bufs[drv_data->active_buf_idx]; in dmic_mcux_dma_cb()
211 dmic_mcux_enable_dma(drv_data, false); in dmic_mcux_dma_cb()
212 dmic_mcux_activate_channels(drv_data, false); in dmic_mcux_dma_cb()
214 dmic_mcux_stop(drv_data); in dmic_mcux_dma_cb()
215 drv_data->dmic_state = DMIC_STATE_ERROR; in dmic_mcux_dma_cb()
222 ret = k_mem_slab_alloc(drv_data->mem_slab, &new_buffer, K_NO_WAIT); in dmic_mcux_dma_cb()
231 drv_data->dmic_state = DMIC_STATE_ERROR; in dmic_mcux_dma_cb()
233 dmic_mcux_reload_dma(drv_data, done_buffer); in dmic_mcux_dma_cb()
235 drv_data->active_buf_idx = in dmic_mcux_dma_cb()
236 dmic_mcux_next_buf_idx(drv_data->active_buf_idx); in dmic_mcux_dma_cb()
245 ret = k_msgq_put(drv_data->rx_queue, &done_buffer, K_NO_WAIT); in dmic_mcux_dma_cb()
248 k_mem_slab_free(drv_data->mem_slab, new_buffer); in dmic_mcux_dma_cb()
254 drv_data->dmic_state = DMIC_STATE_ERROR; in dmic_mcux_dma_cb()
256 dmic_mcux_reload_dma(drv_data, done_buffer); in dmic_mcux_dma_cb()
258 drv_data->active_buf_idx = in dmic_mcux_dma_cb()
259 dmic_mcux_next_buf_idx(drv_data->active_buf_idx); in dmic_mcux_dma_cb()
267 drv_data->dma_bufs[drv_data->active_buf_idx] = new_buffer; in dmic_mcux_dma_cb()
268 dmic_mcux_reload_dma(drv_data, new_buffer); in dmic_mcux_dma_cb()
270 drv_data->active_buf_idx = dmic_mcux_next_buf_idx(drv_data->active_buf_idx); in dmic_mcux_dma_cb()
275 struct mcux_dmic_drv_data *drv_data = dev->data; in dmic_mcux_setup_dma() local
279 uint8_t num_chan = drv_data->act_num_chan; in dmic_mcux_setup_dma()
280 uint32_t dma_buf_size = drv_data->block_size / num_chan; in dmic_mcux_setup_dma()
282 void *dma_buf = drv_data->dma_bufs[dma_buf_idx]; in dmic_mcux_setup_dma()
288 dma_cfg.user_data = drv_data; in dmic_mcux_setup_dma()
305 hw_chan = dmic_mcux_hw_chan(drv_data, chan); in dmic_mcux_setup_dma()
309 DMIC_FifoGetAddress(drv_data->base_address, hw_chan); in dmic_mcux_setup_dma()
340 dma_buf = drv_data->dma_bufs[dma_buf_idx]; in dmic_mcux_setup_dma()
342 pdm_channel = drv_data->pdm_channels[hw_chan]; in dmic_mcux_setup_dma()
362 struct mcux_dmic_drv_data *drv_data = dev->data; in dmic_mcux_init_channel() local
364 if (!drv_data->pdm_channels[chan]) { in dmic_mcux_init_channel()
369 drv_data->pdm_channels[chan]->dmic_channel_cfg.osr = osr; in dmic_mcux_init_channel()
371 DMIC_ConfigChannel(drv_data->base_address, (dmic_channel_t)chan, in dmic_mcux_init_channel()
373 &drv_data->pdm_channels[chan]->dmic_channel_cfg); in dmic_mcux_init_channel()
377 DMIC_FifoChannel(drv_data->base_address, chan, 15, true, true); in dmic_mcux_init_channel()
379 DMIC_EnableChannelInterrupt(drv_data->base_address, chan, false); in dmic_mcux_init_channel()
386 struct mcux_dmic_drv_data *drv_data = dev->data; in mcux_dmic_init() local
393 DMIC_Init(drv_data->base_address); in mcux_dmic_init()
394 DMIC_Use2fs(drv_data->base_address, config->use2fs); in mcux_dmic_init()
397 DMIC_SetIOCFG(drv_data->base_address, kDMIC_PdmDual); in mcux_dmic_init()
399 drv_data->dmic_state = DMIC_STATE_INITIALIZED; in mcux_dmic_init()
408 struct mcux_dmic_drv_data *drv_data = dev->data; in dmic_mcux_configure() local
416 if (drv_data->dmic_state == DMIC_STATE_ACTIVE) { in dmic_mcux_configure()
435 if (drv_data->dmic_state == DMIC_STATE_CONFIGURED) { in dmic_mcux_configure()
436 DMIC_DeInit(drv_data->base_address); in dmic_mcux_configure()
437 drv_data->dmic_state = DMIC_STATE_UNINIT; in dmic_mcux_configure()
443 if (drv_data->dmic_state == DMIC_STATE_UNINIT) { in dmic_mcux_configure()
486 drv_data->chan_map_lo = channel->req_chan_map_lo; in dmic_mcux_configure()
487 drv_data->chan_map_hi = channel->req_chan_map_hi; in dmic_mcux_configure()
506 dmic_mcux_hw_chan(drv_data, chan), in dmic_mcux_configure()
515 dmic_mcux_hw_chan(drv_data, in dmic_mcux_configure()
528 drv_data->mem_slab = stream->mem_slab; in dmic_mcux_configure()
529 drv_data->block_size = stream->block_size; in dmic_mcux_configure()
530 drv_data->act_num_chan = channel->act_num_chan; in dmic_mcux_configure()
531 drv_data->dmic_state = DMIC_STATE_CONFIGURED; in dmic_mcux_configure()
538 struct mcux_dmic_drv_data *drv_data = dev->data; in dmic_mcux_start() local
551 ret = k_mem_slab_alloc(drv_data->mem_slab, in dmic_mcux_start()
552 &drv_data->dma_bufs[i], K_NO_WAIT); in dmic_mcux_start()
564 ret = dmic_mcux_enable_dma(drv_data, true); in dmic_mcux_start()
568 dmic_mcux_activate_channels(drv_data, true); in dmic_mcux_start()
576 struct mcux_dmic_drv_data *drv_data = dev->data; in dmic_mcux_trigger() local
581 if (drv_data->dmic_state == DMIC_STATE_ACTIVE) { in dmic_mcux_trigger()
582 dmic_mcux_activate_channels(drv_data, false); in dmic_mcux_trigger()
584 drv_data->dmic_state = DMIC_STATE_PAUSED; in dmic_mcux_trigger()
587 if (drv_data->dmic_state == DMIC_STATE_ACTIVE) { in dmic_mcux_trigger()
588 dmic_mcux_stop(drv_data); in dmic_mcux_trigger()
590 drv_data->dmic_state = DMIC_STATE_CONFIGURED; in dmic_mcux_trigger()
594 if (drv_data->dmic_state == DMIC_STATE_PAUSED) { in dmic_mcux_trigger()
595 dmic_mcux_activate_channels(drv_data, true); in dmic_mcux_trigger()
597 drv_data->dmic_state = DMIC_STATE_ACTIVE; in dmic_mcux_trigger()
600 if ((drv_data->dmic_state != DMIC_STATE_CONFIGURED) && in dmic_mcux_trigger()
601 (drv_data->dmic_state != DMIC_STATE_ACTIVE)) { in dmic_mcux_trigger()
604 } else if (drv_data->dmic_state != DMIC_STATE_ACTIVE) { in dmic_mcux_trigger()
609 drv_data->dmic_state = DMIC_STATE_ACTIVE; in dmic_mcux_trigger()
614 DMIC_DeInit(drv_data->base_address); in dmic_mcux_trigger()
615 drv_data->dmic_state = DMIC_STATE_UNINIT; in dmic_mcux_trigger()
628 struct mcux_dmic_drv_data *drv_data = dev->data; in dmic_mcux_read() local
633 if (drv_data->dmic_state == DMIC_STATE_ERROR) { in dmic_mcux_read()
638 if ((drv_data->dmic_state != DMIC_STATE_CONFIGURED) && in dmic_mcux_read()
639 (drv_data->dmic_state != DMIC_STATE_ACTIVE) && in dmic_mcux_read()
640 (drv_data->dmic_state != DMIC_STATE_PAUSED)) { in dmic_mcux_read()
645 ret = k_msgq_get(drv_data->rx_queue, buffer, SYS_TIMEOUT_MS(timeout)); in dmic_mcux_read()
649 *size = drv_data->block_size; in dmic_mcux_read()