124 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Enhanced Direct Memory Access (EDMA3) Controller
 | 
						|
 *
 | 
						|
 * (C) Copyright 2014
 | 
						|
 *     Texas Instruments Incorporated, <www.ti.com>
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier:     GPL-2.0+
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _EDMA3_H_
 | 
						|
#define _EDMA3_H_
 | 
						|
 | 
						|
#include <linux/stddef.h>
 | 
						|
 | 
						|
#define EDMA3_PARSET_NULL_LINK			0xffff
 | 
						|
 | 
						|
/*
 | 
						|
 * All parameter RAM set options
 | 
						|
 * opt field in edma3_param_set_config structure
 | 
						|
 */
 | 
						|
#define EDMA3_SLOPT_PRIV_LEVEL			BIT(31)
 | 
						|
#define EDMA3_SLOPT_PRIV_ID(id)			((0xf & (id)) << 24)
 | 
						|
#define EDMA3_SLOPT_INTERM_COMP_CHAIN_ENB	BIT(23)
 | 
						|
#define EDMA3_SLOPT_TRANS_COMP_CHAIN_ENB	BIT(22)
 | 
						|
#define EDMA3_SLOPT_INTERM_COMP_INT_ENB		BIT(21)
 | 
						|
#define EDMA3_SLOPT_TRANS_COMP_INT_ENB		BIT(20)
 | 
						|
#define EDMA3_SLOPT_COMP_CODE(code)		((0x3f & (code)) << 12)
 | 
						|
#define EDMA3_SLOPT_FIFO_WIDTH_8		0
 | 
						|
#define EDMA3_SLOPT_FIFO_WIDTH_16		(1 << 8)
 | 
						|
#define EDMA3_SLOPT_FIFO_WIDTH_32		(2 << 8)
 | 
						|
#define EDMA3_SLOPT_FIFO_WIDTH_64		(3 << 8)
 | 
						|
#define EDMA3_SLOPT_FIFO_WIDTH_128		(4 << 8)
 | 
						|
#define EDMA3_SLOPT_FIFO_WIDTH_256		(5 << 8)
 | 
						|
#define EDMA3_SLOPT_FIFO_WIDTH_SET(w)		((w & 0x7) << 8)
 | 
						|
#define EDMA3_SLOPT_STATIC			BIT(3)
 | 
						|
#define EDMA3_SLOPT_AB_SYNC			BIT(2)
 | 
						|
#define EDMA3_SLOPT_DST_ADDR_CONST_MODE		BIT(1)
 | 
						|
#define EDMA3_SLOPT_SRC_ADDR_CONST_MODE		BIT(0)
 | 
						|
 | 
						|
enum edma3_address_mode {
 | 
						|
	INCR = 0,
 | 
						|
	FIFO = 1
 | 
						|
};
 | 
						|
 | 
						|
enum edma3_fifo_width {
 | 
						|
	W8BIT = 0,
 | 
						|
	W16BIT = 1,
 | 
						|
	W32BIT = 2,
 | 
						|
	W64BIT = 3,
 | 
						|
	W128BIT = 4,
 | 
						|
	W256BIT = 5
 | 
						|
};
 | 
						|
 | 
						|
enum edma3_sync_dimension {
 | 
						|
	ASYNC = 0,
 | 
						|
	ABSYNC = 1
 | 
						|
};
 | 
						|
 | 
						|
/* PaRAM slots are laid out like this */
 | 
						|
struct edma3_slot_layout {
 | 
						|
	u32 opt;
 | 
						|
	u32 src;
 | 
						|
	u32 a_b_cnt;
 | 
						|
	u32 dst;
 | 
						|
	u32 src_dst_bidx;
 | 
						|
	u32 link_bcntrld;
 | 
						|
	u32 src_dst_cidx;
 | 
						|
	u32 ccnt;
 | 
						|
} __packed;
 | 
						|
 | 
						|
/*
 | 
						|
 * Use this to assign trigger word number of edma3_slot_layout struct.
 | 
						|
 * trigger_word_name - is the exact name from edma3_slot_layout.
 | 
						|
 */
 | 
						|
#define EDMA3_TWORD(trigger_word_name)\
 | 
						|
		(offsetof(struct edma3_slot_layout, trigger_word_name) / 4)
 | 
						|
 | 
						|
struct edma3_slot_config {
 | 
						|
	u32 opt;
 | 
						|
	u32 src;
 | 
						|
	u32 dst;
 | 
						|
	int bcnt;
 | 
						|
	int acnt;
 | 
						|
	int ccnt;
 | 
						|
	int src_bidx;
 | 
						|
	int dst_bidx;
 | 
						|
	int src_cidx;
 | 
						|
	int dst_cidx;
 | 
						|
	int bcntrld;
 | 
						|
	int link;
 | 
						|
};
 | 
						|
 | 
						|
struct edma3_channel_config {
 | 
						|
	int slot;
 | 
						|
	int chnum;
 | 
						|
	int complete_code;	/* indicate pending complete interrupt */
 | 
						|
	int trigger_slot_word;	/* only used for qedma */
 | 
						|
};
 | 
						|
 | 
						|
void qedma3_start(u32 base, struct edma3_channel_config *cfg);
 | 
						|
void qedma3_stop(u32 base, struct edma3_channel_config *cfg);
 | 
						|
void edma3_slot_configure(u32 base, int slot, struct edma3_slot_config *cfg);
 | 
						|
int edma3_check_for_transfer(u32 base, struct edma3_channel_config *cfg);
 | 
						|
void edma3_write_slot(u32 base, int slot, struct edma3_slot_layout *param);
 | 
						|
void edma3_read_slot(u32 base, int slot, struct edma3_slot_layout *param);
 | 
						|
 | 
						|
void edma3_set_dest(u32 base, int slot, u32 dst, enum edma3_address_mode mode,
 | 
						|
		    enum edma3_fifo_width width);
 | 
						|
void edma3_set_dest_index(u32 base, unsigned slot, int bidx, int cidx);
 | 
						|
void edma3_set_dest_addr(u32 base, int slot, u32 dst);
 | 
						|
 | 
						|
void edma3_set_src(u32 base, int slot, u32 src, enum edma3_address_mode mode,
 | 
						|
		   enum edma3_fifo_width width);
 | 
						|
void edma3_set_src_index(u32 base, unsigned slot, int bidx, int cidx);
 | 
						|
void edma3_set_src_addr(u32 base, int slot, u32 src);
 | 
						|
 | 
						|
void edma3_set_transfer_params(u32 base, int slot, int acnt,
 | 
						|
			       int bcnt, int ccnt, u16 bcnt_rld,
 | 
						|
			       enum edma3_sync_dimension sync_mode);
 | 
						|
void edma3_transfer(unsigned long edma3_base_addr, unsigned int
 | 
						|
		edma_slot_num, void *dst, void *src, size_t len);
 | 
						|
 | 
						|
#endif
 |