From fb27ca98811973199b23146f6d33a27daaf3a9ff Mon Sep 17 00:00:00 2001 From: Antony Arun T Date: Mon, 27 May 2019 21:36:57 +0530 Subject: [PATCH] mmc: ipq6018: fix for mmc iopad issue Change-Id: I71353b93ef7c62bfcdff2f9207bb26bcdd882c88 Signed-off-by: Antony Arun T --- board/qca/arm/ipq40xx/ipq40xx.h | 5 +++++ board/qca/arm/ipq6018/ipq6018.c | 9 +++++++++ board/qca/arm/ipq806x/ipq806x.h | 5 +++++ board/qca/arm/ipq807x/ipq807x.h | 4 ++++ drivers/mmc/sdhci.c | 2 ++ include/sdhci.h | 3 +++ 6 files changed, 28 insertions(+) diff --git a/board/qca/arm/ipq40xx/ipq40xx.h b/board/qca/arm/ipq40xx/ipq40xx.h index d0b35cfab7..17b2c40a8b 100644 --- a/board/qca/arm/ipq40xx/ipq40xx.h +++ b/board/qca/arm/ipq40xx/ipq40xx.h @@ -172,4 +172,9 @@ extern const add_node_t add_fdt_node[]; unsigned int get_board_index(unsigned int machid); void reset_crashdump(void); void ipq_fdt_fixup_socinfo(void *blob); + +__weak void mmc_iopad_config(struct sdhci_host *host) +{ + return; +} #endif diff --git a/board/qca/arm/ipq6018/ipq6018.c b/board/qca/arm/ipq6018/ipq6018.c index dddbd256e1..98fdc8cbb9 100644 --- a/board/qca/arm/ipq6018/ipq6018.c +++ b/board/qca/arm/ipq6018/ipq6018.c @@ -236,6 +236,15 @@ void emmc_clock_config() udelay(10); } +void mmc_iopad_config(struct sdhci_host *host) +{ + u32 val; + val = sdhci_readb(host, SDHCI_VENDOR_IOPAD); + /*set bit 15 & 16*/ + val |= 0x18000; + writel(val, host->ioaddr + SDHCI_VENDOR_IOPAD); +} + void emmc_clock_disable(void) { /* Clear divider */ diff --git a/board/qca/arm/ipq806x/ipq806x.h b/board/qca/arm/ipq806x/ipq806x.h index 1dd309193d..b8dcfef5ae 100644 --- a/board/qca/arm/ipq806x/ipq806x.h +++ b/board/qca/arm/ipq806x/ipq806x.h @@ -222,4 +222,9 @@ void reset_crashdump(void); void ipq_fdt_fixup_socinfo(void *blob); void board_pci_init(int id); void board_pcie_clock_init(int id); + +__weak void mmc_iopad_config(struct sdhci_host *host) +{ + return; +} #endif /* _IPQ806X_H_ */ diff --git a/board/qca/arm/ipq807x/ipq807x.h b/board/qca/arm/ipq807x/ipq807x.h index 89a67f6169..d2d5c0ff6d 100644 --- a/board/qca/arm/ipq807x/ipq807x.h +++ b/board/qca/arm/ipq807x/ipq807x.h @@ -304,4 +304,8 @@ __weak int ipq_get_tz_version(char *version_name, int buf_size) return 1; } +__weak void mmc_iopad_config(struct sdhci_host *host) +{ + return; +} #endif /* _IPQ807X_H_ */ diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index 6cb2a3b3d6..129d96b99a 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -673,6 +673,8 @@ int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk) sdhci_reset(host, SDHCI_RESET_ALL); + mmc_iopad_config(host); + host->mmc = mmc_create(&host->cfg, host); if (host->mmc == NULL) { printf("%s: mmc create fail!\n", __func__); diff --git a/include/sdhci.h b/include/sdhci.h index f0aa1d84b4..deeb2e4996 100644 --- a/include/sdhci.h +++ b/include/sdhci.h @@ -203,6 +203,9 @@ #define SDHCI_MAX_DIV_SPEC_200 256 #define SDHCI_MAX_DIV_SPEC_300 2046 +/*Vendor Specific register*/ +#define SDHCI_VENDOR_IOPAD 0x20C + /* * quirks */