*参照元 [#ed9e675c] #backlinks *説明 [#oeae4457] -パス: 複数あり --CONFIG_DMA_ENGINE 無効: [[linux-4.4.1/include/linux/dmaengine.h]] --CONFIG_DMA_ENGINE 有効: [[linux-4.4.1/drivers/dma/dmaengine.c]] -FIXME: これは何? --説明 **引数 [#de93ff85] -const dma_cap_mask_t *mask -- --[[linux-4.4.1/dma_cap_mask_t]] -dma_filter_fn fn -- --[[linux-4.4.1/dma_filter_fn]] -void *fn_param -- **返り値 [#wcfb47fb] -struct dma_chan * -- --[[linux-4.4.1/dma_chan]] **参考 [#g8f630c5] *実装 [#jef20fab] **CONFIG_DMA_ENGINE 無効: include/linux/dmaengine.h [#x9588c63] static inline struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param) { return NULL; } **CONFIG_DMA_ENGINE 有効: drivers/dma/dmaengine.c [#pced9e83] /** * __dma_request_channel - try to allocate an exclusive channel * @mask: capabilities that the channel must satisfy * @fn: optional callback to disposition available channels * @fn_param: opaque parameter to pass to dma_filter_fn * * Returns pointer to appropriate DMA channel on success or NULL. */ struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param) { struct dma_device *device, *_d; struct dma_chan *chan = NULL; int err; - --[[linux-4.4.1/dma_device]] --[[linux-4.4.1/dma_chan]] /* Find a channel */ mutex_lock(&dma_list_mutex); - --[[linux-4.4.1/mutex_lock()]] --[[linux-4.4.1/dma_list_mutex(global)]] list_for_each_entry_safe(device, _d, &dma_device_list, global_node) { - --[[linux-4.4.1/list_for_each_entry_safe()]] --[[linux-4.4.1/dma_device_list(global)]] chan = private_candidate(mask, device, fn, fn_param); - --[[linux-4.4.1/private_candidate()]] if (chan) { /* Found a suitable channel, try to grab, prep, and * return it. We first set DMA_PRIVATE to disable * balance_ref_count as this channel will not be * published in the general-purpose allocator */ dma_cap_set(DMA_PRIVATE, device->cap_mask); device->privatecnt++; err = dma_chan_get(chan); - --[[linux-4.4.1/dma_cap_set()]] --[[linux-4.4.1/dma_chan_get()]] if (err == -ENODEV) { pr_debug("%s: %s module removed\n", __func__, dma_chan_name(chan)); list_del_rcu(&device->global_node); } else if (err) pr_debug("%s: failed to get %s: (%d)\n", __func__, dma_chan_name(chan), err); else break; - --[[linux-4.4.1/pr_debug()]] --[[linux-4.4.1/list_del_rcu()]] --[[linux-4.4.1/dma_chan_name()]] if (--device->privatecnt == 0) dma_cap_clear(DMA_PRIVATE, device->cap_mask); - --[[linux-4.4.1/dma_cap_clear()]] chan = NULL; } } mutex_unlock(&dma_list_mutex); - --[[linux-4.4.1/mutex_unlock()]] pr_debug("%s: %s (%s)\n", __func__, chan ? "success" : "fail", chan ? dma_chan_name(chan) : NULL); return chan; } EXPORT_SYMBOL_GPL(__dma_request_channel); - --[[linux-4.4.1/EXPORT_SYMBOL_GPL()]] *コメント [#y640fd2d]