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