diff options
Diffstat (limited to 'drivers/mci')
-rw-r--r-- | drivers/mci/imx-esdhc-common.c | 2 | ||||
-rw-r--r-- | drivers/mci/mci-core.c | 36 | ||||
-rw-r--r-- | drivers/mci/stm32_sdmmc2.c | 7 |
3 files changed, 36 insertions, 9 deletions
diff --git a/drivers/mci/imx-esdhc-common.c b/drivers/mci/imx-esdhc-common.c index d0bef9470c..c9d589468f 100644 --- a/drivers/mci/imx-esdhc-common.c +++ b/drivers/mci/imx-esdhc-common.c @@ -214,7 +214,7 @@ int __esdhc_send_cmd(struct fsl_esdhc_host *host, struct mci_cmd *cmd, SDHCI_INT_CMD_COMPLETE, SDHCI_INT_CMD_COMPLETE, 100 * MSECOND); if (ret) { - dev_err(host->dev, "timeout 1\n"); + dev_dbg(host->dev, "timeout 1\n"); return -ETIMEDOUT; } diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c index dd163c3d16..34aaee54f9 100644 --- a/drivers/mci/mci-core.c +++ b/drivers/mci/mci-core.c @@ -668,10 +668,11 @@ retry_scr: static void mci_set_ios(struct mci *mci) { struct mci_host *host = mci->host; - struct mci_ios ios; - - ios.bus_width = host->bus_width; - ios.clock = host->clock; + struct mci_ios ios = { + .bus_width = host->bus_width, + .clock = host->clock, + .timing = host->timing, + }; host->set_ios(host, &ios); } @@ -996,6 +997,9 @@ static int mci_startup_sd(struct mci *mci) mci_set_bus_width(mci, MMC_BUS_WIDTH_4); } + if (mci->tran_speed > 25000000) + mci->host->timing = MMC_TIMING_SD_HS; + mci_set_clock(mci, mci->tran_speed); return 0; @@ -1021,6 +1025,8 @@ static int mci_startup_mmc(struct mci *mci) mci->tran_speed = 52000000; else mci->tran_speed = 26000000; + + host->timing = MMC_TIMING_MMC_HS; } mci_set_clock(mci, mci->tran_speed); @@ -1473,6 +1479,20 @@ static unsigned extract_mtd_year(struct mci *mci) return year; } +static const char *mci_timing_tostr(unsigned timing) +{ + switch (timing) { + case MMC_TIMING_LEGACY: + return "legacy"; + case MMC_TIMING_MMC_HS: + return "MMC HS"; + case MMC_TIMING_SD_HS: + return "SD HS"; + default: + return "unknown"; /* shouldn't happen */ + } +} + static void mci_print_caps(unsigned caps) { printf(" capabilities: %s%s%s%s%s\n", @@ -1509,6 +1529,7 @@ static void mci_info(struct device_d *dev) bw = 1; printf(" current buswidth: %d\n", bw); + printf(" current timing: %s\n", mci_timing_tostr(host->timing)); mci_print_caps(host->host_caps); printf("Card information:\n"); @@ -1801,6 +1822,7 @@ static int mci_detect(struct device_d *dev) int mci_register(struct mci_host *host) { struct mci *mci; + struct param_d *param_probe; int ret; mci = xzalloc(sizeof(*mci)); @@ -1832,11 +1854,11 @@ int mci_register(struct mci_host *host) dev_info(mci->host->hw_dev, "registered as %s\n", dev_name(&mci->dev)); - mci->param_probe = dev_add_param_bool(&mci->dev, "probe", + param_probe = dev_add_param_bool(&mci->dev, "probe", mci_set_probe, NULL, &mci->probe, mci); - if (IS_ERR(mci->param_probe) && PTR_ERR(mci->param_probe) != -ENOSYS) { - ret = PTR_ERR(mci->param_probe); + if (IS_ERR(param_probe) && PTR_ERR(param_probe) != -ENOSYS) { + ret = PTR_ERR(param_probe); dev_dbg(&mci->dev, "Failed to add 'probe' parameter to the MCI device\n"); goto err_unregister; } diff --git a/drivers/mci/stm32_sdmmc2.c b/drivers/mci/stm32_sdmmc2.c index 44f7e62399..0c26869b03 100644 --- a/drivers/mci/stm32_sdmmc2.c +++ b/drivers/mci/stm32_sdmmc2.c @@ -622,7 +622,7 @@ static int stm32_sdmmc2_probe(struct amba_device *adev, priv->reset_ctl = reset_control_get(dev, NULL); if (IS_ERR(priv->reset_ctl)) - priv->reset_ctl = NULL; + return PTR_ERR(priv->reset_ctl); mci->f_min = 400000; /* f_max is taken from kernel v5.3 variant_stm32_sdmmc */ @@ -631,6 +631,11 @@ static int stm32_sdmmc2_probe(struct amba_device *adev, mci_of_parse(&priv->mci); + if (mci->f_max >= 26000000) + mci->host_caps |= MMC_CAP_MMC_HIGHSPEED; + if (mci->f_max >= 52000000) + mci->host_caps |= MMC_CAP_MMC_HIGHSPEED_52MHZ; + return mci_register(&priv->mci); priv_free: |