xref: /openbmc/u-boot/include/dma-uclass.h (revision d94604d5)
110b4dc52SÁlvaro Fernández Rojas /* SPDX-License-Identifier: GPL-2.0+ */
210b4dc52SÁlvaro Fernández Rojas /*
310b4dc52SÁlvaro Fernández Rojas  * Copyright (C) 2018 Álvaro Fernández Rojas <noltari@gmail.com>
4*27ab27f8SÁlvaro Fernández Rojas  * Copyright (C) 2015 - 2018 Texas Instruments Incorporated <www.ti.com>
510b4dc52SÁlvaro Fernández Rojas  * Written by Mugunthan V N <mugunthanvnm@ti.com>
610b4dc52SÁlvaro Fernández Rojas  *
710b4dc52SÁlvaro Fernández Rojas  */
810b4dc52SÁlvaro Fernández Rojas 
910b4dc52SÁlvaro Fernández Rojas #ifndef _DMA_UCLASS_H
1010b4dc52SÁlvaro Fernández Rojas #define _DMA_UCLASS_H
1110b4dc52SÁlvaro Fernández Rojas 
1210b4dc52SÁlvaro Fernández Rojas /* See dma.h for background documentation. */
1310b4dc52SÁlvaro Fernández Rojas 
1410b4dc52SÁlvaro Fernández Rojas #include <dma.h>
1510b4dc52SÁlvaro Fernández Rojas 
16*27ab27f8SÁlvaro Fernández Rojas struct ofnode_phandle_args;
17*27ab27f8SÁlvaro Fernández Rojas 
1810b4dc52SÁlvaro Fernández Rojas /*
1910b4dc52SÁlvaro Fernández Rojas  * struct dma_ops - Driver model DMA operations
2010b4dc52SÁlvaro Fernández Rojas  *
2110b4dc52SÁlvaro Fernández Rojas  * The uclass interface is implemented by all DMA devices which use
2210b4dc52SÁlvaro Fernández Rojas  * driver model.
2310b4dc52SÁlvaro Fernández Rojas  */
2410b4dc52SÁlvaro Fernández Rojas struct dma_ops {
25*27ab27f8SÁlvaro Fernández Rojas #ifdef CONFIG_DMA_CHANNELS
26*27ab27f8SÁlvaro Fernández Rojas 	/**
27*27ab27f8SÁlvaro Fernández Rojas 	 * of_xlate - Translate a client's device-tree (OF) DMA specifier.
28*27ab27f8SÁlvaro Fernández Rojas 	 *
29*27ab27f8SÁlvaro Fernández Rojas 	 * The DMA core calls this function as the first step in implementing
30*27ab27f8SÁlvaro Fernández Rojas 	 * a client's dma_get_by_*() call.
31*27ab27f8SÁlvaro Fernández Rojas 	 *
32*27ab27f8SÁlvaro Fernández Rojas 	 * If this function pointer is set to NULL, the DMA core will use a
33*27ab27f8SÁlvaro Fernández Rojas 	 * default implementation, which assumes #dma-cells = <1>, and that
34*27ab27f8SÁlvaro Fernández Rojas 	 * the DT cell contains a simple integer DMA Channel.
35*27ab27f8SÁlvaro Fernández Rojas 	 *
36*27ab27f8SÁlvaro Fernández Rojas 	 * At present, the DMA API solely supports device-tree. If this
37*27ab27f8SÁlvaro Fernández Rojas 	 * changes, other xxx_xlate() functions may be added to support those
38*27ab27f8SÁlvaro Fernández Rojas 	 * other mechanisms.
39*27ab27f8SÁlvaro Fernández Rojas 	 *
40*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The dma struct to hold the translation result.
41*27ab27f8SÁlvaro Fernández Rojas 	 * @args:	The dma specifier values from device tree.
42*27ab27f8SÁlvaro Fernández Rojas 	 * @return 0 if OK, or a negative error code.
43*27ab27f8SÁlvaro Fernández Rojas 	 */
44*27ab27f8SÁlvaro Fernández Rojas 	int (*of_xlate)(struct dma *dma,
45*27ab27f8SÁlvaro Fernández Rojas 			struct ofnode_phandle_args *args);
46*27ab27f8SÁlvaro Fernández Rojas 	/**
47*27ab27f8SÁlvaro Fernández Rojas 	 * request - Request a translated DMA.
48*27ab27f8SÁlvaro Fernández Rojas 	 *
49*27ab27f8SÁlvaro Fernández Rojas 	 * The DMA core calls this function as the second step in
50*27ab27f8SÁlvaro Fernández Rojas 	 * implementing a client's dma_get_by_*() call, following a successful
51*27ab27f8SÁlvaro Fernández Rojas 	 * xxx_xlate() call, or as the only step in implementing a client's
52*27ab27f8SÁlvaro Fernández Rojas 	 * dma_request() call.
53*27ab27f8SÁlvaro Fernández Rojas 	 *
54*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The DMA struct to request; this has been filled in by
55*27ab27f8SÁlvaro Fernández Rojas 	 *   a previoux xxx_xlate() function call, or by the caller of
56*27ab27f8SÁlvaro Fernández Rojas 	 *   dma_request().
57*27ab27f8SÁlvaro Fernández Rojas 	 * @return 0 if OK, or a negative error code.
58*27ab27f8SÁlvaro Fernández Rojas 	 */
59*27ab27f8SÁlvaro Fernández Rojas 	int (*request)(struct dma *dma);
60*27ab27f8SÁlvaro Fernández Rojas 	/**
61*27ab27f8SÁlvaro Fernández Rojas 	 * free - Free a previously requested dma.
62*27ab27f8SÁlvaro Fernández Rojas 	 *
63*27ab27f8SÁlvaro Fernández Rojas 	 * This is the implementation of the client dma_free() API.
64*27ab27f8SÁlvaro Fernández Rojas 	 *
65*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The DMA to free.
66*27ab27f8SÁlvaro Fernández Rojas 	 * @return 0 if OK, or a negative error code.
67*27ab27f8SÁlvaro Fernández Rojas 	 */
68*27ab27f8SÁlvaro Fernández Rojas 	int (*free)(struct dma *dma);
69*27ab27f8SÁlvaro Fernández Rojas 	/**
70*27ab27f8SÁlvaro Fernández Rojas 	 * enable() - Enable a DMA Channel.
71*27ab27f8SÁlvaro Fernández Rojas 	 *
72*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The DMA Channel to manipulate.
73*27ab27f8SÁlvaro Fernández Rojas 	 * @return zero on success, or -ve error code.
74*27ab27f8SÁlvaro Fernández Rojas 	 */
75*27ab27f8SÁlvaro Fernández Rojas 	int (*enable)(struct dma *dma);
76*27ab27f8SÁlvaro Fernández Rojas 	/**
77*27ab27f8SÁlvaro Fernández Rojas 	 * disable() - Disable a DMA Channel.
78*27ab27f8SÁlvaro Fernández Rojas 	 *
79*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The DMA Channel to manipulate.
80*27ab27f8SÁlvaro Fernández Rojas 	 * @return zero on success, or -ve error code.
81*27ab27f8SÁlvaro Fernández Rojas 	 */
82*27ab27f8SÁlvaro Fernández Rojas 	int (*disable)(struct dma *dma);
83*27ab27f8SÁlvaro Fernández Rojas 	/**
84*27ab27f8SÁlvaro Fernández Rojas 	 * prepare_rcv_buf() - Prepare/Add receive DMA buffer.
85*27ab27f8SÁlvaro Fernández Rojas 	 *
86*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The DMA Channel to manipulate.
87*27ab27f8SÁlvaro Fernández Rojas 	 * @dst: The receive buffer pointer.
88*27ab27f8SÁlvaro Fernández Rojas 	 * @size: The receive buffer size
89*27ab27f8SÁlvaro Fernández Rojas 	 * @return zero on success, or -ve error code.
90*27ab27f8SÁlvaro Fernández Rojas 	 */
91*27ab27f8SÁlvaro Fernández Rojas 	int (*prepare_rcv_buf)(struct dma *dma, void *dst, size_t size);
92*27ab27f8SÁlvaro Fernández Rojas 	/**
93*27ab27f8SÁlvaro Fernández Rojas 	 * receive() - Receive a DMA transfer.
94*27ab27f8SÁlvaro Fernández Rojas 	 *
95*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The DMA Channel to manipulate.
96*27ab27f8SÁlvaro Fernández Rojas 	 * @dst: The destination pointer.
97*27ab27f8SÁlvaro Fernández Rojas 	 * @metadata: DMA driver's specific data
98*27ab27f8SÁlvaro Fernández Rojas 	 * @return zero on success, or -ve error code.
99*27ab27f8SÁlvaro Fernández Rojas 	 */
100*27ab27f8SÁlvaro Fernández Rojas 	int (*receive)(struct dma *dma, void **dst, void *metadata);
101*27ab27f8SÁlvaro Fernández Rojas 	/**
102*27ab27f8SÁlvaro Fernández Rojas 	 * send() - Send a DMA transfer.
103*27ab27f8SÁlvaro Fernández Rojas 	 *
104*27ab27f8SÁlvaro Fernández Rojas 	 * @dma: The DMA Channel to manipulate.
105*27ab27f8SÁlvaro Fernández Rojas 	 * @src: The source pointer.
106*27ab27f8SÁlvaro Fernández Rojas 	 * @len: Length of the data to be sent (number of bytes).
107*27ab27f8SÁlvaro Fernández Rojas 	 * @metadata: DMA driver's specific data
108*27ab27f8SÁlvaro Fernández Rojas 	 * @return zero on success, or -ve error code.
109*27ab27f8SÁlvaro Fernández Rojas 	 */
110*27ab27f8SÁlvaro Fernández Rojas 	int (*send)(struct dma *dma, void *src, size_t len, void *metadata);
111*27ab27f8SÁlvaro Fernández Rojas #endif /* CONFIG_DMA_CHANNELS */
11210b4dc52SÁlvaro Fernández Rojas 	/**
11310b4dc52SÁlvaro Fernández Rojas 	 * transfer() - Issue a DMA transfer. The implementation must
11410b4dc52SÁlvaro Fernández Rojas 	 *   wait until the transfer is done.
11510b4dc52SÁlvaro Fernández Rojas 	 *
11610b4dc52SÁlvaro Fernández Rojas 	 * @dev: The DMA device
11710b4dc52SÁlvaro Fernández Rojas 	 * @direction: direction of data transfer (should be one from
11810b4dc52SÁlvaro Fernández Rojas 	 *   enum dma_direction)
11910b4dc52SÁlvaro Fernández Rojas 	 * @dst: The destination pointer.
12010b4dc52SÁlvaro Fernández Rojas 	 * @src: The source pointer.
12110b4dc52SÁlvaro Fernández Rojas 	 * @len: Length of the data to be copied (number of bytes).
12210b4dc52SÁlvaro Fernández Rojas 	 * @return zero on success, or -ve error code.
12310b4dc52SÁlvaro Fernández Rojas 	 */
12410b4dc52SÁlvaro Fernández Rojas 	int (*transfer)(struct udevice *dev, int direction, void *dst,
12510b4dc52SÁlvaro Fernández Rojas 			void *src, size_t len);
12610b4dc52SÁlvaro Fernández Rojas };
12710b4dc52SÁlvaro Fernández Rojas 
12810b4dc52SÁlvaro Fernández Rojas #endif /* _DMA_UCLASS_H */
129