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