Thread (10 messages) 10 messages, 5 authors, 2014-06-11

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

From: Ludovic Desroches <hidden>
Date: 2014-06-11 08:12:48
Also in: linux-arm-kernel

On Wed, Jun 11, 2014 at 09:41:47AM +0200, Arnd Bergmann wrote:
On Wednesday 11 June 2014 09:35:25 Ludovic Desroches wrote:
quoted
quoted
quoted
+     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
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help