mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-03-14 05:46:58 +00:00
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
5 changed files with 102 additions and 3 deletions
arch/powerpc
drivers/mmc
include
|
@ -73,7 +73,8 @@ void get_sys_info(sys_info_t *sys_info)
|
||||||
[14] = 4, /* CC4 PPL / 4 */
|
[14] = 4, /* CC4 PPL / 4 */
|
||||||
};
|
};
|
||||||
uint i, freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
|
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;
|
uint rcw_tmp;
|
||||||
#endif
|
#endif
|
||||||
uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
|
uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
|
||||||
|
@ -453,6 +454,48 @@ void get_sys_info(sys_info_t *sys_info)
|
||||||
#endif
|
#endif
|
||||||
#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 */
|
#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
|
||||||
|
|
||||||
for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
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;
|
gd->arch.i2c2_clk = gd->arch.i2c1_clk;
|
||||||
|
|
||||||
#if defined(CONFIG_FSL_ESDHC)
|
#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) ||\
|
#if defined(CONFIG_MPC8569) || defined(CONFIG_P1010) ||\
|
||||||
defined(CONFIG_P1014)
|
defined(CONFIG_P1014)
|
||||||
gd->arch.sdhc_clk = gd->bus_clk;
|
gd->arch.sdhc_clk = gd->bus_clk;
|
||||||
#else
|
#else
|
||||||
gd->arch.sdhc_clk = gd->bus_clk / 2;
|
gd->arch.sdhc_clk = gd->bus_clk / 2;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#endif /* defined(CONFIG_FSL_ESDHC) */
|
#endif /* defined(CONFIG_FSL_ESDHC) */
|
||||||
|
|
||||||
#if defined(CONFIG_CPM2)
|
#if defined(CONFIG_CPM2)
|
||||||
|
|
|
@ -775,7 +775,6 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)
|
||||||
#endif
|
#endif
|
||||||
#define CONFIG_SYS_FSL_NUM_CC_PLLS 2
|
#define CONFIG_SYS_FSL_NUM_CC_PLLS 2
|
||||||
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 1, 1 }
|
#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_NUM_LAWS 16
|
||||||
#define CONFIG_SYS_FSL_SRDS_1
|
#define CONFIG_SYS_FSL_SRDS_1
|
||||||
#define CONFIG_SYS_FSL_SEC_COMPAT 5
|
#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_SYS_FMAN_V3
|
||||||
#define CONFIG_FM_PLAT_CLK_DIV 1
|
#define CONFIG_FM_PLAT_CLK_DIV 1
|
||||||
#define CONFIG_SYS_FM1_CLK CONFIG_FM_PLAT_CLK_DIV
|
#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_FM_MURAM_SIZE 0x30000
|
||||||
#define CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
|
#define CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
|
||||||
#define CONFIG_SYS_FSL_TBCLK_DIV 16
|
#define CONFIG_SYS_FSL_TBCLK_DIV 16
|
||||||
|
@ -823,7 +825,6 @@ defined(CONFIG_PPC_T1014) || defined(CONFIG_PPC_T1013)
|
||||||
#endif
|
#endif
|
||||||
#define CONFIG_SYS_FSL_NUM_CC_PLL 2
|
#define CONFIG_SYS_FSL_NUM_CC_PLL 2
|
||||||
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 1, 1 }
|
#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_NUM_LAWS 16
|
||||||
#define CONFIG_SYS_FSL_SRDS_1
|
#define CONFIG_SYS_FSL_SRDS_1
|
||||||
#define CONFIG_SYS_FSL_SEC_COMPAT 5
|
#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_DDR_VER FSL_DDR_VER_5_0
|
||||||
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
||||||
#define CONFIG_SYS_FM1_CLK 0
|
#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_QBMAN_CLK_DIV 1
|
||||||
#define CONFIG_SYS_FM_MURAM_SIZE 0x30000
|
#define CONFIG_SYS_FM_MURAM_SIZE 0x30000
|
||||||
#define CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
|
#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_PME_PLAT_CLK_DIV 1
|
||||||
#define CONFIG_SYS_PME_CLK CONFIG_PME_PLAT_CLK_DIV
|
#define CONFIG_SYS_PME_CLK CONFIG_PME_PLAT_CLK_DIV
|
||||||
#define CONFIG_SYS_FM1_CLK 0
|
#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_DDR_VER FSL_DDR_VER_4_7
|
||||||
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
||||||
#define CONFIG_SYS_FMAN_V3
|
#define CONFIG_SYS_FMAN_V3
|
||||||
|
|
|
@ -506,11 +506,47 @@ static void set_sysctl(struct mmc *mmc, uint clock)
|
||||||
esdhc_setbits32(®s->sysctl, clk);
|
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)
|
static void esdhc_set_ios(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct fsl_esdhc_cfg *cfg = mmc->priv;
|
struct fsl_esdhc_cfg *cfg = mmc->priv;
|
||||||
struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
|
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 the clock speed */
|
||||||
set_sysctl(mmc, mmc->clock);
|
set_sysctl(mmc, mmc->clock);
|
||||||
|
|
||||||
|
@ -740,8 +776,13 @@ void fdt_fixup_esdhc(void *blob, bd_t *bd)
|
||||||
}
|
}
|
||||||
#endif
|
#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",
|
do_fixup_by_compat_u32(blob, compat, "clock-frequency",
|
||||||
gd->arch.sdhc_clk, 1);
|
gd->arch.sdhc_clk, 1);
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
|
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
|
||||||
do_fixup_by_compat_u32(blob, compat, "adapter-type",
|
do_fixup_by_compat_u32(blob, compat, "adapter-type",
|
||||||
(u32)(gd->arch.sdhc_adapter), 1);
|
(u32)(gd->arch.sdhc_adapter), 1);
|
||||||
|
|
|
@ -18,6 +18,7 @@ typedef struct
|
||||||
unsigned long freq_ddrbus;
|
unsigned long freq_ddrbus;
|
||||||
unsigned long freq_localbus;
|
unsigned long freq_localbus;
|
||||||
unsigned long freq_qe;
|
unsigned long freq_qe;
|
||||||
|
unsigned long freq_sdhc;
|
||||||
#ifdef CONFIG_SYS_DPAA_FMAN
|
#ifdef CONFIG_SYS_DPAA_FMAN
|
||||||
unsigned long freq_fman[CONFIG_SYS_NUM_FMAN];
|
unsigned long freq_fman[CONFIG_SYS_NUM_FMAN];
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -78,6 +78,9 @@
|
||||||
#define IRQSTATEN_TC (0x00000002)
|
#define IRQSTATEN_TC (0x00000002)
|
||||||
#define IRQSTATEN_CC (0x00000001)
|
#define IRQSTATEN_CC (0x00000001)
|
||||||
|
|
||||||
|
#define ESDHCCTL 0x0002e40c
|
||||||
|
#define ESDHCCTL_PCS (0x00080000)
|
||||||
|
|
||||||
#define PRSSTAT 0x0002e024
|
#define PRSSTAT 0x0002e024
|
||||||
#define PRSSTAT_DAT0 (0x01000000)
|
#define PRSSTAT_DAT0 (0x01000000)
|
||||||
#define PRSSTAT_CLSL (0x00800000)
|
#define PRSSTAT_CLSL (0x00800000)
|
||||||
|
@ -86,6 +89,7 @@
|
||||||
#define PRSSTAT_CINS (0x00010000)
|
#define PRSSTAT_CINS (0x00010000)
|
||||||
#define PRSSTAT_BREN (0x00000800)
|
#define PRSSTAT_BREN (0x00000800)
|
||||||
#define PRSSTAT_BWEN (0x00000400)
|
#define PRSSTAT_BWEN (0x00000400)
|
||||||
|
#define PRSSTAT_SDSTB (0X00000008)
|
||||||
#define PRSSTAT_DLA (0x00000004)
|
#define PRSSTAT_DLA (0x00000004)
|
||||||
#define PRSSTAT_CICHB (0x00000002)
|
#define PRSSTAT_CICHB (0x00000002)
|
||||||
#define PRSSTAT_CIDHB (0x00000001)
|
#define PRSSTAT_CIDHB (0x00000001)
|
||||||
|
|
Loading…
Add table
Reference in a new issue