1e165b1d3SKhoronzhuk, Ivan /* 2e165b1d3SKhoronzhuk, Ivan * Enhanced Direct Memory Access (EDMA3) Controller 3e165b1d3SKhoronzhuk, Ivan * 4e165b1d3SKhoronzhuk, Ivan * (C) Copyright 2014 5e165b1d3SKhoronzhuk, Ivan * Texas Instruments Incorporated, <www.ti.com> 6e165b1d3SKhoronzhuk, Ivan * 7e165b1d3SKhoronzhuk, Ivan * SPDX-License-Identifier: GPL-2.0+ 8e165b1d3SKhoronzhuk, Ivan */ 9e165b1d3SKhoronzhuk, Ivan 10e165b1d3SKhoronzhuk, Ivan #ifndef _EDMA3_H_ 11e165b1d3SKhoronzhuk, Ivan #define _EDMA3_H_ 12e165b1d3SKhoronzhuk, Ivan 13e165b1d3SKhoronzhuk, Ivan #include <linux/stddef.h> 14e165b1d3SKhoronzhuk, Ivan 15e165b1d3SKhoronzhuk, Ivan #define EDMA3_PARSET_NULL_LINK 0xffff 16e165b1d3SKhoronzhuk, Ivan 17e165b1d3SKhoronzhuk, Ivan /* 18e165b1d3SKhoronzhuk, Ivan * All parameter RAM set options 19e165b1d3SKhoronzhuk, Ivan * opt field in edma3_param_set_config structure 20e165b1d3SKhoronzhuk, Ivan */ 21e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_PRIV_LEVEL BIT(31) 22e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_PRIV_ID(id) ((0xf & (id)) << 24) 23e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_INTERM_COMP_CHAIN_ENB BIT(23) 24e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_TRANS_COMP_CHAIN_ENB BIT(22) 25e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_INTERM_COMP_INT_ENB BIT(21) 26e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_TRANS_COMP_INT_ENB BIT(20) 27e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_COMP_CODE(code) ((0x3f & (code)) << 12) 28e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_8 0 29e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_16 (1 << 8) 30e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_32 (2 << 8) 31e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_64 (3 << 8) 32e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_128 (4 << 8) 33e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_256 (5 << 8) 34e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_SET(w) ((w & 0x7) << 8) 35e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_STATIC BIT(3) 36e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_AB_SYNC BIT(2) 37e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_DST_ADDR_CONST_MODE BIT(1) 38e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_SRC_ADDR_CONST_MODE BIT(0) 39e165b1d3SKhoronzhuk, Ivan 40e165b1d3SKhoronzhuk, Ivan enum edma3_address_mode { 41e165b1d3SKhoronzhuk, Ivan INCR = 0, 42e165b1d3SKhoronzhuk, Ivan FIFO = 1 43e165b1d3SKhoronzhuk, Ivan }; 44e165b1d3SKhoronzhuk, Ivan 45e165b1d3SKhoronzhuk, Ivan enum edma3_fifo_width { 46e165b1d3SKhoronzhuk, Ivan W8BIT = 0, 47e165b1d3SKhoronzhuk, Ivan W16BIT = 1, 48e165b1d3SKhoronzhuk, Ivan W32BIT = 2, 49e165b1d3SKhoronzhuk, Ivan W64BIT = 3, 50e165b1d3SKhoronzhuk, Ivan W128BIT = 4, 51e165b1d3SKhoronzhuk, Ivan W256BIT = 5 52e165b1d3SKhoronzhuk, Ivan }; 53e165b1d3SKhoronzhuk, Ivan 54e165b1d3SKhoronzhuk, Ivan enum edma3_sync_dimension { 55e165b1d3SKhoronzhuk, Ivan ASYNC = 0, 56e165b1d3SKhoronzhuk, Ivan ABSYNC = 1 57e165b1d3SKhoronzhuk, Ivan }; 58e165b1d3SKhoronzhuk, Ivan 59e165b1d3SKhoronzhuk, Ivan /* PaRAM slots are laid out like this */ 60e165b1d3SKhoronzhuk, Ivan struct edma3_slot_layout { 61e165b1d3SKhoronzhuk, Ivan u32 opt; 62e165b1d3SKhoronzhuk, Ivan u32 src; 63e165b1d3SKhoronzhuk, Ivan u32 a_b_cnt; 64e165b1d3SKhoronzhuk, Ivan u32 dst; 65e165b1d3SKhoronzhuk, Ivan u32 src_dst_bidx; 66e165b1d3SKhoronzhuk, Ivan u32 link_bcntrld; 67e165b1d3SKhoronzhuk, Ivan u32 src_dst_cidx; 68e165b1d3SKhoronzhuk, Ivan u32 ccnt; 69e165b1d3SKhoronzhuk, Ivan } __packed; 70e165b1d3SKhoronzhuk, Ivan 71e165b1d3SKhoronzhuk, Ivan /* 72e165b1d3SKhoronzhuk, Ivan * Use this to assign trigger word number of edma3_slot_layout struct. 73e165b1d3SKhoronzhuk, Ivan * trigger_word_name - is the exact name from edma3_slot_layout. 74e165b1d3SKhoronzhuk, Ivan */ 75e165b1d3SKhoronzhuk, Ivan #define EDMA3_TWORD(trigger_word_name)\ 76e165b1d3SKhoronzhuk, Ivan (offsetof(struct edma3_slot_layout, trigger_word_name) / 4) 77e165b1d3SKhoronzhuk, Ivan 78e165b1d3SKhoronzhuk, Ivan struct edma3_slot_config { 79e165b1d3SKhoronzhuk, Ivan u32 opt; 80e165b1d3SKhoronzhuk, Ivan u32 src; 81e165b1d3SKhoronzhuk, Ivan u32 dst; 82e165b1d3SKhoronzhuk, Ivan int bcnt; 83e165b1d3SKhoronzhuk, Ivan int acnt; 84e165b1d3SKhoronzhuk, Ivan int ccnt; 85e165b1d3SKhoronzhuk, Ivan int src_bidx; 86e165b1d3SKhoronzhuk, Ivan int dst_bidx; 87e165b1d3SKhoronzhuk, Ivan int src_cidx; 88e165b1d3SKhoronzhuk, Ivan int dst_cidx; 89e165b1d3SKhoronzhuk, Ivan int bcntrld; 90e165b1d3SKhoronzhuk, Ivan int link; 91e165b1d3SKhoronzhuk, Ivan }; 92e165b1d3SKhoronzhuk, Ivan 93e165b1d3SKhoronzhuk, Ivan struct edma3_channel_config { 94e165b1d3SKhoronzhuk, Ivan int slot; 95e165b1d3SKhoronzhuk, Ivan int chnum; 96e165b1d3SKhoronzhuk, Ivan int complete_code; /* indicate pending complete interrupt */ 97e165b1d3SKhoronzhuk, Ivan int trigger_slot_word; /* only used for qedma */ 98e165b1d3SKhoronzhuk, Ivan }; 99e165b1d3SKhoronzhuk, Ivan 100e165b1d3SKhoronzhuk, Ivan void qedma3_start(u32 base, struct edma3_channel_config *cfg); 101e165b1d3SKhoronzhuk, Ivan void qedma3_stop(u32 base, struct edma3_channel_config *cfg); 102e165b1d3SKhoronzhuk, Ivan void edma3_slot_configure(u32 base, int slot, struct edma3_slot_config *cfg); 103e165b1d3SKhoronzhuk, Ivan int edma3_check_for_transfer(u32 base, struct edma3_channel_config *cfg); 104e165b1d3SKhoronzhuk, Ivan void edma3_write_slot(u32 base, int slot, struct edma3_slot_layout *param); 105e165b1d3SKhoronzhuk, Ivan void edma3_read_slot(u32 base, int slot, struct edma3_slot_layout *param); 106e165b1d3SKhoronzhuk, Ivan 107e165b1d3SKhoronzhuk, Ivan void edma3_set_dest(u32 base, int slot, u32 dst, enum edma3_address_mode mode, 108e165b1d3SKhoronzhuk, Ivan enum edma3_fifo_width width); 109e165b1d3SKhoronzhuk, Ivan void edma3_set_dest_index(u32 base, unsigned slot, int bidx, int cidx); 110e165b1d3SKhoronzhuk, Ivan void edma3_set_dest_addr(u32 base, int slot, u32 dst); 111e165b1d3SKhoronzhuk, Ivan 112e165b1d3SKhoronzhuk, Ivan void edma3_set_src(u32 base, int slot, u32 src, enum edma3_address_mode mode, 113e165b1d3SKhoronzhuk, Ivan enum edma3_fifo_width width); 114e165b1d3SKhoronzhuk, Ivan void edma3_set_src_index(u32 base, unsigned slot, int bidx, int cidx); 115e165b1d3SKhoronzhuk, Ivan void edma3_set_src_addr(u32 base, int slot, u32 src); 116e165b1d3SKhoronzhuk, Ivan 117e165b1d3SKhoronzhuk, Ivan void edma3_set_transfer_params(u32 base, int slot, int acnt, 118e165b1d3SKhoronzhuk, Ivan int bcnt, int ccnt, u16 bcnt_rld, 119e165b1d3SKhoronzhuk, Ivan enum edma3_sync_dimension sync_mode); 120*664ab2c9SVignesh R void edma3_transfer(unsigned long edma3_base_addr, unsigned int 121*664ab2c9SVignesh R edma_slot_num, void *dst, void *src, size_t len); 122e165b1d3SKhoronzhuk, Ivan 123e165b1d3SKhoronzhuk, Ivan #endif 124