Loading drivers/mmc/core/mmc.c +1 −1 Original line number Diff line number Diff line Loading @@ -1198,7 +1198,7 @@ static int mmc_select_hs400(struct mmc_card *card) mmc_set_timing(host, MMC_TIMING_MMC_HS400); mmc_set_bus_speed(card); if (host->ops->enhanced_strobe) { if (card->ext_csd.strobe_support && host->ops->enhanced_strobe) { mmc_host_clk_hold(host); err = host->ops->enhanced_strobe(host); mmc_host_clk_release(host); Loading drivers/mmc/host/sdhci-msm.c +10 −7 Original line number Diff line number Diff line Loading @@ -787,7 +787,7 @@ static int sdhci_msm_cm_dll_sdc4_calibration(struct sdhci_host *host) writel_relaxed(ddr_config, host->ioaddr + CORE_DDR_CONFIG); } if (msm_host->enhanced_strobe) if (msm_host->enhanced_strobe && mmc_card_strobe(msm_host->mmc->card)) writel_relaxed((readl_relaxed(host->ioaddr + CORE_DDR_200_CFG) | CORE_CMDIN_RCLK_EN), host->ioaddr + CORE_DDR_200_CFG); Loading Loading @@ -835,8 +835,8 @@ static int sdhci_msm_enhanced_strobe(struct sdhci_host *host) pr_debug("%s: Enter %s\n", mmc_hostname(host->mmc), __func__); if (!msm_host->enhanced_strobe) { pr_debug("%s: host does not support hs400 enhanced strobe\n", if (!msm_host->enhanced_strobe || !mmc_card_strobe(mmc->card)) { pr_debug("%s: host/card does not support hs400 enhanced strobe\n", mmc_hostname(mmc)); return -EINVAL; } Loading Loading @@ -2670,7 +2670,9 @@ static void sdhci_msm_set_clock(struct sdhci_host *host, unsigned int clock) * Select HS400 mode using the HC_SELECT_IN from VENDOR SPEC * register */ if ((msm_host->tuning_done || msm_host->enhanced_strobe) && if ((msm_host->tuning_done || (mmc_card_strobe(msm_host->mmc->card) && msm_host->enhanced_strobe)) && !msm_host->calibration_done) { /* * Write 0x6 to HC_SELECT_IN and 1 to HC_SELECT_IN_EN Loading Loading @@ -2892,8 +2894,9 @@ static void sdhci_msm_enhanced_strobe_mask(struct sdhci_host *host, bool set) struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_msm_host *msm_host = pltfm_host->priv; if (!msm_host->enhanced_strobe) { pr_debug("%s: host does not support hs400 enhanced strobe\n", if (!msm_host->enhanced_strobe || !mmc_card_strobe(msm_host->mmc->card)) { pr_debug("%s: host/card does not support hs400 enhanced strobe\n", mmc_hostname(host->mmc)); return; } Loading include/linux/mmc/card.h +3 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ struct mmc_ext_csd { u8 raw_rpmb_size_mult; /* 168 */ u8 raw_erased_mem_count; /* 181 */ u8 strobe_support; /* 184 */ #define MMC_STROBE_SUPPORT (1 << 0) u8 raw_ext_csd_structure; /* 194 */ u8 raw_card_type; /* 196 */ u8 raw_drive_strength; /* 197 */ Loading Loading @@ -579,6 +580,8 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) #define mmc_card_set_auto_bkops(c) ((c)->state |= MMC_STATE_AUTO_BKOPS) #define mmc_card_clr_auto_bkops(c) ((c)->state &= ~MMC_STATE_AUTO_BKOPS) #define mmc_card_strobe(c) (((c)->ext_csd).strobe_support & MMC_STROBE_SUPPORT) /* * Quirk add/remove for MMC products. */ Loading Loading
drivers/mmc/core/mmc.c +1 −1 Original line number Diff line number Diff line Loading @@ -1198,7 +1198,7 @@ static int mmc_select_hs400(struct mmc_card *card) mmc_set_timing(host, MMC_TIMING_MMC_HS400); mmc_set_bus_speed(card); if (host->ops->enhanced_strobe) { if (card->ext_csd.strobe_support && host->ops->enhanced_strobe) { mmc_host_clk_hold(host); err = host->ops->enhanced_strobe(host); mmc_host_clk_release(host); Loading
drivers/mmc/host/sdhci-msm.c +10 −7 Original line number Diff line number Diff line Loading @@ -787,7 +787,7 @@ static int sdhci_msm_cm_dll_sdc4_calibration(struct sdhci_host *host) writel_relaxed(ddr_config, host->ioaddr + CORE_DDR_CONFIG); } if (msm_host->enhanced_strobe) if (msm_host->enhanced_strobe && mmc_card_strobe(msm_host->mmc->card)) writel_relaxed((readl_relaxed(host->ioaddr + CORE_DDR_200_CFG) | CORE_CMDIN_RCLK_EN), host->ioaddr + CORE_DDR_200_CFG); Loading Loading @@ -835,8 +835,8 @@ static int sdhci_msm_enhanced_strobe(struct sdhci_host *host) pr_debug("%s: Enter %s\n", mmc_hostname(host->mmc), __func__); if (!msm_host->enhanced_strobe) { pr_debug("%s: host does not support hs400 enhanced strobe\n", if (!msm_host->enhanced_strobe || !mmc_card_strobe(mmc->card)) { pr_debug("%s: host/card does not support hs400 enhanced strobe\n", mmc_hostname(mmc)); return -EINVAL; } Loading Loading @@ -2670,7 +2670,9 @@ static void sdhci_msm_set_clock(struct sdhci_host *host, unsigned int clock) * Select HS400 mode using the HC_SELECT_IN from VENDOR SPEC * register */ if ((msm_host->tuning_done || msm_host->enhanced_strobe) && if ((msm_host->tuning_done || (mmc_card_strobe(msm_host->mmc->card) && msm_host->enhanced_strobe)) && !msm_host->calibration_done) { /* * Write 0x6 to HC_SELECT_IN and 1 to HC_SELECT_IN_EN Loading Loading @@ -2892,8 +2894,9 @@ static void sdhci_msm_enhanced_strobe_mask(struct sdhci_host *host, bool set) struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_msm_host *msm_host = pltfm_host->priv; if (!msm_host->enhanced_strobe) { pr_debug("%s: host does not support hs400 enhanced strobe\n", if (!msm_host->enhanced_strobe || !mmc_card_strobe(msm_host->mmc->card)) { pr_debug("%s: host/card does not support hs400 enhanced strobe\n", mmc_hostname(host->mmc)); return; } Loading
include/linux/mmc/card.h +3 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ struct mmc_ext_csd { u8 raw_rpmb_size_mult; /* 168 */ u8 raw_erased_mem_count; /* 181 */ u8 strobe_support; /* 184 */ #define MMC_STROBE_SUPPORT (1 << 0) u8 raw_ext_csd_structure; /* 194 */ u8 raw_card_type; /* 196 */ u8 raw_drive_strength; /* 197 */ Loading Loading @@ -579,6 +580,8 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) #define mmc_card_set_auto_bkops(c) ((c)->state |= MMC_STATE_AUTO_BKOPS) #define mmc_card_clr_auto_bkops(c) ((c)->state &= ~MMC_STATE_AUTO_BKOPS) #define mmc_card_strobe(c) (((c)->ext_csd).strobe_support & MMC_STROBE_SUPPORT) /* * Quirk add/remove for MMC products. */ Loading