xref: /arm-trusted-firmware/drivers/brcm/emmc/emmc_chal_sd.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2016 - 2020, Broadcom
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <string.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <lib/mmio.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <platform_def.h>
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #include "bcm_emmc.h"
15*91f16700Schasinglulu #include "emmc_chal_types.h"
16*91f16700Schasinglulu #include "emmc_chal_sd.h"
17*91f16700Schasinglulu #include "emmc_pboot_hal_memory_drv.h"
18*91f16700Schasinglulu 
19*91f16700Schasinglulu extern void emmc_soft_reset(void);
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #define SD_VDD_WINDOW_1_6_TO_1_7        0x00000010	// 1.6 V to 1.7 Volts
22*91f16700Schasinglulu #define SD_VDD_WINDOW_1_7_TO_1_8        0x00000020	// 1.7 V to 1.8 Volts
23*91f16700Schasinglulu #define SD_VDD_WINDOW_1_8_TO_1_9        0x00000040	// 1.8 V to 1.9 Volts
24*91f16700Schasinglulu #define SD_VDD_WINDOW_1_9_TO_2_0        0x00000080	// 1.9 V to 2.0 Volts
25*91f16700Schasinglulu #define SD_VDD_WINDOW_2_0_TO_2_1        0x00000100	// 2.0 V to 2.1 Volts
26*91f16700Schasinglulu #define SD_VDD_WINDOW_2_1_TO_2_2        0x00000200	// 2.1 V to 2.2 Volts
27*91f16700Schasinglulu #define SD_VDD_WINDOW_2_2_TO_2_3        0x00000400	// 2.2 V to 2.3 Volts
28*91f16700Schasinglulu #define SD_VDD_WINDOW_2_3_TO_2_4        0x00000800	// 2.3 V to 2.4 Volts
29*91f16700Schasinglulu #define SD_VDD_WINDOW_2_4_TO_2_5        0x00001000	// 2.4 V to 2.5 Volts
30*91f16700Schasinglulu #define SD_VDD_WINDOW_2_5_TO_2_6        0x00002000	// 2.5 V to 2.6 Volts
31*91f16700Schasinglulu #define SD_VDD_WINDOW_2_6_TO_2_7        0x00004000	// 2.6 V to 2.7 Volts
32*91f16700Schasinglulu #define SD_VDD_WINDOW_2_7_TO_2_8        0x00008000	// 2.7 V to 2.8 Volts
33*91f16700Schasinglulu #define SD_VDD_WINDOW_2_8_TO_2_9        0x00010000	// 2.8 V to 2.9 Volts
34*91f16700Schasinglulu #define SD_VDD_WINDOW_2_9_TO_3_0        0x00020000	// 2.9 V to 3.0 Volts
35*91f16700Schasinglulu #define SD_VDD_WINDOW_3_0_TO_3_1        0x00040000	// 3.0 V to 3.1 Volts
36*91f16700Schasinglulu #define SD_VDD_WINDOW_3_1_TO_3_2        0x00080000	// 3.1 V to 3.2 Volts
37*91f16700Schasinglulu #define SD_VDD_WINDOW_3_2_TO_3_3        0x00100000	// 3.2 V to 3.3 Volts
38*91f16700Schasinglulu #define SD_VDD_WINDOW_3_3_TO_3_4        0x00200000	// 3.3 V to 3.4 Volts
39*91f16700Schasinglulu #define SD_VDD_WINDOW_3_4_TO_3_5        0x00400000	// 3.4 V to 3.5 Volts
40*91f16700Schasinglulu #define SD_VDD_WINDOW_3_5_TO_3_6        0x00800000	// 3.5 V to 3.6 Volts
41*91f16700Schasinglulu 
42*91f16700Schasinglulu #define SD_VDD_WINDOW_1_6_TO_2_6        (SD_VDD_WINDOW_1_6_TO_1_7 |	\
43*91f16700Schasinglulu 					 SD_VDD_WINDOW_1_7_TO_1_8 |	\
44*91f16700Schasinglulu 					 SD_VDD_WINDOW_1_8_TO_1_9 |	\
45*91f16700Schasinglulu 					 SD_VDD_WINDOW_1_9_TO_2_0 |	\
46*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_0_TO_2_1 |	\
47*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_1_TO_2_2 |	\
48*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_2_TO_2_3 |	\
49*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_3_TO_2_4 |	\
50*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_4_TO_2_5 |	\
51*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_5_TO_2_6)
52*91f16700Schasinglulu 
53*91f16700Schasinglulu #define SD_VDD_WINDOW_2_6_TO_3_2        (SD_VDD_WINDOW_2_6_TO_2_7 |	\
54*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_7_TO_2_8 |	\
55*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_8_TO_2_9 |	\
56*91f16700Schasinglulu 					 SD_VDD_WINDOW_2_9_TO_3_0 |	\
57*91f16700Schasinglulu 					 SD_VDD_WINDOW_3_0_TO_3_1 |	\
58*91f16700Schasinglulu 					 SD_VDD_WINDOW_3_1_TO_3_2)
59*91f16700Schasinglulu 
60*91f16700Schasinglulu #define SD_VDD_WINDOW_3_2_TO_3_6        (SD_VDD_WINDOW_3_2_TO_3_3 |	\
61*91f16700Schasinglulu 					 SD_VDD_WINDOW_3_3_TO_3_4 |	\
62*91f16700Schasinglulu 					 SD_VDD_WINDOW_3_4_TO_3_5 |	\
63*91f16700Schasinglulu 					 SD_VDD_WINDOW_3_5_TO_3_6)
64*91f16700Schasinglulu 
65*91f16700Schasinglulu 
66*91f16700Schasinglulu static int32_t chal_sd_set_power(struct sd_dev *handle,
67*91f16700Schasinglulu 				 uint32_t voltage, uint32_t state);
68*91f16700Schasinglulu 
69*91f16700Schasinglulu static void chal_sd_set_dma_boundary(struct sd_dev *handle, uint32_t boundary);
70*91f16700Schasinglulu 
71*91f16700Schasinglulu static int32_t chal_sd_setup_handler(struct sd_dev *handle,
72*91f16700Schasinglulu 				     uint32_t sdBbase, uint32_t hostBase);
73*91f16700Schasinglulu 
74*91f16700Schasinglulu /*
75*91f16700Schasinglulu  * Configure host controller pwr settings,
76*91f16700Schasinglulu  * to match voltage requirements by SD Card
77*91f16700Schasinglulu  */
78*91f16700Schasinglulu static int32_t chal_sd_set_power(struct sd_dev *handle,
79*91f16700Schasinglulu 				 uint32_t voltage, uint32_t state)
80*91f16700Schasinglulu {
81*91f16700Schasinglulu 	int32_t rc, rval = SD_FAIL;
82*91f16700Schasinglulu 	uint32_t time = 0;
83*91f16700Schasinglulu 
84*91f16700Schasinglulu 	if (handle == NULL)
85*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
86*91f16700Schasinglulu 
87*91f16700Schasinglulu 	mmio_clrsetbits_32(handle->ctrl.sdRegBaseAddr +
88*91f16700Schasinglulu 			   SD4_EMMC_TOP_CTRL_OFFSET,
89*91f16700Schasinglulu 			   (SD4_EMMC_TOP_CTRL_SDVSELVDD1_MASK |
90*91f16700Schasinglulu 			    SD4_EMMC_TOP_CTRL_SDPWR_MASK),
91*91f16700Schasinglulu 			   (voltage << 9));
92*91f16700Schasinglulu 
93*91f16700Schasinglulu 	/*
94*91f16700Schasinglulu 	 * Long delay is required here in emulation.  Without this, the initial
95*91f16700Schasinglulu 	 * commands sent to the eMMC card timeout.  We don't know if this
96*91f16700Schasinglulu 	 * delay is necessary with silicon, leaving in for safety.
97*91f16700Schasinglulu 	 * It is observed that 403ms on emulation system and as per the clock
98*91f16700Schasinglulu 	 * calculations it is expected to complete with in 1ms on chip
99*91f16700Schasinglulu 	 */
100*91f16700Schasinglulu 	do {
101*91f16700Schasinglulu 		rc =  mmio_read_32(handle->ctrl.sdRegBaseAddr +
102*91f16700Schasinglulu 				   SD4_EMMC_TOP_INTR_OFFSET);
103*91f16700Schasinglulu 
104*91f16700Schasinglulu 		if ((rc & SD4_EMMC_TOP_INTR_CRDINS_MASK) ==
105*91f16700Schasinglulu 				SD4_EMMC_TOP_INTR_CRDINS_MASK)
106*91f16700Schasinglulu 			break;
107*91f16700Schasinglulu 
108*91f16700Schasinglulu 		mdelay(1);
109*91f16700Schasinglulu 	} while (time++ < EMMC_CARD_DETECT_TIMEOUT_MS);
110*91f16700Schasinglulu 
111*91f16700Schasinglulu 	if (time >= EMMC_CARD_DETECT_TIMEOUT_MS) {
112*91f16700Schasinglulu 		ERROR("EMMC: Card insert event detection timeout\n");
113*91f16700Schasinglulu 		return rval;
114*91f16700Schasinglulu 	}
115*91f16700Schasinglulu 
116*91f16700Schasinglulu 	VERBOSE("EMMC: Card detection delay: %dms\n", time);
117*91f16700Schasinglulu 
118*91f16700Schasinglulu 	if (state)
119*91f16700Schasinglulu 		mmio_setbits_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL_OFFSET,
120*91f16700Schasinglulu 				SD4_EMMC_TOP_CTRL_SDPWR_MASK);
121*91f16700Schasinglulu 
122*91f16700Schasinglulu 	/* dummy write & ack to verify if the sdio is ready to send commands */
123*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_ARG_OFFSET, 0);
124*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CMD_OFFSET, 0);
125*91f16700Schasinglulu 
126*91f16700Schasinglulu 	/*
127*91f16700Schasinglulu 	 * 63ms observed on emulation system, As per clock calculations
128*91f16700Schasinglulu 	 * it will complete  < 1ms on chip.
129*91f16700Schasinglulu 	 */
130*91f16700Schasinglulu 	time = 0;
131*91f16700Schasinglulu 	do {
132*91f16700Schasinglulu 		rc = mmio_read_32(handle->ctrl.sdRegBaseAddr +
133*91f16700Schasinglulu 				  SD4_EMMC_TOP_INTR_OFFSET);
134*91f16700Schasinglulu 
135*91f16700Schasinglulu 		if (rc & SD4_EMMC_TOP_INTR_ERRIRQ_MASK)
136*91f16700Schasinglulu 			break;
137*91f16700Schasinglulu 
138*91f16700Schasinglulu 		if ((rc & SD4_EMMC_TOP_INTR_CMDDONE_MASK) ==
139*91f16700Schasinglulu 				SD4_EMMC_TOP_INTR_CMDDONE_MASK)
140*91f16700Schasinglulu 			break;
141*91f16700Schasinglulu 
142*91f16700Schasinglulu 		mdelay(1);
143*91f16700Schasinglulu 	} while (time++ < EMMC_CMD_TIMEOUT_MS);
144*91f16700Schasinglulu 
145*91f16700Schasinglulu 	if (time >= EMMC_CMD_TIMEOUT_MS) {
146*91f16700Schasinglulu 		WARN("%s %d Initial dummy command timeout is happened\n",
147*91f16700Schasinglulu 		      __func__, __LINE__);
148*91f16700Schasinglulu 		return rval;
149*91f16700Schasinglulu 	}
150*91f16700Schasinglulu 
151*91f16700Schasinglulu 	VERBOSE("EMMC: Dummy Command delay: %dms\n", time);
152*91f16700Schasinglulu 
153*91f16700Schasinglulu 	return SD_OK;
154*91f16700Schasinglulu }
155*91f16700Schasinglulu 
156*91f16700Schasinglulu /*
157*91f16700Schasinglulu  * Configure DMA Boundaries
158*91f16700Schasinglulu  */
159*91f16700Schasinglulu static void chal_sd_set_dma_boundary(struct sd_dev *handle, uint32_t boundary)
160*91f16700Schasinglulu {
161*91f16700Schasinglulu 	if (handle == NULL)
162*91f16700Schasinglulu 		return;
163*91f16700Schasinglulu 
164*91f16700Schasinglulu 	mmio_clrsetbits_32(handle->ctrl.sdRegBaseAddr +
165*91f16700Schasinglulu 			   SD4_EMMC_TOP_BLOCK_OFFSET,
166*91f16700Schasinglulu 			   SD4_EMMC_TOP_BLOCK_HSBS_MASK, boundary);
167*91f16700Schasinglulu }
168*91f16700Schasinglulu 
169*91f16700Schasinglulu static int32_t chal_sd_setup_handler(struct sd_dev *handle, uint32_t sdBase,
170*91f16700Schasinglulu 				     uint32_t hostBase)
171*91f16700Schasinglulu {
172*91f16700Schasinglulu 	if (handle == NULL)
173*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
174*91f16700Schasinglulu 
175*91f16700Schasinglulu 	handle->ctrl.sdRegBaseAddr = sdBase;
176*91f16700Schasinglulu 	handle->ctrl.hostRegBaseAddr = hostBase;
177*91f16700Schasinglulu 	handle->ctrl.present = 0;
178*91f16700Schasinglulu 	handle->ctrl.rca = 0;
179*91f16700Schasinglulu 	handle->ctrl.blkGapEnable = 0;
180*91f16700Schasinglulu 	handle->ctrl.cmdStatus = 0;
181*91f16700Schasinglulu 
182*91f16700Schasinglulu 	return SD_OK;
183*91f16700Schasinglulu }
184*91f16700Schasinglulu 
185*91f16700Schasinglulu /*
186*91f16700Schasinglulu  * Initialize SD Host controller
187*91f16700Schasinglulu  */
188*91f16700Schasinglulu int32_t chal_sd_init(CHAL_HANDLE *sd_handle)
189*91f16700Schasinglulu {
190*91f16700Schasinglulu 	uint32_t cap_val_l = 0;
191*91f16700Schasinglulu 	uint32_t ctl_val, voltage;
192*91f16700Schasinglulu 	uint32_t timeout_val;
193*91f16700Schasinglulu 	struct sd_dev *handle;
194*91f16700Schasinglulu 	uint32_t reg_val;
195*91f16700Schasinglulu 	int32_t rval = SD_FAIL;
196*91f16700Schasinglulu 
197*91f16700Schasinglulu 	if (sd_handle == NULL)
198*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
199*91f16700Schasinglulu 
200*91f16700Schasinglulu 	handle = (struct sd_dev *)sd_handle;
201*91f16700Schasinglulu 
202*91f16700Schasinglulu 	/*
203*91f16700Schasinglulu 	 * Set SDIO Host Controller capabilities register
204*91f16700Schasinglulu 	 */
205*91f16700Schasinglulu 	EMMC_TRACE("Set Host Controller Capabilities register\n");
206*91f16700Schasinglulu 
207*91f16700Schasinglulu 	reg_val = 0;
208*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__SLOT_TYPE_R);
209*91f16700Schasinglulu 	reg_val |= (0 << ICFG_SDIO0_CAP0__INT_MODE_R);
210*91f16700Schasinglulu 	reg_val |= (0 << ICFG_SDIO0_CAP0__SYS_BUS_64BIT_R);
211*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__VOLTAGE_1P8V_R);
212*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__VOLTAGE_3P0V_R);
213*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__VOLTAGE_3P3V_R);
214*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__SUSPEND_RESUME_R);
215*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__SDMA_R);
216*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__HIGH_SPEED_R);
217*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__ADMA2_R);
218*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__EXTENDED_MEDIA_R);
219*91f16700Schasinglulu 	reg_val |= (2 << ICFG_SDIO0_CAP0__MAX_BLOCK_LEN_R);
220*91f16700Schasinglulu 	reg_val |= (0xd0 << ICFG_SDIO0_CAP0__BASE_CLK_FREQ_R);
221*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP0__TIMEOUT_UNIT_R);
222*91f16700Schasinglulu 	reg_val |= (0x30 << ICFG_SDIO0_CAP0__TIMEOUT_CLK_FREQ_R);
223*91f16700Schasinglulu 
224*91f16700Schasinglulu 	mmio_write_32(ICFG_SDIO0_CAP0, reg_val);
225*91f16700Schasinglulu 
226*91f16700Schasinglulu 	reg_val = 0;
227*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__SPI_BLOCK_MODE_R);
228*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__SPI_MODE_R);
229*91f16700Schasinglulu 	reg_val |= (0 << ICFG_SDIO0_CAP1__CLK_MULT_R);
230*91f16700Schasinglulu 	reg_val |= (0 << ICFG_SDIO0_CAP1__RETUNING_MODE_R);
231*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__TUNE_SDR50_R);
232*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__TIME_RETUNE_R);
233*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__DRIVER_D_R);
234*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__DRIVER_C_R);
235*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__DRIVER_A_R);
236*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__DDR50_R);
237*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__SDR104_R);
238*91f16700Schasinglulu 	reg_val |= (1 << ICFG_SDIO0_CAP1__SDR50_R);
239*91f16700Schasinglulu 
240*91f16700Schasinglulu 	mmio_write_32(ICFG_SDIO0_CAP1, reg_val);
241*91f16700Schasinglulu 
242*91f16700Schasinglulu 	/* Reset the SDIO controller */
243*91f16700Schasinglulu 	chal_sd_stop();
244*91f16700Schasinglulu 
245*91f16700Schasinglulu 	/* Turn on SD clock */
246*91f16700Schasinglulu 	chal_sd_set_clock(sd_handle,
247*91f16700Schasinglulu 			  chal_sd_freq_2_div_ctrl_setting(INIT_CLK_FREQ), 1);
248*91f16700Schasinglulu 
249*91f16700Schasinglulu 	/* program data time out value to the max */
250*91f16700Schasinglulu 	timeout_val = SD_HOST_CORE_TIMEOUT;
251*91f16700Schasinglulu 
252*91f16700Schasinglulu 	ctl_val = mmio_read_32(handle->ctrl.sdRegBaseAddr +
253*91f16700Schasinglulu 			       SD4_EMMC_TOP_CTRL1_OFFSET);
254*91f16700Schasinglulu 	ctl_val |= ((timeout_val & 0xf) << SD4_EMMC_TOP_CTRL1_DTCNT_SHIFT);
255*91f16700Schasinglulu 
256*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET,
257*91f16700Schasinglulu 		      ctl_val);
258*91f16700Schasinglulu 
259*91f16700Schasinglulu 	/* enable all interrupt status */
260*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN1_OFFSET,
261*91f16700Schasinglulu 		      0);
262*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN2_OFFSET,
263*91f16700Schasinglulu 		      0);
264*91f16700Schasinglulu 
265*91f16700Schasinglulu 	SD_US_DELAY(100);
266*91f16700Schasinglulu 
267*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN1_OFFSET,
268*91f16700Schasinglulu 		      SD_NOR_INTERRUPTS | SD_ERR_INTERRUPTS);
269*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN2_OFFSET,
270*91f16700Schasinglulu 		      SD_NOR_INTERRUPTS | SD_ERR_INTERRUPTS);
271*91f16700Schasinglulu 
272*91f16700Schasinglulu 	/* Select SD bus voltage */
273*91f16700Schasinglulu 	cap_val_l = mmio_read_32(handle->ctrl.sdRegBaseAddr +
274*91f16700Schasinglulu 				 SD4_EMMC_TOP_CAPABILITIES1_OFFSET);
275*91f16700Schasinglulu 	handle->cfg.voltage = 0;
276*91f16700Schasinglulu 	voltage = 0x7;
277*91f16700Schasinglulu 
278*91f16700Schasinglulu 	if (cap_val_l & SD4_EMMC_TOP_CAPABILITIES1_V33_MASK) {
279*91f16700Schasinglulu 		handle->cfg.voltage |= SD_VDD_WINDOW_3_3_TO_3_4;
280*91f16700Schasinglulu 		voltage = 0x7;
281*91f16700Schasinglulu 	} else if (cap_val_l & SD4_EMMC_TOP_CAPABILITIES1_V3_MASK) {
282*91f16700Schasinglulu 		handle->cfg.voltage |= SD_VDD_WINDOW_3_0_TO_3_1;
283*91f16700Schasinglulu 		voltage = 0x6;
284*91f16700Schasinglulu 	} else if (cap_val_l & SD4_EMMC_TOP_CAPABILITIES1_V18_MASK) {
285*91f16700Schasinglulu 		handle->cfg.voltage |= SD_VDD_WINDOW_1_8_TO_1_9;
286*91f16700Schasinglulu 		voltage = 0x5;
287*91f16700Schasinglulu 	}
288*91f16700Schasinglulu 
289*91f16700Schasinglulu 	rval = chal_sd_set_power(handle, voltage, SD4_EMMC_TOP_CTRL_SDPWR_MASK);
290*91f16700Schasinglulu 
291*91f16700Schasinglulu 	ctl_val = mmio_read_32(handle->ctrl.sdRegBaseAddr +
292*91f16700Schasinglulu 			       SD4_EMMC_TOP_HCVERSIRQ_OFFSET);
293*91f16700Schasinglulu 	handle->ctrl.version = ((ctl_val >> 16) & 0xFF);
294*91f16700Schasinglulu 
295*91f16700Schasinglulu 	return rval;
296*91f16700Schasinglulu }
297*91f16700Schasinglulu 
298*91f16700Schasinglulu void chal_sd_set_speed(CHAL_HANDLE *sd_handle, uint32_t speed)
299*91f16700Schasinglulu {
300*91f16700Schasinglulu 	struct sd_dev *handle;
301*91f16700Schasinglulu 
302*91f16700Schasinglulu 	if (sd_handle == NULL)
303*91f16700Schasinglulu 		return;
304*91f16700Schasinglulu 
305*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
306*91f16700Schasinglulu 
307*91f16700Schasinglulu 	if (speed) {
308*91f16700Schasinglulu 		EMMC_TRACE("enable HighSpeed\n");
309*91f16700Schasinglulu 		mmio_setbits_32(handle->ctrl.sdRegBaseAddr +
310*91f16700Schasinglulu 				SD4_EMMC_TOP_CTRL_OFFSET,
311*91f16700Schasinglulu 				SD4_EMMC_TOP_CTRL_HSEN_MASK);
312*91f16700Schasinglulu 	} else {
313*91f16700Schasinglulu 		EMMC_TRACE("disable HighSpeed\n");
314*91f16700Schasinglulu 		mmio_clrbits_32(handle->ctrl.sdRegBaseAddr +
315*91f16700Schasinglulu 				SD4_EMMC_TOP_CTRL_OFFSET,
316*91f16700Schasinglulu 				SD4_EMMC_TOP_CTRL_HSEN_MASK);
317*91f16700Schasinglulu 	}
318*91f16700Schasinglulu }
319*91f16700Schasinglulu 
320*91f16700Schasinglulu int32_t chal_sd_stop(void)
321*91f16700Schasinglulu {
322*91f16700Schasinglulu 	uintptr_t idm_rst_ctrl_addr = EMMC_IDM_RESET_CTRL_ADDR;
323*91f16700Schasinglulu 
324*91f16700Schasinglulu 	/* Configure IO pins */
325*91f16700Schasinglulu 	emmc_soft_reset();
326*91f16700Schasinglulu 
327*91f16700Schasinglulu 	/* Reset the SDIO controller */
328*91f16700Schasinglulu 	mmio_write_32(idm_rst_ctrl_addr, 1);
329*91f16700Schasinglulu 	SD_US_DELAY(100);
330*91f16700Schasinglulu 	mmio_write_32(idm_rst_ctrl_addr, 0);
331*91f16700Schasinglulu 	SD_US_DELAY(100);
332*91f16700Schasinglulu 
333*91f16700Schasinglulu 	return SD_OK;
334*91f16700Schasinglulu }
335*91f16700Schasinglulu 
336*91f16700Schasinglulu /*
337*91f16700Schasinglulu  * Check if host supports specified capability
338*91f16700Schasinglulu  * returns -ve val on error, 0 if capability not supported else 1.
339*91f16700Schasinglulu  */
340*91f16700Schasinglulu int32_t chal_sd_check_cap(CHAL_HANDLE *sd_handle, uint32_t caps)
341*91f16700Schasinglulu {
342*91f16700Schasinglulu 	struct sd_dev *handle;
343*91f16700Schasinglulu 
344*91f16700Schasinglulu 	if (sd_handle == NULL)
345*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
346*91f16700Schasinglulu 
347*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
348*91f16700Schasinglulu 
349*91f16700Schasinglulu 	if (caps & mmio_read_32(handle->ctrl.sdRegBaseAddr +
350*91f16700Schasinglulu 				SD4_EMMC_TOP_CAPABILITIES1_OFFSET))
351*91f16700Schasinglulu 		return 1;
352*91f16700Schasinglulu 	else
353*91f16700Schasinglulu 		return 0;
354*91f16700Schasinglulu }
355*91f16700Schasinglulu 
356*91f16700Schasinglulu int32_t chal_sd_start(CHAL_HANDLE *sd_handle,
357*91f16700Schasinglulu 		      uint32_t mode, uint32_t sd_base, uint32_t host_base)
358*91f16700Schasinglulu {
359*91f16700Schasinglulu 
360*91f16700Schasinglulu 	struct sd_dev *handle;
361*91f16700Schasinglulu 	int32_t rval = SD_FAIL;
362*91f16700Schasinglulu 
363*91f16700Schasinglulu 	if (sd_handle == NULL)
364*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
365*91f16700Schasinglulu 
366*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
367*91f16700Schasinglulu 
368*91f16700Schasinglulu 	handle->cfg.mode = SD_PIO_MODE;	/* set to PIO mode first for init */
369*91f16700Schasinglulu 	handle->cfg.dma = SD_DMA_OFF;
370*91f16700Schasinglulu 
371*91f16700Schasinglulu 	chal_sd_setup_handler(handle, sd_base, host_base);
372*91f16700Schasinglulu 
373*91f16700Schasinglulu 	/* init and start hw */
374*91f16700Schasinglulu 	rval = chal_sd_init(sd_handle);
375*91f16700Schasinglulu 	if (rval != SD_OK)
376*91f16700Schasinglulu 		return rval;
377*91f16700Schasinglulu 
378*91f16700Schasinglulu 	chal_sd_clear_pending_irq(sd_handle);
379*91f16700Schasinglulu 
380*91f16700Schasinglulu 	handle->ctrl.eventList = 0;
381*91f16700Schasinglulu 	handle->cfg.mode = mode;
382*91f16700Schasinglulu 
383*91f16700Schasinglulu 	return SD_OK;
384*91f16700Schasinglulu }
385*91f16700Schasinglulu 
386*91f16700Schasinglulu /*
387*91f16700Schasinglulu  * Function to check 8bits of err generated from auto CMD12
388*91f16700Schasinglulu  */
389*91f16700Schasinglulu int32_t chal_sd_get_atuo12_error(CHAL_HANDLE *sd_handle)
390*91f16700Schasinglulu {
391*91f16700Schasinglulu 	struct sd_dev *handle;
392*91f16700Schasinglulu 
393*91f16700Schasinglulu 	if (sd_handle == NULL)
394*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
395*91f16700Schasinglulu 
396*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
397*91f16700Schasinglulu 
398*91f16700Schasinglulu 	return (mmio_read_32(handle->ctrl.sdRegBaseAddr +
399*91f16700Schasinglulu 			     SD4_EMMC_TOP_ERRSTAT_OFFSET) & 0xFF);
400*91f16700Schasinglulu }
401*91f16700Schasinglulu 
402*91f16700Schasinglulu /*
403*91f16700Schasinglulu  * Read present state register
404*91f16700Schasinglulu  */
405*91f16700Schasinglulu uint32_t chal_sd_get_present_status(CHAL_HANDLE *sd_handle)
406*91f16700Schasinglulu {
407*91f16700Schasinglulu 	struct sd_dev *handle;
408*91f16700Schasinglulu 
409*91f16700Schasinglulu 	if (sd_handle == NULL)
410*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
411*91f16700Schasinglulu 
412*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
413*91f16700Schasinglulu 
414*91f16700Schasinglulu 	return mmio_read_32(handle->ctrl.sdRegBaseAddr +
415*91f16700Schasinglulu 			    SD4_EMMC_TOP_PSTATE_OFFSET);
416*91f16700Schasinglulu }
417*91f16700Schasinglulu 
418*91f16700Schasinglulu /*
419*91f16700Schasinglulu  * Set SD bus width
420*91f16700Schasinglulu  */
421*91f16700Schasinglulu int32_t chal_sd_config_bus_width(CHAL_HANDLE *sd_handle, int32_t width)
422*91f16700Schasinglulu {
423*91f16700Schasinglulu 	uint32_t ctl_val;
424*91f16700Schasinglulu 	struct sd_dev *handle;
425*91f16700Schasinglulu 
426*91f16700Schasinglulu 	if (sd_handle == NULL)
427*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
428*91f16700Schasinglulu 
429*91f16700Schasinglulu 	handle = (struct sd_dev *)sd_handle;
430*91f16700Schasinglulu 
431*91f16700Schasinglulu 	ctl_val = mmio_read_32(handle->ctrl.sdRegBaseAddr +
432*91f16700Schasinglulu 			       SD4_EMMC_TOP_CTRL_OFFSET);
433*91f16700Schasinglulu 
434*91f16700Schasinglulu 	switch (width) {
435*91f16700Schasinglulu #ifdef DRIVER_EMMC_ENABLE_DATA_WIDTH_8BIT
436*91f16700Schasinglulu 	case SD_BUS_DATA_WIDTH_8BIT:
437*91f16700Schasinglulu 		ctl_val &= ~SD_BUS_DATA_WIDTH_4BIT;
438*91f16700Schasinglulu 		ctl_val |= SD_BUS_DATA_WIDTH_8BIT;
439*91f16700Schasinglulu 		break;
440*91f16700Schasinglulu #endif
441*91f16700Schasinglulu 	case SD_BUS_DATA_WIDTH_4BIT:
442*91f16700Schasinglulu 		ctl_val &= ~SD_BUS_DATA_WIDTH_8BIT;
443*91f16700Schasinglulu 		ctl_val |= SD_BUS_DATA_WIDTH_4BIT;
444*91f16700Schasinglulu 		break;
445*91f16700Schasinglulu 	case SD_BUS_DATA_WIDTH_1BIT:
446*91f16700Schasinglulu 		ctl_val &= ~(SD_BUS_DATA_WIDTH_4BIT | SD_BUS_DATA_WIDTH_8BIT);
447*91f16700Schasinglulu 		break;
448*91f16700Schasinglulu 	default:
449*91f16700Schasinglulu 		return SD_INV_DATA_WIDTH;
450*91f16700Schasinglulu 	};
451*91f16700Schasinglulu 
452*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL_OFFSET,
453*91f16700Schasinglulu 		      ctl_val);
454*91f16700Schasinglulu 
455*91f16700Schasinglulu 	return SD_OK;
456*91f16700Schasinglulu }
457*91f16700Schasinglulu 
458*91f16700Schasinglulu /*
459*91f16700Schasinglulu  * Function to enable or disable DMA control.
460*91f16700Schasinglulu  */
461*91f16700Schasinglulu int32_t chal_sd_set_dma(CHAL_HANDLE *sd_handle, uint32_t mode)
462*91f16700Schasinglulu {
463*91f16700Schasinglulu 	uint32_t val;
464*91f16700Schasinglulu 	struct sd_dev *handle;
465*91f16700Schasinglulu 	int32_t rc;
466*91f16700Schasinglulu 
467*91f16700Schasinglulu 	if (sd_handle == NULL)
468*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
469*91f16700Schasinglulu 
470*91f16700Schasinglulu 	handle = (struct sd_dev *)sd_handle;
471*91f16700Schasinglulu 
472*91f16700Schasinglulu 	if (mode) {
473*91f16700Schasinglulu 		rc = chal_sd_check_cap(sd_handle,
474*91f16700Schasinglulu 				       SD4_EMMC_TOP_CAPABILITIES1_SDMA_MASK |
475*91f16700Schasinglulu 				       SD4_EMMC_TOP_CAPABILITIES1_ADMA2_MASK);
476*91f16700Schasinglulu 		if (rc < 0)
477*91f16700Schasinglulu 			return rc;
478*91f16700Schasinglulu 
479*91f16700Schasinglulu 		if (rc) {
480*91f16700Schasinglulu 
481*91f16700Schasinglulu 			handle->cfg.dma = mode;
482*91f16700Schasinglulu 			val = mmio_read_32(handle->ctrl.sdRegBaseAddr +
483*91f16700Schasinglulu 					   SD4_EMMC_TOP_CTRL_OFFSET);
484*91f16700Schasinglulu 			val &= ~(SD4_EMMC_TOP_CTRL_DMASEL_MASK);
485*91f16700Schasinglulu 			val |= handle->cfg.dma - 1;
486*91f16700Schasinglulu 			mmio_write_32(handle->ctrl.sdRegBaseAddr +
487*91f16700Schasinglulu 				      SD4_EMMC_TOP_CTRL_OFFSET, val);
488*91f16700Schasinglulu 			return SD_OK;
489*91f16700Schasinglulu 		}
490*91f16700Schasinglulu 	}
491*91f16700Schasinglulu 	handle->cfg.dma = 0;
492*91f16700Schasinglulu 
493*91f16700Schasinglulu 	return SD_FAIL;
494*91f16700Schasinglulu }
495*91f16700Schasinglulu 
496*91f16700Schasinglulu /*
497*91f16700Schasinglulu  * Get current DMA address.
498*91f16700Schasinglulu  * Called only when there is no data transaction activity.
499*91f16700Schasinglulu  */
500*91f16700Schasinglulu uintptr_t chal_sd_get_dma_addr(CHAL_HANDLE *sd_handle)
501*91f16700Schasinglulu {
502*91f16700Schasinglulu 	struct sd_dev *handle;
503*91f16700Schasinglulu 
504*91f16700Schasinglulu 	if (sd_handle == NULL)
505*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
506*91f16700Schasinglulu 
507*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
508*91f16700Schasinglulu 
509*91f16700Schasinglulu 	if (handle->cfg.dma == SD_DMA_OFF)
510*91f16700Schasinglulu 		return 0;
511*91f16700Schasinglulu 
512*91f16700Schasinglulu 	return (uintptr_t)mmio_read_32(handle->ctrl.sdRegBaseAddr +
513*91f16700Schasinglulu 				       SD4_EMMC_TOP_SYSADDR_OFFSET);
514*91f16700Schasinglulu }
515*91f16700Schasinglulu 
516*91f16700Schasinglulu int32_t chal_sd_send_cmd(CHAL_HANDLE *sd_handle, uint32_t cmd_idx,
517*91f16700Schasinglulu 			 uint32_t argument, uint32_t options)
518*91f16700Schasinglulu {
519*91f16700Schasinglulu 	uint32_t cmd_mode_reg = 0;
520*91f16700Schasinglulu 	struct sd_dev *handle;
521*91f16700Schasinglulu 
522*91f16700Schasinglulu 	if (sd_handle == NULL)
523*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
524*91f16700Schasinglulu 
525*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
526*91f16700Schasinglulu 
527*91f16700Schasinglulu 	EMMC_TRACE("%s %d cmd:%d argReg:%x options:%x\n",
528*91f16700Schasinglulu 		   __func__, __LINE__, cmd_idx, argument, options);
529*91f16700Schasinglulu 
530*91f16700Schasinglulu 	/* Configure the value for command and mode registers */
531*91f16700Schasinglulu 	cmd_mode_reg = (cmd_idx << 24) | options;
532*91f16700Schasinglulu 
533*91f16700Schasinglulu 	/*
534*91f16700Schasinglulu 	 * 1. Write block size reg & block count reg,
535*91f16700Schasinglulu 	 * this is done in the tx or rx setup
536*91f16700Schasinglulu 	 */
537*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_BLOCK_OFFSET,
538*91f16700Schasinglulu 		      handle->ctrl.blkReg);
539*91f16700Schasinglulu 
540*91f16700Schasinglulu 	/* 2. Write argument reg */
541*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_ARG_OFFSET,
542*91f16700Schasinglulu 		      argument);
543*91f16700Schasinglulu 	handle->ctrl.argReg = argument;
544*91f16700Schasinglulu 
545*91f16700Schasinglulu 	/*
546*91f16700Schasinglulu 	 * 3. Write transfer mode reg & command reg, check the DMA bit which is
547*91f16700Schasinglulu 	 *    set before this function call if it is selected.
548*91f16700Schasinglulu 	 */
549*91f16700Schasinglulu 	if (cmd_idx == 24 || cmd_idx == 25 || cmd_idx == 18 || cmd_idx == 17 ||
550*91f16700Schasinglulu 	    cmd_idx == 42 || cmd_idx == 51 || cmd_idx == 53)
551*91f16700Schasinglulu 		cmd_mode_reg |= ((handle->cfg.dma) ? 1 : 0);
552*91f16700Schasinglulu 
553*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CMD_OFFSET,
554*91f16700Schasinglulu 		      cmd_mode_reg);
555*91f16700Schasinglulu 
556*91f16700Schasinglulu 	handle->ctrl.cmdIndex = cmd_idx;
557*91f16700Schasinglulu 
558*91f16700Schasinglulu 	return SD_OK;
559*91f16700Schasinglulu }
560*91f16700Schasinglulu 
561*91f16700Schasinglulu int32_t chal_sd_set_dma_addr(CHAL_HANDLE *sd_handle, uintptr_t address)
562*91f16700Schasinglulu {
563*91f16700Schasinglulu 	struct sd_dev *handle;
564*91f16700Schasinglulu 
565*91f16700Schasinglulu 	if (sd_handle == NULL)
566*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
567*91f16700Schasinglulu 
568*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
569*91f16700Schasinglulu 
570*91f16700Schasinglulu 	if (handle->cfg.dma == SD_DMA_OFF)
571*91f16700Schasinglulu 		return SD_FAIL;
572*91f16700Schasinglulu 
573*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_SYSADDR_OFFSET,
574*91f16700Schasinglulu 		      address);
575*91f16700Schasinglulu 	return SD_OK;
576*91f16700Schasinglulu }
577*91f16700Schasinglulu 
578*91f16700Schasinglulu uint32_t chal_sd_freq_2_div_ctrl_setting(uint32_t desired_freq)
579*91f16700Schasinglulu {
580*91f16700Schasinglulu 	/*
581*91f16700Schasinglulu 	 * Divider control setting represents 1/2 of the actual divider value.
582*91f16700Schasinglulu 	 *
583*91f16700Schasinglulu 	 * DesiredFreq = BaseClockFreq / (2 * div_ctrl_setting)
584*91f16700Schasinglulu 	 *
585*91f16700Schasinglulu 	 * ==> div_ctrl_setting = BaseClockFreq / (2 * DesiredFreq)
586*91f16700Schasinglulu 	 */
587*91f16700Schasinglulu 	uint32_t div_ctrl_setting;
588*91f16700Schasinglulu 	uint32_t actual_freq;
589*91f16700Schasinglulu 
590*91f16700Schasinglulu 	assert(desired_freq != 0);
591*91f16700Schasinglulu 
592*91f16700Schasinglulu 	/* Special case, 0 = divider of 1. */
593*91f16700Schasinglulu 	if (desired_freq >= BASE_CLK_FREQ)
594*91f16700Schasinglulu 		return 0;
595*91f16700Schasinglulu 
596*91f16700Schasinglulu 	/* Normal case, desired_freq < BASE_CLK_FREQ */
597*91f16700Schasinglulu 	div_ctrl_setting = BASE_CLK_FREQ / (2 * desired_freq);
598*91f16700Schasinglulu 
599*91f16700Schasinglulu 	actual_freq = BASE_CLK_FREQ / (2 * div_ctrl_setting);
600*91f16700Schasinglulu 
601*91f16700Schasinglulu 	if (actual_freq > desired_freq) {
602*91f16700Schasinglulu 		/*
603*91f16700Schasinglulu 		 * Division does not result in exact frequency match.
604*91f16700Schasinglulu 		 * Make sure resulting frequency does not exceed requested freq.
605*91f16700Schasinglulu 		 */
606*91f16700Schasinglulu 		div_ctrl_setting++;
607*91f16700Schasinglulu 	}
608*91f16700Schasinglulu 
609*91f16700Schasinglulu 	return div_ctrl_setting;
610*91f16700Schasinglulu }
611*91f16700Schasinglulu 
612*91f16700Schasinglulu int32_t chal_sd_set_clock(CHAL_HANDLE *sd_handle, uint32_t div_ctrl_setting,
613*91f16700Schasinglulu 			  uint32_t on)
614*91f16700Schasinglulu {
615*91f16700Schasinglulu 	uint32_t value;
616*91f16700Schasinglulu 	struct sd_dev *handle;
617*91f16700Schasinglulu 	uint32_t time;
618*91f16700Schasinglulu 	uint32_t clk_sel_high_byte = 0xFF & (div_ctrl_setting >> 8);
619*91f16700Schasinglulu 	uint32_t clk_sel_low_byte = 0xFF & div_ctrl_setting;
620*91f16700Schasinglulu 
621*91f16700Schasinglulu 	if (sd_handle == NULL)
622*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
623*91f16700Schasinglulu 
624*91f16700Schasinglulu 	EMMC_TRACE("set_clock(div_ctrl_setting=%d,on=%d)\n",
625*91f16700Schasinglulu 		   div_ctrl_setting, on);
626*91f16700Schasinglulu 
627*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
628*91f16700Schasinglulu 
629*91f16700Schasinglulu 	/* Read control register content. */
630*91f16700Schasinglulu 	value = mmio_read_32(handle->ctrl.sdRegBaseAddr +
631*91f16700Schasinglulu 			     SD4_EMMC_TOP_CTRL1_OFFSET);
632*91f16700Schasinglulu 
633*91f16700Schasinglulu 	/* Disable Clock */
634*91f16700Schasinglulu 	value &= ~(SD4_EMMC_TOP_CTRL1_SDCLKEN_MASK);
635*91f16700Schasinglulu 
636*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET,
637*91f16700Schasinglulu 		      value);
638*91f16700Schasinglulu 
639*91f16700Schasinglulu 	/* Clear bits of interest. */
640*91f16700Schasinglulu 	value &= ~(SD4_EMMC_TOP_CTRL1_SDCLKSEL_MASK |
641*91f16700Schasinglulu 		   SD4_EMMC_TOP_CTRL1_SDCLKSEL_UP_MASK);
642*91f16700Schasinglulu 
643*91f16700Schasinglulu 	/* Set bits of interest to new value. */
644*91f16700Schasinglulu 	value |= (SD4_EMMC_TOP_CTRL1_SDCLKSEL_MASK &
645*91f16700Schasinglulu 		  (clk_sel_low_byte << SD4_EMMC_TOP_CTRL1_SDCLKSEL_SHIFT));
646*91f16700Schasinglulu 	value |= (SD4_EMMC_TOP_CTRL1_SDCLKSEL_UP_MASK &
647*91f16700Schasinglulu 		  (clk_sel_high_byte << SD4_EMMC_TOP_CTRL1_SDCLKSEL_UP_SHIFT));
648*91f16700Schasinglulu 	value |= SD4_EMMC_TOP_CTRL1_ICLKEN_MASK;
649*91f16700Schasinglulu 
650*91f16700Schasinglulu 	/* Write updated value back to control register. */
651*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET,
652*91f16700Schasinglulu 		      value);
653*91f16700Schasinglulu 
654*91f16700Schasinglulu 	time = 0;
655*91f16700Schasinglulu 	do {
656*91f16700Schasinglulu 		value = mmio_read_32(handle->ctrl.sdRegBaseAddr +
657*91f16700Schasinglulu 				     SD4_EMMC_TOP_CTRL1_OFFSET);
658*91f16700Schasinglulu 
659*91f16700Schasinglulu 		if ((value & SD4_EMMC_TOP_CTRL1_ICLKSTB_MASK) ==
660*91f16700Schasinglulu 				SD4_EMMC_TOP_CTRL1_ICLKSTB_MASK)
661*91f16700Schasinglulu 			break;
662*91f16700Schasinglulu 
663*91f16700Schasinglulu 		mdelay(1);
664*91f16700Schasinglulu 	} while (time++ < EMMC_CLOCK_SETTING_TIMEOUT_MS);
665*91f16700Schasinglulu 
666*91f16700Schasinglulu 	if (time >= EMMC_CLOCK_SETTING_TIMEOUT_MS)
667*91f16700Schasinglulu 		WARN("%s %d clock settings timeout happenedi (%dms)\n",
668*91f16700Schasinglulu 			 __func__, __LINE__, time);
669*91f16700Schasinglulu 
670*91f16700Schasinglulu 	VERBOSE("EMMC: clock settings delay: %dms\n", time);
671*91f16700Schasinglulu 
672*91f16700Schasinglulu 	value = mmio_read_32(handle->ctrl.sdRegBaseAddr +
673*91f16700Schasinglulu 			     SD4_EMMC_TOP_CTRL1_OFFSET);
674*91f16700Schasinglulu 
675*91f16700Schasinglulu 	if (on)
676*91f16700Schasinglulu 		value |= SD4_EMMC_TOP_CTRL1_SDCLKEN_MASK;
677*91f16700Schasinglulu 
678*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET,
679*91f16700Schasinglulu 		      value);
680*91f16700Schasinglulu 
681*91f16700Schasinglulu 	return SD_OK;
682*91f16700Schasinglulu }
683*91f16700Schasinglulu 
684*91f16700Schasinglulu /*
685*91f16700Schasinglulu  * function to setup DMA buffer and data length, calculates block
686*91f16700Schasinglulu  * size and the number of blocks to be transferred and return
687*91f16700Schasinglulu  * the DMA buffer address.
688*91f16700Schasinglulu  */
689*91f16700Schasinglulu int32_t chal_sd_setup_xfer(CHAL_HANDLE *sd_handle,
690*91f16700Schasinglulu 			   uint8_t *data, uint32_t length, int32_t dir)
691*91f16700Schasinglulu {
692*91f16700Schasinglulu 	uint32_t blocks = 0;
693*91f16700Schasinglulu 	struct sd_dev *handle;
694*91f16700Schasinglulu 
695*91f16700Schasinglulu 	if (sd_handle == NULL)
696*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
697*91f16700Schasinglulu 
698*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
699*91f16700Schasinglulu 
700*91f16700Schasinglulu 	if (length <= handle->cfg.blockSize) {
701*91f16700Schasinglulu 		handle->ctrl.blkReg = length | handle->cfg.dmaBoundary;
702*91f16700Schasinglulu 	} else {
703*91f16700Schasinglulu 		blocks = length / handle->cfg.blockSize;
704*91f16700Schasinglulu 		handle->ctrl.blkReg = (blocks << 16) | handle->cfg.blockSize |
705*91f16700Schasinglulu 					handle->cfg.dmaBoundary;
706*91f16700Schasinglulu 	}
707*91f16700Schasinglulu 
708*91f16700Schasinglulu 	if (handle->cfg.dma != SD_DMA_OFF) {
709*91f16700Schasinglulu 		/* For DMA target address setting, physical address should be used */
710*91f16700Schasinglulu 		mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_SYSADDR_OFFSET,
711*91f16700Schasinglulu 				(uintptr_t)data);
712*91f16700Schasinglulu 	}
713*91f16700Schasinglulu 
714*91f16700Schasinglulu 	return SD_OK;
715*91f16700Schasinglulu }
716*91f16700Schasinglulu 
717*91f16700Schasinglulu #ifdef INCLUDE_EMMC_DRIVER_WRITE_CODE
718*91f16700Schasinglulu /*
719*91f16700Schasinglulu  * function to write one block data directly to the
720*91f16700Schasinglulu  * host controller's FIFO which is 1K uint8_t or
721*91f16700Schasinglulu  * 2K uint8_t in size.
722*91f16700Schasinglulu  * It is used in Non-DMA mode for data transmission.
723*91f16700Schasinglulu  */
724*91f16700Schasinglulu int32_t chal_sd_write_buffer(CHAL_HANDLE *sd_handle, uint32_t length,
725*91f16700Schasinglulu 			     uint8_t *data)
726*91f16700Schasinglulu {
727*91f16700Schasinglulu 	uint32_t i, leftOver = 0, blockSize, size, value = 0;
728*91f16700Schasinglulu 	struct sd_dev *handle;
729*91f16700Schasinglulu 
730*91f16700Schasinglulu 	if (sd_handle == NULL)
731*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
732*91f16700Schasinglulu 
733*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
734*91f16700Schasinglulu 
735*91f16700Schasinglulu 	blockSize = handle->cfg.blockSize;
736*91f16700Schasinglulu 
737*91f16700Schasinglulu 	if (length == 0)
738*91f16700Schasinglulu 		return SD_OK;
739*91f16700Schasinglulu 
740*91f16700Schasinglulu 	/* PIO mode, push into fifo word by word */
741*91f16700Schasinglulu 	if (length >= blockSize) {
742*91f16700Schasinglulu 		size = blockSize;
743*91f16700Schasinglulu 	} else {
744*91f16700Schasinglulu 		size = ((length >> 2) << 2);
745*91f16700Schasinglulu 		leftOver = length % 4;
746*91f16700Schasinglulu 	}
747*91f16700Schasinglulu 
748*91f16700Schasinglulu 	for (i = 0; i < size; i += 4) {
749*91f16700Schasinglulu 		value = *(uint32_t *)(data + i);
750*91f16700Schasinglulu 		mmio_write_32(handle->ctrl.sdRegBaseAddr +
751*91f16700Schasinglulu 			      SD4_EMMC_TOP_BUFDAT_OFFSET, value);
752*91f16700Schasinglulu 	}
753*91f16700Schasinglulu /*
754*91f16700Schasinglulu  * BUG ALERT:
755*91f16700Schasinglulu  *    This implementation has TWO issues that must be addressed before you
756*91f16700Schasinglulu  *    can safely INCLUDE_EMMC_DRIVER_WRITE_CODE.
757*91f16700Schasinglulu  *
758*91f16700Schasinglulu  *    (1) For the last leftOver bytes, driver writes full word, which means
759*91f16700Schasinglulu  *        some of the eMMC content (i.e. "4 - leftOver" will be erroneously
760*91f16700Schasinglulu  *        overwritten).
761*91f16700Schasinglulu  *    (2) eMMC is a block device. What happens when less than a full block of
762*91f16700Schasinglulu  *        data is submitted???
763*91f16700Schasinglulu  */
764*91f16700Schasinglulu 	if (leftOver > 0) {
765*91f16700Schasinglulu 		value = ((*(uint32_t *)(data + i)) << (4 - leftOver));
766*91f16700Schasinglulu 		mmio_write_32(handle->ctrl.sdRegBaseAddr +
767*91f16700Schasinglulu 			      SD4_EMMC_TOP_BUFDAT_OFFSET, value);
768*91f16700Schasinglulu 	}
769*91f16700Schasinglulu 
770*91f16700Schasinglulu 	return SD_OK;
771*91f16700Schasinglulu }
772*91f16700Schasinglulu #endif /* INCLUDE_EMMC_DRIVER_WRITE_CODE */
773*91f16700Schasinglulu 
774*91f16700Schasinglulu /*
775*91f16700Schasinglulu  * Function to read maximal one block data directly
776*91f16700Schasinglulu  * from the data port of the host controller (FIFO). It is used
777*91f16700Schasinglulu  * in Non-DMA mode for data transmission.
778*91f16700Schasinglulu  */
779*91f16700Schasinglulu int32_t chal_sd_read_buffer(CHAL_HANDLE *sd_handle, uint32_t length,
780*91f16700Schasinglulu 			    uint8_t *data)
781*91f16700Schasinglulu {
782*91f16700Schasinglulu 	uint32_t i, size, leftOver, blockSize, value;
783*91f16700Schasinglulu 	struct sd_dev *handle;
784*91f16700Schasinglulu 
785*91f16700Schasinglulu 	if (sd_handle == NULL)
786*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
787*91f16700Schasinglulu 
788*91f16700Schasinglulu 	handle = (struct sd_dev *)sd_handle;
789*91f16700Schasinglulu 
790*91f16700Schasinglulu 	value = 0;
791*91f16700Schasinglulu 
792*91f16700Schasinglulu 	blockSize = handle->cfg.blockSize;
793*91f16700Schasinglulu 
794*91f16700Schasinglulu 	/* PIO mode, extract fifo word by word */
795*91f16700Schasinglulu 	if (length >= blockSize) {
796*91f16700Schasinglulu 		size = blockSize;
797*91f16700Schasinglulu 		leftOver = 0;
798*91f16700Schasinglulu 	} else {
799*91f16700Schasinglulu 		leftOver = length % 4;
800*91f16700Schasinglulu 		size = ((length >> 2) << 2);
801*91f16700Schasinglulu 	}
802*91f16700Schasinglulu 
803*91f16700Schasinglulu 	for (i = 0; i < size; i += 4) {
804*91f16700Schasinglulu 		value =
805*91f16700Schasinglulu 		    mmio_read_32(handle->ctrl.sdRegBaseAddr +
806*91f16700Schasinglulu 				    SD4_EMMC_TOP_BUFDAT_OFFSET);
807*91f16700Schasinglulu 		memcpy((void *)(data + i), &value, sizeof(uint32_t));
808*91f16700Schasinglulu 	}
809*91f16700Schasinglulu 
810*91f16700Schasinglulu 	if (leftOver > 0) {
811*91f16700Schasinglulu 		value = mmio_read_32(handle->ctrl.sdRegBaseAddr +
812*91f16700Schasinglulu 				     SD4_EMMC_TOP_BUFDAT_OFFSET);
813*91f16700Schasinglulu 
814*91f16700Schasinglulu 		/*
815*91f16700Schasinglulu 		 * Copy remaining non-full word bytes.
816*91f16700Schasinglulu 		 * (We run ARM as Little Endian)
817*91f16700Schasinglulu 		 */
818*91f16700Schasinglulu 		uint8_t j = 0;
819*91f16700Schasinglulu 
820*91f16700Schasinglulu 		for (j = 0; j < leftOver; j++) {
821*91f16700Schasinglulu 			data[i + j] = (value >> (j * 8)) & 0xFF;
822*91f16700Schasinglulu 		}
823*91f16700Schasinglulu 	}
824*91f16700Schasinglulu 
825*91f16700Schasinglulu 	return SD_OK;
826*91f16700Schasinglulu }
827*91f16700Schasinglulu 
828*91f16700Schasinglulu /*
829*91f16700Schasinglulu  * Resets both DAT or CMD line.
830*91f16700Schasinglulu  */
831*91f16700Schasinglulu int32_t chal_sd_reset_line(CHAL_HANDLE *sd_handle, uint32_t line)
832*91f16700Schasinglulu {
833*91f16700Schasinglulu 	uint32_t control, flag;
834*91f16700Schasinglulu 	struct sd_dev *handle;
835*91f16700Schasinglulu 
836*91f16700Schasinglulu 	if (sd_handle == NULL)
837*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
838*91f16700Schasinglulu 
839*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
840*91f16700Schasinglulu 
841*91f16700Schasinglulu 	flag = SD4_EMMC_TOP_CTRL1_CMDRST_MASK | SD4_EMMC_TOP_CTRL1_DATRST_MASK;
842*91f16700Schasinglulu 
843*91f16700Schasinglulu 	if (flag != (line | flag))
844*91f16700Schasinglulu 		return SD_FAIL;
845*91f16700Schasinglulu 
846*91f16700Schasinglulu 	control = mmio_read_32(handle->ctrl.sdRegBaseAddr +
847*91f16700Schasinglulu 			       SD4_EMMC_TOP_CTRL1_OFFSET);
848*91f16700Schasinglulu 	control |= line;
849*91f16700Schasinglulu 	mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET,
850*91f16700Schasinglulu 		      control);
851*91f16700Schasinglulu 
852*91f16700Schasinglulu 	/* reset CMD and DATA line should always work, no need to timed out */
853*91f16700Schasinglulu 	do {
854*91f16700Schasinglulu 		control = mmio_read_32(handle->ctrl.sdRegBaseAddr +
855*91f16700Schasinglulu 				       SD4_EMMC_TOP_CTRL1_OFFSET);
856*91f16700Schasinglulu 	} while (control & line);
857*91f16700Schasinglulu 
858*91f16700Schasinglulu 	return SD_OK;
859*91f16700Schasinglulu }
860*91f16700Schasinglulu 
861*91f16700Schasinglulu /*
862*91f16700Schasinglulu  * Function to be called once a SD command is done to read
863*91f16700Schasinglulu  * back it's response data.
864*91f16700Schasinglulu  */
865*91f16700Schasinglulu int32_t chal_sd_get_response(CHAL_HANDLE *sd_handle, uint32_t *resp)
866*91f16700Schasinglulu {
867*91f16700Schasinglulu 	struct sd_dev *handle;
868*91f16700Schasinglulu 
869*91f16700Schasinglulu 	if (sd_handle == NULL)
870*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
871*91f16700Schasinglulu 
872*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
873*91f16700Schasinglulu 	resp[0] = mmio_read_32(handle->ctrl.sdRegBaseAddr +
874*91f16700Schasinglulu 			       SD4_EMMC_TOP_RESP0_OFFSET);
875*91f16700Schasinglulu 	resp[1] = mmio_read_32(handle->ctrl.sdRegBaseAddr +
876*91f16700Schasinglulu 			       SD4_EMMC_TOP_RESP2_OFFSET);
877*91f16700Schasinglulu 	resp[2] = mmio_read_32(handle->ctrl.sdRegBaseAddr +
878*91f16700Schasinglulu 			       SD4_EMMC_TOP_RESP4_OFFSET);
879*91f16700Schasinglulu 	resp[3] = mmio_read_32(handle->ctrl.sdRegBaseAddr +
880*91f16700Schasinglulu 			       SD4_EMMC_TOP_RESP6_OFFSET);
881*91f16700Schasinglulu 
882*91f16700Schasinglulu 	return SD_OK;
883*91f16700Schasinglulu }
884*91f16700Schasinglulu 
885*91f16700Schasinglulu /*
886*91f16700Schasinglulu  * The function is called to clean all the pending interrupts.
887*91f16700Schasinglulu  */
888*91f16700Schasinglulu int32_t chal_sd_clear_pending_irq(CHAL_HANDLE *sd_handle)
889*91f16700Schasinglulu {
890*91f16700Schasinglulu 	uint32_t status = SD_OK;
891*91f16700Schasinglulu 	struct sd_dev *handle;
892*91f16700Schasinglulu 
893*91f16700Schasinglulu 	if (sd_handle == NULL)
894*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
895*91f16700Schasinglulu 
896*91f16700Schasinglulu 	handle = (struct sd_dev *)sd_handle;
897*91f16700Schasinglulu 
898*91f16700Schasinglulu 	/* Make sure clean all interrupts */
899*91f16700Schasinglulu 	do {
900*91f16700Schasinglulu 		mmio_write_32(handle->ctrl.sdRegBaseAddr +
901*91f16700Schasinglulu 			      SD4_EMMC_TOP_INTR_OFFSET, 0xFFFFFFFF);
902*91f16700Schasinglulu 		SD_US_DELAY(10);
903*91f16700Schasinglulu 	} while (mmio_read_32(handle->ctrl.sdRegBaseAddr +
904*91f16700Schasinglulu 			      SD4_EMMC_TOP_INTR_OFFSET));
905*91f16700Schasinglulu 
906*91f16700Schasinglulu 	return status;
907*91f16700Schasinglulu }
908*91f16700Schasinglulu 
909*91f16700Schasinglulu /*
910*91f16700Schasinglulu  * The function returns interrupt status register value.
911*91f16700Schasinglulu  */
912*91f16700Schasinglulu int32_t chal_sd_get_irq_status(CHAL_HANDLE *sd_handle)
913*91f16700Schasinglulu {
914*91f16700Schasinglulu 	struct sd_dev *handle;
915*91f16700Schasinglulu 
916*91f16700Schasinglulu 	if (sd_handle == NULL)
917*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
918*91f16700Schasinglulu 
919*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
920*91f16700Schasinglulu 
921*91f16700Schasinglulu 	return (mmio_read_32(handle->ctrl.sdRegBaseAddr +
922*91f16700Schasinglulu 			     SD4_EMMC_TOP_INTR_OFFSET));
923*91f16700Schasinglulu }
924*91f16700Schasinglulu 
925*91f16700Schasinglulu /*
926*91f16700Schasinglulu  * The function clears interrupt(s) specified in the mask.
927*91f16700Schasinglulu  */
928*91f16700Schasinglulu int32_t chal_sd_clear_irq(CHAL_HANDLE *sd_handle, uint32_t mask)
929*91f16700Schasinglulu {
930*91f16700Schasinglulu 	struct sd_dev *handle;
931*91f16700Schasinglulu 
932*91f16700Schasinglulu 	if (sd_handle == NULL)
933*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
934*91f16700Schasinglulu 
935*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
936*91f16700Schasinglulu 
937*91f16700Schasinglulu 	/* Make sure clean masked interrupts */
938*91f16700Schasinglulu 	do {
939*91f16700Schasinglulu 		mmio_write_32(handle->ctrl.sdRegBaseAddr +
940*91f16700Schasinglulu 			      SD4_EMMC_TOP_INTR_OFFSET, mask);
941*91f16700Schasinglulu 		SD_US_DELAY(10);
942*91f16700Schasinglulu 	} while (mask &
943*91f16700Schasinglulu 		 mmio_read_32(handle->ctrl.sdRegBaseAddr +
944*91f16700Schasinglulu 			      SD4_EMMC_TOP_INTR_OFFSET));
945*91f16700Schasinglulu 
946*91f16700Schasinglulu 	return SD_OK;
947*91f16700Schasinglulu }
948*91f16700Schasinglulu 
949*91f16700Schasinglulu /*
950*91f16700Schasinglulu  * Description: The function configures the SD host controller.
951*91f16700Schasinglulu  */
952*91f16700Schasinglulu int32_t chal_sd_config(CHAL_HANDLE *sd_handle, uint32_t speed, uint32_t retry,
953*91f16700Schasinglulu 		       uint32_t boundary, uint32_t blkSize, uint32_t dma)
954*91f16700Schasinglulu {
955*91f16700Schasinglulu 	struct sd_dev *handle;
956*91f16700Schasinglulu 
957*91f16700Schasinglulu 	if (sd_handle == NULL)
958*91f16700Schasinglulu 		return SD_INVALID_HANDLE;
959*91f16700Schasinglulu 
960*91f16700Schasinglulu 	handle = (struct sd_dev *) sd_handle;
961*91f16700Schasinglulu 
962*91f16700Schasinglulu 	handle->cfg.speedMode = speed;
963*91f16700Schasinglulu 	handle->cfg.retryLimit = retry;
964*91f16700Schasinglulu 	handle->cfg.dmaBoundary = boundary;
965*91f16700Schasinglulu 	handle->cfg.blockSize = blkSize;
966*91f16700Schasinglulu 
967*91f16700Schasinglulu 	chal_sd_set_dma(sd_handle, dma);
968*91f16700Schasinglulu 	SD_US_DELAY(100);
969*91f16700Schasinglulu 	chal_sd_set_dma_boundary(handle, boundary);
970*91f16700Schasinglulu 	SD_US_DELAY(100);
971*91f16700Schasinglulu 
972*91f16700Schasinglulu 	chal_sd_set_speed(sd_handle, speed);
973*91f16700Schasinglulu 
974*91f16700Schasinglulu 	SD_US_DELAY(100);
975*91f16700Schasinglulu 	return SD_OK;
976*91f16700Schasinglulu }
977*91f16700Schasinglulu 
978*91f16700Schasinglulu /*
979*91f16700Schasinglulu  * Cleans up HC FIFO.
980*91f16700Schasinglulu  */
981*91f16700Schasinglulu void chal_sd_dump_fifo(CHAL_HANDLE *sd_handle)
982*91f16700Schasinglulu {
983*91f16700Schasinglulu 	struct sd_dev *handle;
984*91f16700Schasinglulu 
985*91f16700Schasinglulu 	if (sd_handle == NULL)
986*91f16700Schasinglulu 		return;
987*91f16700Schasinglulu 
988*91f16700Schasinglulu 	handle = (struct sd_dev *)sd_handle;
989*91f16700Schasinglulu 
990*91f16700Schasinglulu 	/* in case there still data in the host buffer */
991*91f16700Schasinglulu 	while (mmio_read_32(handle->ctrl.sdRegBaseAddr +
992*91f16700Schasinglulu 			    SD4_EMMC_TOP_PSTATE_OFFSET) & 0x800) {
993*91f16700Schasinglulu 		mmio_read_32(handle->ctrl.sdRegBaseAddr +
994*91f16700Schasinglulu 			     SD4_EMMC_TOP_BUFDAT_OFFSET);
995*91f16700Schasinglulu 	};
996*91f16700Schasinglulu }
997*91f16700Schasinglulu 
998*91f16700Schasinglulu /*
999*91f16700Schasinglulu  * Enable or disable a SD interrupt signal.
1000*91f16700Schasinglulu  */
1001*91f16700Schasinglulu void chal_sd_set_irq_signal(CHAL_HANDLE *sd_handle, uint32_t mask,
1002*91f16700Schasinglulu 			    uint32_t state)
1003*91f16700Schasinglulu {
1004*91f16700Schasinglulu 	struct sd_dev *handle;
1005*91f16700Schasinglulu 
1006*91f16700Schasinglulu 	if (sd_handle == NULL)
1007*91f16700Schasinglulu 		return;
1008*91f16700Schasinglulu 
1009*91f16700Schasinglulu 	handle = (struct sd_dev *)sd_handle;
1010*91f16700Schasinglulu 
1011*91f16700Schasinglulu 	if (state)
1012*91f16700Schasinglulu 		mmio_setbits_32(handle->ctrl.sdRegBaseAddr +
1013*91f16700Schasinglulu 				SD4_EMMC_TOP_INTREN2_OFFSET, mask);
1014*91f16700Schasinglulu 	else
1015*91f16700Schasinglulu 		mmio_clrbits_32(handle->ctrl.sdRegBaseAddr +
1016*91f16700Schasinglulu 				SD4_EMMC_TOP_INTREN2_OFFSET, mask);
1017*91f16700Schasinglulu }
1018