Skip to content

Commit d4be90c

Browse files
committed
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
2 parents 00d20db + 5cfc828 commit d4be90c

2 files changed

Lines changed: 55 additions & 0 deletions

File tree

drivers/mmc/host/rtsx_pci_sdmmc.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,6 +1306,46 @@ static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)
13061306
return err;
13071307
}
13081308

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+
13091349
static int sdmmc_execute_tuning(struct mmc_host *mmc, u32 opcode)
13101350
{
13111351
struct realtek_pci_sdmmc *host = mmc_priv(mmc);
@@ -1418,6 +1458,7 @@ static const struct mmc_host_ops realtek_pci_sdmmc_ops = {
14181458
.get_ro = sdmmc_get_ro,
14191459
.get_cd = sdmmc_get_cd,
14201460
.start_signal_voltage_switch = sdmmc_switch_voltage,
1461+
.card_busy = sdmmc_card_busy,
14211462
.execute_tuning = sdmmc_execute_tuning,
14221463
.init_sd_express = sdmmc_init_sd_express,
14231464
};

drivers/mmc/host/sdhci-of-dwcmshc.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,13 @@ static void dwcmshc_rk3568_set_clock(struct sdhci_host *host, unsigned int clock
739739
sdhci_writel(host, extra, reg);
740740

741741
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+
742749
/*
743750
* Disable DLL and reset both of sample and drive clock.
744751
* The bypass bit and start bit need to be set if DLL is not locked.
@@ -1588,6 +1595,7 @@ static int eic7700_init(struct device *dev, struct sdhci_host *host, struct dwcm
15881595
{
15891596
u32 emmc_caps = MMC_CAP2_NO_SD | MMC_CAP2_NO_SDIO;
15901597
unsigned int val, hsp_int_status, hsp_pwr_ctrl;
1598+
static const char * const clk_ids[] = {"axi"};
15911599
struct of_phandle_args args;
15921600
struct eic7700_priv *priv;
15931601
struct regmap *hsp_regmap;
@@ -1605,6 +1613,11 @@ static int eic7700_init(struct device *dev, struct sdhci_host *host, struct dwcm
16051613
return ret;
16061614
}
16071615

1616+
ret = dwcmshc_get_enable_other_clks(mmc_dev(host->mmc), dwc_priv,
1617+
ARRAY_SIZE(clk_ids), clk_ids);
1618+
if (ret)
1619+
return ret;
1620+
16081621
ret = of_parse_phandle_with_fixed_args(dev->of_node, "eswin,hsp-sp-csr", 2, 0, &args);
16091622
if (ret) {
16101623
dev_err(dev, "Fail to parse 'eswin,hsp-sp-csr' phandle (%d)\n", ret);
@@ -1726,6 +1739,7 @@ static const struct sdhci_ops sdhci_dwcmshc_eic7700_ops = {
17261739
.set_uhs_signaling = sdhci_eic7700_set_uhs_wrapper,
17271740
.set_power = sdhci_set_power_and_bus_voltage,
17281741
.irq = dwcmshc_cqe_irq_handler,
1742+
.adma_write_desc = dwcmshc_adma_write_desc,
17291743
.platform_execute_tuning = sdhci_eic7700_executing_tuning,
17301744
};
17311745

0 commit comments

Comments
 (0)