xref: /rk3399_ARM-atf/include/drivers/cadence/cdns_combo_phy.h (revision ddaf02d17142187d9f17acd4900aafa598666317)
1*ddaf02d1SJit Loon Lim /*
2*ddaf02d1SJit Loon Lim  * Copyright (c) 2022-2023, Intel Corporation. All rights reserved.
3*ddaf02d1SJit Loon Lim  *
4*ddaf02d1SJit Loon Lim  * SPDX-License-Identifier: BSD-3-Clause
5*ddaf02d1SJit Loon Lim  */
6*ddaf02d1SJit Loon Lim 
7*ddaf02d1SJit Loon Lim #ifndef CDN_COMBOPHY_H
8*ddaf02d1SJit Loon Lim #define CDN_COMBOPHY_H
9*ddaf02d1SJit Loon Lim 
10*ddaf02d1SJit Loon Lim /* SRS */
11*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS02			0x8
12*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS03			0xC
13*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS04			0x10
14*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS05			0x14
15*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS06			0x18
16*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS07			0x1C
17*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS09			0x24
18*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS10			0x28
19*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS11			0x2C
20*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS12			0x30
21*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS13			0x34
22*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SRS14			0x38
23*ddaf02d1SJit Loon Lim 
24*ddaf02d1SJit Loon Lim /* SRS03 */
25*ddaf02d1SJit Loon Lim /* Response Type Select
26*ddaf02d1SJit Loon Lim  * Defines the expected response length.
27*ddaf02d1SJit Loon Lim  */
28*ddaf02d1SJit Loon Lim #define SDMMC_CDN_RTS				16
29*ddaf02d1SJit Loon Lim 
30*ddaf02d1SJit Loon Lim /* Command CRC Check Enable
31*ddaf02d1SJit Loon Lim  * When set to 1, the host checks if the CRC field of the response is valid.
32*ddaf02d1SJit Loon Lim  * When 0, the CRC check is disabled and the CRC field of the response is ignored.
33*ddaf02d1SJit Loon Lim  */
34*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CRCCE				19
35*ddaf02d1SJit Loon Lim 
36*ddaf02d1SJit Loon Lim /* Command Index
37*ddaf02d1SJit Loon Lim  * This field contains a command number (index) of the command to be sent.
38*ddaf02d1SJit Loon Lim  */
39*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CIDX				24
40*ddaf02d1SJit Loon Lim 
41*ddaf02d1SJit Loon Lim /* SRS09 */
42*ddaf02d1SJit Loon Lim /* Card Inserted
43*ddaf02d1SJit Loon Lim  * Indicates if the card is inserted inside the slot.
44*ddaf02d1SJit Loon Lim  */
45*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CI				16
46*ddaf02d1SJit Loon Lim 
47*ddaf02d1SJit Loon Lim /* SRS10 */
48*ddaf02d1SJit Loon Lim /* Data Transfer Width
49*ddaf02d1SJit Loon Lim  * Bit used to configure DAT bus width to 1 or 4.
50*ddaf02d1SJit Loon Lim  */
51*ddaf02d1SJit Loon Lim #define SDMMC_CDN_DTW				1
52*ddaf02d1SJit Loon Lim 
53*ddaf02d1SJit Loon Lim /* Extended Data Transfer Width
54*ddaf02d1SJit Loon Lim  * This bit is to enable/disable 8-bit DAT bus width mode.
55*ddaf02d1SJit Loon Lim  */
56*ddaf02d1SJit Loon Lim #define SDMMC_CDN_EDTW				5
57*ddaf02d1SJit Loon Lim 
58*ddaf02d1SJit Loon Lim /* SD Bus Power for VDD1
59*ddaf02d1SJit Loon Lim  * When set to 1, the VDD1 voltage is supplied to card/device.
60*ddaf02d1SJit Loon Lim  */
61*ddaf02d1SJit Loon Lim #define SDMMC_CDN_BP				8
62*ddaf02d1SJit Loon Lim 
63*ddaf02d1SJit Loon Lim /* SD Bus Voltage Select
64*ddaf02d1SJit Loon Lim  * This field is used to configure VDD1 voltage level.
65*ddaf02d1SJit Loon Lim  */
66*ddaf02d1SJit Loon Lim #define SDMMC_CDN_BVS				9
67*ddaf02d1SJit Loon Lim 
68*ddaf02d1SJit Loon Lim /* SRS11 */
69*ddaf02d1SJit Loon Lim /* Internal Clock Enable
70*ddaf02d1SJit Loon Lim  * This field is designated to controls (enable/disable) external clock generator.
71*ddaf02d1SJit Loon Lim  */
72*ddaf02d1SJit Loon Lim #define SDMMC_CDN_ICE				0
73*ddaf02d1SJit Loon Lim 
74*ddaf02d1SJit Loon Lim /* Internal Clock Stable
75*ddaf02d1SJit Loon Lim  * When 1, indicates that the clock on sdmclk pin of the host is stable.
76*ddaf02d1SJit Loon Lim  * When 0, indicates that the clock is not stable .
77*ddaf02d1SJit Loon Lim  */
78*ddaf02d1SJit Loon Lim #define SDMMC_CDN_ICS				1
79*ddaf02d1SJit Loon Lim 
80*ddaf02d1SJit Loon Lim /* SD Clock Enable
81*ddaf02d1SJit Loon Lim  * When set, SDCLK clock is enabled.
82*ddaf02d1SJit Loon Lim  * When clear, SDCLK clock is stopped.
83*ddaf02d1SJit Loon Lim  */
84*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SDCE				2
85*ddaf02d1SJit Loon Lim 
86*ddaf02d1SJit Loon Lim /* USDCLK Frequency Select
87*ddaf02d1SJit Loon Lim  * This is used to calculate frequency of USDCLK clock.
88*ddaf02d1SJit Loon Lim  */
89*ddaf02d1SJit Loon Lim #define SDMMC_CDN_USDCLKFS			6
90*ddaf02d1SJit Loon Lim 
91*ddaf02d1SJit Loon Lim /* SDCLK Frequency Select
92*ddaf02d1SJit Loon Lim  * This is used to calculate frequency of SDCLK clock.
93*ddaf02d1SJit Loon Lim  */
94*ddaf02d1SJit Loon Lim #define SDMMC_CDN_SDCLKFS				8
95*ddaf02d1SJit Loon Lim 
96*ddaf02d1SJit Loon Lim /* Data Timeout Counter Value
97*ddaf02d1SJit Loon Lim  * This value determines the interval by which DAT line timeouts are detected
98*ddaf02d1SJit Loon Lim  */
99*ddaf02d1SJit Loon Lim #define SDMMC_CDN_DTCV				16
100*ddaf02d1SJit Loon Lim 
101*ddaf02d1SJit Loon Lim /* SRS12 */
102*ddaf02d1SJit Loon Lim /* Command Complete
103*ddaf02d1SJit Loon Lim  * Generated when the end bit of the response is received.
104*ddaf02d1SJit Loon Lim  */
105*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CC				0
106*ddaf02d1SJit Loon Lim 
107*ddaf02d1SJit Loon Lim /* Transfer Complete
108*ddaf02d1SJit Loon Lim  * Generated when the transfer which uses the DAT line is complete.
109*ddaf02d1SJit Loon Lim  */
110*ddaf02d1SJit Loon Lim #define SDMMC_CDN_TC				1
111*ddaf02d1SJit Loon Lim 
112*ddaf02d1SJit Loon Lim /* Error Interrupt
113*ddaf02d1SJit Loon Lim  * The software can check for an error by reading this single bit first.
114*ddaf02d1SJit Loon Lim  */
115*ddaf02d1SJit Loon Lim #define SDMMC_CDN_EINT				15
116*ddaf02d1SJit Loon Lim 
117*ddaf02d1SJit Loon Lim /* SRS14 */
118*ddaf02d1SJit Loon Lim /* Command Complete Interrupt Enable */
119*ddaf02d1SJit Loon Lim #define SDMMC_CDN_CC_IE				0
120*ddaf02d1SJit Loon Lim 
121*ddaf02d1SJit Loon Lim /* Transfer Complete Interrupt Enable */
122*ddaf02d1SJit Loon Lim #define SDMMC_CDN_TC_IE				1
123*ddaf02d1SJit Loon Lim 
124*ddaf02d1SJit Loon Lim /* DMA Interrupt Enable */
125*ddaf02d1SJit Loon Lim #define SDMMC_CDN_DMAINT_IE			3
126*ddaf02d1SJit Loon Lim 
127*ddaf02d1SJit Loon Lim /* Combo PHY DLL registers */
128*ddaf02d1SJit Loon Lim #define CP_DLL_REG_BASE			(0x10B92000)
129*ddaf02d1SJit Loon Lim #define CP_DLL_DQ_TIMING_REG		(0x00)
130*ddaf02d1SJit Loon Lim #define CP_DLL_DQS_TIMING_REG		(0x04)
131*ddaf02d1SJit Loon Lim #define CP_DLL_GATE_LPBK_CTRL_REG	(0x08)
132*ddaf02d1SJit Loon Lim #define CP_DLL_MASTER_CTRL_REG		(0x0C)
133*ddaf02d1SJit Loon Lim #define CP_DLL_SLAVE_CTRL_REG		(0x10)
134*ddaf02d1SJit Loon Lim #define CP_DLL_IE_TIMING_REG		(0x14)
135*ddaf02d1SJit Loon Lim 
136*ddaf02d1SJit Loon Lim #define CP_DQ_TIMING_REG_SDR		(0x00000002)
137*ddaf02d1SJit Loon Lim #define CP_DQS_TIMING_REG_SDR		(0x00100004)
138*ddaf02d1SJit Loon Lim #define CP_GATE_LPBK_CTRL_REG_SDR	(0x00D80000)
139*ddaf02d1SJit Loon Lim #define CP_DLL_MASTER_CTRL_REG_SDR	(0x00800000)
140*ddaf02d1SJit Loon Lim #define CP_DLL_SLAVE_CTRL_REG_SDR	(0x00000000)
141*ddaf02d1SJit Loon Lim 
142*ddaf02d1SJit Loon Lim #define CP_DLL(_reg)			(CP_DLL_REG_BASE \
143*ddaf02d1SJit Loon Lim 					+ (CP_DLL_##_reg))
144*ddaf02d1SJit Loon Lim 
145*ddaf02d1SJit Loon Lim /* Control Timing Block registers */
146*ddaf02d1SJit Loon Lim #define CP_CTB_REG_BASE			(0x10B92080)
147*ddaf02d1SJit Loon Lim #define CP_CTB_CTRL_REG			(0x00)
148*ddaf02d1SJit Loon Lim #define CP_CTB_TSEL_REG			(0x04)
149*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_CTRL0		(0x08)
150*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_CTRL1		(0x0C)
151*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_STATUS0		(0x10)
152*ddaf02d1SJit Loon Lim #define CP_CTB_GPIO_STATUS1		(0x14)
153*ddaf02d1SJit Loon Lim 
154*ddaf02d1SJit Loon Lim #define CP_CTRL_REG_SDR			(0x00004040)
155*ddaf02d1SJit Loon Lim #define CP_TSEL_REG_SDR			(0x00000000)
156*ddaf02d1SJit Loon Lim 
157*ddaf02d1SJit Loon Lim #define CP_CTB(_reg)			(CP_CTB_REG_BASE \
158*ddaf02d1SJit Loon Lim 					+ (CP_CTB_##_reg))
159*ddaf02d1SJit Loon Lim 
160*ddaf02d1SJit Loon Lim /* Combo PHY */
161*ddaf02d1SJit Loon Lim #define SDMMC_CDN_REG_BASE		0x10808200
162*ddaf02d1SJit Loon Lim #define PHY_DQ_TIMING_REG		0x2000
163*ddaf02d1SJit Loon Lim #define PHY_DQS_TIMING_REG		0x2004
164*ddaf02d1SJit Loon Lim #define PHY_GATE_LPBK_CTRL_REG		0x2008
165*ddaf02d1SJit Loon Lim #define PHY_DLL_MASTER_CTRL_REG		0x200C
166*ddaf02d1SJit Loon Lim #define PHY_DLL_SLAVE_CTRL_REG		0x2010
167*ddaf02d1SJit Loon Lim #define PHY_CTRL_REG			0x2080
168*ddaf02d1SJit Loon Lim #define PHY_REG_ADDR_MASK		0xFFFF
169*ddaf02d1SJit Loon Lim #define PHY_REG_DATA_MASK		0xFFFFFFFF
170*ddaf02d1SJit Loon Lim 
171*ddaf02d1SJit Loon Lim /* PHY_DQS_TIMING_REG */
172*ddaf02d1SJit Loon Lim #define CP_USE_EXT_LPBK_DQS(x)		((x) << 22) //0x1
173*ddaf02d1SJit Loon Lim #define CP_USE_LPBK_DQS(x)		((x) << 21) //0x1
174*ddaf02d1SJit Loon Lim #define CP_USE_PHONY_DQS(x)		((x) << 20) //0x1
175*ddaf02d1SJit Loon Lim #define CP_USE_PHONY_DQS_CMD(x)		((x) << 19) //0x1
176*ddaf02d1SJit Loon Lim 
177*ddaf02d1SJit Loon Lim /* PHY_GATE_LPBK_CTRL_REG */
178*ddaf02d1SJit Loon Lim #define CP_SYNC_METHOD(x)		((x) << 31) //0x1
179*ddaf02d1SJit Loon Lim #define CP_SW_HALF_CYCLE_SHIFT(x)	((x) << 28) //0x1
180*ddaf02d1SJit Loon Lim #define CP_RD_DEL_SEL(x)		((x) << 19) //0x3f
181*ddaf02d1SJit Loon Lim #define CP_UNDERRUN_SUPPRESS(x)		((x) << 18) //0x1
182*ddaf02d1SJit Loon Lim #define CP_GATE_CFG_ALWAYS_ON(x)	((x) << 6) //0x1
183*ddaf02d1SJit Loon Lim 
184*ddaf02d1SJit Loon Lim /* PHY_DLL_MASTER_CTRL_REG */
185*ddaf02d1SJit Loon Lim #define CP_DLL_BYPASS_MODE(x)		((x) << 23) //0x1
186*ddaf02d1SJit Loon Lim #define CP_DLL_START_POINT(x)		((x) << 0) //0xff
187*ddaf02d1SJit Loon Lim 
188*ddaf02d1SJit Loon Lim /* PHY_DLL_SLAVE_CTRL_REG */
189*ddaf02d1SJit Loon Lim #define CP_READ_DQS_CMD_DELAY(x)	((x) << 24) //0xff
190*ddaf02d1SJit Loon Lim #define CP_CLK_WRDQS_DELAY(x)		((x) << 16) //0xff
191*ddaf02d1SJit Loon Lim #define CP_CLK_WR_DELAY(x)		((x) << 8) //0xff
192*ddaf02d1SJit Loon Lim #define CP_READ_DQS_DELAY(x)		((x) << 0) //0xff
193*ddaf02d1SJit Loon Lim 
194*ddaf02d1SJit Loon Lim /* PHY_DQ_TIMING_REG */
195*ddaf02d1SJit Loon Lim #define CP_IO_MASK_ALWAYS_ON(x)		((x) << 31) //0x1
196*ddaf02d1SJit Loon Lim #define CP_IO_MASK_END(x)		((x) << 27) //0x7
197*ddaf02d1SJit Loon Lim #define CP_IO_MASK_START(x)		((x) << 24) //0x7
198*ddaf02d1SJit Loon Lim #define CP_DATA_SELECT_OE_END(x)	((x) << 0) //0x7
199*ddaf02d1SJit Loon Lim 
200*ddaf02d1SJit Loon Lim /* PHY_CTRL_REG */
201*ddaf02d1SJit Loon Lim #define CP_PHONY_DQS_TIMING_MASK	0x3F
202*ddaf02d1SJit Loon Lim #define CP_PHONY_DQS_TIMING_SHIFT	4
203*ddaf02d1SJit Loon Lim 
204*ddaf02d1SJit Loon Lim /* Shared Macros */
205*ddaf02d1SJit Loon Lim #define SDMMC_CDN(_reg)			(SDMMC_CDN_REG_BASE + \
206*ddaf02d1SJit Loon Lim 					(SDMMC_CDN_##_reg))
207*ddaf02d1SJit Loon Lim 
208*ddaf02d1SJit Loon Lim struct cdns_sdmmc_combo_phy {
209*ddaf02d1SJit Loon Lim 	uint32_t	cp_clk_wr_delay;
210*ddaf02d1SJit Loon Lim 	uint32_t	cp_clk_wrdqs_delay;
211*ddaf02d1SJit Loon Lim 	uint32_t	cp_data_select_oe_end;
212*ddaf02d1SJit Loon Lim 	uint32_t	cp_dll_bypass_mode;
213*ddaf02d1SJit Loon Lim 	uint32_t	cp_dll_locked_mode;
214*ddaf02d1SJit Loon Lim 	uint32_t	cp_dll_start_point;
215*ddaf02d1SJit Loon Lim 	uint32_t	cp_gate_cfg_always_on;
216*ddaf02d1SJit Loon Lim 	uint32_t	cp_io_mask_always_on;
217*ddaf02d1SJit Loon Lim 	uint32_t	cp_io_mask_end;
218*ddaf02d1SJit Loon Lim 	uint32_t	cp_io_mask_start;
219*ddaf02d1SJit Loon Lim 	uint32_t	cp_rd_del_sel;
220*ddaf02d1SJit Loon Lim 	uint32_t	cp_read_dqs_cmd_delay;
221*ddaf02d1SJit Loon Lim 	uint32_t	cp_read_dqs_delay;
222*ddaf02d1SJit Loon Lim 	uint32_t	cp_sw_half_cycle_shift;
223*ddaf02d1SJit Loon Lim 	uint32_t	cp_sync_method;
224*ddaf02d1SJit Loon Lim 	uint32_t	cp_underrun_suppress;
225*ddaf02d1SJit Loon Lim 	uint32_t	cp_use_ext_lpbk_dqs;
226*ddaf02d1SJit Loon Lim 	uint32_t	cp_use_lpbk_dqs;
227*ddaf02d1SJit Loon Lim 	uint32_t	cp_use_phony_dqs;
228*ddaf02d1SJit Loon Lim 	uint32_t	cp_use_phony_dqs_cmd;
229*ddaf02d1SJit Loon Lim };
230*ddaf02d1SJit Loon Lim 
231*ddaf02d1SJit Loon Lim /* Function Prototype */
232*ddaf02d1SJit Loon Lim 
233*ddaf02d1SJit Loon Lim int cdns_sdmmc_write_phy_reg(uint32_t phy_reg_addr, uint32_t phy_reg_addr_value,
234*ddaf02d1SJit Loon Lim 			uint32_t phy_reg_data, uint32_t phy_reg_data_value);
235*ddaf02d1SJit Loon Lim int cdns_sd_card_detect(void);
236*ddaf02d1SJit Loon Lim int cdns_emmc_card_reset(void);
237*ddaf02d1SJit Loon Lim 
238*ddaf02d1SJit Loon Lim #endif
239