19 #define DMA_AVAILABLE ((CONFIG(SDHCI_ADMA_IN_BOOTBLOCK) && ENV_BOOTBLOCK) \
20 || (CONFIG(SDHCI_ADMA_IN_VERSTAGE) && ENV_SEPARATE_VERSTAGE) \
21 || (CONFIG(SDHCI_ADMA_IN_ROMSTAGE) && ENV_ROMSTAGE) \
22 || ENV_POSTCAR || ENV_RAMSTAGE)
26 return malloc(length_in_bytes);
51 for (i = 0; i < 4; i++) {
59 sdhc_trace(
"Response: 0x%08x.%08x.%08x.%08x\n",
70 struct mmc_data *data,
unsigned int start_addr)
90 sdhc_error(
"Error detected in status(0x%X)!\n", stat);
96 if (!(ps & ps_mask)) {
108 while (buffer_end >
buffer)
112 while (buffer_end >
buffer)
115 if (++block_count >= data->
blocks)
127 unsigned int stat = 0;
130 unsigned int timeout, start_addr = 0;
146 sdhc_trace(
"Cmd: %2d, Arg: 0x%08x, not sent\n",
148 sdhc_error(
"Controller never released inhibit bit(s), "
149 "present state %#8.8x.\n",
212 sdhc_trace(
"Error - IntStatus: 0x%08x\n", stat);
227 "Timeout for status update! IntStatus: 0x%08x\n",
297 unsigned int bbflags;
305 if (
CONFIG(SDHCI_BOUNCE_BUFFER) && data) {
321 bbstate = &bbstate_val;
324 "ERROR: Failed to get bounce buffer.\n");
335 if (
CONFIG(SDHCI_BOUNCE_BUFFER) && bbstate)
344 unsigned int actual, div, clk, timeout;
379 if (actual != ctrlr->
bus_hz) {
393 (actual / 1000) % 1000);
401 "Internal clock never stabilised.\n");
416 unsigned short power)
423 if (
power != (
unsigned short)-1) {
424 switch (1 <<
power) {
518 previous_ctrl = ctrl;
554 sdhc_debug(
"SDHCI bus width: %d bit%s\n", bus_width,
555 (bus_width != 1) ?
"s" :
"");
587 unsigned int caps, caps_1;
647 sdhc_error(
"Hardware doesn't specify base clock frequency\n");
655 sdhc_trace(
"%d.%03d MHz: ctrlr->clock_base\n",
659 ctrlr->
f_max / 1000000,
660 (ctrlr->
f_max / 1000) % 1000);
662 ctrlr->
f_min / 1000000,
663 (ctrlr->
f_min / 1000) % 1000);
685 sdhc_debug(
"SDHCI Controller Base Address: %p\n",
762 ctrlr->
b_max = 65535;
int bounce_buffer_start(struct bounce_buffer *state, void *data, size_t len, unsigned int flags)
bounce_buffer_start() – Start the bounce buffer session state: stores state passed between bounce_buf...
int bounce_buffer_stop(struct bounce_buffer *state)
bounce_buffer_stop() – Finish the bounce buffer session state: stores state passed between bounce_buf...
int dma_coherent(void *ptr)
void mdelay(unsigned int msecs)
#define DRVR_CAP_BROKEN_R1B
#define DRVR_CAP_NO_SIMULT_VDD_AND_POWER
#define DRVR_CAP_NO_HISPD_BIT
void * malloc(size_t size)
static int stopwatch_expired(struct stopwatch *sw)
static void stopwatch_init_msecs_expire(struct stopwatch *sw, long ms)
static const struct pnpconfig power[]
u8 buffer[C2P_BUFFER_MAXSIZE]
const struct smm_save_state_ops *legacy_ops __weak
#define sdhc_trace(format...)
#define sdhc_debug(format...)
#define sdhc_error(format...)
#define DRVR_CAP_HS200_TUNING
#define CMD_FLAG_IGNORE_INHIBIT
#define DRVR_CAP_REMOVABLE
#define DRVR_CAP_ENHANCED_STROBE
#define DRVR_CAP_DMA_64BIT
#define BUS_TIMING_LEGACY
#define MMC_CMD_AUTO_TUNING_SEQUENCE
#define DRVR_CAP_AUTO_CMD12
#define MMC_VDD_165_195_SHIFT
void sdhci_reset(struct sdhci_ctrlr *sdhci_ctrlr, u8 mask)
const u16 speed_driver_voltage[]
static int sdhci_update(struct sdhci_ctrlr *sdhci_ctrlr)
void sdhci_cmd_done(struct sdhci_ctrlr *sdhci_ctrlr, struct mmc_command *cmd)
void sdhci_update_pointers(struct sdhci_ctrlr *sdhci_ctrlr)
static void sdhci_set_uhs_signaling(struct sdhci_ctrlr *sdhci_ctrlr, uint32_t timing)
static int sdhci_pre_init(struct sdhci_ctrlr *sdhci_ctrlr)
__weak void sdhc_log_command(struct mmc_command *cmd)
static void sdhci_set_power(struct sdhci_ctrlr *sdhci_ctrlr, unsigned short power)
__weak void soc_sd_mmc_controller_quirks(struct sd_mmc_ctrlr *ctrlr)
static void sdhci_tuning_start(struct sd_mmc_ctrlr *ctrlr, int retune)
static int sdhci_init(struct sdhci_ctrlr *sdhci_ctrlr)
static int sdhci_send_command(struct sd_mmc_ctrlr *ctrlr, struct mmc_command *cmd, struct mmc_data *data)
static void sdhci_led_control(struct sd_mmc_ctrlr *ctrlr, int on)
int add_sdhci(struct sdhci_ctrlr *sdhci_ctrlr)
__weak void * dma_malloc(size_t length_in_bytes)
static void sdhci_set_ios(struct sd_mmc_ctrlr *ctrlr)
__weak void sdhc_log_response(uint32_t entries, uint32_t *response)
__weak void sdhc_log_ret(int ret)
__weak void sdhc_log_command_issued(void)
static int sdhci_set_clock(struct sdhci_ctrlr *sdhci_ctrlr, unsigned int clock)
static int sdhci_send_command_bounced(struct sd_mmc_ctrlr *ctrlr, struct mmc_command *cmd, struct mmc_data *data, struct bounce_buffer *bbstate)
static int sdhci_is_tuning_complete(struct sd_mmc_ctrlr *ctrlr, int *successful)
static int sdhci_transfer_data(struct sdhci_ctrlr *sdhci_ctrlr, struct mmc_data *data, unsigned int start_addr)
#define SDHCI_TRNS_ACMD12
#define SDHCI_CLOCK_INT_STABLE
#define SDHCI_CMD_RESP_NONE
#define SDHCI_CAN_DO_ADMA2
#define SDHCI_CARD_STATE_STABLE
#define SDHCI_CTRL_UHS_DDR50
#define SDHCI_HOST_VERSION
#define SDHCI_CTRL_UHS_SDR25
#define SDHCI_CAN_DO_8BIT
#define SDHCI_CTRL_EXEC_TUNING
#define SDHCI_CTRL_UHS_SDR12
#define SDHCI_MAX_DIV_SPEC_300
#define SDHCI_TIMEOUT_CONTROL
#define SDHCI_INT_DATA_MASK
#define SDHCI_CAN_VDD_330
static void sdhci_writew(struct sdhci_ctrlr *sdhci_ctrlr, u16 val, int reg)
#define SDHCI_SOFTWARE_RESET
#define SDHCI_CMD_RESP_LONG
#define SDHCI_CTRL_CD_TEST_INS
#define SDHCI_CLOCK_INT_EN
#define SDHCI_CTRL_4BITBUS
#define SDHCI_CTRL_UHS_SDR50
#define SDHCI_CTRL_TUNED_CLK
#define SDHCI_CTRL_UHS_MASK
#define SDHCI_CLOCK_BASE_SHIFT
int sdhci_setup_adma(struct sdhci_ctrlr *sdhci_ctrlr, struct mmc_data *data)
#define SDHCI_TRANSFER_MODE
#define SDHCI_CTRL_CD_TEST
#define SDHCI_HOST_CONTROL
#define SDHCI_CTRL_VDD_180
#define SDHCI_SPEC_VER_MASK
#define SDHCI_SPACE_AVAILABLE
int sdhci_complete_adma(struct sdhci_ctrlr *sdhci_ctrlr, struct mmc_command *cmd)
#define SDHCI_CTRL_DMA_MASK
#define SDHCI_CLOCK_CONTROL
#define SDHCI_MAX_DIV_SPEC_200
#define SDHCI_CLOCK_V3_BASE_MASK
#define SDHCI_CMD_RESP_SHORT
#define SDHCI_HOST_CONTROL2
static u8 sdhci_readb(struct sdhci_ctrlr *sdhci_ctrlr, int reg)
#define SDHCI_CTRL_ADMA64
static u32 sdhci_readl(struct sdhci_ctrlr *sdhci_ctrlr, int reg)
#define SDHCI_SUPPORT_HS400
#define SDHCI_INT_RESPONSE
#define SDHCI_DIV_MASK_LEN
#define SDHCI_INT_DATA_AVAIL
#define SDHCI_MAKE_CMD(c, f)
#define SDHCI_CAN_VDD_180
#define SDHCI_DATA_AVAILABLE
#define SDHCI_DATA_INHIBIT
#define SDHCI_TRNS_BLK_CNT_EN
static u16 sdhci_readw(struct sdhci_ctrlr *sdhci_ctrlr, int reg)
#define SDHCI_CMD_RESP_SHORT_BUSY
#define SDHCI_BLOCK_COUNT
#define SDHCI_DEFAULT_BOUNDARY_ARG
#define SDHCI_CTRL_8BITBUS
#define SDHCI_CTRL_UHS_SDR104
#define SDHCI_CAPABILITIES_1
#define SDHCI_CMD_INHIBIT
#define SDHCI_CLOCK_CARD_EN
#define SDHCI_CTRL_DRV_TYPE_A
#define SDHCI_CARD_PRESENT
#define SDHCI_DIVIDER_HI_SHIFT
#define SDHCI_PRESENT_STATE
#define SDHCI_CAN_VDD_300
#define SDHCI_INT_TIMEOUT
#define SDHCI_CARD_DETECT_PIN_LEVEL
static void sdhci_writel(struct sdhci_ctrlr *sdhci_ctrlr, u32 val, int reg)
#define SDHCI_INT_CMD_MASK
#define SDHCI_DIV_HI_MASK
#define SDHCI_SIGNAL_ENABLE
#define SDHCI_INT_ALL_MASK
#define SDHCI_CAPABILITIES
#define SDHCI_MAKE_BLKSZ(dma, blksz)
static void sdhci_writeb(struct sdhci_ctrlr *sdhci_ctrlr, u8 val, int reg)
#define SDHCI_CTRL_ADMA32
#define SDHCI_POWER_CONTROL
#define SDHCI_DIVIDER_SHIFT
#define SDHCI_CTRL_DRV_TYPE_MASK
#define SDHCI_INT_DATA_END
#define SDHCI_CLOCK_BASE_MASK
void(* tuning_start)(struct sd_mmc_ctrlr *ctrlr, int retune)
uint32_t udelay_wait_after_cmd
int(* send_cmd)(struct sd_mmc_ctrlr *ctrlr, struct mmc_command *cmd, struct mmc_data *data)
int(* is_tuning_complete)(struct sd_mmc_ctrlr *ctrlr, int *successful)
void(* set_ios)(struct sd_mmc_ctrlr *ctrlr)
struct sd_mmc_ctrlr sd_mmc_ctrlr