diff --git a/drivers/clk/sunxi/clk_d1.c b/drivers/clk/sunxi/clk_d1.c index 9dae761de83..66958402581 100644 --- a/drivers/clk/sunxi/clk_d1.c +++ b/drivers/clk/sunxi/clk_d1.c @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include @@ -76,9 +76,18 @@ static struct ccu_reset d1_resets[] = { [RST_BUS_LRADC] = RESET(0xa9c, BIT(16)), }; +static void d1_ccu_init(struct udevice *dev) +{ + struct ccu_plat *plat = dev_get_plat(dev); + + /* Set PLL_CPUX to 1008 MHz. */ + clrsetbits_le32(plat->base + 0x000, 0xff << 8, 0x29 << 8); +} + const struct ccu_desc d1_ccu_desc = { .gates = d1_gates, .resets = d1_resets, .num_gates = ARRAY_SIZE(d1_gates), .num_resets = ARRAY_SIZE(d1_resets), + .init = d1_ccu_init, }; diff --git a/drivers/clk/sunxi/clk_sunxi.c b/drivers/clk/sunxi/clk_sunxi.c index 1782cffc404..b668d534a08 100644 --- a/drivers/clk/sunxi/clk_sunxi.c +++ b/drivers/clk/sunxi/clk_sunxi.c @@ -79,6 +79,7 @@ static int sunxi_clk_bind(struct udevice *dev) static int sunxi_clk_probe(struct udevice *dev) { + struct ccu_plat *plat = dev_get_plat(dev); struct clk_bulk clk_bulk; struct reset_ctl_bulk rst_bulk; int ret; @@ -91,6 +92,9 @@ static int sunxi_clk_probe(struct udevice *dev) if (!ret) reset_deassert_bulk(&rst_bulk); + if (IS_ENABLED(CONFIG_SPL_BUILD) && plat->desc->init) + plat->desc->init(dev); + return 0; } diff --git a/include/clk/sunxi.h b/include/clk/sunxi.h index c298195c51e..714048139fb 100644 --- a/include/clk/sunxi.h +++ b/include/clk/sunxi.h @@ -72,6 +72,7 @@ struct ccu_desc { const struct ccu_reset *resets; u8 num_gates; u8 num_resets; + void (*init)(struct udevice *dev); }; /**