1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

MMC host:

- mtk-sd: Fix register settings for hs400(es) mode
  - sdhci_am654: Revert patch for start-signal-voltage-switch
 -----BEGIN PGP SIGNATURE-----
 
 iQJLBAABCgA1FiEEugLDXPmKSktSkQsV/iaEJXNYjCkFAmevM+QXHHVsZi5oYW5z
 c29uQGxpbmFyby5vcmcACgkQ/iaEJXNYjCkgxhAAqthmTkHIacDPEyQMvrgTp3yV
 Cbvv4tKCNUGfeyG7BqONvzsc48kwb4TX5bGfQvAWe703j5amHiJlLi9uRbE8PSXs
 g4kGgKO/2Kyak5DpaJgq2cNFDlhNav8vIaXvq048Hene2TNkBKxgB6+eJHFX4Ty+
 xKSyX5lPHruuohyFQ9EOvB/azk/YfGKNhCHykqr1MSgxcvQoe9fxXKQdtYI213iH
 QT9E9BNd0s1dKTFx67RqWsfQK9/ih3y/VoAq1DdZPdZTDFZzXH+a2VrWznPwDPeb
 OEm/lSwlvDONlaR7p6TV74w/+VT3FmvuFZ5DgjWU69Wf1Z+Uh4OPimDUluopnwh7
 WSvex8PRAPqrDEslonEHcviCSeFrC7MwVFJX/dAqTfTp1LgroYDk0FgpNVwsljVv
 k5E0UGD4u422yiUDumiT19dmxFYSlZB3dtvZW3dPbOA7CdnCZeo1m+aGWpzL9Kpj
 4uVoDyUJM/vxHzHv2Lm5lIqTAqRNHEjvHLKKwGoJ5rDNoyqVn14WORf3x156Dsc4
 OxV/SlZccoQfS+3gGJWNCcFm7ahRBeG8r1kyKIDs3//eRJLCBAGQCaTu4/5V7Eyp
 mwVR606YCTAK9r5kGuRJ6oIXWqNLhmCWyRWvYd0uG/rkCNjJ3XRhtNKbU2NQqbjh
 ZR9zGiWThG9FmQwolHw=
 =zuz9
 -----END PGP SIGNATURE-----

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

Pull MMC host fixes from Ulf Hansson:

 - mtk-sd: Fix register settings for hs400(es) mode

 - sdhci_am654: Revert patch for start-signal-voltage-switch

* tag 'mmc-v6.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
  mmc: mtk-sd: Fix register settings for hs400(es) mode
  Revert "mmc: sdhci_am654: Add sdhci_am654_start_signal_voltage_switch"
This commit is contained in:
Linus Torvalds 2025-02-14 14:55:50 -08:00
commit f92a80bdb4
2 changed files with 20 additions and 41 deletions

View file

@ -273,6 +273,7 @@
#define MSDC_PAD_TUNE_CMD2_SEL BIT(21) /* RW */
#define PAD_DS_TUNE_DLY_SEL BIT(0) /* RW */
#define PAD_DS_TUNE_DLY2_SEL BIT(1) /* RW */
#define PAD_DS_TUNE_DLY1 GENMASK(6, 2) /* RW */
#define PAD_DS_TUNE_DLY2 GENMASK(11, 7) /* RW */
#define PAD_DS_TUNE_DLY3 GENMASK(16, 12) /* RW */
@ -318,6 +319,7 @@
/* EMMC50_PAD_DS_TUNE mask */
#define PAD_DS_DLY_SEL BIT(16) /* RW */
#define PAD_DS_DLY2_SEL BIT(15) /* RW */
#define PAD_DS_DLY1 GENMASK(14, 10) /* RW */
#define PAD_DS_DLY3 GENMASK(4, 0) /* RW */
@ -2504,13 +2506,23 @@ tune_done:
static int msdc_prepare_hs400_tuning(struct mmc_host *mmc, struct mmc_ios *ios)
{
struct msdc_host *host = mmc_priv(mmc);
host->hs400_mode = true;
if (host->top_base)
writel(host->hs400_ds_delay,
host->top_base + EMMC50_PAD_DS_TUNE);
else
writel(host->hs400_ds_delay, host->base + PAD_DS_TUNE);
if (host->top_base) {
if (host->hs400_ds_dly3)
sdr_set_field(host->top_base + EMMC50_PAD_DS_TUNE,
PAD_DS_DLY3, host->hs400_ds_dly3);
if (host->hs400_ds_delay)
writel(host->hs400_ds_delay,
host->top_base + EMMC50_PAD_DS_TUNE);
} else {
if (host->hs400_ds_dly3)
sdr_set_field(host->base + PAD_DS_TUNE,
PAD_DS_TUNE_DLY3, host->hs400_ds_dly3);
if (host->hs400_ds_delay)
writel(host->hs400_ds_delay, host->base + PAD_DS_TUNE);
}
/* hs400 mode must set it to 0 */
sdr_clr_bits(host->base + MSDC_PATCH_BIT2, MSDC_PATCH_BIT2_CFGCRCSTS);
/* to improve read performance, set outstanding to 2 */
@ -2530,14 +2542,11 @@ static int msdc_execute_hs400_tuning(struct mmc_host *mmc, struct mmc_card *card
if (host->top_base) {
sdr_set_bits(host->top_base + EMMC50_PAD_DS_TUNE,
PAD_DS_DLY_SEL);
if (host->hs400_ds_dly3)
sdr_set_field(host->top_base + EMMC50_PAD_DS_TUNE,
PAD_DS_DLY3, host->hs400_ds_dly3);
sdr_clr_bits(host->top_base + EMMC50_PAD_DS_TUNE,
PAD_DS_DLY2_SEL);
} else {
sdr_set_bits(host->base + PAD_DS_TUNE, PAD_DS_TUNE_DLY_SEL);
if (host->hs400_ds_dly3)
sdr_set_field(host->base + PAD_DS_TUNE,
PAD_DS_TUNE_DLY3, host->hs400_ds_dly3);
sdr_clr_bits(host->base + PAD_DS_TUNE, PAD_DS_TUNE_DLY2_SEL);
}
host->hs400_tuning = true;

View file

@ -155,7 +155,6 @@ struct sdhci_am654_data {
u32 tuning_loop;
#define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0)
#define SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA BIT(1)
};
struct window {
@ -357,29 +356,6 @@ static void sdhci_j721e_4bit_set_clock(struct sdhci_host *host,
sdhci_set_clock(host, clock);
}
static int sdhci_am654_start_signal_voltage_switch(struct mmc_host *mmc, struct mmc_ios *ios)
{
struct sdhci_host *host = mmc_priv(mmc);
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
int ret;
if ((sdhci_am654->quirks & SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA) &&
ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180) {
if (!IS_ERR(mmc->supply.vqmmc)) {
ret = mmc_regulator_set_vqmmc(mmc, ios);
if (ret < 0) {
pr_err("%s: Switching to 1.8V signalling voltage failed,\n",
mmc_hostname(mmc));
return -EIO;
}
}
return 0;
}
return sdhci_start_signal_voltage_switch(mmc, ios);
}
static u8 sdhci_am654_write_power_on(struct sdhci_host *host, u8 val, int reg)
{
writeb(val, host->ioaddr + reg);
@ -868,11 +844,6 @@ static int sdhci_am654_get_of_property(struct platform_device *pdev,
if (device_property_read_bool(dev, "ti,fails-without-test-cd"))
sdhci_am654->quirks |= SDHCI_AM654_QUIRK_FORCE_CDTEST;
/* Suppress v1p8 ena for eMMC and SD with vqmmc supply */
if (!!of_parse_phandle(dev->of_node, "vmmc-supply", 0) ==
!!of_parse_phandle(dev->of_node, "vqmmc-supply", 0))
sdhci_am654->quirks |= SDHCI_AM654_QUIRK_SUPPRESS_V1P8_ENA;
sdhci_get_of_property(pdev);
return 0;
@ -969,7 +940,6 @@ static int sdhci_am654_probe(struct platform_device *pdev)
goto err_pltfm_free;
}
host->mmc_host_ops.start_signal_voltage_switch = sdhci_am654_start_signal_voltage_switch;
host->mmc_host_ops.execute_tuning = sdhci_am654_execute_tuning;
pm_runtime_get_noresume(dev);