drivers: esdhc: add support for ColdFire mcf5441x family
PATCH v2 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
@@ -382,6 +382,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.
@@ -538,8 +557,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 }
@@ -987,8 +1010,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 );
@@ -1096,6 +1123,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 );
@@ -1120,6 +1152,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.18.0