*参照元 [#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]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS