diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2019-12-02 07:19:49 -0800 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-12-04 08:37:12 +0100 |
commit | 10d13ce95256b09e716cacd8753c67b40e2b3149 (patch) | |
tree | ef80fcedb630e0e3552313124a48c25a0ad3f474 /drivers/mci/imx-esdhc.h | |
parent | b86dbc7b110d8eab0408d5766bd372d953334cf8 (diff) | |
download | barebox-10d13ce95256b09e716cacd8753c67b40e2b3149.tar.gz barebox-10d13ce95256b09e716cacd8753c67b40e2b3149.tar.xz |
mci: imx-esdhc-pbl: Share IO accessors with regular driver
With a bit of a change to PBL ESDHC initialization code it is possible
to share all of the low-level I/O accessor code with the regular
driver, including sharing definitions of flags describing HW's quirks.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mci/imx-esdhc.h')
-rw-r--r-- | drivers/mci/imx-esdhc.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/drivers/mci/imx-esdhc.h b/drivers/mci/imx-esdhc.h index ad05c4c0bf..e5647187b4 100644 --- a/drivers/mci/imx-esdhc.h +++ b/drivers/mci/imx-esdhc.h @@ -69,4 +69,102 @@ #define ESDHC_DMA_SYSCTL 0x40c /* Layerscape specific */ #define ESDHC_SYSCTL_DMA_SNOOP BIT(6) + +/* + * The CMDTYPE of the CMD register (offset 0xE) should be set to + * "11" when the STOP CMD12 is issued on imx53 to abort one + * open ended multi-blk IO. Otherwise the TC INT wouldn't + * be generated. + * In exact block transfer, the controller doesn't complete the + * operations automatically as required at the end of the + * transfer and remains on hold if the abort command is not sent. + * As a result, the TC flag is not asserted and SW received timeout + * exeception. Bit1 of Vendor Spec registor is used to fix it. + */ +#define ESDHC_FLAG_MULTIBLK_NO_INT BIT(1) +/* + * The flag enables the workaround for ESDHC errata ENGcm07207 which + * affects i.MX25 and i.MX35. + */ +#define ESDHC_FLAG_ENGCM07207 BIT(2) +/* + * The flag tells that the ESDHC controller is an USDHC block that is + * integrated on the i.MX6 series. + */ +#define ESDHC_FLAG_USDHC BIT(3) +/* The IP supports manual tuning process */ +#define ESDHC_FLAG_MAN_TUNING BIT(4) +/* The IP supports standard tuning process */ +#define ESDHC_FLAG_STD_TUNING BIT(5) +/* The IP has SDHCI_CAPABILITIES_1 register */ +#define ESDHC_FLAG_HAVE_CAP1 BIT(6) + +/* + * The IP has errata ERR004536 + * uSDHC: ADMA Length Mismatch Error occurs if the AHB read access is slow, + * when reading data from the card + */ +#define ESDHC_FLAG_ERR004536 BIT(7) +/* The IP supports HS200 mode */ +#define ESDHC_FLAG_HS200 BIT(8) +/* The IP supports HS400 mode */ +#define ESDHC_FLAG_HS400 BIT(9) +/* Need to access registers in bigendian mode */ +#define ESDHC_FLAG_BIGENDIAN BIT(10) +/* Enable cache snooping */ +#define ESDHC_FLAG_CACHE_SNOOPING BIT(11) + +struct esdhc_soc_data { + u32 flags; + const char *clkidx; +}; + +struct fsl_esdhc_host { + struct mci_host mci; + struct clk *clk; + struct device_d *dev; + void __iomem *regs; + const struct esdhc_soc_data *socdata; + struct sdhci sdhci; +}; + + +static inline int esdhc_is_usdhc(struct fsl_esdhc_host *data) +{ + return !!(data->socdata->flags & ESDHC_FLAG_USDHC); +} + +static inline struct fsl_esdhc_host *sdhci_to_esdhc(struct sdhci *sdhci) +{ + return container_of(sdhci, struct fsl_esdhc_host, sdhci); +} + +static inline void +esdhc_clrsetbits32(struct fsl_esdhc_host *host, unsigned int reg, + u32 clear, u32 set) +{ + u32 val; + + val = sdhci_read32(&host->sdhci, reg); + val &= ~clear; + val |= set; + sdhci_write32(&host->sdhci, reg, val); +} + +static inline void +esdhc_clrbits32(struct fsl_esdhc_host *host, unsigned int reg, + u32 clear) +{ + esdhc_clrsetbits32(host, reg, clear, 0); +} + +static inline void +esdhc_setbits32(struct fsl_esdhc_host *host, unsigned int reg, + u32 set) +{ + esdhc_clrsetbits32(host, reg, 0, set); +} + +void esdhc_populate_sdhci(struct fsl_esdhc_host *host); + #endif /* __FSL_ESDHC_H__ */ |