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