11bd4fe43Sopenharmony_ci/*
21bd4fe43Sopenharmony_ci * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License.
51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at
61bd4fe43Sopenharmony_ci *
71bd4fe43Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81bd4fe43Sopenharmony_ci *
91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and
131bd4fe43Sopenharmony_ci * limitations under the License.
141bd4fe43Sopenharmony_ci */
151bd4fe43Sopenharmony_ci
161bd4fe43Sopenharmony_ci#ifndef SDHCI_H
171bd4fe43Sopenharmony_ci#define SDHCI_H
181bd4fe43Sopenharmony_ci
191bd4fe43Sopenharmony_ci#include "asm/dma.h"
201bd4fe43Sopenharmony_ci#include "asm/io.h"
211bd4fe43Sopenharmony_ci#include "asm/platform.h"
221bd4fe43Sopenharmony_ci#include "device_resource_if.h"
231bd4fe43Sopenharmony_ci#include "linux/scatterlist.h"
241bd4fe43Sopenharmony_ci#include "los_bitmap.h"
251bd4fe43Sopenharmony_ci#include "los_event.h"
261bd4fe43Sopenharmony_ci#include "los_vm_zone.h"
271bd4fe43Sopenharmony_ci#include "mmc_corex.h"
281bd4fe43Sopenharmony_ci#include "osal_io.h"
291bd4fe43Sopenharmony_ci#include "osal_irq.h"
301bd4fe43Sopenharmony_ci#include "osal_time.h"
311bd4fe43Sopenharmony_ci
321bd4fe43Sopenharmony_ci#ifdef __cplusplus
331bd4fe43Sopenharmony_ci#if __cplusplus
341bd4fe43Sopenharmony_ciextern "C" {
351bd4fe43Sopenharmony_ci#endif /* __cplusplus */
361bd4fe43Sopenharmony_ci#endif /* __cplusplus */
371bd4fe43Sopenharmony_ci
381bd4fe43Sopenharmony_ci#define REG_CTRL_SD_CLK     IO_DEVICE_ADDR(0x100C0040)
391bd4fe43Sopenharmony_ci#define REG_CTRL_SD_CMD     IO_DEVICE_ADDR(0x100C0044)
401bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA0   IO_DEVICE_ADDR(0x100C0048)
411bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA1   IO_DEVICE_ADDR(0x100C004C)
421bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA2   IO_DEVICE_ADDR(0x100C0050)
431bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA3   IO_DEVICE_ADDR(0x100C0054)
441bd4fe43Sopenharmony_ci
451bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_CLK   IO_DEVICE_ADDR(0x100C0014)
461bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_CMD   IO_DEVICE_ADDR(0x100C0018)
471bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA0 IO_DEVICE_ADDR(0x100C0020)
481bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA1 IO_DEVICE_ADDR(0x100C001c)
491bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA2 IO_DEVICE_ADDR(0x100C0028)
501bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA3 IO_DEVICE_ADDR(0x100C0024)
511bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA4 IO_DEVICE_ADDR(0x100C0030)
521bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA5 IO_DEVICE_ADDR(0x100C0034)
531bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA6 IO_DEVICE_ADDR(0x100C0038)
541bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA7 IO_DEVICE_ADDR(0x100C003c)
551bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DS    IO_DEVICE_ADDR(0x100C0058)
561bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_RST   IO_DEVICE_ADDR(0x100C005C)
571bd4fe43Sopenharmony_ci
581bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_CLK   IO_DEVICE_ADDR(0x112C0048)
591bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_CMD   IO_DEVICE_ADDR(0x112C004C)
601bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA0 IO_DEVICE_ADDR(0x112C0064)
611bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA1 IO_DEVICE_ADDR(0x112C0060)
621bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA2 IO_DEVICE_ADDR(0x112C005C)
631bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA3 IO_DEVICE_ADDR(0x112C0058)
641bd4fe43Sopenharmony_ci
651bd4fe43Sopenharmony_ci/* macro for io_mux. */
661bd4fe43Sopenharmony_ci#define IO_CFG_SR               (1 << 10)
671bd4fe43Sopenharmony_ci#define IO_CFG_PULL_DOWN        (1 << 9)
681bd4fe43Sopenharmony_ci#define IO_CFG_PULL_UP          (1 << 8)
691bd4fe43Sopenharmony_ci#define IO_CFG_DRV_STR_MASK     (0xfU << 4)
701bd4fe43Sopenharmony_ci#define IO_DRV_MASK             0x7f0
711bd4fe43Sopenharmony_ci
721bd4fe43Sopenharmony_ci#define IO_DRV_STR_SEL(str)     ((str) << 4)
731bd4fe43Sopenharmony_ci
741bd4fe43Sopenharmony_ci#define IO_MUX_CLK_TYPE_EMMC    0x0
751bd4fe43Sopenharmony_ci#define IO_MUX_CLK_TYPE_SD      0x1
761bd4fe43Sopenharmony_ci#define IO_MUX_SHIFT(type)      ((type) << 0)
771bd4fe43Sopenharmony_ci#define IO_MUX_MASK             (0xfU << 0)
781bd4fe43Sopenharmony_ci
791bd4fe43Sopenharmony_ci#define IO_DRV_SDIO_CLK  0x3
801bd4fe43Sopenharmony_ci#define IO_DRV_SDIO_CMD  0x6
811bd4fe43Sopenharmony_ci#define IO_DRV_SDIO_DATA 0x6
821bd4fe43Sopenharmony_ci
831bd4fe43Sopenharmony_ci#define IO_DRV_SD_SDHS_CLK  0x5
841bd4fe43Sopenharmony_ci#define IO_DRV_SD_SDHS_CMD  0x7
851bd4fe43Sopenharmony_ci#define IO_DRV_SD_SDHS_DATA 0x7
861bd4fe43Sopenharmony_ci
871bd4fe43Sopenharmony_ci#define IO_DRV_SD_OTHER_CLK  0x7
881bd4fe43Sopenharmony_ci#define IO_DRV_SD_OTHER_CMD   IO_DRV_SD_OTHER_CLK
891bd4fe43Sopenharmony_ci#define IO_DRV_SD_OTHER_DATA  IO_DRV_SD_OTHER_CLK
901bd4fe43Sopenharmony_ci
911bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_CLK  0x3
921bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_CMD  0x4
931bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_DATA 0x4
941bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_DS   0x3
951bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_RST  0x3
961bd4fe43Sopenharmony_ci
971bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_CLK  0x2
981bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_CMD  0x4
991bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_DATA 0x4
1001bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_RST  0x3
1011bd4fe43Sopenharmony_ci
1021bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_CLK  0x4
1031bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_CMD  0x6
1041bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_DATA 0x6
1051bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_RST  0x3
1061bd4fe43Sopenharmony_ci
1071bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_CLK  0x5
1081bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_CMD  0x6
1091bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_DATA 0x6
1101bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_RST  0x3
1111bd4fe43Sopenharmony_ci
1121bd4fe43Sopenharmony_ci#define PERI_CRG125 (CRG_REG_BASE + 0x01F4)
1131bd4fe43Sopenharmony_ci#define PERI_CRG126 (CRG_REG_BASE + 0x01F8)
1141bd4fe43Sopenharmony_ci#define PERI_CRG127 (CRG_REG_BASE + 0x01FC)
1151bd4fe43Sopenharmony_ci#define PERI_CRG135 (CRG_REG_BASE + 0x021C)
1161bd4fe43Sopenharmony_ci#define PERI_CRG136 (CRG_REG_BASE + 0x0220)
1171bd4fe43Sopenharmony_ci#define PERI_CRG139 (CRG_REG_BASE + 0x022C)
1181bd4fe43Sopenharmony_ci#define PERI_SD_DRV_DLL_CTRL (CRG_REG_BASE + 0x210)
1191bd4fe43Sopenharmony_ci#define PERI_SDIO_DRV_DLL_CTRL (CRG_REG_BASE + 0x228)
1201bd4fe43Sopenharmony_ci#define PERI_SD_SAMPL_DLL_STATUS (CRG_REG_BASE + 0x208)
1211bd4fe43Sopenharmony_ci#define PERI_SDIO_SAMPL_DLL_STATUS (CRG_REG_BASE + 0x224)
1221bd4fe43Sopenharmony_ci
1231bd4fe43Sopenharmony_ci/*
1241bd4fe43Sopenharmony_ci * PERI_CRG125/PERI_CRG139 details.
1251bd4fe43Sopenharmony_ci * [28]Clock gating configuration. 0: disabled; 1: enabled.
1261bd4fe43Sopenharmony_ci * [27]Soft reset request. 0: reset deasserted; 1: reset.
1271bd4fe43Sopenharmony_ci * [26:24]Working clock selection. 000: 100KHz; 001: 400KHz; 010: 25MHz; 011: 50MKz;
1281bd4fe43Sopenharmony_ci * 100: 90MKz(Supported only in eMMC mode); 101: 112.5MKz(Supported only in eMMC mode);
1291bd4fe43Sopenharmony_ci * 110: 150MKz(Supported only in eMMC mode); others: reserved.
1301bd4fe43Sopenharmony_ci */
1311bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_MASK 0x7
1321bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_SHIFT 24
1331bd4fe43Sopenharmony_ci#define SDHCI_CKEN (1U << 28)
1341bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_100K   0
1351bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_400K   1
1361bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_25M    2
1371bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_50M    3
1381bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_90M    4
1391bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_112P5M 5
1401bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_150M   6
1411bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CRG_REQ (1U << 27)
1421bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CKEN (1U << 28)
1431bd4fe43Sopenharmony_ci#define SDHCI_EMMC_DLL_RST (1U << 29)
1441bd4fe43Sopenharmony_ci
1451bd4fe43Sopenharmony_ci/*
1461bd4fe43Sopenharmony_ci * PERI_CRG126/PERI_CRG135 details.
1471bd4fe43Sopenharmony_ci * [4:0]Clock phase configuration for B clock debugging during edge detection. The default value is 90 degrees.
1481bd4fe43Sopenharmony_ci * 0x00: 0; 0x01: 11.25; 0x02: 22.5; ... 0x1E: 337.5; 0x1F: 348.75; others: reserved.
1491bd4fe43Sopenharmony_ci */
1501bd4fe43Sopenharmony_ci#define SDHCI_SAMPLB_DLL_CLK_MASK (0x1fU << 0)
1511bd4fe43Sopenharmony_ci#define SDHCI_SAMPLB_DLL_CLK 8
1521bd4fe43Sopenharmony_ci#define SDHCI_SAMPLB_SEL(phase) ((phase) << 0)
1531bd4fe43Sopenharmony_ci
1541bd4fe43Sopenharmony_ci/*
1551bd4fe43Sopenharmony_ci * PERI_CRG127/PERI_CRG136 details.
1561bd4fe43Sopenharmony_ci * [28:24]Clock phase configuration. Default value: 180.
1571bd4fe43Sopenharmony_ci * 0x00: 0; 0x01: 11.25; 0x02: 22.5; ... 0x1E: 337.5; 0x1F: 348.75; others: reserved.
1581bd4fe43Sopenharmony_ci */
1591bd4fe43Sopenharmony_ci#define SDHCI_DRV_CLK_PHASE_SHFT 24
1601bd4fe43Sopenharmony_ci#define SDHCI_DRV_CLK_PHASE_MASK (0x1f << 24)
1611bd4fe43Sopenharmony_ci#define SDHCI_PHASE_112P5_DEGREE 10        /* 112.5 degree */
1621bd4fe43Sopenharmony_ci#define SDHCI_PHASE_258P75_DEGREE 23       /* 258.75 degree */
1631bd4fe43Sopenharmony_ci#define SDHCI_PHASE_225_DEGREE 20          /* 225 degree */
1641bd4fe43Sopenharmony_ci#define SDHCI_PHASE_180_DEGREE 16          /* 180 degree */
1651bd4fe43Sopenharmony_ci
1661bd4fe43Sopenharmony_ci/*
1671bd4fe43Sopenharmony_ci * PERI_SD_DRV_DLL_CTRL/PERI_SDIO_DRV_DLL_CTRL details.
1681bd4fe43Sopenharmony_ci */
1691bd4fe43Sopenharmony_ci#define SDHCI_DRV_DLL_LOCK (1U << 15)
1701bd4fe43Sopenharmony_ci
1711bd4fe43Sopenharmony_ci/*
1721bd4fe43Sopenharmony_ci * PERI_SD_SAMPL_DLL_STATUS/PERI_SDIO_SAMPL_DLL_STATUS details.
1731bd4fe43Sopenharmony_ci */
1741bd4fe43Sopenharmony_ci#define SDHCI_SAMPL_DLL_DEV_READY 1
1751bd4fe43Sopenharmony_ci#define SDHCI_SAMPL_DLL_DEV_EN (1U << 16)
1761bd4fe43Sopenharmony_ci
1771bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_100K       100000
1781bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_400K       400000
1791bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_25M        25000000
1801bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_50M        50000000
1811bd4fe43Sopenharmony_ci/* only support for EMMC chip */
1821bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_90M        90000000
1831bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_112P5M     112500000
1841bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_150M       150000000
1851bd4fe43Sopenharmony_ci
1861bd4fe43Sopenharmony_ci#define SDHCI_CMD_DATA_REQ_TIMEOUT  (LOSCFG_BASE_CORE_TICK_PER_SECOND * 10) /* 30 s */
1871bd4fe43Sopenharmony_ci#define SDHCI_CMD_REQ_TIMEOUT  (LOSCFG_BASE_CORE_TICK_PER_SECOND * 1) /* 1s */
1881bd4fe43Sopenharmony_ci
1891bd4fe43Sopenharmony_ci/* define event lock */
1901bd4fe43Sopenharmony_citypedef EVENT_CB_S SDHCI_EVENT;
1911bd4fe43Sopenharmony_ci#define SDHCI_EVENT_INIT(event) LOS_EventInit(event)
1921bd4fe43Sopenharmony_ci#define SDHCI_EVENT_SIGNAL(event, bit) LOS_EventWrite(event, bit)
1931bd4fe43Sopenharmony_ci#define SDHCI_EVENT_WAIT(event, bit, timeout) LOS_EventRead(event, bit, (LOS_WAITMODE_OR + LOS_WAITMODE_CLR), timeout)
1941bd4fe43Sopenharmony_ci#define SDHCI_EVENT_DELETE(event) LOS_EventDestroy(event)
1951bd4fe43Sopenharmony_ci
1961bd4fe43Sopenharmony_ci/* define irq lock */
1971bd4fe43Sopenharmony_ci#define SDHCI_IRQ_LOCK(flags)    do { (*(flags)) = LOS_IntLock(); } while (0)
1981bd4fe43Sopenharmony_ci#define SDHCI_IRQ_UNLOCK(flags)  do { LOS_IntRestore(flags); } while (0)
1991bd4fe43Sopenharmony_ci
2001bd4fe43Sopenharmony_ci#define SDHCI_SG_DMA_ADDRESS(sg) ((sg)->dma_address)
2011bd4fe43Sopenharmony_ci#ifdef CONFIG_NEED_SG_DMA_LENGTH
2021bd4fe43Sopenharmony_ci#define SDHCI_SG_DMA_LEN(sg)     ((sg)->dma_length)
2031bd4fe43Sopenharmony_ci#else
2041bd4fe43Sopenharmony_ci#define SDHCI_SG_DMA_LEN(sg)     ((sg)->length)
2051bd4fe43Sopenharmony_ci#endif
2061bd4fe43Sopenharmony_ci
2071bd4fe43Sopenharmony_ci/*
2081bd4fe43Sopenharmony_ci * Host SDMA buffer boundary. Valid values from 4K to 512K in powers of 2.
2091bd4fe43Sopenharmony_ci */
2101bd4fe43Sopenharmony_ci#define SDHCI_DEFAULT_BOUNDARY_SIZE  (512 * 1024)
2111bd4fe43Sopenharmony_ci#define SDHCI_DEFAULT_BOUNDARY       19
2121bd4fe43Sopenharmony_ci#define SDHCI_DEFAULT_BOUNDARY_ARG   (SDHCI_DEFAULT_BOUNDARY - 12)
2131bd4fe43Sopenharmony_ci
2141bd4fe43Sopenharmony_cienum SdhciDmaDataDirection {
2151bd4fe43Sopenharmony_ci    DMA_BIDIRECTIONAL = 0,
2161bd4fe43Sopenharmony_ci    DMA_TO_DEVICE = 1,
2171bd4fe43Sopenharmony_ci    DMA_FROM_DEVICE = 2,
2181bd4fe43Sopenharmony_ci    DMA_NONE = 3,
2191bd4fe43Sopenharmony_ci};
2201bd4fe43Sopenharmony_ci
2211bd4fe43Sopenharmony_cienum SdhciHostRegister {
2221bd4fe43Sopenharmony_ci    SDMASA_R = 0x0000,
2231bd4fe43Sopenharmony_ci    BLOCKSIZE_R = 0x0004,
2241bd4fe43Sopenharmony_ci    BLOCKCOUNT_R = 0x0006,
2251bd4fe43Sopenharmony_ci    ARGUMENT_R = 0x0008,
2261bd4fe43Sopenharmony_ci    XFER_MODE_R = 0x000c,
2271bd4fe43Sopenharmony_ci    CMD_R = 0x000e,
2281bd4fe43Sopenharmony_ci    RESP01_R = 0x0010,
2291bd4fe43Sopenharmony_ci    RESP23_R = 0x0014,
2301bd4fe43Sopenharmony_ci    RESP45_R = 0x0018,
2311bd4fe43Sopenharmony_ci    RESP67_R = 0x001c,
2321bd4fe43Sopenharmony_ci    BUF_DATA_R = 0x0020,
2331bd4fe43Sopenharmony_ci    PSTATE_R = 0x0024,
2341bd4fe43Sopenharmony_ci    HOST_CTRL1_R = 0x0028,
2351bd4fe43Sopenharmony_ci    PWR_CTRL_R = 0x0029,
2361bd4fe43Sopenharmony_ci    BLOCK_GAP_CTRL_R = 0x002a,
2371bd4fe43Sopenharmony_ci    WUP_CTRL_R = 0x002b,
2381bd4fe43Sopenharmony_ci    CLK_CTRL_R = 0x002c,
2391bd4fe43Sopenharmony_ci    TOUT_CTRL_R = 0x002e,
2401bd4fe43Sopenharmony_ci    SW_RST_R = 0x002f,
2411bd4fe43Sopenharmony_ci    NORMAL_INT_STAT_R = 0x0030,
2421bd4fe43Sopenharmony_ci    ERROR_INT_STAT_R = 0x0032,
2431bd4fe43Sopenharmony_ci    NORMAL_INT_STAT_EN_R = 0x0034,
2441bd4fe43Sopenharmony_ci    ERROR_INT_STAT_EN_R = 0x0036,
2451bd4fe43Sopenharmony_ci    NORMAL_INT_SIGNAL_EN_R = 0x0038,
2461bd4fe43Sopenharmony_ci    ERROR_INT_SIGNAL_EN_R = 0x003a,
2471bd4fe43Sopenharmony_ci    AUTO_CMD_STAT_R = 0x003c,
2481bd4fe43Sopenharmony_ci    HOST_CTRL2_R = 0x003e,
2491bd4fe43Sopenharmony_ci    CAPABILITIES1_R = 0x0040,
2501bd4fe43Sopenharmony_ci    CAPABILITIES2_R = 0x0044,
2511bd4fe43Sopenharmony_ci    CURR_CAPBILITIES1_R = 0x0048,
2521bd4fe43Sopenharmony_ci    ADMA_ERR_STAT_R = 0x0054,
2531bd4fe43Sopenharmony_ci    ADMA_SA_LOW_R = 0x0058,
2541bd4fe43Sopenharmony_ci    ADMA_SA_HIGH_R = 0x005c,
2551bd4fe43Sopenharmony_ci    ADMA_ID_LOW_R = 0x0078,
2561bd4fe43Sopenharmony_ci    ADMA_ID_HIGH_R = 0x007c,
2571bd4fe43Sopenharmony_ci    SLOT_INT_STATUS_R = 0x00FC,
2581bd4fe43Sopenharmony_ci    HOST_VERSION_R = 0x00FE,
2591bd4fe43Sopenharmony_ci    MSHC_VER_ID_R = 0x0500,
2601bd4fe43Sopenharmony_ci    MSHC_VER_TYPE_R = 0x0504,
2611bd4fe43Sopenharmony_ci    MSHC_CTRL_R = 0x0508,
2621bd4fe43Sopenharmony_ci    MBIU_CTRL_R = 0x0510,
2631bd4fe43Sopenharmony_ci    EMMC_CTRL_R = 0x052c,
2641bd4fe43Sopenharmony_ci    BOOT_CTRL_R = 0x052e,
2651bd4fe43Sopenharmony_ci    EMMC_HW_RESET_R = 0x0534,
2661bd4fe43Sopenharmony_ci    AT_CTRL_R = 0x0540,
2671bd4fe43Sopenharmony_ci    AT_STAT_R = 0x0544,
2681bd4fe43Sopenharmony_ci    MULTI_CYCLE_R = 0x054c
2691bd4fe43Sopenharmony_ci};
2701bd4fe43Sopenharmony_ci
2711bd4fe43Sopenharmony_ci/*
2721bd4fe43Sopenharmony_ci * SDMASA_R(0x0000) details.
2731bd4fe43Sopenharmony_ci * [31:0]Whether to use the built-in DMA to transfer data.
2741bd4fe43Sopenharmony_ci * If Host Version Enable is set to 0, it indicates the SDMA system address.
2751bd4fe43Sopenharmony_ci * If Host Version Enable is set to 1, it indicates the block count. 1 indicates a block.
2761bd4fe43Sopenharmony_ci */
2771bd4fe43Sopenharmony_ci#define SDHCI_DMA_ADDRESS 0x00
2781bd4fe43Sopenharmony_ci#define SDHCI_ARGUMENT2 SDHCI_DMA_ADDRESS
2791bd4fe43Sopenharmony_ci
2801bd4fe43Sopenharmony_ci/*
2811bd4fe43Sopenharmony_ci * BLOCKSIZE_R(0x0004) details.
2821bd4fe43Sopenharmony_ci * [14:12]Boundary value of an SDMA data block. 000: 4K bytes; 001: 8K bytes; ... 111: 512K bytes.
2831bd4fe43Sopenharmony_ci * [11:0]Transfer block zise. 0x800: 2048bytes.
2841bd4fe43Sopenharmony_ci */
2851bd4fe43Sopenharmony_ci#define SDHCI_MAKE_BLKSZ(dma, blksz) (((dma & 0x7) << 12) | (blksz & 0xFFF))
2861bd4fe43Sopenharmony_ci
2871bd4fe43Sopenharmony_ci/*
2881bd4fe43Sopenharmony_ci * XFER_MODE_R(0x000c) details.
2891bd4fe43Sopenharmony_ci * [15:9]reserved.
2901bd4fe43Sopenharmony_ci * [8]Disable the response interrupt. 0: enable; 1: disable.
2911bd4fe43Sopenharmony_ci * [7]Response error check enable. 0: disable; 1: enable.
2921bd4fe43Sopenharmony_ci * [6]Response R1/R5 Type. 0: R1; 1: R5.
2931bd4fe43Sopenharmony_ci * [5]Multiple/single block select. 0: single block; 1: multiple block.
2941bd4fe43Sopenharmony_ci * [4]Data transfer direction. 0: Controller-to-card; 1: card-to-Controller.
2951bd4fe43Sopenharmony_ci * [3:2]Auto Command Enable. 00: close; 01: Auto CMD12 Enable; 10: Auto CMD23 Enable; 11: Auto CMD Auto Select.(sdio 00)
2961bd4fe43Sopenharmony_ci * [1]Block count Enable. 0: disable; 1: enable.
2971bd4fe43Sopenharmony_ci * [0]DMA Enable. 0: No data is transmitted or non-DMA data is transmitted; 1: DMA data transfer.
2981bd4fe43Sopenharmony_ci */
2991bd4fe43Sopenharmony_ci#define SDHCI_TRNS_DMA (1 << 0)
3001bd4fe43Sopenharmony_ci#define SDHCI_TRNS_BLK_CNT_EN (1 << 1)
3011bd4fe43Sopenharmony_ci#define SDHCI_TRNS_AUTO_CMD12 (1 << 2)
3021bd4fe43Sopenharmony_ci#define SDHCI_TRNS_AUTO_CMD23 (1 << 3)
3031bd4fe43Sopenharmony_ci#define SDHCI_TRNS_READ (1 << 4)
3041bd4fe43Sopenharmony_ci#define SDHCI_TRNS_MULTI (1 << 5)
3051bd4fe43Sopenharmony_ci
3061bd4fe43Sopenharmony_ci/*
3071bd4fe43Sopenharmony_ci * CMD_R(0x000e) details.
3081bd4fe43Sopenharmony_ci * [15:14]reserved.
3091bd4fe43Sopenharmony_ci * [13:8]cmd index.
3101bd4fe43Sopenharmony_ci * [7:6]cmd type. 00: Normal cmd; 01: Suspend cmd; 10: Resume cmd; 11: Abort cmd.
3111bd4fe43Sopenharmony_ci * [5]Whether data is being transmitted. 0: No data is transmitted. 1: Data is being transmitted.
3121bd4fe43Sopenharmony_ci * [4]Command ID check enable. 0: disable; 1: enable.
3131bd4fe43Sopenharmony_ci * [3]Command CRC check enable. 0: disable; 1: enable.
3141bd4fe43Sopenharmony_ci * [2]Subcommand ID. 0: Main; 1: Sub Command.
3151bd4fe43Sopenharmony_ci * [1:0]Response type. 00: no response; 01: response Length 136; 10: response length 48; 11: response length 48 check.
3161bd4fe43Sopenharmony_ci */
3171bd4fe43Sopenharmony_ci#define SDHCI_CMD_CRC_CHECK_ENABLE 0x08
3181bd4fe43Sopenharmony_ci#define SDHCI_CMD_INDEX_CHECK_ENABLE 0x10
3191bd4fe43Sopenharmony_ci#define SDHCI_CMD_DATA_TX 0x20
3201bd4fe43Sopenharmony_ci
3211bd4fe43Sopenharmony_ci#define SDHCI_CMD_NONE_RESP 0x00
3221bd4fe43Sopenharmony_ci#define SDHCI_CMD_LONG_RESP 0x01
3231bd4fe43Sopenharmony_ci#define SDHCI_CMD_SHORT_RESP 0x02
3241bd4fe43Sopenharmony_ci#define SDHCI_CMD_SHORT_RESP_BUSY 0x03
3251bd4fe43Sopenharmony_ci
3261bd4fe43Sopenharmony_ci#define SDHCI_GEN_CMD(c, f) (((c & 0xff) << 8) | (f & 0xff))
3271bd4fe43Sopenharmony_ci#define SDHCI_PARSE_CMD(c) ((c >> 8) & 0x3f)
3281bd4fe43Sopenharmony_ci
3291bd4fe43Sopenharmony_ci/*
3301bd4fe43Sopenharmony_ci * PSTATE_R(0x0024) details.
3311bd4fe43Sopenharmony_ci * [31:28]reserved.
3321bd4fe43Sopenharmony_ci * [27]Command sending error status. 0: No error occurs in the sent command. 1: The command cannot be sent.
3331bd4fe43Sopenharmony_ci * [26:25]reserved.
3341bd4fe43Sopenharmony_ci * [24]CMD pin status. 0: The cmd pin is at low level. 1: The cmd pin is at high level.
3351bd4fe43Sopenharmony_ci * [23:20]Data[3:0] pin status, meaning of each bit. 0: low level; 1: high level.
3361bd4fe43Sopenharmony_ci * [18]Card_detect_n pin status. 0: low level; 1: high level.
3371bd4fe43Sopenharmony_ci * [11]Buffer read enable. 0 : disable; 1: enable.
3381bd4fe43Sopenharmony_ci * [10]Buffer write enable. 0 : disable; 1: enable.
3391bd4fe43Sopenharmony_ci * [9]Read transfer valid. 0: idle; 1: Data is being read.
3401bd4fe43Sopenharmony_ci * [8]Write transfer valid. 0: idle; 1: Data is being written.
3411bd4fe43Sopenharmony_ci * [7:4]Data[7:4] pin status, meaning of each bit. 0: low level; 1: high level.
3421bd4fe43Sopenharmony_ci * [3]reserved.
3431bd4fe43Sopenharmony_ci * [2]The data line is valid. 0: idle; 1: Data is being transmitted.
3441bd4fe43Sopenharmony_ci * [1]The command with data is valid. 0: idle state, Commands with data can be sent.
3451bd4fe43Sopenharmony_ci * 1: The data line is being transferred or the read operation is valid.
3461bd4fe43Sopenharmony_ci * [0]The command line is valid. 0: idle state. The controller can send commands.
3471bd4fe43Sopenharmony_ci * 1: busy. The controller cannot send commands.
3481bd4fe43Sopenharmony_ci */
3491bd4fe43Sopenharmony_ci#define SDHCI_CMD_INVALID 0x00000001
3501bd4fe43Sopenharmony_ci#define SDHCI_DATA_INVALID 0x00000002
3511bd4fe43Sopenharmony_ci#define SDHCI_CARD_PRESENT 0x00010000
3521bd4fe43Sopenharmony_ci#define SDHCI_WRITE_PROTECT 0x00080000
3531bd4fe43Sopenharmony_ci#define SDHCI_DATA_0_LEVEL_MASK 0x00100000
3541bd4fe43Sopenharmony_ci
3551bd4fe43Sopenharmony_ci/*
3561bd4fe43Sopenharmony_ci * HOST_CTRL1_R(0x0028) details.
3571bd4fe43Sopenharmony_ci * [7]Card detection signal select. 0: card detection signal card_detect_n (common use); 1: card detection test level.
3581bd4fe43Sopenharmony_ci * [6]Card detection test level. 0: no card; 1: a card is inserted.
3591bd4fe43Sopenharmony_ci * [5]reserved.
3601bd4fe43Sopenharmony_ci * [4:3]DMA select. When Host Version 4 Enable in HOST_CTRL2_R is 1: 00: SDMA; 01: ADMA1; 10: ADMA2;
3611bd4fe43Sopenharmony_ci * 11: ADMA2 or ADMA3. When Host Version 4 Enable in HOST_CTRL2_R is 0: 00: SDMA; 01: reserved;
3621bd4fe43Sopenharmony_ci * 10: 32-bit address ADMA2; 11: 64-bit address ADMA2.
3631bd4fe43Sopenharmony_ci * [2]High-speed enable. 0: Normal Speed; 1: High Speed.
3641bd4fe43Sopenharmony_ci * [1]Bit width of the data transfer. 0: 1bit; 1: 4bit.
3651bd4fe43Sopenharmony_ci * [0]reserved.
3661bd4fe43Sopenharmony_ci */
3671bd4fe43Sopenharmony_ci#define SDHCI_CTRL_4_BIT_BUS 0x02
3681bd4fe43Sopenharmony_ci#define SDHCI_CTRL_HIGH_SPEED 0x04
3691bd4fe43Sopenharmony_ci#define SDHCI_CTRL_DMA_ENABLE_MASK 0x18
3701bd4fe43Sopenharmony_ci#define SDHCI_CTRL_SDMA_ENABLE 0x00
3711bd4fe43Sopenharmony_ci#define SDHCI_CTRL_ADMA1_ENABLE 0x08
3721bd4fe43Sopenharmony_ci#define SDHCI_CTRL_ADMA32_ENABLE 0x10
3731bd4fe43Sopenharmony_ci#define SDHCI_CTRL_ADMA64_ENABLE 0x18
3741bd4fe43Sopenharmony_ci#define SDHCI_CTRL_8_BIT_BUS 0x20
3751bd4fe43Sopenharmony_ci
3761bd4fe43Sopenharmony_ci/*
3771bd4fe43Sopenharmony_ci * PWR_CTRL_R(0x0029) details.
3781bd4fe43Sopenharmony_ci * [0]VDD2 Power enable. 0: power off; 1: power on.
3791bd4fe43Sopenharmony_ci */
3801bd4fe43Sopenharmony_ci#define SDHCI_POWER_ON 0x01
3811bd4fe43Sopenharmony_ci#define SDHCI_POWER_180 0x0A
3821bd4fe43Sopenharmony_ci#define SDHCI_POWER_300 0x0C
3831bd4fe43Sopenharmony_ci#define SDHCI_POWER_330 0x0E
3841bd4fe43Sopenharmony_ci
3851bd4fe43Sopenharmony_ci/*
3861bd4fe43Sopenharmony_ci * CLK_CTRL_R(0x002c) details.
3871bd4fe43Sopenharmony_ci * [15:4]reserved.
3881bd4fe43Sopenharmony_ci * [3]PLL enable. 0: The PLL is in low power mode. 1: enabled.
3891bd4fe43Sopenharmony_ci * [2]SD/eMMC clock enable. 0: disabled; 1: enabled.
3901bd4fe43Sopenharmony_ci * [1]Internal clock status. 0: unstable; 1: stable.
3911bd4fe43Sopenharmony_ci * [0]Internal clock enable. 0: disabled; 1: enabled.
3921bd4fe43Sopenharmony_ci */
3931bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_PLL_EN (1 << 3)
3941bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_CLK_EN (1 << 2)
3951bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_INT_STABLE (1 << 1)
3961bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_INT_CLK_EN (1 << 0)
3971bd4fe43Sopenharmony_ci
3981bd4fe43Sopenharmony_ci/*
3991bd4fe43Sopenharmony_ci * TOUT_CTRL_R(0x002e) details.
4001bd4fe43Sopenharmony_ci * [3:0]Data timeout count. 0x0: TMCLK x 2^13; 0xe: TMCLK x 2^27; others: reserved.
4011bd4fe43Sopenharmony_ci */
4021bd4fe43Sopenharmony_ci#define SDHCI_DEFINE_TIMEOUT 0xE
4031bd4fe43Sopenharmony_ci
4041bd4fe43Sopenharmony_ci/*
4051bd4fe43Sopenharmony_ci * SW_RST_R(0x002f) details.
4061bd4fe43Sopenharmony_ci * [7:3]reserved.
4071bd4fe43Sopenharmony_ci * [2]Data line soft reset request. 0: not reset; 1: reset.
4081bd4fe43Sopenharmony_ci * [1]Command line soft reset request. 0: not reset; 1: reset.
4091bd4fe43Sopenharmony_ci * [0]Soft reset request of the controller. 0: not reset; 1: reset.
4101bd4fe43Sopenharmony_ci */
4111bd4fe43Sopenharmony_ci#define SDHCI_RESET_ALL 0x01
4121bd4fe43Sopenharmony_ci#define SDHCI_RESET_CMD 0x02
4131bd4fe43Sopenharmony_ci#define SDHCI_RESET_DATA 0x04
4141bd4fe43Sopenharmony_ci
4151bd4fe43Sopenharmony_ci/*
4161bd4fe43Sopenharmony_ci * NORMAL_INT_STAT_R(0x0030) details.
4171bd4fe43Sopenharmony_ci * [15]Summary error interrupt status. [14]reserved. [13]TX event interrupt status.
4181bd4fe43Sopenharmony_ci * [12]Retuning event interrupt status. [11]INT_C interrupt status. [10]INT_B interrupt status.
4191bd4fe43Sopenharmony_ci * [9]INT_A interrupt status. [8]Card interrupt status. [7]Card removal interrupt status.
4201bd4fe43Sopenharmony_ci * [6]Card insertion interrupt status. [5]Buffer read ready interrupt status. [4]Buffer write ready interrupt status.
4211bd4fe43Sopenharmony_ci * [3]DMA interrupt status. [2]Block gap event interrupt status due to a stop request.
4221bd4fe43Sopenharmony_ci * [1]Read/write transfer completion interrupt status. [0]Command completion interrupt status.
4231bd4fe43Sopenharmony_ci */
4241bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_RESPONSE 0x00000001
4251bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_END 0x00000002
4261bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_BLK_GAP 0x00000004
4271bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DMA_END 0x00000008
4281bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_SPACE_AVAIL 0x00000010
4291bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_AVAIL 0x00000020
4301bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CARD_INSERT 0x00000040
4311bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CARD_REMOVE 0x00000080
4321bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CARD_INT 0x00000100
4331bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_ERROR 0x00008000
4341bd4fe43Sopenharmony_ci
4351bd4fe43Sopenharmony_ci/*
4361bd4fe43Sopenharmony_ci * NORMAL_INT_SIGNAL_EN_R(0x0038) details.
4371bd4fe43Sopenharmony_ci */
4381bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_TIMEOUT 0x00010000
4391bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CRC 0x00020000
4401bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_END_BIT 0x00040000
4411bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_INDEX 0x00080000
4421bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_TIMEOUT 0x00100000
4431bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_CRC 0x00200000
4441bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_END_BIT 0x00400000
4451bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_BUS_POWER 0x00800000
4461bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_AUTO_CMD_ERR 0x01000000
4471bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_ADMA_ERROR 0x02000000
4481bd4fe43Sopenharmony_ci
4491bd4fe43Sopenharmony_ci#define SDHCI_INT_CMD_MASK (SDHCI_INTERRUPT_RESPONSE | SDHCI_INTERRUPT_TIMEOUT | SDHCI_INTERRUPT_CRC | \
4501bd4fe43Sopenharmony_ci    SDHCI_INTERRUPT_END_BIT | SDHCI_INTERRUPT_INDEX | SDHCI_INTERRUPT_AUTO_CMD_ERR)
4511bd4fe43Sopenharmony_ci
4521bd4fe43Sopenharmony_ci#define SDHCI_INT_DATA_MASK (SDHCI_INTERRUPT_DATA_END | SDHCI_INTERRUPT_DMA_END | SDHCI_INTERRUPT_DATA_AVAIL | \
4531bd4fe43Sopenharmony_ci    SDHCI_INTERRUPT_SPACE_AVAIL | SDHCI_INTERRUPT_DATA_TIMEOUT | SDHCI_INTERRUPT_DATA_CRC | \
4541bd4fe43Sopenharmony_ci    SDHCI_INTERRUPT_DATA_END_BIT | SDHCI_INTERRUPT_ADMA_ERROR | SDHCI_INTERRUPT_BLK_GAP)
4551bd4fe43Sopenharmony_ci
4561bd4fe43Sopenharmony_ci/*
4571bd4fe43Sopenharmony_ci * HOST_CTRL2_R(0x003e) details.
4581bd4fe43Sopenharmony_ci * [9:8]reserved; [3]reserved.
4591bd4fe43Sopenharmony_ci * [15]Automatic selection enable of the preset value. 0: disabled, 1: enabled.
4601bd4fe43Sopenharmony_ci * [14]Async interrupt enable. 0: disabled; 1: enabled.
4611bd4fe43Sopenharmony_ci * [13]Bus 64-bit address enable. 0: disabled; 1: enabled.
4621bd4fe43Sopenharmony_ci * [12]Controller version 4 enable. 0: 3.0; 1: 4.0.
4631bd4fe43Sopenharmony_ci * [11]CMD23 enable. 0: disabled; 1: enabled.
4641bd4fe43Sopenharmony_ci * [10]ADMA2 length. 0:16-bit data length; 1:26-bit data length.
4651bd4fe43Sopenharmony_ci * [7]Sample clock select. 0: Select the fixed clock to collect data. 1: tuned clock.
4661bd4fe43Sopenharmony_ci * [6]Run the tuning command. The value is automatically cleared after the tuning operation is complete.
4671bd4fe43Sopenharmony_ci * 0: Tuning is not performed or tuning is complete. 1: tuning.
4681bd4fe43Sopenharmony_ci * [5:4]Drive capability select. 00: typeB; 01: typeA; 10: typeC; 11: typeD.
4691bd4fe43Sopenharmony_ci * [2:0]emmc mode. 000: Legacy; 001: High Speed SDR; 010: HS200; others: reserved.
4701bd4fe43Sopenharmony_ci */
4711bd4fe43Sopenharmony_ci#define SDHCI_UHS_MASK 0x0007
4721bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR12 0x0000
4731bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR25 0x0001
4741bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR50 0x0002
4751bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR104 0x0003
4761bd4fe43Sopenharmony_ci#define SDHCI_UHS_DDR50 0x0004
4771bd4fe43Sopenharmony_ci#define SDHCI_HS_SDR200 0x0005 /* reserved value in SDIO spec */
4781bd4fe43Sopenharmony_ci#define SDHCI_HS400 0x0007
4791bd4fe43Sopenharmony_ci#define SDHCI_VDD_180 0x0008
4801bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_MASK 0x0030
4811bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_B 0x0000
4821bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_A 0x0010
4831bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_C 0x0020
4841bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_D 0x0030
4851bd4fe43Sopenharmony_ci#define SDHCI_EXEC_TUNING 0x0040
4861bd4fe43Sopenharmony_ci#define SDHCI_TUNED_CLK 0x0080
4871bd4fe43Sopenharmony_ci#define SDHCI_ASYNC_INT_ENABLE 0x4000
4881bd4fe43Sopenharmony_ci#define SDHCI_PRESET_VAL_ENABLE 0x8000
4891bd4fe43Sopenharmony_ci
4901bd4fe43Sopenharmony_ci/*
4911bd4fe43Sopenharmony_ci * CAPABILITIES1_R(0x0040) details.
4921bd4fe43Sopenharmony_ci * [31:30]Slot type. 00: Removable card slot; 01: Embedded Slot;
4931bd4fe43Sopenharmony_ci * 10: Shared bus slot (used in SD mode); 11:UHS2 (not supported currently).
4941bd4fe43Sopenharmony_ci * [29]Whether the sync interrupt is supported. 0: not supported; 1: supported.
4951bd4fe43Sopenharmony_ci * [28]The 64-bit system address is used for V3. 0: not supported; 1: supported.
4961bd4fe43Sopenharmony_ci * [27]The 64-bit system address is used for V4. 0: not supported; 1: supported.
4971bd4fe43Sopenharmony_ci * [26]The voltage is 1.8 V. 0: not supported; 1: supported.
4981bd4fe43Sopenharmony_ci * [25]The voltage is 3.0 V. 0: not supported; 1: supported.
4991bd4fe43Sopenharmony_ci * [24]The voltage is 3.3 V. 0: not supported; 1: supported.
5001bd4fe43Sopenharmony_ci * [23]Suspending and Resuming Support. 0: not supported; 1: supported.
5011bd4fe43Sopenharmony_ci * [22]SDMA Support. 0: not supported; 1: supported.
5021bd4fe43Sopenharmony_ci * [21]Indicates whether to support high speed. 0: not supported; 1: supported.
5031bd4fe43Sopenharmony_ci * [19]Indicates whether to support ADMA2. 0: not supported; 1: supported.
5041bd4fe43Sopenharmony_ci * [18]Whether the 8-bit embedded component is supported. 0: not supported; 1: supported.
5051bd4fe43Sopenharmony_ci * [17:16]Maximum block length. 0x0: 512Byte; 0x1: 1024Byte; 0x2: 2048Byte; 0x3: reserved.
5061bd4fe43Sopenharmony_ci * [15:8]Basic frequency of the clock. 0x0: 1MHz; 0x3F: 63MHz; 0x40~0xFF: not supported.
5071bd4fe43Sopenharmony_ci * [7]Timeout clock unit. 0: KHz; 1: MHz.
5081bd4fe43Sopenharmony_ci * [5:0]Timeout interval. 0x1: 1KHz/1MHz; 0x2: 2KHz/2MHz; ... 0x3F: 63KHz/63MHz
5091bd4fe43Sopenharmony_ci */
5101bd4fe43Sopenharmony_ci#define SDHCI_TIMEOUT_CLK_UNIT 0x00000080
5111bd4fe43Sopenharmony_ci#define SDHCI_CLK_BASE_MASK 0x00003F00
5121bd4fe43Sopenharmony_ci#define SDHCI_BASIC_FREQ_OF_CLK_MASK 0x0000FF00
5131bd4fe43Sopenharmony_ci#define SDHCI_BASIC_FREQ_OF_CLK_SHIFT 8
5141bd4fe43Sopenharmony_ci#define SDHCI_MAX_BLOCK_SIZE_MASK 0x00030000
5151bd4fe43Sopenharmony_ci#define SDHCI_MAX_BLOCK_SIZE_SHIFT 16
5161bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_8BIT 0x00040000
5171bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_ADMA2 0x00080000
5181bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_HISPD 0x00200000
5191bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_SDMA 0x00400000
5201bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_VDD_330 0x01000000
5211bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_VDD_300 0x02000000
5221bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_VDD_180 0x04000000
5231bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_64BIT 0x10000000
5241bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_ASYNC_INT 0x20000000
5251bd4fe43Sopenharmony_ci
5261bd4fe43Sopenharmony_ci/*
5271bd4fe43Sopenharmony_ci * CAPABILITIES2_R(0x0044) details.
5281bd4fe43Sopenharmony_ci * [28]Whether the 1.8V VDDR is supported. 0: not supported; 1: supported.
5291bd4fe43Sopenharmony_ci * [27]Whether the ADMA3 is supported. 0: not supported; 1: supported.
5301bd4fe43Sopenharmony_ci * [15:14]Retuning mode. 00: MODE1, Timer; 01: MODE2, Timer and ReTuning request;
5311bd4fe43Sopenharmony_ci * 10: MODE3, Auto retuning Timer and ReTuning request; 11: reserved.
5321bd4fe43Sopenharmony_ci * [13]SDR50 uses Tuning. 0: not use; 1: use.
5331bd4fe43Sopenharmony_ci * [11:8]Retuning count. 0x1: 1s; 0x3: 4s; others: reserved.
5341bd4fe43Sopenharmony_ci * [6]Support TYPED. 0: not supported; 1: supported.
5351bd4fe43Sopenharmony_ci * [5]Support TYPEC. 0: not supported; 1: supported.
5361bd4fe43Sopenharmony_ci * [4]Support TYPEA. 0: not supported; 1: supported.
5371bd4fe43Sopenharmony_ci * [3]Support UHS2. 0: not supported; 1: supported.
5381bd4fe43Sopenharmony_ci * [2]Support DDR50. 0: not supported; 1: supported.
5391bd4fe43Sopenharmony_ci * [1]Support SDR104. 0: not supported; 1: supported.
5401bd4fe43Sopenharmony_ci * [0]Support SDR50. 0: not supported; 1: supported.
5411bd4fe43Sopenharmony_ci */
5421bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_SDR50 0x00000001
5431bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_SDR104 0x00000002
5441bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DDR50 0x00000004
5451bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DRIVER_TYPE_A 0x00000010
5461bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DRIVER_TYPE_C 0x00000020
5471bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DRIVER_TYPE_D 0x00000040
5481bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_TIMER_COUNT_MASK 0x00000F00
5491bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_TIMER_COUNT_SHIFT 8
5501bd4fe43Sopenharmony_ci#define SDHCI_USE_SDR50_TUNING 0x00002000
5511bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_MODE_MASK 0x0000C000
5521bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_MODE_SHIFT 14
5531bd4fe43Sopenharmony_ci#define SDHCI_CLK_MUL_MASK 0x00FF0000
5541bd4fe43Sopenharmony_ci#define SDHCI_CLK_MUL_SHIFT 16
5551bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_ADMA3 0x8000000
5561bd4fe43Sopenharmony_ci
5571bd4fe43Sopenharmony_ci/*
5581bd4fe43Sopenharmony_ci * HOST_VERSION_R(0x00FE) details.
5591bd4fe43Sopenharmony_ci */
5601bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_VER_MASK 0x00FF
5611bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_100 0
5621bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_200 1
5631bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_300 2
5641bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_400 3
5651bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_410 4
5661bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_420 5
5671bd4fe43Sopenharmony_ci
5681bd4fe43Sopenharmony_ci/*
5691bd4fe43Sopenharmony_ci * EMMC_CTRL_R(0x0508) details.
5701bd4fe43Sopenharmony_ci */
5711bd4fe43Sopenharmony_ci#define SDHC_CMD_CONFLIT_CHECK     0x01
5721bd4fe43Sopenharmony_ci
5731bd4fe43Sopenharmony_ci/*
5741bd4fe43Sopenharmony_ci * MBIU_CTRL_R(0x0510) details.
5751bd4fe43Sopenharmony_ci * [3]16 burst enable. 0: disable 16 burst; 1: enable 16 burst.
5761bd4fe43Sopenharmony_ci * [2]8 burst enable. 0: disable 8 burst; 1: enable 8 burst.
5771bd4fe43Sopenharmony_ci * [1]4 burst enable. 0: disable 4 burst; 1: enable 4 burst.
5781bd4fe43Sopenharmony_ci * [0]Burst configuration validation enable.
5791bd4fe43Sopenharmony_ci * 0: Generate fixed bursts by configuring gm_enburst4, gm_enburst8, gm_enburst16;
5801bd4fe43Sopenharmony_ci * 1: Generate bursts based on the actual data length.
5811bd4fe43Sopenharmony_ci */
5821bd4fe43Sopenharmony_ci#define SDHCI_GM_WR_OSRC_LMT_MASK (0x7 << 24)
5831bd4fe43Sopenharmony_ci#define SDHCI_GM_RD_OSRC_LMT_MASK (0x7 << 16)
5841bd4fe43Sopenharmony_ci#define SDHCI_GM_WR_OSRC_LMT_VAL (7 << 24)
5851bd4fe43Sopenharmony_ci#define SDHCI_GM_RD_OSRC_LMT_VAL (7 << 16)
5861bd4fe43Sopenharmony_ci#define SDHCI_UNDEFL_INCR_EN 0x1
5871bd4fe43Sopenharmony_ci
5881bd4fe43Sopenharmony_ci/*
5891bd4fe43Sopenharmony_ci * EMMC_CTRL_R(0x052c) details.
5901bd4fe43Sopenharmony_ci * [15:10]reserved; [8:2]reserved.
5911bd4fe43Sopenharmony_ci * [9]Algorithm for sorting tasks. 0: Tasks with a higher priority are executed first.
5921bd4fe43Sopenharmony_ci * Tasks with the same priority are executed first in first. 1: first come first execute.
5931bd4fe43Sopenharmony_ci * [1]Disable the CRC check. 0: Data CRC check is enabled. 1: The CRC check is disabled.
5941bd4fe43Sopenharmony_ci * [0]Type of the connected card. 0: non-eMMC card; 1: eMMC card.
5951bd4fe43Sopenharmony_ci */
5961bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CTRL_EMMC (1 << 0)
5971bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CTRL_ENH_STROBE_EN (1 << 8)
5981bd4fe43Sopenharmony_ci
5991bd4fe43Sopenharmony_ci/*
6001bd4fe43Sopenharmony_ci * AT_CTRL_R(0x0540) details.
6011bd4fe43Sopenharmony_ci * [4]Software configuration tuning enable. 0: disable; 1: enable.
6021bd4fe43Sopenharmony_ci */
6031bd4fe43Sopenharmony_ci#define SDHCI_SW_TUNING_EN 0x00000010
6041bd4fe43Sopenharmony_ci
6051bd4fe43Sopenharmony_ci/*
6061bd4fe43Sopenharmony_ci * AT_STAT_R(0x0544) details.
6071bd4fe43Sopenharmony_ci * [7:0]Phase value configured by software.
6081bd4fe43Sopenharmony_ci */
6091bd4fe43Sopenharmony_ci#define SDHCI_CENTER_PH_CODE_MASK   0x000000ff
6101bd4fe43Sopenharmony_ci#define SDHCI_SAMPLE_PHASE 4
6111bd4fe43Sopenharmony_ci#define SDHCI_PHASE_SCALE 32
6121bd4fe43Sopenharmony_ci#define SDHCI_PHASE_SCALE_TIMES 4
6131bd4fe43Sopenharmony_ci
6141bd4fe43Sopenharmony_ci/*
6151bd4fe43Sopenharmony_ci * MULTI_CYCLE_R(0x054C) details.
6161bd4fe43Sopenharmony_ci */
6171bd4fe43Sopenharmony_ci#define SDHCI_FOUND_EDGE (0x1 << 11)
6181bd4fe43Sopenharmony_ci#define SDHCI_EDGE_DETECT_EN (0x1 << 8)
6191bd4fe43Sopenharmony_ci#define SDHCI_DOUT_EN_F_EDGE (0x1 << 6)
6201bd4fe43Sopenharmony_ci#define SDHCI_DATA_DLY_EN (0x1 << 3)
6211bd4fe43Sopenharmony_ci#define SDHCI_CMD_DLY_EN (0x1 << 2)
6221bd4fe43Sopenharmony_ci
6231bd4fe43Sopenharmony_ci/*
6241bd4fe43Sopenharmony_ci * End of controller registers.
6251bd4fe43Sopenharmony_ci */
6261bd4fe43Sopenharmony_ci#define ADMA2_END 0x2
6271bd4fe43Sopenharmony_ci
6281bd4fe43Sopenharmony_ci#define SDHCI_USE_SDMA  (1 << 0)
6291bd4fe43Sopenharmony_ci#define SDHCI_USE_ADMA  (1 << 1)
6301bd4fe43Sopenharmony_ci#define SDHCI_REQ_USE_DMA (1 << 2)
6311bd4fe43Sopenharmony_ci#define SDHCI_DEVICE_DEAD (1 << 3)
6321bd4fe43Sopenharmony_ci#define SDHCI_SDR50_NEEDS_TUNING (1 << 4)
6331bd4fe43Sopenharmony_ci#define SDHCI_NEEDS_RETUNING (1 << 5)
6341bd4fe43Sopenharmony_ci#define SDHCI_AUTO_CMD12 (1 << 6)
6351bd4fe43Sopenharmony_ci#define SDHCI_AUTO_CMD23 (1 << 7)
6361bd4fe43Sopenharmony_ci#define SDHCI_PV_ENABLED (1 << 8)
6371bd4fe43Sopenharmony_ci#define SDHCI_SDIO_IRQ_ENABLED (1 << 9)
6381bd4fe43Sopenharmony_ci#define SDHCI_SDR104_NEEDS_TUNING (1 << 10)
6391bd4fe43Sopenharmony_ci#define SDHCI_USING_RETUNING_TIMER (1 << 11)
6401bd4fe43Sopenharmony_ci#define SDHCI_USE_64BIT_ADMA  (1 << 12)
6411bd4fe43Sopenharmony_ci#define SDHCI_HOST_IRQ_STATUS  (1 << 13)
6421bd4fe43Sopenharmony_ci
6431bd4fe43Sopenharmony_ci#define SDHCI_ADMA_MAX_DESC 128
6441bd4fe43Sopenharmony_ci#define SDHCI_ADMA_DEF_SIZE ((SDHCI_ADMA_MAX_DESC * 2 + 1) * 4)
6451bd4fe43Sopenharmony_ci#define SDHCI_ADMA_LINE_SIZE 8
6461bd4fe43Sopenharmony_ci#define SDHCI_ADMA_64BIT_LINE_SIZE 12
6471bd4fe43Sopenharmony_ci#define SDHCI_MAX_DIV_SPEC_200 256
6481bd4fe43Sopenharmony_ci#define SDHCI_MAX_DIV_SPEC_300 2046
6491bd4fe43Sopenharmony_ci
6501bd4fe43Sopenharmony_ciunion SdhciHostQuirks {
6511bd4fe43Sopenharmony_ci    uint32_t quirksData;
6521bd4fe43Sopenharmony_ci    struct QuirksBitData {
6531bd4fe43Sopenharmony_ci        uint32_t brokenCardDetection : 1;
6541bd4fe43Sopenharmony_ci        uint32_t forceSWDetect : 1; /* custom requirement: use the SD protocol to detect rather then the interrupt. */
6551bd4fe43Sopenharmony_ci        uint32_t invertedWriteProtect : 1;
6561bd4fe43Sopenharmony_ci        uint32_t noEndattrInNopdesc : 1;
6571bd4fe43Sopenharmony_ci        uint32_t reserved : 28;
6581bd4fe43Sopenharmony_ci    }bits;
6591bd4fe43Sopenharmony_ci};
6601bd4fe43Sopenharmony_ci
6611bd4fe43Sopenharmony_ci#define SDHCI_PEND_REQUEST_DONE (1 << 0)
6621bd4fe43Sopenharmony_ci#define SDHCI_PEND_ACCIDENT (1 << 1)
6631bd4fe43Sopenharmony_cistruct SdhciHost {
6641bd4fe43Sopenharmony_ci    struct MmcCntlr *mmc;
6651bd4fe43Sopenharmony_ci    struct MmcCmd *cmd;
6661bd4fe43Sopenharmony_ci    void *base;
6671bd4fe43Sopenharmony_ci    uint32_t irqNum;
6681bd4fe43Sopenharmony_ci    uint32_t irqEnable;
6691bd4fe43Sopenharmony_ci    uint32_t hostId;
6701bd4fe43Sopenharmony_ci    union SdhciHostQuirks quirks;
6711bd4fe43Sopenharmony_ci    uint32_t flags;
6721bd4fe43Sopenharmony_ci    uint16_t version;
6731bd4fe43Sopenharmony_ci    uint32_t maxClk;
6741bd4fe43Sopenharmony_ci    uint32_t clkMul;
6751bd4fe43Sopenharmony_ci    uint32_t clock;
6761bd4fe43Sopenharmony_ci    uint8_t pwr;
6771bd4fe43Sopenharmony_ci    bool presetEnabled;
6781bd4fe43Sopenharmony_ci    struct OsalMutex mutex;
6791bd4fe43Sopenharmony_ci    SDHCI_EVENT sdhciEvent;
6801bd4fe43Sopenharmony_ci    bool waitForEvent;
6811bd4fe43Sopenharmony_ci    uint8_t *alignedBuff;
6821bd4fe43Sopenharmony_ci    uint32_t buffLen;
6831bd4fe43Sopenharmony_ci    struct scatterlist dmaSg;
6841bd4fe43Sopenharmony_ci    struct scatterlist *sg;
6851bd4fe43Sopenharmony_ci    uint32_t dmaSgCount;
6861bd4fe43Sopenharmony_ci    char *admaDesc;
6871bd4fe43Sopenharmony_ci    uint32_t admaDescSize;
6881bd4fe43Sopenharmony_ci    uint32_t admaDescLineSize;
6891bd4fe43Sopenharmony_ci    uint32_t admaMaxDesc;
6901bd4fe43Sopenharmony_ci    uint32_t tuningPhase;
6911bd4fe43Sopenharmony_ci};
6921bd4fe43Sopenharmony_ci
6931bd4fe43Sopenharmony_cistatic inline void SdhciWritel(struct SdhciHost *host, uint32_t val, int reg)
6941bd4fe43Sopenharmony_ci{
6951bd4fe43Sopenharmony_ci    OSAL_WRITEL(val, (uintptr_t)host->base + reg);
6961bd4fe43Sopenharmony_ci}
6971bd4fe43Sopenharmony_ci
6981bd4fe43Sopenharmony_cistatic inline void SdhciWritew(struct SdhciHost *host, uint16_t val, int reg)
6991bd4fe43Sopenharmony_ci{
7001bd4fe43Sopenharmony_ci    OSAL_WRITEW(val, (uintptr_t)host->base + reg);
7011bd4fe43Sopenharmony_ci}
7021bd4fe43Sopenharmony_ci
7031bd4fe43Sopenharmony_cistatic inline void SdhciWriteb(struct SdhciHost *host, uint8_t val, int reg)
7041bd4fe43Sopenharmony_ci{
7051bd4fe43Sopenharmony_ci    OSAL_WRITEB(val, (uintptr_t)host->base + reg);
7061bd4fe43Sopenharmony_ci}
7071bd4fe43Sopenharmony_ci
7081bd4fe43Sopenharmony_cistatic inline uint32_t SdhciReadl(struct SdhciHost *host, int reg)
7091bd4fe43Sopenharmony_ci{
7101bd4fe43Sopenharmony_ci    return OSAL_READL((uintptr_t)host->base + reg);
7111bd4fe43Sopenharmony_ci}
7121bd4fe43Sopenharmony_ci
7131bd4fe43Sopenharmony_cistatic inline uint16_t SdhciReadw(struct SdhciHost *host, int reg)
7141bd4fe43Sopenharmony_ci{
7151bd4fe43Sopenharmony_ci    return OSAL_READW((uintptr_t)host->base + reg);
7161bd4fe43Sopenharmony_ci}
7171bd4fe43Sopenharmony_ci
7181bd4fe43Sopenharmony_cistatic inline uint8_t SdhciReadb(struct SdhciHost *host, int reg)
7191bd4fe43Sopenharmony_ci{
7201bd4fe43Sopenharmony_ci    return OSAL_READB((uintptr_t)host->base + reg);
7211bd4fe43Sopenharmony_ci}
7221bd4fe43Sopenharmony_ci
7231bd4fe43Sopenharmony_ci#ifdef __cplusplus
7241bd4fe43Sopenharmony_ci#if __cplusplus
7251bd4fe43Sopenharmony_ci}
7261bd4fe43Sopenharmony_ci#endif /* __cplusplus */
7271bd4fe43Sopenharmony_ci#endif /* __cplusplus */
7281bd4fe43Sopenharmony_ci
7291bd4fe43Sopenharmony_ci#endif /* SDHCI_H */
730