feat(nxp-clk): setup the DDR PLL

Add the DDR PLL instance and configure it to operate at its maximum
allowed frequency.

Change-Id: I96efd68687de78f70759f631d10a0f611c234c8d
Signed-off-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
This commit is contained in:
Ghennadi Procopciuc 2024-09-09 10:24:35 +03:00
parent b8c68ad799
commit 18c2b137f8
5 changed files with 41 additions and 0 deletions

View file

@ -13,6 +13,7 @@
#define ARM_DFS_BASE_ADDR (0x40054000UL)
#define CGM0_BASE_ADDR (0x40030000UL)
#define CGM1_BASE_ADDR (0x40034000UL)
#define DDRPLL_BASE_ADDR (0x40044000UL)
/* FXOSC */
#define FXOSC_CTRL(FXOSC) ((FXOSC) + 0x0UL)

View file

@ -26,6 +26,7 @@ struct s32cc_clk_drv {
uintptr_t armdfs_base;
uintptr_t cgm0_base;
uintptr_t cgm1_base;
uintptr_t ddrpll_base;
};
static int update_stack_depth(unsigned int *depth)
@ -47,6 +48,7 @@ static struct s32cc_clk_drv *get_drv(void)
.armdfs_base = ARM_DFS_BASE_ADDR,
.cgm0_base = CGM0_BASE_ADDR,
.cgm1_base = CGM1_BASE_ADDR,
.ddrpll_base = DDRPLL_BASE_ADDR,
};
return &driver;
@ -86,6 +88,9 @@ static int get_base_addr(enum s32cc_clk_source id, const struct s32cc_clk_drv *d
case S32CC_PERIPH_PLL:
*base = drv->periphpll_base;
break;
case S32CC_DDR_PLL:
*base = drv->ddrpll_base;
break;
case S32CC_ARM_DFS:
*base = drv->armdfs_base;
break;
@ -585,6 +590,7 @@ static int enable_mux(struct s32cc_clk_obj *module,
/* PLL mux will be enabled by PLL setup */
case S32CC_ARM_PLL:
case S32CC_PERIPH_PLL:
case S32CC_DDR_PLL:
break;
case S32CC_CGM1:
ret = enable_cgm_mux(mux, drv);

View file

@ -16,6 +16,8 @@
#define S32CC_XBAR_2X_FREQ (800U * MHZ)
#define S32CC_PERIPH_PLL_VCO_FREQ (2U * GHZ)
#define S32CC_PERIPH_PLL_PHI3_FREQ UART_CLOCK_HZ
#define S32CC_DDR_PLL_VCO_FREQ (1600U * MHZ)
#define S32CC_DDR_PLL_PHI0_FREQ (800U * MHZ)
static int setup_fxosc(void)
{
@ -139,6 +141,28 @@ static int enable_uart_clk(void)
return ret;
}
static int setup_ddr_pll(void)
{
int ret;
ret = clk_set_parent(S32CC_CLK_DDR_PLL_MUX, S32CC_CLK_FXOSC);
if (ret != 0) {
return ret;
}
ret = clk_set_rate(S32CC_CLK_DDR_PLL_VCO, S32CC_DDR_PLL_VCO_FREQ, NULL);
if (ret != 0) {
return ret;
}
ret = clk_set_rate(S32CC_CLK_DDR_PLL_PHI0, S32CC_DDR_PLL_PHI0_FREQ, NULL);
if (ret != 0) {
return ret;
}
return ret;
}
int s32cc_init_early_clks(void)
{
int ret;
@ -175,5 +199,10 @@ int s32cc_init_early_clks(void)
return ret;
}
ret = setup_ddr_pll();
if (ret != 0) {
return ret;
}
return ret;
}

View file

@ -95,4 +95,8 @@
#define S32CC_CLK_LINFLEX_BAUD S32CC_ARCH_CLK(16)
#define S32CC_CLK_LINFLEX S32CC_ARCH_CLK(17)
/* DDR PLL */
#define S32CC_CLK_DDR_PLL_MUX S32CC_ARCH_CLK(18)
#define S32CC_CLK_DDR_PLL_VCO S32CC_ARCH_CLK(19)
#endif /* S32CC_CLK_IDS_H */

View file

@ -36,6 +36,7 @@ enum s32cc_clk_source {
S32CC_PERIPH_PLL,
S32CC_CGM0,
S32CC_CGM1,
S32CC_DDR_PLL,
};
struct s32cc_clk_obj {