drivers: esdhc: add support for ColdFire mcf5441x family
PATCH RESEND 1/1 drivers: esdhc: add support for ColdFire mcf5441x family
This patch has been tested on the mcf54415-based stmark2 board. The eSDHC driver works reliably using DMA mode.
Signed-off-by Angelo Dureghello <[email protected]>
---
Changes in v2:
- add be to le 32-bit byte swap for ColdFire,
- remove HS from host capabilities for ColdFire.
--- drivers/mmc/fsl_esdhc.c | 43 ++++++++++++++++++++++++++++++++++++++++- include/fsl_esdhc.h | 1 + 2 files changed, 43 insertions(+), 1 deletion(-)
drivers/mmc/fsl_esdhc.c +42 -1
@@ -384,6 +384,25 @@ static void check_and_invalidate_dcache_rangeinvalidate_dcache_range (start, end); } +#ifdef CONFIG_MCF5441x +/* +* Swaps 32-bit words to little-endian byte order. +*/ +static inline void sd_swap_dma_buff (struct mmc_data *data) +{ +int i, size = data->blocksize >>2 ; +u32 *buffer = (u32 *)data->dest; +u32 sw; + +while (data->blocks--) { +for (i =0 ; i < size; i++) { + sw =__sw32 (*buffer); + *buffer++ = sw; + } + } +} +#endif +/* * Sends a command out on the bus. Takes the mmc pointer, * a command pointer, and an optional data pointer.
@@ -546,8 +565,12 @@ static int esdhc_send_cmd_common(struct fsl_esdhc_priv *priv, struct mmc *mmc,* cache-fill during the DMA operations such as the * speculative pre-fetching etc. */ -if (data->flags &MMC_DATA_READ ) +if (data->flags &MMC_DATA_READ ) {check_and_invalidate_dcache_range (cmd, data); +#ifdef CONFIG_MCF5441x +sd_swap_dma_buff (data); +#endif + }#endif }
@@ -1029,8 +1052,12 @@ static int esdhc_init_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)/* Disable the BRR and BWR bits in IRQSTAT */ esdhc_clrbits32 (®s->irqstaten,IRQSTATEN_BRR |IRQSTATEN_BWR ); +#ifdef CONFIG_MCF5441x +esdhc_write32 (®s->proctl,PROCTL_INIT |PROCTL_D3CD ); +#else /* Put the PROCTL reg back to the default */ esdhc_write32 (®s->proctl,PROCTL_INIT ); +#endif /* Set timout to the maximum value */ esdhc_clrsetbits32 (®s->sysctl,SYSCTL_TIMEOUT_MASK ,14 <<16 );
@@ -1138,6 +1165,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,if (ret)return ret; +#ifdef CONFIG_MCF5441x +/* ColdFire, using SDHC_DATA[3] for card detection */ +esdhc_write32 (®s->proctl,PROCTL_INIT |PROCTL_D3CD ); +#endif +#ifndef CONFIG_FSL_USDHC esdhc_setbits32 (®s->sysctl,SYSCTL_PEREN |SYSCTL_HCKEN |SYSCTL_IPGEN |SYSCTL_CKEN );
@@ -1162,6 +1194,15 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv, voltage_caps =0 ; caps =esdhc_read32 (®s->hostcapblt); +#ifdef CONFIG_MCF5441x +/* +* MCF5441x RM declares in more points that sdhc clock speed must +* never exceed 25 Mhz. From this, the HS bit needs to be disabled +* from host capabilities. +*/ + caps &= ~ESDHC_HOSTCAPBLT_HSS ; +#endif +#ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC135 caps = caps & ~(ESDHC_HOSTCAPBLT_SRS |ESDHC_HOSTCAPBLT_VS18 |ESDHC_HOSTCAPBLT_VS30 );
include/fsl_esdhc.h +1 -0
@@ -106,6 +106,7 @@#define PROCTL_INIT 0x00000020#define PROCTL_DTW_4 0x00000002#define PROCTL_DTW_8 0x00000004 +#define PROCTL_D3CD 0x00000008#define CMDARG 0x0002e008
Signature · 1 line
2.20.1
PATCH RESEND 1/1 drivers: esdhc: add support for ColdFire mcf5441x family
Quoted 4 lines · Angelo Dureghello
This patch has been tested on the mcf54415-based stmark2 board. The eSDHC driver works reliably using DMA mode.
Signed-off-by Angelo Dureghello <[email protected]>
Applied to u-boot/master, thanks!
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: not available URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190126/978c427f/attachment.sig>