blob: 6bf5d9321bbffa28aa2a125aee8ffb5167a9cb16 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef HW_SDHCI_H_
#define HW_SDHCI_H_
//Fields of command register
#define SDHCI_CMD_IDX(c) ((c) << 24)
#define SDHCI_RESP_MASK (0x3 << 16)
#define SDHCI_CMD_RESP_LEN_EMPTY (0x0 << 16)
#define SDHCI_CMD_RESP_LEN_136 (0x1 << 16)
#define SDHCI_CMD_RESP_LEN_48 (0x2 << 16)
#define SDHCI_CMD_RESP_LEN_48B (0x3 << 16)
#define SDHCI_CMD_RESP_CRC_CHECK (0x1 << 19)
#define SDHCI_CMD_RESP_CMD_IDX_CHECK (0x1 << 20)
#define SDHCI_CMD_RESP_DATA_PRESENT (0x1 << 21)
#define SDHCI_CMD_TYPE_NORMAL (0x0 << 22)
#define SDHCI_CMD_TYPE_SUSPEND (0x1 << 22)
#define SDHCI_CMD_TYPE_RESUME (0x2 << 22)
#define SDHCI_CMD_TYPE_ABORT (0x3 << 22)
#define SDHCI_CMD_DMA_EN (1 << 0)
#define SDHCI_CMD_BLKCNT_EN (1 << 1)
#define SDHCI_CMD_AUTO12 (1 << 2)
#define SDHCI_CMD_AUTO23 (2 << 2)
#define SDHCI_CMD_READ (1 << 4)
#define SDHCI_CMD_MULTI_BLK (1 << 5)
typedef struct sdhci_regs {
uint32_t arg2; // 00h
uint32_t blkcntsiz; // 04h
uint32_t arg1; // 08h
uint32_t cmd; // 0Ch
#define SDHCI_XFERMODE_DMA_ENABLE (1 << 0)
uint32_t resp0; // 10h
uint32_t resp1; // 14h
uint32_t resp2; // 18h
uint32_t resp3; // 1Ch
uint32_t data; // 20h
uint32_t state; // 24h
#define SDHCI_STATE_CMD_INHIBIT (1 << 0)
#define SDHCI_STATE_DAT_INHIBIT (1 << 1)
#define SDHCI_STATE_DAT_LINE_ACTIVE (1 << 2)
#define SDHCI_STATE_RETUNING_REQUEST (1 << 3)
#define SDHCI_STATE_WRITE_TRANSFER_ACTIVE (1 << 8)
#define SDHCI_STATE_READ_TRANSFER_ACTIVE (1 << 9)
#define SDHCI_STATE_BUFFER_WRITE_ENABLE (1 << 10)
#define SDHCI_STATE_BUFFER_READ_ENABLE (1 << 11)
#define SDHCI_STATE_CARD_INSERTED (1 << 16)
#define SDHCI_STATE_CARD_STATE_STABLE (1 << 17)
#define SDHCI_STATE_CARD_DETECT_PIN_LEVEL (1 << 18)
#define SDHCI_STATE_WRITE_PROTECT (1 << 19)
#define SDHCI_STATE_CMD_LINE_SIGNAL_LVL (1 << 24)
uint32_t ctrl0; // 28h
#define SDHCI_HOSTCTRL_LED_ON (1 << 0)
#define SDHCI_HOSTCTRL_FOUR_BIT_BUS_WIDTH (1 << 1)
#define SDHCI_HOSTCTRL_HIGHSPEED_ENABLE (1 << 2)
#define SDHCI_HOSTCTRL_DMA_SELECT_ADMA2 (3 << 3)
#define SDHCI_HOSTCTRL_EXT_DATA_WIDTH (1 << 5)
#define SDHCI_PWRCTRL_SD_BUS_POWER (1 << 8)
#define SDHCI_PWRCTRL_SD_BUS_VOLTAGE_MASK (7 << 9)
#define SDHCI_PWRCTRL_SD_BUS_VOLTAGE_3P3V (7 << 9)
#define SDHCI_PWRCTRL_SD_BUS_VOLTAGE_3P0V (6 << 9)
#define SDHCI_PWRCTRL_SD_BUS_VOLTAGE_1P8V (5 << 9)
#define SDHCI_EMMC_HW_RESET (1 << 12)
uint32_t ctrl1; // 2Ch
#define SDHCI_INTERNAL_CLOCK_ENABLE (1 << 0)
#define SDHCI_INTERNAL_CLOCK_STABLE (1 << 1)
#define SDHCI_SD_CLOCK_ENABLE (1 << 2)
#define SDHCI_PROGRAMMABLE_CLOCK_GENERATOR (1 << 5)
#define SDHCI_SOFTWARE_RESET_ALL (1 << 24)
#define SDHCI_SOFTWARE_RESET_CMD (1 << 25)
#define SDHCI_SOFTWARE_RESET_DAT (1 << 26)
uint32_t irq; // 30h
uint32_t irqmsk; // 34h
uint32_t irqen; // 38h
#define SDHCI_IRQ_CMD_CPLT (1 << 0)
#define SDHCI_IRQ_XFER_CPLT (1 << 1)
#define SDHCI_IRQ_BLK_GAP_EVT (1 << 2)
#define SDHCI_IRQ_DMA (1 << 3)
#define SDHCI_IRQ_BUFF_WRITE_READY (1 << 4)
#define SDHCI_IRQ_BUFF_READ_READY (1 << 5)
#define SDHCI_IRQ_CARD_INSERTION (1 << 6)
#define SDHCI_IRQ_CARD_REMOVAL (1 << 7)
#define SDHCI_IRQ_CARD_INTERRUPT (1 << 8)
#define SDHCI_IRQ_A (1 << 9)
#define SDHCI_IRQ_B (1 << 10)
#define SDHCI_IRQ_C (1 << 11)
#define SDHCI_IRQ_RETUNING (1 << 12)
#define SDHCI_IRQ_ERR (1 << 15)
#define SDHCI_IRQ_ERR_CMD_TIMEOUT (1 << 16)
#define SDHCI_IRQ_ERR_CMD_CRC (1 << 17)
#define SDHCI_IRQ_ERR_CMD_END_BIT (1 << 18)
#define SDHCI_IRQ_ERR_CMD_INDEX (1 << 19)
#define SDHCI_IRQ_ERR_CMD (SDHCI_IRQ_ERR_CMD_TIMEOUT | \
SDHCI_IRQ_ERR_CMD_CRC | \
SDHCI_IRQ_ERR_CMD_END_BIT | \
SDHCI_IRQ_ERR_CMD_INDEX)
#define SDHCI_IRQ_ERR_DAT_TIMEOUT (1 << 20)
#define SDHCI_IRQ_ERR_DAT_CRC (1 << 21)
#define SDHCI_IRQ_ERR_DAT_ENDBIT (1 << 22)
#define SDHCI_IRQ_ERR_DAT (SDHCI_IRQ_ERR_DAT_TIMEOUT | \
SDHCI_IRQ_ERR_DAT_CRC | \
SDHCI_IRQ_ERR_DAT_ENDBIT)
#define SDHCI_IRQ_ERR_CURRENT_LIMIT (1 << 23)
#define SDHCI_IRQ_ERR_AUTO_CMD (1 << 24)
#define SDHCI_IRQ_ERR_ADMA (1 << 25)
#define SDHCI_IRQ_ERR_TUNING (1 << 26)
#define SDHCI_IRQ_ERR_VS_1 (1 << 28)
#define SDHCI_IRQ_ERR_VS_2 (1 << 29)
#define SDHCI_IRQ_ERR_VS_3 (1 << 30)
#define SDHCI_IRQ_ERR_VS_4 (1 << 31)
uint32_t ctrl2; // 3Ch
#define SDHCI_HOSTCTRL2_UHS_MODE_SELECT_MASK (7 << 16)
#define SDHCI_HOSTCTRL2_UHS_MODE_SELECT_SDR12 (0 << 16)
#define SDHCI_HOSTCTRL2_UHS_MODE_SELECT_SDR25 (1 << 16)
#define SDHCI_HOSTCTRL2_UHS_MODE_SELECT_SDR50 (2 << 16)
#define SDHCI_HOSTCTRL2_UHS_MODE_SELECT_SDR104 (3 << 16)
#define SDHCI_HOSTCTRL2_UHS_MODE_SELECT_DDR50 (4 << 16)
#define SDHCI_HOSTCTRL2_UHS_MODE_SELECT_HS400 (5 << 16)
#define SDHCI_HOSTCTRL2_1P8V_SIGNALLING_ENA (1 << 19)
#define SDHCI_HOSTCTRL2_EXEC_TUNING (1 << 22)
#define SDHCI_HOSTCTRL2_CLOCK_SELECT (1 << 23)
uint32_t caps0; // 40h
#define SDHCI_CORECFG_8_BIT_SUPPORT (1 << 18)
#define SDHCI_CORECFG_ADMA2_SUPPORT (1 << 19)
#define SDHCI_CORECFG_3P3_VOLT_SUPPORT (1 << 24)
#define SDHCI_CORECFG_3P0_VOLT_SUPPORT (1 << 25)
#define SDHCI_CORECFG_1P8_VOLT_SUPPORT (1 << 26)
#define SDHCI_CORECFG_64BIT_SUPPORT (1 << 28)
uint32_t caps1; // 44h
uint32_t maxcaps0; // 48h
uint32_t maxcaps1; // 4Ch
uint32_t forceirq; // 50h
uint32_t admaerr; // 54h
uint32_t admaaddr0; // 58h
uint32_t admaaddr1; // 5Ch
uint32_t preset[4]; // 60h
uint8_t resvd[112];
uint32_t busctl;
uint8_t _reserved_4[24];
uint32_t slotirqversion;
#define SDHCI_VERSION_1 0x00
#define SDHCI_VERSION_2 0x01
#define SDHCI_VERSION_3 0x02
} __PACKED sdhci_regs_t;
#endif // HW_SDHCI_H_