Logo Search packages:      
Sourcecode: linux-fsl-imx51 version File versions  Download package

int mxc_dma_config ( int  channel_num,
mxc_dma_requestbuf_t dma_buf,
int  num_buf,
mxc_dma_mode_t  mode 
)

This function would just configure the buffers specified by the user into dma channel. The caller must call mxc_dma_enable to start this transfer.

Parameters:
channel_num the channel number returned at request time. This would be used by the DMA driver to identify the calling driver and do the necessary cleanup on the channel associated with the particular peripheral
dma_buf an array of physical addresses to the user defined buffers. The caller must guarantee the dma_buf is available until the transfer is completed.
num_buf number of buffers in the array
mode specifies whether this is READ or WRITE operation
Returns:
This function returns a negative number on error if buffer could not be added with DMA for transfer. On Success, it returns 0

Definition at line 878 of file dma_mx2.c.

References mx2_dma_priv_s::dma_chaining, fill_dma_bd(), mxc_dma_channel::lock, mxc_dma_channel::mode, and mxc_dma_channel::private.

Referenced by asrc_ioctl(), audio_capture_dma(), audio_playback_dma(), dma_tx_do_tasklet(), mxc_irda_hard_xmit(), mxc_irda_rx_alloc(), mxcuart_dmaread_callback(), mxcuart_initdma(), mxcuart_start_tx(), spdif_start_rx(), and spdif_start_tx().

{
      mxc_dma_channel_t *dma;
      mx2_dma_priv_t *dma_private;

      if ((dma_buf == NULL) || (num_buf < 1)) {
            return -EINVAL;
      }

      if ((channel_num >= MAX_DMA_CHANNELS) || (channel_num < 0)) {
            return -EINVAL;
      }

      dma = g_dma_channels + channel_num;
      dma_private = (mx2_dma_priv_t *) dma->private;
      if (dma_private == NULL) {
            printk(KERN_ERR
                   "config dma %d which is not completed initialization \n",
                   channel_num);
            return -EFAULT;
      }

      if (dma->lock == 0) {
            return -ENODEV;
      }

      /*TODO: dma chainning can not support on bi-dir channel */
      if (dma_private->dma_chaining && (dma->mode != mode)) {
            return -EINVAL;
      }

      /*TODO: fill dma buffer into driver .
       * If driver is no enought buffer to save them , it will return -EBUSY
       */
      if (fill_dma_bd(dma, dma_buf, num_buf, mode)) {
            return -EBUSY;
      }

      return 0;
}


Generated by  Doxygen 1.6.0   Back to index