return err;
 }
 
-static bool filter(struct dma_chan *chan, void *slave)
+static bool filter(struct dma_chan *chan, void *pdata)
 {
-       struct  at_dma_slave *sl = slave;
+       struct atmel_spi_dma *sl_pdata = pdata;
+       struct at_dma_slave *sl;
 
+       if (!sl_pdata)
+               return false;
+
+       sl = &sl_pdata->dma_slave;
        if (sl->dma_dev == chan->device->dev) {
                chan->private = sl;
                return true;
 
 static int atmel_spi_configure_dma(struct atmel_spi *as)
 {
-       struct at_dma_slave *sdata = &as->dma.dma_slave;
        struct dma_slave_config slave_config;
+       struct device *dev = &as->pdev->dev;
        int err;
 
-       if (sdata && sdata->dma_dev) {
-               dma_cap_mask_t mask;
+       dma_cap_mask_t mask;
+       dma_cap_zero(mask);
+       dma_cap_set(DMA_SLAVE, mask);
 
-               /* Try to grab two DMA channels */
-               dma_cap_zero(mask);
-               dma_cap_set(DMA_SLAVE, mask);
-               as->dma.chan_tx = dma_request_channel(mask, filter, sdata);
-               if (as->dma.chan_tx)
-                       as->dma.chan_rx =
-                               dma_request_channel(mask, filter, sdata);
+       as->dma.chan_tx = dma_request_slave_channel_compat(mask, filter,
+                                                          &as->dma,
+                                                          dev, "tx");
+       if (!as->dma.chan_tx) {
+               dev_err(dev,
+                       "DMA TX channel not available, SPI unable to use DMA\n");
+               err = -EBUSY;
+               goto error;
        }
-       if (!as->dma.chan_rx || !as->dma.chan_tx) {
-               dev_err(&as->pdev->dev,
-                       "DMA channel not available, SPI unable to use DMA\n");
+
+       as->dma.chan_rx = dma_request_slave_channel_compat(mask, filter,
+                                                          &as->dma,
+                                                          dev, "rx");
+
+       if (!as->dma.chan_rx) {
+               dev_err(dev,
+                       "DMA RX channel not available, SPI unable to use DMA\n");
                err = -EBUSY;
                goto error;
        }