diff --git a/drivers/mmc/arm_pl180_mmci.c b/drivers/mmc/arm_pl180_mmci.c index 809b86570a..f99b5f997e 100644 --- a/drivers/mmc/arm_pl180_mmci.c +++ b/drivers/mmc/arm_pl180_mmci.c @@ -443,15 +443,6 @@ static int arm_pl180_mmc_probe(struct udevice *dev) SDI_CLKCR_HWFC_EN; host->clock_in = clk_get_rate(&clk); - periphid = dev_read_u32_default(dev, "arm,primecell-periphid", 0); - switch (periphid) { - case STM32_MMCI_ID: /* stm32 variant */ - host->version2 = false; - break; - default: - host->version2 = true; - } - cfg->name = dev->name; cfg->voltages = VOLTAGE_WINDOW_SD; cfg->host_caps = 0; @@ -459,6 +450,23 @@ static int arm_pl180_mmc_probe(struct udevice *dev) cfg->f_max = MMC_CLOCK_MAX; cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT; + periphid = dev_read_u32_default(dev, "arm,primecell-periphid", 0); + switch (periphid) { + case STM32_MMCI_ID: /* stm32 variant */ + host->version2 = false; + break; + case UX500V2_MMCI_ID: + host->pwr_init = SDI_PWR_OPD | SDI_PWR_PWRCTRL_ON; + host->clkdiv_init = SDI_CLKCR_CLKDIV_INIT_V2 | SDI_CLKCR_CLKEN | + SDI_CLKCR_HWFC_EN; + cfg->voltages = VOLTAGE_WINDOW_MMC; + cfg->f_min = host->clock_in / (2 + SDI_CLKCR_CLKDIV_INIT_V2); + host->version2 = true; + break; + default: + host->version2 = true; + } + gpio_request_by_name(dev, "cd-gpios", 0, &host->cd_gpio, GPIOD_IS_IN); ret = mmc_of_parse(dev, cfg); diff --git a/drivers/mmc/arm_pl180_mmci.h b/drivers/mmc/arm_pl180_mmci.h index 61ee96a112..15c29beadb 100644 --- a/drivers/mmc/arm_pl180_mmci.h +++ b/drivers/mmc/arm_pl180_mmci.h @@ -142,6 +142,7 @@ #define SDI_FIFO_BURST_SIZE 8 #define STM32_MMCI_ID 0x00880180 +#define UX500V2_MMCI_ID 0x10480180 struct sdi_registers { u32 power; /* 0x00*/