*reg = (0x4 << 24) | (0x7 << 16);
}
-void dram_pll_init(void)
+void dram_pll_init(enum sscg_pll_out_val pll_val)
{
unsigned long pll_control_reg = DRAM_PLL_CFG0;
+ unsigned long pll_cfg_reg2 = DRAM_PLL_CFG2;
u32 pwdn_mask = 0;
u32 pll_clke = 0;
u32 bypass1 = 0;
u32 bypass2 = 0;
+ u32 val;
#define SRC_DDR1_ENABLE_MASK (0x8F000000UL)
#define SRC_DDR2_ENABLE_MASK (0x8F000000UL)
writel(SRC_DDR1_ENABLE_MASK, SRC_BASE_ADDR + 0x1000);
writel(SRC_DDR1_ENABLE_MASK, SRC_BASE_ADDR + 0x1004);
+ /* Bypass */
+ setbits_le32(pll_control_reg, bypass1);
+ setbits_le32(pll_control_reg, bypass2);
+
+ switch (pll_val) {
+ case SSCG_PLL_OUT_400M:
+ val = readl(pll_cfg_reg2);
+ val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK | SSCG_PLL_FEEDBACK_DIV_F2_MASK);
+ val |= SSCG_PLL_OUTPUT_DIV_VAL(1);
+ val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11);
+ writel(val, pll_cfg_reg2);
+ break;
+ case SSCG_PLL_OUT_600M:
+ val = readl(pll_cfg_reg2);
+ val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK | SSCG_PLL_FEEDBACK_DIV_F2_MASK);
+ val |= SSCG_PLL_OUTPUT_DIV_VAL(1);
+ val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(17);
+ writel(val, pll_cfg_reg2);
+ break;
+ case SSCG_PLL_OUT_800M:
+ val = readl(pll_cfg_reg2);
+ val &= ~(SSCG_PLL_OUTPUT_DIV_VAL_MASK | SSCG_PLL_FEEDBACK_DIV_F2_MASK);
+ val |= SSCG_PLL_OUTPUT_DIV_VAL(0);
+ val |= SSCG_PLL_FEEDBACK_DIV_F2_VAL(11);
+ writel(val, pll_cfg_reg2);
+ break;
+ }
+
/* Clear power down bit */
clrbits_le32(pll_control_reg, pwdn_mask);
/* Eanble ARM_PLL/SYS_PLL */
SSCG_PLL_FEEDBACK_DIV_F2_MASK)
#define SSCG_PLL_OUTPUT_DIV_VAL_MASK (0x3f << 1)
#define SSCG_PLL_OUTPUT_DIV_VAL_SHIFT (1)
-#define SSCG_PLL_OUTPUT_DIV_VAL(n) ((n) << 1) & \
+#define SSCG_PLL_OUTPUT_DIV_VAL(n) (((n) << 1) & \
SSCG_PLL_OUTPUT_DIV_VAL_MASK)
#define SSCG_PLL_FILTER_RANGE_MASK (0x1)
ENET_125MHz,
};
+enum sscg_pll_out_val {
+ SSCG_PLL_OUT_400M,
+ SSCG_PLL_OUT_600M,
+ SSCG_PLL_OUT_800M,
+};
+
+void dram_pll_init(enum sscg_pll_out_val pll_val);
u32 imx_get_fecclk(void);
u32 imx_get_uartclk(void);
int clock_init(void);