Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-3.14/deps-from-dma-of' into for-3.14/dmas-resets-rework

This merges git://git.infradead.org/users/vkoul/slave-dma.git topic/of

+36 -23
+28
drivers/dma/dmaengine.c
··· 535 535 } 536 536 EXPORT_SYMBOL_GPL(dma_get_slave_channel); 537 537 538 + struct dma_chan *dma_get_any_slave_channel(struct dma_device *device) 539 + { 540 + dma_cap_mask_t mask; 541 + struct dma_chan *chan; 542 + int err; 543 + 544 + dma_cap_zero(mask); 545 + dma_cap_set(DMA_SLAVE, mask); 546 + 547 + /* lock against __dma_request_channel */ 548 + mutex_lock(&dma_list_mutex); 549 + 550 + chan = private_candidate(&mask, device, NULL, NULL); 551 + if (chan) { 552 + err = dma_chan_get(chan); 553 + if (err) { 554 + pr_debug("%s: failed to get %s: (%d)\n", 555 + __func__, dma_chan_name(chan), err); 556 + chan = NULL; 557 + } 558 + } 559 + 560 + mutex_unlock(&dma_list_mutex); 561 + 562 + return chan; 563 + } 564 + EXPORT_SYMBOL_GPL(dma_get_any_slave_channel); 565 + 538 566 /** 539 567 * __dma_request_channel - try to allocate an exclusive channel 540 568 * @mask: capabilities that the channel must satisfy
+7 -23
drivers/dma/mmp_pdma.c
··· 893 893 struct of_dma *ofdma) 894 894 { 895 895 struct mmp_pdma_device *d = ofdma->of_dma_data; 896 - struct dma_chan *chan, *candidate; 896 + struct dma_chan *chan; 897 + struct mmp_pdma_chan *c; 897 898 898 - retry: 899 - candidate = NULL; 900 - 901 - /* walk the list of channels registered with the current instance and 902 - * find one that is currently unused */ 903 - list_for_each_entry(chan, &d->device.channels, device_node) 904 - if (chan->client_count == 0) { 905 - candidate = chan; 906 - break; 907 - } 908 - 909 - if (!candidate) 899 + chan = dma_get_any_slave_channel(&d->device); 900 + if (!chan) 910 901 return NULL; 911 902 912 - /* dma_get_slave_channel will return NULL if we lost a race between 913 - * the lookup and the reservation */ 914 - chan = dma_get_slave_channel(candidate); 903 + c = to_mmp_pdma_chan(chan); 904 + c->drcmr = dma_spec->args[0]; 915 905 916 - if (chan) { 917 - struct mmp_pdma_chan *c = to_mmp_pdma_chan(chan); 918 - c->drcmr = dma_spec->args[0]; 919 - return chan; 920 - } 921 - 922 - goto retry; 906 + return chan; 923 907 } 924 908 925 909 static int mmp_pdma_probe(struct platform_device *op)
+1
include/linux/dmaengine.h
··· 1087 1087 void dma_async_device_unregister(struct dma_device *device); 1088 1088 void dma_run_dependencies(struct dma_async_tx_descriptor *tx); 1089 1089 struct dma_chan *dma_get_slave_channel(struct dma_chan *chan); 1090 + struct dma_chan *dma_get_any_slave_channel(struct dma_device *device); 1090 1091 struct dma_chan *net_dma_find_channel(void); 1091 1092 #define dma_request_channel(mask, x, y) __dma_request_channel(&(mask), x, y) 1092 1093 #define dma_request_slave_channel_compat(mask, x, y, dev, name) \