xref: /openbmc/u-boot/drivers/spi/rk_spi.h (revision fbe44dd1)
1 /*
2  * SPI driver for rockchip
3  *
4  * (C) Copyright 2015 Google, Inc
5  *
6  * (C) Copyright 2008-2013 Rockchip Electronics
7  * Peter, Software Engineering, <superpeter.cai@gmail.com>.
8  *
9  * SPDX-License-Identifier:     GPL-2.0+
10  */
11 
12 #ifndef __RK_SPI_H
13 #define __RK_SPI_H
14 
15 struct rockchip_spi {
16 	u32 ctrlr0;
17 	u32 ctrlr1;
18 	u32 enr;
19 	u32 ser;
20 	u32 baudr;
21 	u32 txftlr;
22 	u32 rxftlr;
23 	u32 txflr;
24 	u32 rxflr;
25 	u32 sr;
26 	u32 ipr;
27 	u32 imr;
28 	u32 isr;
29 	u32 risr;
30 	u32 icr;
31 	u32 dmacr;
32 	u32 dmatdlr;
33 	u32 dmardlr;		/* 0x44 */
34 	u32 reserved[0xef];
35 	u32 txdr[0x100];	/* 0x400 */
36 	u32 rxdr[0x100];	/* 0x800 */
37 };
38 
39 /* CTRLR0 */
40 enum {
41 	DFS_SHIFT	= 0,	/* Data Frame Size */
42 	DFS_MASK	= 3,
43 	DFS_4BIT	= 0,
44 	DFS_8BIT,
45 	DFS_16BIT,
46 	DFS_RESV,
47 
48 	CFS_SHIFT	= 2,	/* Control Frame Size */
49 	CFS_MASK	= 0xf,
50 
51 	SCPH_SHIFT	= 6,	/* Serial Clock Phase */
52 	SCPH_MASK	= 1,
53 	SCPH_TOGMID	= 0,	/* SCLK toggles in middle of first data bit */
54 	SCPH_TOGSTA,		/* SCLK toggles at start of first data bit */
55 
56 	SCOL_SHIFT	= 7,	/* Serial Clock Polarity */
57 	SCOL_MASK	= 1,
58 	SCOL_LOW	= 0,	/* Inactive state of serial clock is low */
59 	SCOL_HIGH,		/* Inactive state of serial clock is high */
60 
61 	CSM_SHIFT	= 8,	/* Chip Select Mode */
62 	CSM_MASK	= 0x3,
63 	CSM_KEEP	= 0,	/* ss_n stays low after each frame  */
64 	CSM_HALF,		/* ss_n high for half sclk_out cycles */
65 	CSM_ONE,		/* ss_n high for one sclk_out cycle */
66 	CSM_RESV,
67 
68 	SSN_DELAY_SHIFT	= 10,	/* SSN to Sclk_out delay */
69 	SSN_DELAY_MASK	= 1,
70 	SSN_DELAY_HALF	= 0,	/* 1/2 sclk_out cycle */
71 	SSN_DELAY_ONE	= 1,	/* 1 sclk_out cycle */
72 
73 	SEM_SHIFT	= 11,	/* Serial Endian Mode */
74 	SEM_MASK	= 1,
75 	SEM_LITTLE	= 0,	/* little endian */
76 	SEM_BIG,		/* big endian */
77 
78 	FBM_SHIFT	= 12,	/* First Bit Mode */
79 	FBM_MASK	= 1,
80 	FBM_MSB		= 0,	/* first bit is MSB */
81 	FBM_LSB,		/* first bit in LSB */
82 
83 	HALF_WORD_TX_SHIFT = 13,	/* Byte and Halfword Transform */
84 	HALF_WORD_MASK	= 1,
85 	HALF_WORD_ON	= 0,	/* apb 16bit write/read, spi 8bit write/read */
86 	HALF_WORD_OFF,		/* apb 8bit write/read, spi 8bit write/read */
87 
88 	RXDSD_SHIFT	= 14,	/* Rxd Sample Delay, in cycles */
89 	RXDSD_MASK	= 3,
90 
91 	FRF_SHIFT	= 16,	/* Frame Format */
92 	FRF_MASK	= 3,
93 	FRF_SPI		= 0,	/* Motorola SPI */
94 	FRF_SSP,			/* Texas Instruments SSP*/
95 	FRF_MICROWIRE,		/* National Semiconductors Microwire */
96 	FRF_RESV,
97 
98 	TMOD_SHIFT	= 18,	/* Transfer Mode */
99 	TMOD_MASK	= 3,
100 	TMOD_TR		= 0,	/* xmit & recv */
101 	TMOD_TO,		/* xmit only */
102 	TMOD_RO,		/* recv only */
103 	TMOD_RESV,
104 
105 	OMOD_SHIFT	= 20,	/* Operation Mode */
106 	OMOD_MASK	= 1,
107 	OMOD_MASTER	= 0,	/* Master Mode */
108 	OMOD_SLAVE,		/* Slave Mode */
109 };
110 
111 /* SR */
112 enum {
113 	SR_MASK		= 0x7f,
114 	SR_BUSY		= 1 << 0,
115 	SR_TF_FULL	= 1 << 1,
116 	SR_TF_EMPT	= 1 << 2,
117 	SR_RF_EMPT	= 1 << 3,
118 	SR_RF_FULL	= 1 << 4,
119 };
120 
121 #define ROCKCHIP_SPI_TIMEOUT_MS		1000
122 
123 /*
124  * We limit the maximum bitrate to 50MBit/s (50MHz) due to an assumed
125  * hardware limitation...  the Linux kernel source has the following
126  * comment:
127  *   "sclk_out: spi master internal logic in rk3x can support 50Mhz"
128  */
129 #define ROCKCHIP_SPI_MAX_RATE		50000000
130 
131 #endif /* __RK_SPI_H */
132