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