mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-14 21:38:46 +02:00
3a005126c9
Add a managed API, devm_of_dma_controller_register(), to simplify DMA engine controller registration by automatically handling resource cleanup. Signed-off-by: Frank Li <Frank.Li@nxp.com> Link: https://patch.msgid.link/20260225-mxsdma-module-v3-1-8f798b13baa6@nxp.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
123 lines
2.9 KiB
C
123 lines
2.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* OF helpers for DMA request / controller
|
|
*
|
|
* Based on of_gpio.h
|
|
*
|
|
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
|
|
*/
|
|
|
|
#ifndef __LINUX_OF_DMA_H
|
|
#define __LINUX_OF_DMA_H
|
|
|
|
#include <linux/of.h>
|
|
#include <linux/dmaengine.h>
|
|
|
|
struct device_node;
|
|
|
|
struct of_dma {
|
|
struct list_head of_dma_controllers;
|
|
struct device_node *of_node;
|
|
struct dma_chan *(*of_dma_xlate)
|
|
(struct of_phandle_args *, struct of_dma *);
|
|
void *(*of_dma_route_allocate)
|
|
(struct of_phandle_args *, struct of_dma *);
|
|
struct dma_router *dma_router;
|
|
void *of_dma_data;
|
|
};
|
|
|
|
struct of_dma_filter_info {
|
|
dma_cap_mask_t dma_cap;
|
|
dma_filter_fn filter_fn;
|
|
};
|
|
|
|
#ifdef CONFIG_DMA_OF
|
|
extern int of_dma_controller_register(struct device_node *np,
|
|
struct dma_chan *(*of_dma_xlate)
|
|
(struct of_phandle_args *, struct of_dma *),
|
|
void *data);
|
|
extern void of_dma_controller_free(struct device_node *np);
|
|
|
|
static void __of_dma_controller_free(void *np)
|
|
{
|
|
of_dma_controller_free(np);
|
|
}
|
|
|
|
static inline int
|
|
devm_of_dma_controller_register(struct device *dev, struct device_node *np,
|
|
struct dma_chan *(*of_dma_xlate)
|
|
(struct of_phandle_args *, struct of_dma *),
|
|
void *data)
|
|
{
|
|
int ret;
|
|
|
|
ret = of_dma_controller_register(np, of_dma_xlate, data);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return devm_add_action_or_reset(dev, __of_dma_controller_free, np);
|
|
}
|
|
|
|
extern int of_dma_router_register(struct device_node *np,
|
|
void *(*of_dma_route_allocate)
|
|
(struct of_phandle_args *, struct of_dma *),
|
|
struct dma_router *dma_router);
|
|
#define of_dma_router_free of_dma_controller_free
|
|
|
|
extern struct dma_chan *of_dma_request_slave_channel(struct device_node *np,
|
|
const char *name);
|
|
extern struct dma_chan *of_dma_simple_xlate(struct of_phandle_args *dma_spec,
|
|
struct of_dma *ofdma);
|
|
extern struct dma_chan *of_dma_xlate_by_chan_id(struct of_phandle_args *dma_spec,
|
|
struct of_dma *ofdma);
|
|
|
|
#else
|
|
static inline int of_dma_controller_register(struct device_node *np,
|
|
struct dma_chan *(*of_dma_xlate)
|
|
(struct of_phandle_args *, struct of_dma *),
|
|
void *data)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline void of_dma_controller_free(struct device_node *np)
|
|
{
|
|
}
|
|
|
|
static inline int
|
|
devm_of_dma_controller_register(struct device *dev, struct device_node *np,
|
|
struct dma_chan *(*of_dma_xlate)
|
|
(struct of_phandle_args *, struct of_dma *),
|
|
void *data)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline int of_dma_router_register(struct device_node *np,
|
|
void *(*of_dma_route_allocate)
|
|
(struct of_phandle_args *, struct of_dma *),
|
|
struct dma_router *dma_router)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
#define of_dma_router_free of_dma_controller_free
|
|
|
|
static inline struct dma_chan *of_dma_request_slave_channel(struct device_node *np,
|
|
const char *name)
|
|
{
|
|
return ERR_PTR(-ENODEV);
|
|
}
|
|
|
|
static inline struct dma_chan *of_dma_simple_xlate(struct of_phandle_args *dma_spec,
|
|
struct of_dma *ofdma)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
#define of_dma_xlate_by_chan_id NULL
|
|
|
|
#endif
|
|
|
|
#endif /* __LINUX_OF_DMA_H */
|