xref: /arm-trusted-firmware/drivers/renesas/common/emmc/emmc_init.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2021, Renesas Electronics Corporation. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <stddef.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <lib/mmio.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include "emmc_config.h"
12*91f16700Schasinglulu #include "emmc_hal.h"
13*91f16700Schasinglulu #include "emmc_std.h"
14*91f16700Schasinglulu #include "emmc_registers.h"
15*91f16700Schasinglulu #include "emmc_def.h"
16*91f16700Schasinglulu #include "rcar_private.h"
17*91f16700Schasinglulu #include "cpg_registers.h"
18*91f16700Schasinglulu 
19*91f16700Schasinglulu st_mmc_base mmc_drv_obj;
20*91f16700Schasinglulu 
21*91f16700Schasinglulu EMMC_ERROR_CODE rcar_emmc_memcard_power(uint8_t mode)
22*91f16700Schasinglulu {
23*91f16700Schasinglulu 
24*91f16700Schasinglulu 	if (mode == TRUE) {
25*91f16700Schasinglulu 		/* power on (Vcc&Vccq is always power on) */
26*91f16700Schasinglulu 		mmc_drv_obj.card_power_enable = TRUE;
27*91f16700Schasinglulu 	} else {
28*91f16700Schasinglulu 		/* power off (Vcc&Vccq is always power on) */
29*91f16700Schasinglulu 		mmc_drv_obj.card_power_enable = FALSE;
30*91f16700Schasinglulu 		mmc_drv_obj.mount = FALSE;
31*91f16700Schasinglulu 		mmc_drv_obj.selected = FALSE;
32*91f16700Schasinglulu 	}
33*91f16700Schasinglulu 
34*91f16700Schasinglulu 	return EMMC_SUCCESS;
35*91f16700Schasinglulu }
36*91f16700Schasinglulu static inline void emmc_set_retry_count(uint32_t retry)
37*91f16700Schasinglulu {
38*91f16700Schasinglulu 	mmc_drv_obj.retries_after_fail = retry;
39*91f16700Schasinglulu }
40*91f16700Schasinglulu 
41*91f16700Schasinglulu static inline void emmc_set_data_timeout(uint32_t data_timeout)
42*91f16700Schasinglulu {
43*91f16700Schasinglulu 	mmc_drv_obj.data_timeout = data_timeout;
44*91f16700Schasinglulu }
45*91f16700Schasinglulu 
46*91f16700Schasinglulu static void emmc_memset(uint8_t *buff, uint8_t data, uint32_t cnt)
47*91f16700Schasinglulu {
48*91f16700Schasinglulu 	if (buff == NULL) {
49*91f16700Schasinglulu 		return;
50*91f16700Schasinglulu 	}
51*91f16700Schasinglulu 
52*91f16700Schasinglulu 	while (cnt > 0) {
53*91f16700Schasinglulu 		*buff++ = data;
54*91f16700Schasinglulu 		cnt--;
55*91f16700Schasinglulu 	}
56*91f16700Schasinglulu }
57*91f16700Schasinglulu 
58*91f16700Schasinglulu static void emmc_driver_config(void)
59*91f16700Schasinglulu {
60*91f16700Schasinglulu 	emmc_set_retry_count(EMMC_RETRY_COUNT);
61*91f16700Schasinglulu 	emmc_set_data_timeout(EMMC_RW_DATA_TIMEOUT);
62*91f16700Schasinglulu }
63*91f16700Schasinglulu 
64*91f16700Schasinglulu static void emmc_drv_init(void)
65*91f16700Schasinglulu {
66*91f16700Schasinglulu 	emmc_memset((uint8_t *) (&mmc_drv_obj), 0, sizeof(st_mmc_base));
67*91f16700Schasinglulu 	mmc_drv_obj.card_present = HAL_MEMCARD_CARD_IS_IN;
68*91f16700Schasinglulu 	mmc_drv_obj.data_timeout = EMMC_RW_DATA_TIMEOUT;
69*91f16700Schasinglulu 	mmc_drv_obj.bus_width = HAL_MEMCARD_DATA_WIDTH_1_BIT;
70*91f16700Schasinglulu }
71*91f16700Schasinglulu 
72*91f16700Schasinglulu static EMMC_ERROR_CODE emmc_dev_finalize(void)
73*91f16700Schasinglulu {
74*91f16700Schasinglulu 	EMMC_ERROR_CODE result;
75*91f16700Schasinglulu 	uint32_t dataL;
76*91f16700Schasinglulu 
77*91f16700Schasinglulu 	/*
78*91f16700Schasinglulu 	 * MMC power off
79*91f16700Schasinglulu 	 * the power supply of eMMC device is always turning on.
80*91f16700Schasinglulu 	 * RST_n : Hi --> Low level.
81*91f16700Schasinglulu 	 */
82*91f16700Schasinglulu 	result = rcar_emmc_memcard_power(FALSE);
83*91f16700Schasinglulu 
84*91f16700Schasinglulu 	/* host controller reset */
85*91f16700Schasinglulu 	SETR_32(SD_INFO1, 0x00000000U);		/* all interrupt clear */
86*91f16700Schasinglulu 	SETR_32(SD_INFO2, SD_INFO2_CLEAR);	/* all interrupt clear */
87*91f16700Schasinglulu 	SETR_32(SD_INFO1_MASK, 0x00000000U);	/* all interrupt disable */
88*91f16700Schasinglulu 	SETR_32(SD_INFO2_MASK, SD_INFO2_CLEAR);	/* all interrupt disable */
89*91f16700Schasinglulu 	SETR_32(SD_CLK_CTRL, 0x00000000U);	/* MMC clock stop */
90*91f16700Schasinglulu 
91*91f16700Schasinglulu 	dataL = mmio_read_32(SMSTPCR3);
92*91f16700Schasinglulu 	if ((dataL & CPG_MSTP_MMC) == 0U) {
93*91f16700Schasinglulu 		dataL |= (CPG_MSTP_MMC);
94*91f16700Schasinglulu 		mmio_write_32(CPG_CPGWPR, (~dataL));
95*91f16700Schasinglulu 		mmio_write_32(SMSTPCR3, dataL);
96*91f16700Schasinglulu 	}
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 	return result;
99*91f16700Schasinglulu }
100*91f16700Schasinglulu 
101*91f16700Schasinglulu static EMMC_ERROR_CODE emmc_dev_init(void)
102*91f16700Schasinglulu {
103*91f16700Schasinglulu 	/* Enable clock supply to eMMC. */
104*91f16700Schasinglulu 	mstpcr_write(SMSTPCR3, CPG_MSTPSR3, CPG_MSTP_MMC);
105*91f16700Schasinglulu 
106*91f16700Schasinglulu 	/* Set SD clock */
107*91f16700Schasinglulu 	mmio_write_32(CPG_CPGWPR, ~((uint32_t) (BIT9 | BIT0)));	/* SD phy 200MHz */
108*91f16700Schasinglulu 
109*91f16700Schasinglulu 	/* Stop SDnH clock & SDn=200MHz */
110*91f16700Schasinglulu 	mmio_write_32(CPG_SDxCKCR, (BIT9 | BIT0));
111*91f16700Schasinglulu 
112*91f16700Schasinglulu 	/* MMCIF initialize */
113*91f16700Schasinglulu 	SETR_32(SD_INFO1, 0x00000000U);		/* all interrupt clear */
114*91f16700Schasinglulu 	SETR_32(SD_INFO2, SD_INFO2_CLEAR);	/* all interrupt clear */
115*91f16700Schasinglulu 	SETR_32(SD_INFO1_MASK, 0x00000000U);	/* all interrupt disable */
116*91f16700Schasinglulu 	SETR_32(SD_INFO2_MASK, SD_INFO2_CLEAR);	/* all interrupt disable */
117*91f16700Schasinglulu 
118*91f16700Schasinglulu 	SETR_32(HOST_MODE, 0x00000000U);	/* SD_BUF access width = 64-bit */
119*91f16700Schasinglulu 	SETR_32(SD_OPTION, 0x0000C0EEU);	/* Bus width = 1bit, timeout=MAX */
120*91f16700Schasinglulu 	SETR_32(SD_CLK_CTRL, 0x00000000U);	/* Disable Automatic Control & Clock Output */
121*91f16700Schasinglulu 
122*91f16700Schasinglulu 	return EMMC_SUCCESS;
123*91f16700Schasinglulu }
124*91f16700Schasinglulu 
125*91f16700Schasinglulu static EMMC_ERROR_CODE emmc_reset_controller(void)
126*91f16700Schasinglulu {
127*91f16700Schasinglulu 	EMMC_ERROR_CODE result;
128*91f16700Schasinglulu 
129*91f16700Schasinglulu 	/* initialize mmc driver */
130*91f16700Schasinglulu 	emmc_drv_init();
131*91f16700Schasinglulu 
132*91f16700Schasinglulu 	/* initialize H/W */
133*91f16700Schasinglulu 	result = emmc_dev_init();
134*91f16700Schasinglulu 	if (result == EMMC_SUCCESS) {
135*91f16700Schasinglulu 		mmc_drv_obj.initialize = TRUE;
136*91f16700Schasinglulu 	}
137*91f16700Schasinglulu 
138*91f16700Schasinglulu 	return result;
139*91f16700Schasinglulu 
140*91f16700Schasinglulu }
141*91f16700Schasinglulu 
142*91f16700Schasinglulu EMMC_ERROR_CODE emmc_terminate(void)
143*91f16700Schasinglulu {
144*91f16700Schasinglulu 	EMMC_ERROR_CODE result;
145*91f16700Schasinglulu 
146*91f16700Schasinglulu 	result = emmc_dev_finalize();
147*91f16700Schasinglulu 
148*91f16700Schasinglulu 	emmc_memset((uint8_t *) (&mmc_drv_obj), 0, sizeof(st_mmc_base));
149*91f16700Schasinglulu 
150*91f16700Schasinglulu 	return result;
151*91f16700Schasinglulu }
152*91f16700Schasinglulu 
153*91f16700Schasinglulu EMMC_ERROR_CODE rcar_emmc_init(void)
154*91f16700Schasinglulu {
155*91f16700Schasinglulu 	EMMC_ERROR_CODE result;
156*91f16700Schasinglulu 
157*91f16700Schasinglulu 	result = emmc_reset_controller();
158*91f16700Schasinglulu 	if (result == EMMC_SUCCESS) {
159*91f16700Schasinglulu 		emmc_driver_config();
160*91f16700Schasinglulu 	}
161*91f16700Schasinglulu 
162*91f16700Schasinglulu 	return result;
163*91f16700Schasinglulu }
164