
From: Yangbo Lu yangbo.lu@freescale.com
This patch adds esdhc support for ls1043ardb.
Signed-off-by: Yangbo Lu yangbo.lu@freescale.com Signed-off-by: Gong Qianyu Qianyu.Gong@freescale.com --- arch/arm/cpu/armv8/fsl-lsch2/cpu.c | 10 ++++++++++ arch/arm/cpu/armv8/fsl-lsch2/fdt.c | 6 ++++++ arch/arm/cpu/armv8/fsl-lsch2/speed.c | 18 +++++++++++++++++- board/freescale/ls1043ardb/ls1043ardb.c | 1 + drivers/mmc/fsl_esdhc.c | 13 +++++++------ include/configs/ls1043a_common.h | 11 +++++++++++ include/fsl_esdhc.h | 2 +- 7 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/arch/arm/cpu/armv8/fsl-lsch2/cpu.c b/arch/arm/cpu/armv8/fsl-lsch2/cpu.c index ef63770..63b74d0 100644 --- a/arch/arm/cpu/armv8/fsl-lsch2/cpu.c +++ b/arch/arm/cpu/armv8/fsl-lsch2/cpu.c @@ -13,6 +13,9 @@ #include <asm/arch/immap_lsch2.h> #include <asm/arch/fsl_serdes.h> #include <fm_eth.h> +#ifdef CONFIG_FSL_ESDHC +#include <fsl_esdhc.h> +#endif #include "speed.h"
DECLARE_GLOBAL_DATA_PTR; @@ -495,6 +498,13 @@ int print_cpuinfo(void) } #endif
+#ifdef CONFIG_FSL_ESDHC +int cpu_mmc_init(bd_t *bis) +{ + return fsl_esdhc_mmc_init(bis); +} +#endif + /* * Initializes on-chip ethernet controllers. * to override, implement board_eth_init() diff --git a/arch/arm/cpu/armv8/fsl-lsch2/fdt.c b/arch/arm/cpu/armv8/fsl-lsch2/fdt.c index a646faa..f1ae1f1 100644 --- a/arch/arm/cpu/armv8/fsl-lsch2/fdt.c +++ b/arch/arm/cpu/armv8/fsl-lsch2/fdt.c @@ -8,6 +8,9 @@ #include <libfdt.h> #include <fdt_support.h> #include <phy.h> +#ifdef CONFIG_FSL_ESDHC +#include <fsl_esdhc.h> +#endif
int fdt_fixup_phy_connection(void *blob, int offset, phy_interface_t phyc) { @@ -17,4 +20,7 @@ int fdt_fixup_phy_connection(void *blob, int offset, phy_interface_t phyc)
void ft_cpu_setup(void *blob, bd_t *bd) { +#if defined(CONFIG_FSL_ESDHC) + fdt_fixup_esdhc(blob, bd); +#endif } diff --git a/arch/arm/cpu/armv8/fsl-lsch2/speed.c b/arch/arm/cpu/armv8/fsl-lsch2/speed.c index 3bc6401..4c59baa 100644 --- a/arch/arm/cpu/armv8/fsl-lsch2/speed.c +++ b/arch/arm/cpu/armv8/fsl-lsch2/speed.c @@ -25,7 +25,7 @@ void get_sys_info(struct sys_info *sys_info) struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL}; u32 ccr; #endif -#ifdef CONFIG_SYS_DPAA_FMAN +#if defined(CONFIG_FSL_ESDHC) || defined(CONFIG_SYS_DPAA_FMAN) u32 rcw_tmp; #endif struct ccsr_clk *clk = (void *)(CONFIG_SYS_FSL_CLK_ADDR); @@ -105,6 +105,11 @@ void get_sys_info(struct sys_info *sys_info)
#define HWA_CGA_M2_CLK_SEL 0x00000007 #define HWA_CGA_M2_CLK_SHIFT 0 +#if defined(CONFIG_FSL_ESDHC) + rcw_tmp = in_be32(&gur->rcwsr[15]); + rcw_tmp = (rcw_tmp & HWA_CGA_M2_CLK_SEL) >> HWA_CGA_M2_CLK_SHIFT; + sys_info->freq_sdhc = freq_c_pll[1] / rcw_tmp; +#endif
#if defined(CONFIG_FSL_IFC) ccr = in_le32(&ifc_regs.gregs->ifc_ccr); @@ -123,6 +128,10 @@ int get_clocks(void) gd->bus_clk = sys_info.freq_systembus; gd->mem_clk = sys_info.freq_ddrbus;
+#if defined(CONFIG_FSL_ESDHC) + gd->arch.sdhc_clk = sys_info.freq_sdhc; +#endif + if (gd->cpu_clk != 0) return 0; else @@ -139,6 +148,11 @@ ulong get_ddr_freq(ulong dummy) return gd->mem_clk; }
+int get_sdhc_freq(ulong dummy) +{ + return gd->arch.sdhc_clk; +} + int get_serial_clock(void) { return gd->bus_clk; @@ -149,6 +163,8 @@ unsigned int mxc_get_clock(enum mxc_clock clk) switch (clk) { case MXC_I2C_CLK: return get_bus_freq(0); + case MXC_ESDHC_CLK: + return get_sdhc_freq(0); case MXC_DSPI_CLK: return get_bus_freq(0); case MXC_UART_CLK: diff --git a/board/freescale/ls1043ardb/ls1043ardb.c b/board/freescale/ls1043ardb/ls1043ardb.c index 5a2f3bd..de6682a 100644 --- a/board/freescale/ls1043ardb/ls1043ardb.c +++ b/board/freescale/ls1043ardb/ls1043ardb.c @@ -13,6 +13,7 @@ #include <asm/arch/soc.h> #include <hwconfig.h> #include <ahci.h> +#include <mmc.h> #include <scsi.h> #include <fm_eth.h> #include <fsl_csu.h> diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c index 0b37002..0a22874 100644 --- a/drivers/mmc/fsl_esdhc.c +++ b/drivers/mmc/fsl_esdhc.c @@ -106,7 +106,8 @@ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data) xfertyp |= XFERTYP_RSPTYP_48;
#if defined(CONFIG_MX53) || defined(CONFIG_PPC_T4240) || \ - defined(CONFIG_LS102XA) || defined(CONFIG_LS2085A) + defined(CONFIG_LS102XA) || defined(CONFIG_LS2085A) || \ + defined(CONFIG_LS1043A) if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) xfertyp |= XFERTYP_CMDTYP_ABORT; #endif @@ -184,7 +185,7 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) int timeout; struct fsl_esdhc_cfg *cfg = mmc->priv; struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; -#ifdef CONFIG_LS2085A +#if defined(CONFIG_LS2085A) || defined(CONFIG_LS1043A) dma_addr_t addr; #endif uint wml_value; @@ -197,7 +198,7 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
esdhc_clrsetbits32(®s->wml, WML_RD_WML_MASK, wml_value); #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO -#ifdef CONFIG_LS2085A +#if defined(CONFIG_LS2085A) || defined(CONFIG_LS1043A) addr = virt_to_phys((void *)(data->dest)); if (upper_32_bits(addr)) printf("Error found for upper 32 bits\n"); @@ -223,7 +224,7 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) esdhc_clrsetbits32(®s->wml, WML_WR_WML_MASK, wml_value << 16); #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO -#ifdef CONFIG_LS2085A +#if defined(CONFIG_LS2085A) || defined(CONFIG_LS1043A) addr = virt_to_phys((void *)(data->src)); if (upper_32_bits(addr)) printf("Error found for upper 32 bits\n"); @@ -277,7 +278,7 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) static void check_and_invalidate_dcache_range (struct mmc_cmd *cmd, struct mmc_data *data) { -#ifdef CONFIG_LS2085A +#if defined(CONFIG_LS2085A) || defined(CONFIG_LS1043A) unsigned start = 0; #else unsigned start = (unsigned)data->dest ; @@ -285,7 +286,7 @@ static void check_and_invalidate_dcache_range unsigned size = roundup(ARCH_DMA_MINALIGN, data->blocks*data->blocksize); unsigned end = start+size ; -#ifdef CONFIG_LS2085A +#if defined(CONFIG_LS2085A) || defined(CONFIG_LS1043A) dma_addr_t addr;
addr = virt_to_phys((void *)(data->dest)); diff --git a/include/configs/ls1043a_common.h b/include/configs/ls1043a_common.h index 3cb013d..d3ba4a3 100644 --- a/include/configs/ls1043a_common.h +++ b/include/configs/ls1043a_common.h @@ -115,6 +115,17 @@ #define CONFIG_CMD_ENV #define CONFIG_CMD_PING
+/* MMC */ +#define CONFIG_MMC +#ifdef CONFIG_MMC +#define CONFIG_CMD_MMC +#define CONFIG_FSL_ESDHC +#define CONFIG_SYS_FSL_MMC_HAS_CAPBLT_VS33 +#define CONFIG_GENERIC_MMC +#define CONFIG_CMD_FAT +#define CONFIG_DOS_PARTITION +#endif + /* FMan ucode */ #define CONFIG_SYS_DPAA_FMAN #ifdef CONFIG_SYS_DPAA_FMAN diff --git a/include/fsl_esdhc.h b/include/fsl_esdhc.h index 0d00b7d..b6572e7 100644 --- a/include/fsl_esdhc.h +++ b/include/fsl_esdhc.h @@ -166,7 +166,7 @@ #define ESDHC_VENDORSPEC_VSELECT 0x00000002 /* Use 1.8V */
struct fsl_esdhc_cfg { -#ifdef CONFIG_LS2085A +#if defined(CONFIG_LS2085A) || defined(CONFIG_LS1043A) u64 esdhc_base; #else u32 esdhc_base;