params->output_counter++;
wake_up_interruptible(¶ms->output_wait_queue);
spin_unlock_irqrestore(&output_int_lock, lock_flags);
+
+ schedule_work(¶ms->task_output_work);
return;
}
+static void asrc_output_task_worker(struct work_struct *w)
+{
+ struct asrc_pair_params *params =
+ container_of(w, struct asrc_pair_params, task_output_work);
+
+ /* asrc output work struct */
+}
+
+
static void mxc_free_dma_buf(struct asrc_pair_params *params)
{
if (params->input_dma_total.dma_vaddr != NULL) {
init_waitqueue_head(¶ms->input_wait_queue);
init_waitqueue_head(¶ms->output_wait_queue);
+ /* Add work struct to cover the task of
+ * receive last period of output data.*/
+ INIT_WORK(¶ms->task_output_work,
+ asrc_output_task_worker);
if (copy_to_user
((void __user *)arg, &config,
struct dma_block output_dma[ASRC_DMA_BUFFER_NUM];
struct dma_async_tx_descriptor *desc_in;
struct dma_async_tx_descriptor *desc_out;
+ struct work_struct task_output_work;
};
struct asrc_data {