···535535}536536EXPORT_SYMBOL_GPL(dma_get_slave_channel);537537538538+struct dma_chan *dma_get_any_slave_channel(struct dma_device *device)539539+{540540+ dma_cap_mask_t mask;541541+ struct dma_chan *chan;542542+ int err;543543+544544+ dma_cap_zero(mask);545545+ dma_cap_set(DMA_SLAVE, mask);546546+547547+ /* lock against __dma_request_channel */548548+ mutex_lock(&dma_list_mutex);549549+550550+ chan = private_candidate(&mask, device, NULL, NULL);551551+ if (chan) {552552+ err = dma_chan_get(chan);553553+ if (err) {554554+ pr_debug("%s: failed to get %s: (%d)\n",555555+ __func__, dma_chan_name(chan), err);556556+ chan = NULL;557557+ }558558+ }559559+560560+ mutex_unlock(&dma_list_mutex);561561+562562+ return chan;563563+}564564+EXPORT_SYMBOL_GPL(dma_get_any_slave_channel);565565+538566/**539567 * __dma_request_channel - try to allocate an exclusive channel540568 * @mask: capabilities that the channel must satisfy
+7-23
drivers/dma/mmp_pdma.c
···893893 struct of_dma *ofdma)894894{895895 struct mmp_pdma_device *d = ofdma->of_dma_data;896896- struct dma_chan *chan, *candidate;896896+ struct dma_chan *chan;897897+ struct mmp_pdma_chan *c;897898898898-retry:899899- candidate = NULL;900900-901901- /* walk the list of channels registered with the current instance and902902- * find one that is currently unused */903903- list_for_each_entry(chan, &d->device.channels, device_node)904904- if (chan->client_count == 0) {905905- candidate = chan;906906- break;907907- }908908-909909- if (!candidate)899899+ chan = dma_get_any_slave_channel(&d->device);900900+ if (!chan)910901 return NULL;911902912912- /* dma_get_slave_channel will return NULL if we lost a race between913913- * the lookup and the reservation */914914- chan = dma_get_slave_channel(candidate);903903+ c = to_mmp_pdma_chan(chan);904904+ c->drcmr = dma_spec->args[0];915905916916- if (chan) {917917- struct mmp_pdma_chan *c = to_mmp_pdma_chan(chan);918918- c->drcmr = dma_spec->args[0];919919- return chan;920920- }921921-922922- goto retry;906906+ return chan;923907}924908925909static int mmp_pdma_probe(struct platform_device *op)