mmc: fsl_esdhc: Add peripheral clock support
The SD clock could be generated by platform clock or peripheral clock for some platforms. This patch adds peripheral clock support for T1024/T1040/T2080. To enable it, define CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK. Signed-off-by: Yangbo Lu <yangbo.lu@freescale.com> Cc: York Sun <yorksun@freescale.com> Cc: Pantelis Antoniou <panto@antoniou-consulting.com> Reviewed-by: York Sun <yorksun@freescale.com>
This commit is contained in:
parent
b46cf1b178
commit
2d9ca2c72c
@ -73,7 +73,8 @@ void get_sys_info(sys_info_t *sys_info)
|
||||
[14] = 4, /* CC4 PPL / 4 */
|
||||
};
|
||||
uint i, freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
|
||||
#if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV)
|
||||
#if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV) || \
|
||||
defined(CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK)
|
||||
uint rcw_tmp;
|
||||
#endif
|
||||
uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
|
||||
@ -453,6 +454,48 @@ void get_sys_info(sys_info_t *sys_info)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||
#if defined(CONFIG_PPC_T2080)
|
||||
#define ESDHC_CLK_SEL 0x00000007
|
||||
#define ESDHC_CLK_SHIFT 0
|
||||
#define ESDHC_CLK_RCWSR 15
|
||||
#else /* Support T1040 T1024 by now */
|
||||
#define ESDHC_CLK_SEL 0xe0000000
|
||||
#define ESDHC_CLK_SHIFT 29
|
||||
#define ESDHC_CLK_RCWSR 7
|
||||
#endif
|
||||
rcw_tmp = in_be32(&gur->rcwsr[ESDHC_CLK_RCWSR]);
|
||||
switch ((rcw_tmp & ESDHC_CLK_SEL) >> ESDHC_CLK_SHIFT) {
|
||||
case 1:
|
||||
sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK];
|
||||
break;
|
||||
case 2:
|
||||
sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 2;
|
||||
break;
|
||||
case 3:
|
||||
sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 3;
|
||||
break;
|
||||
#if defined(CONFIG_SYS_SDHC_CLK_2_PLL)
|
||||
case 4:
|
||||
sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 4;
|
||||
break;
|
||||
#if defined(CONFIG_PPC_T2080)
|
||||
case 5:
|
||||
sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK];
|
||||
break;
|
||||
#endif
|
||||
case 6:
|
||||
sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 2;
|
||||
break;
|
||||
case 7:
|
||||
sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 3;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
sys_info->freq_sdhc = 0;
|
||||
printf("Error: Unknown SDHC peripheral clock select!\n");
|
||||
}
|
||||
#endif
|
||||
#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
|
||||
|
||||
for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
||||
@ -660,12 +703,16 @@ int get_clocks (void)
|
||||
gd->arch.i2c2_clk = gd->arch.i2c1_clk;
|
||||
|
||||
#if defined(CONFIG_FSL_ESDHC)
|
||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||
gd->arch.sdhc_clk = sys_info.freq_sdhc / 2;
|
||||
#else
|
||||
#if defined(CONFIG_MPC8569) || defined(CONFIG_P1010) ||\
|
||||
defined(CONFIG_P1014)
|
||||
gd->arch.sdhc_clk = gd->bus_clk;
|
||||
#else
|
||||
gd->arch.sdhc_clk = gd->bus_clk / 2;
|
||||
#endif
|
||||
#endif
|
||||
#endif /* defined(CONFIG_FSL_ESDHC) */
|
||||
|
||||
#if defined(CONFIG_CPM2)
|
||||
|
@ -775,7 +775,6 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)
|
||||
#endif
|
||||
#define CONFIG_SYS_FSL_NUM_CC_PLLS 2
|
||||
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 1, 1 }
|
||||
#define CONFIG_SYS_SDHC_CLOCK 0
|
||||
#define CONFIG_SYS_FSL_NUM_LAWS 16
|
||||
#define CONFIG_SYS_FSL_SRDS_1
|
||||
#define CONFIG_SYS_FSL_SEC_COMPAT 5
|
||||
@ -791,6 +790,9 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)
|
||||
#define CONFIG_SYS_FMAN_V3
|
||||
#define CONFIG_FM_PLAT_CLK_DIV 1
|
||||
#define CONFIG_SYS_FM1_CLK CONFIG_FM_PLAT_CLK_DIV
|
||||
#define CONFIG_SYS_SDHC_CLK 0/* Select SDHC CLK begining from PLL1
|
||||
per rcw field value */
|
||||
#define CONFIG_SYS_SDHC_CLK_2_PLL /* Select SDHC CLK from 2 PLLs */
|
||||
#define CONFIG_SYS_FM_MURAM_SIZE 0x30000
|
||||
#define CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
|
||||
#define CONFIG_SYS_FSL_TBCLK_DIV 16
|
||||
@ -823,7 +825,6 @@ defined(CONFIG_PPC_T1014) || defined(CONFIG_PPC_T1013)
|
||||
#endif
|
||||
#define CONFIG_SYS_FSL_NUM_CC_PLL 2
|
||||
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 1, 1 }
|
||||
#define CONFIG_SYS_SDHC_CLOCK 0
|
||||
#define CONFIG_SYS_FSL_NUM_LAWS 16
|
||||
#define CONFIG_SYS_FSL_SRDS_1
|
||||
#define CONFIG_SYS_FSL_SEC_COMPAT 5
|
||||
@ -836,6 +837,8 @@ defined(CONFIG_PPC_T1014) || defined(CONFIG_PPC_T1013)
|
||||
#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_5_0
|
||||
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
||||
#define CONFIG_SYS_FM1_CLK 0
|
||||
#define CONFIG_SYS_SDHC_CLK 0/* Select SDHC CLK begining from PLL1
|
||||
per rcw field value */
|
||||
#define CONFIG_QBMAN_CLK_DIV 1
|
||||
#define CONFIG_SYS_FM_MURAM_SIZE 0x30000
|
||||
#define CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
|
||||
@ -883,6 +886,9 @@ defined(CONFIG_PPC_T1014) || defined(CONFIG_PPC_T1013)
|
||||
#define CONFIG_PME_PLAT_CLK_DIV 1
|
||||
#define CONFIG_SYS_PME_CLK CONFIG_PME_PLAT_CLK_DIV
|
||||
#define CONFIG_SYS_FM1_CLK 0
|
||||
#define CONFIG_SYS_SDHC_CLK 1/* Select SDHC CLK begining from PLL2
|
||||
per rcw field value */
|
||||
#define CONFIG_SYS_SDHC_CLK_2_PLL /* Select SDHC CLK from 2 PLLs */
|
||||
#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_4_7
|
||||
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
||||
#define CONFIG_SYS_FMAN_V3
|
||||
|
@ -506,11 +506,47 @@ static void set_sysctl(struct mmc *mmc, uint clock)
|
||||
esdhc_setbits32(®s->sysctl, clk);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||
static void esdhc_clock_control(struct mmc *mmc, bool enable)
|
||||
{
|
||||
struct fsl_esdhc_cfg *cfg = mmc->priv;
|
||||
struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
|
||||
u32 value;
|
||||
u32 time_out;
|
||||
|
||||
value = esdhc_read32(®s->sysctl);
|
||||
|
||||
if (enable)
|
||||
value |= SYSCTL_CKEN;
|
||||
else
|
||||
value &= ~SYSCTL_CKEN;
|
||||
|
||||
esdhc_write32(®s->sysctl, value);
|
||||
|
||||
time_out = 20;
|
||||
value = PRSSTAT_SDSTB;
|
||||
while (!(esdhc_read32(®s->prsstat) & value)) {
|
||||
if (time_out == 0) {
|
||||
printf("fsl_esdhc: Internal clock never stabilised.\n");
|
||||
break;
|
||||
}
|
||||
time_out--;
|
||||
mdelay(1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void esdhc_set_ios(struct mmc *mmc)
|
||||
{
|
||||
struct fsl_esdhc_cfg *cfg = mmc->priv;
|
||||
struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
|
||||
|
||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||
/* Select to use peripheral clock */
|
||||
esdhc_clock_control(mmc, false);
|
||||
esdhc_setbits32(®s->scr, ESDHCCTL_PCS);
|
||||
esdhc_clock_control(mmc, true);
|
||||
#endif
|
||||
/* Set the clock speed */
|
||||
set_sysctl(mmc, mmc->clock);
|
||||
|
||||
@ -740,8 +776,13 @@ void fdt_fixup_esdhc(void *blob, bd_t *bd)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
|
||||
do_fixup_by_compat_u32(blob, compat, "peripheral-frequency",
|
||||
gd->arch.sdhc_clk, 1);
|
||||
#else
|
||||
do_fixup_by_compat_u32(blob, compat, "clock-frequency",
|
||||
gd->arch.sdhc_clk, 1);
|
||||
#endif
|
||||
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
|
||||
do_fixup_by_compat_u32(blob, compat, "adapter-type",
|
||||
(u32)(gd->arch.sdhc_adapter), 1);
|
||||
|
@ -18,6 +18,7 @@ typedef struct
|
||||
unsigned long freq_ddrbus;
|
||||
unsigned long freq_localbus;
|
||||
unsigned long freq_qe;
|
||||
unsigned long freq_sdhc;
|
||||
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||
unsigned long freq_fman[CONFIG_SYS_NUM_FMAN];
|
||||
#endif
|
||||
|
@ -78,6 +78,9 @@
|
||||
#define IRQSTATEN_TC (0x00000002)
|
||||
#define IRQSTATEN_CC (0x00000001)
|
||||
|
||||
#define ESDHCCTL 0x0002e40c
|
||||
#define ESDHCCTL_PCS (0x00080000)
|
||||
|
||||
#define PRSSTAT 0x0002e024
|
||||
#define PRSSTAT_DAT0 (0x01000000)
|
||||
#define PRSSTAT_CLSL (0x00800000)
|
||||
@ -86,6 +89,7 @@
|
||||
#define PRSSTAT_CINS (0x00010000)
|
||||
#define PRSSTAT_BREN (0x00000800)
|
||||
#define PRSSTAT_BWEN (0x00000400)
|
||||
#define PRSSTAT_SDSTB (0X00000008)
|
||||
#define PRSSTAT_DLA (0x00000004)
|
||||
#define PRSSTAT_CICHB (0x00000002)
|
||||
#define PRSSTAT_CIDHB (0x00000001)
|
||||
|
Loading…
Reference in New Issue
Block a user