Merge tag 'mmc-v6.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

Pull MMC fixes from Ulf Hansson:

- rtsx_pci_sdmmc: Fix signal voltage switch

- sdhci-of-dwcmshc:
- A couple of fixes for Eswin EIC7700
- Fix support for HS200/HS400 mode

* tag 'mmc-v6.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
mmc: sdhci-of-dwcmshc: Fix DMA 128MB boundary for Eswin EIC7700
mmc: sdhci-of-dwcmshc: Fix init for AXI clock for Eswin EIC7700
mmc: rtsx_pci_sdmmc: implement sdmmc_card_busy function
mmc: sdhci-of-dwcmshc: Prevent illegal clock reduction in HS200/HS400 mode

+55
+41
drivers/mmc/host/rtsx_pci_sdmmc.c
··· 1306 return err; 1307 } 1308 1309 static int sdmmc_execute_tuning(struct mmc_host *mmc, u32 opcode) 1310 { 1311 struct realtek_pci_sdmmc *host = mmc_priv(mmc); ··· 1458 .get_ro = sdmmc_get_ro, 1459 .get_cd = sdmmc_get_cd, 1460 .start_signal_voltage_switch = sdmmc_switch_voltage, 1461 .execute_tuning = sdmmc_execute_tuning, 1462 .init_sd_express = sdmmc_init_sd_express, 1463 };
··· 1306 return err; 1307 } 1308 1309 + static int sdmmc_card_busy(struct mmc_host *mmc) 1310 + { 1311 + struct realtek_pci_sdmmc *host = mmc_priv(mmc); 1312 + struct rtsx_pcr *pcr = host->pcr; 1313 + int err; 1314 + u8 stat; 1315 + u8 mask = SD_DAT3_STATUS | SD_DAT2_STATUS | SD_DAT1_STATUS 1316 + | SD_DAT0_STATUS; 1317 + 1318 + mutex_lock(&pcr->pcr_mutex); 1319 + 1320 + rtsx_pci_start_run(pcr); 1321 + 1322 + err = rtsx_pci_write_register(pcr, SD_BUS_STAT, 1323 + SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 1324 + SD_CLK_TOGGLE_EN); 1325 + if (err) 1326 + goto out; 1327 + 1328 + mdelay(1); 1329 + 1330 + err = rtsx_pci_read_register(pcr, SD_BUS_STAT, &stat); 1331 + if (err) 1332 + goto out; 1333 + 1334 + err = rtsx_pci_write_register(pcr, SD_BUS_STAT, 1335 + SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0); 1336 + out: 1337 + mutex_unlock(&pcr->pcr_mutex); 1338 + 1339 + if (err) 1340 + return err; 1341 + 1342 + /* check if any pin between dat[0:3] is low */ 1343 + if ((stat & mask) != mask) 1344 + return 1; 1345 + else 1346 + return 0; 1347 + } 1348 + 1349 static int sdmmc_execute_tuning(struct mmc_host *mmc, u32 opcode) 1350 { 1351 struct realtek_pci_sdmmc *host = mmc_priv(mmc); ··· 1418 .get_ro = sdmmc_get_ro, 1419 .get_cd = sdmmc_get_cd, 1420 .start_signal_voltage_switch = sdmmc_switch_voltage, 1421 + .card_busy = sdmmc_card_busy, 1422 .execute_tuning = sdmmc_execute_tuning, 1423 .init_sd_express = sdmmc_init_sd_express, 1424 };
+14
drivers/mmc/host/sdhci-of-dwcmshc.c
··· 739 sdhci_writel(host, extra, reg); 740 741 if (clock <= 52000000) { 742 /* 743 * Disable DLL and reset both of sample and drive clock. 744 * The bypass bit and start bit need to be set if DLL is not locked. ··· 1595 { 1596 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO; 1597 unsigned int val, hsp_int_status, hsp_pwr_ctrl; 1598 struct of_phandle_args args; 1599 struct eic7700_priv *priv; 1600 struct regmap *hsp_regmap; ··· 1612 dev_err(dev, "failed to reset\n"); 1613 return ret; 1614 } 1615 1616 ret = of_parse_phandle_with_fixed_args(dev->of_node, "eswin,hsp-sp-csr", 2, 0, &args); 1617 if (ret) { ··· 1739 .set_uhs_signaling = sdhci_eic7700_set_uhs_wrapper, 1740 .set_power = sdhci_set_power_and_bus_voltage, 1741 .irq = dwcmshc_cqe_irq_handler, 1742 .platform_execute_tuning = sdhci_eic7700_executing_tuning, 1743 }; 1744
··· 739 sdhci_writel(host, extra, reg); 740 741 if (clock <= 52000000) { 742 + if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200 || 743 + host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { 744 + dev_err(mmc_dev(host->mmc), 745 + "Can't reduce the clock below 52MHz in HS200/HS400 mode"); 746 + return; 747 + } 748 + 749 /* 750 * Disable DLL and reset both of sample and drive clock. 751 * The bypass bit and start bit need to be set if DLL is not locked. ··· 1588 { 1589 u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO; 1590 unsigned int val, hsp_int_status, hsp_pwr_ctrl; 1591 + static const char * const clk_ids[] = {"axi"}; 1592 struct of_phandle_args args; 1593 struct eic7700_priv *priv; 1594 struct regmap *hsp_regmap; ··· 1604 dev_err(dev, "failed to reset\n"); 1605 return ret; 1606 } 1607 + 1608 + ret = dwcmshc_get_enable_other_clks(mmc_dev(host->mmc), dwc_priv, 1609 + ARRAY_SIZE(clk_ids), clk_ids); 1610 + if (ret) 1611 + return ret; 1612 1613 ret = of_parse_phandle_with_fixed_args(dev->of_node, "eswin,hsp-sp-csr", 2, 0, &args); 1614 if (ret) { ··· 1726 .set_uhs_signaling = sdhci_eic7700_set_uhs_wrapper, 1727 .set_power = sdhci_set_power_and_bus_voltage, 1728 .irq = dwcmshc_cqe_irq_handler, 1729 + .adma_write_desc = dwcmshc_adma_write_desc, 1730 .platform_execute_tuning = sdhci_eic7700_executing_tuning, 1731 }; 1732