[RFC PATCH] dma: at_xdmac: creation of the atmel eXtended DMA Controller driver

Ludovic Desroches ludovic.desroches at atmel.com
Wed Jun 11 01:12:48 PDT 2014


On Wed, Jun 11, 2014 at 09:41:47AM +0200, Arnd Bergmann wrote:
> On Wednesday 11 June 2014 09:35:25 Ludovic Desroches wrote:
> > > > +     if (dma_spec->args_count != 2) {
> > > > +             dev_err(&pdev->dev, "dma phandler args: bad number of args\n");
> > > > +             return NULL;
> > > > +     }
> > > > +
> > > > +     dma_cap_zero(mask);
> > > > +     dma_cap_set(DMA_SLAVE, mask);
> > > > +     chan = dma_request_channel(mask, NULL, NULL);
> > > > +     if (!chan) {
> > > > +             dev_err(&pdev->dev, "can't get a dma channel\n");
> > > > +             return NULL;
> > > > +     }
> > > 
> > > You must use dma_get_any_slave_channel. dma_request_channel gives you a
> > > channel from a random dma engine that is present in the system, not
> > > necessarily the one you are managing here.
> > 
> > It is planned to use dma_get_any_slave_channel but currently I am doing
> > tests on a 3.10 kernel that's why I am still using dma_request_channel.
> 
> Ok, I see. The correct way to do this then would be to have a filter
> function that compares the channel's dmadevice pointer to the one
> you get from the of_dma_data pointer. Since you already plan to
> change this, and you probably know that there are no other engines
> in the system, maybe you can do it like this in the meantime:
> 
> 	/* FIXME: use dma_get_any_slave_chan to avoid the WARN_ON */
> 	if (!chan || WARN_ON(chan->device != dev)) {
> 		dev_err(&pdev->dev, "can't get a dma channel\n");
> 		return NULL;
> 	}
> 

I have noticed that the filter function was missing in the RFC version.
I had to add it since there are two xdma controllers in the system.

static bool at_xdmac_filter(struct dma_chan *chan, void *slave)                 
{                                                                               
        struct device *dma_dev = (struct device *) slave;                       
                                                                                
        if (dma_dev == chan->device->dev)                                       
                return true;                                                    
        else                                                                    
                return false;                                                   
}


Ludovic



More information about the linux-arm-kernel mailing list