diff options
Diffstat (limited to 'drivers/mmc/host/sdhci-of-esdhc.c')
-rw-r--r-- | drivers/mmc/host/sdhci-of-esdhc.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index 6e46d2f..291bad1 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c @@ -24,6 +24,9 @@ #define VENDOR_V_22 0x12 #define VENDOR_V_23 0x13 + +static u32 svr; + static u32 esdhc_readl(struct sdhci_host *host, int reg) { u32 ret; @@ -146,7 +149,7 @@ static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg) if (!host->pwr || !val) return; - if (fsl_svr_is(SVR_T4240)) { + if (SVR_SOC_VER(svr) == SVR_T4240) { u8 vol; vol = sdhci_be32bs_readb(host, reg); @@ -202,11 +205,21 @@ static void esdhci_of_adma_workaround(struct sdhci_host *host, u32 intmask) * Check for A-004388: eSDHC DMA might not stop if error * occurs on system transaction * Impact list: - * T4240-R1.0 B4860-R1.0 P1010-R1.0 + * T4240-4160-R1.0 B4860-4420-R1.0 P1010-1014-R1.0 + * P3041-R1.0-R2.0-R1.1 P2041-2040-R1.0-R1.1-R2.0 + * P5040-5021-R2.0 */ - if (!((fsl_svr_is(SVR_T4240) && fsl_svr_rev_is(1, 0)) || - (fsl_svr_is(SVR_B4860) && fsl_svr_rev_is(1, 0)) || - (fsl_svr_is(SVR_P1010) && fsl_svr_rev_is(1, 0)))) + if (!(((SVR_SOC_VER(svr) == SVR_T4240) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_T4160) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_B4420) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_B4860) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_P1010) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_P1014) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_P3041) && (SVR_REV(svr) <= 0x20)) || + ((SVR_SOC_VER(svr) == SVR_P2041) && (SVR_REV(svr) <= 0x20)) || + ((SVR_SOC_VER(svr) == SVR_P2040) && (SVR_REV(svr) <= 0x20)) || + ((SVR_SOC_VER(svr) == SVR_P5021) && (SVR_REV(svr) == 0x20)) || + ((SVR_SOC_VER(svr) == SVR_P5040) && (SVR_REV(svr) == 0x20)))) return; if (host->flags & SDHCI_USE_ADMA) { @@ -335,6 +348,7 @@ static void esdhc_of_platform_init(struct sdhci_host *host) { u32 vvn; + svr = mfspr(SPRN_SVR); vvn = in_be32(host->ioaddr + SDHCI_SLOT_INT_STATUS); vvn = (vvn & SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT; if (vvn == VENDOR_V_22) @@ -350,14 +364,12 @@ static void esdhc_of_platform_init(struct sdhci_host *host) * T4240-R1.0 B4860-R1.0 P3041-R1.0 P3041-R2.0 P2041-R1.0 * P2041-R1.1 P2041-R2.0 P1010-R1.0 */ - if ((fsl_svr_is(SVR_T4240) && fsl_svr_rev_is(1, 0)) || - (fsl_svr_is(SVR_B4860) && fsl_svr_rev_is(1, 0)) || - (fsl_svr_is(SVR_P3041) && fsl_svr_rev_is(1, 0)) || - (fsl_svr_is(SVR_P3041) && fsl_svr_rev_is(2, 0)) || - (fsl_svr_is(SVR_P2041) && fsl_svr_rev_is(2, 0)) || - (fsl_svr_is(SVR_P2041) && fsl_svr_rev_is(1, 1)) || - (fsl_svr_is(SVR_P2041) && fsl_svr_rev_is(1, 0)) || - (fsl_svr_is(SVR_P1010) && fsl_svr_rev_is(1, 0))) + if (((SVR_SOC_VER(svr) == SVR_T4240) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_B4860) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_P1010) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_P3041) && (SVR_REV(svr) == 0x10)) || + ((SVR_SOC_VER(svr) == SVR_P3041) && (SVR_REV(svr) == 0x20)) || + ((SVR_SOC_VER(svr) == SVR_P2041) && (SVR_REV(svr) <= 0x20))) host->quirks2 |= SDHCI_QUIRK2_BROKEN_RESET_ALL; } |