diff options
author | Chen Liangjun <b36089@freescale.com> | 2012-10-26 13:42:35 +0800 |
---|---|---|
committer | Chen Liangjun <b36089@freescale.com> | 2012-11-06 13:43:40 +0800 |
commit | 07eeb987cd59cecd527ba4658ef8220e8f0c13ad (patch) | |
tree | a40c94ca72c3c1e9a445d421346a3794ef8e0bd6 /drivers | |
parent | 9ad976c9dfcb9937c71720d21eebe928370dd83b (diff) |
ENGR00231773-2 ASRC: add work struct for asrc output data receive
SDMA driver can't promise receive all output data generated. Cause when
the data in output FIFO is less than ASRC output FIFO watermark, there
would be no DMA request generated and thus no SDMA transfer would
happens.
In this patch, add work struct to support ASRC driver receive last part
of data in OUTPUT FIFO in polling way.
Signed-off-by: Chen Liangjun <b36089@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mxc/asrc/mxc_asrc.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/mxc/asrc/mxc_asrc.c b/drivers/mxc/asrc/mxc_asrc.c index 13cf635b4f03..8ce2197be9b2 100644 --- a/drivers/mxc/asrc/mxc_asrc.c +++ b/drivers/mxc/asrc/mxc_asrc.c @@ -860,9 +860,20 @@ static void asrc_output_dma_callback(void *data) 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) { @@ -1140,6 +1151,10 @@ static long asrc_ioctl(struct file *file, 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, |