Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma
[~shefty/rdma-dev.git] / drivers / usb / musb / ux500_dma.c
index f8fd0ddee14a4c6d598b77805ee41882c7c7b7a2..97cb45916c4351110e3a21fb2613c2954855ee9b 100644 (file)
@@ -37,7 +37,6 @@ struct ux500_dma_channel {
        struct dma_channel channel;
        struct ux500_dma_controller *controller;
        struct musb_hw_ep *hw_ep;
-       struct work_struct channel_work;
        struct dma_chan *dma_chan;
        unsigned int cur_len;
        dma_cookie_t cookie;
@@ -56,31 +55,11 @@ struct ux500_dma_controller {
        dma_addr_t phy_base;
 };
 
-/* Work function invoked from DMA callback to handle tx transfers. */
-static void ux500_tx_work(struct work_struct *data)
-{
-       struct ux500_dma_channel *ux500_channel = container_of(data,
-               struct ux500_dma_channel, channel_work);
-       struct musb_hw_ep       *hw_ep = ux500_channel->hw_ep;
-       struct musb *musb = hw_ep->musb;
-       unsigned long flags;
-
-       dev_dbg(musb->controller, "DMA tx transfer done on hw_ep=%d\n",
-               hw_ep->epnum);
-
-       spin_lock_irqsave(&musb->lock, flags);
-       ux500_channel->channel.actual_len = ux500_channel->cur_len;
-       ux500_channel->channel.status = MUSB_DMA_STATUS_FREE;
-       musb_dma_completion(musb, hw_ep->epnum,
-                               ux500_channel->is_tx);
-       spin_unlock_irqrestore(&musb->lock, flags);
-}
-
 /* Work function invoked from DMA callback to handle rx transfers. */
-static void ux500_rx_work(struct work_struct *data)
+void ux500_dma_callback(void *private_data)
 {
-       struct ux500_dma_channel *ux500_channel = container_of(data,
-               struct ux500_dma_channel, channel_work);
+       struct dma_channel *channel = private_data;
+       struct ux500_dma_channel *ux500_channel = channel->private_data;
        struct musb_hw_ep       *hw_ep = ux500_channel->hw_ep;
        struct musb *musb = hw_ep->musb;
        unsigned long flags;
@@ -94,14 +73,7 @@ static void ux500_rx_work(struct work_struct *data)
        musb_dma_completion(musb, hw_ep->epnum,
                ux500_channel->is_tx);
        spin_unlock_irqrestore(&musb->lock, flags);
-}
-
-void ux500_dma_callback(void *private_data)
-{
-       struct dma_channel *channel = (struct dma_channel *)private_data;
-       struct ux500_dma_channel *ux500_channel = channel->private_data;
 
-       schedule_work(&ux500_channel->channel_work);
 }
 
 static bool ux500_configure_channel(struct dma_channel *channel,
@@ -330,7 +302,6 @@ static int ux500_dma_controller_start(struct dma_controller *c)
        void **param_array;
        struct ux500_dma_channel *channel_array;
        u32 ch_count;
-       void (*musb_channel_work)(struct work_struct *);
        dma_cap_mask_t mask;
 
        if ((data->num_rx_channels > UX500_MUSB_DMA_NUM_RX_CHANNELS) ||
@@ -347,7 +318,6 @@ static int ux500_dma_controller_start(struct dma_controller *c)
        channel_array = controller->rx_channel;
        ch_count = data->num_rx_channels;
        param_array = data->dma_rx_param_array;
-       musb_channel_work = ux500_rx_work;
 
        for (dir = 0; dir < 2; dir++) {
                for (ch_num = 0; ch_num < ch_count; ch_num++) {
@@ -374,15 +344,12 @@ static int ux500_dma_controller_start(struct dma_controller *c)
                                return -EBUSY;
                        }
 
-                       INIT_WORK(&ux500_channel->channel_work,
-                               musb_channel_work);
                }
 
                /* Prepare the loop for TX channels */
                channel_array = controller->tx_channel;
                ch_count = data->num_tx_channels;
                param_array = data->dma_tx_param_array;
-               musb_channel_work = ux500_tx_work;
                is_tx = 1;
        }