@@ -18,6 +18,8 @@
#include <linux/of.h>
#include <linux/delay.h>
#include <linux/module.h>
+#include <linux/svr.h>
+#include <linux/fsl/guts.h>
#include <linux/mmc/host.h>
#include "sdhci-pltfm.h"
#include "sdhci-esdhc.h"
@@ -28,6 +30,8 @@
struct sdhci_esdhc {
u8 vendor_ver;
u8 spec_ver;
+ u32 soc_ver;
+ u8 soc_rev;
};
/**
@@ -566,18 +570,27 @@ static void esdhc_init(struct platform_device *pdev, struct sdhci_host *host)
{
struct sdhci_pltfm_host *pltfm_host;
struct sdhci_esdhc *esdhc;
+ struct ccsr_guts __iomem *guts;
+ u32 svr;
u16 host_ver;
pltfm_host = sdhci_priv(host);
esdhc = devm_kzalloc(&pdev->dev, sizeof(struct sdhci_esdhc),
GFP_KERNEL);
+ pltfm_host->priv = esdhc;
+
+ guts = guts_regmap();
+ if (guts) {
+ svr = guts_get_reg32(&guts->svr);
+ esdhc->soc_ver = SVR_SOC_VER(svr);
+ esdhc->soc_rev = SVR_REV(svr);
+ } else
+ dev_err(&pdev->dev, "unable to get SVR value!\n");
host_ver = sdhci_readw(host, SDHCI_HOST_VERSION);
esdhc->vendor_ver = (host_ver & SDHCI_VENDOR_VER_MASK) >>
SDHCI_VENDOR_VER_SHIFT;
esdhc->spec_ver = host_ver & SDHCI_SPEC_VER_MASK;
-
- pltfm_host->priv = esdhc;
}
static int sdhci_esdhc_probe(struct platform_device *pdev)
Most of silicon errata about the eSDHC need to be identified through the SoC version/revision. This patch makes the driver get these information from SVR(system version register) of global utilities registers. Signed-off-by: Yangbo Lu <yangbo.lu@freescale.com> --- Changes for v2: - Got SVR through iomap instead of dts Changes for v3: - Managed GUTS through syscon instead of iomap in eSDHC driver Changes for v4: - Got SVR by GUTS driver instead of SYSCON --- drivers/mmc/host/sdhci-of-esdhc.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)