On Tue, Aug 13, 2013 at 07:55:47PM +0100, Mark Brown wrote:
I'm still debugging what's going on here - the basic refcounting all looks OK in the SPI driver, I can see it requesting and releasing with the refcounts all going back to zero in the DMA driver as expected but when we come back to the device later on dmaengine is deciding the device is unavailable quite early on in the process.
The failure is happening because this check is failing:
/* devices with multiple channels need special handling as we need to * ensure that all channels are either private or public. */ if (dev->chancnt > 1 && !dma_has_cap(DMA_PRIVATE, dev->cap_mask)) list_for_each_entry(chan, &dev->channels, device_node) { /* some channels are already publicly allocated */ if (chan->client_count) {
which is happening because dma1chan0 (which is on the same DMA controller as the SPI controller) and in fact every other DMA channel had references grabbed by the network stack dmaengine helpers which I'd enabled in config. The fact that they do that is unhelpful, it renders the API mostly useless, but is nothing to do with this series.
Having tweaked the config everything appears to work so:
Tested-by: Mark Brown broonie@linaro.org
though the whole thing with the filter function is as I say a bit fun from a code review point of view.