参照元

説明

引数

返り値

参考

実装

CONFIG_DMA_ENGINE 無効: include/linux/dmaengine.h

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

/**
 * __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;
        /* Find a channel */
        mutex_lock(&dma_list_mutex);
        list_for_each_entry_safe(device, _d, &dma_device_list, global_node) {
                chan = private_candidate(mask, device, fn, fn_param);
                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);
                        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;
                        if (--device->privatecnt == 0)
                                dma_cap_clear(DMA_PRIVATE, device->cap_mask);
                        chan = NULL;
                }
        }
        mutex_unlock(&dma_list_mutex);
        pr_debug("%s: %s (%s)\n",
                 __func__,
                 chan ? "success" : "fail",
                 chan ? dma_chan_name(chan) : NULL);

        return chan;
}
EXPORT_SYMBOL_GPL(__dma_request_channel);

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-28 (木) 21:53:55