166af5425SGhennadi Procopciuc /* 266af5425SGhennadi Procopciuc * Copyright 2024 NXP 366af5425SGhennadi Procopciuc * 466af5425SGhennadi Procopciuc * SPDX-License-Identifier: BSD-3-Clause 566af5425SGhennadi Procopciuc */ 666af5425SGhennadi Procopciuc #include <drivers/clk.h> 766af5425SGhennadi Procopciuc #include <s32cc-clk-drv.h> 866af5425SGhennadi Procopciuc #include <s32cc-clk-ids.h> 966af5425SGhennadi Procopciuc #include <s32cc-clk-utils.h> 1066af5425SGhennadi Procopciuc 1166af5425SGhennadi Procopciuc #define S32CC_FXOSC_FREQ (40U * MHZ) 127ad4e231SGhennadi Procopciuc #define S32CC_ARM_PLL_VCO_FREQ (2U * GHZ) 13de950ef0SGhennadi Procopciuc #define S32CC_ARM_PLL_PHI0_FREQ (1U * GHZ) 1464e0c226SGhennadi Procopciuc #define S32CC_A53_FREQ (1U * GHZ) 1566af5425SGhennadi Procopciuc 16*d3869455SGhennadi Procopciuc static int enable_fxosc_clk(void) 1766af5425SGhennadi Procopciuc { 1866af5425SGhennadi Procopciuc int ret; 1966af5425SGhennadi Procopciuc 20*d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL); 21*d3869455SGhennadi Procopciuc if (ret != 0) { 22*d3869455SGhennadi Procopciuc return ret; 23*d3869455SGhennadi Procopciuc } 24*d3869455SGhennadi Procopciuc 25*d3869455SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_FXOSC); 26*d3869455SGhennadi Procopciuc if (ret != 0) { 27*d3869455SGhennadi Procopciuc return ret; 28*d3869455SGhennadi Procopciuc } 29*d3869455SGhennadi Procopciuc 30*d3869455SGhennadi Procopciuc return ret; 31*d3869455SGhennadi Procopciuc } 32*d3869455SGhennadi Procopciuc 33*d3869455SGhennadi Procopciuc static int enable_arm_pll(void) 34*d3869455SGhennadi Procopciuc { 35*d3869455SGhennadi Procopciuc int ret; 3666af5425SGhennadi Procopciuc 3783af4504SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC); 3883af4504SGhennadi Procopciuc if (ret != 0) { 3983af4504SGhennadi Procopciuc return ret; 4083af4504SGhennadi Procopciuc } 4183af4504SGhennadi Procopciuc 427ad4e231SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL); 437ad4e231SGhennadi Procopciuc if (ret != 0) { 447ad4e231SGhennadi Procopciuc return ret; 457ad4e231SGhennadi Procopciuc } 467ad4e231SGhennadi Procopciuc 47de950ef0SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL); 48de950ef0SGhennadi Procopciuc if (ret != 0) { 49de950ef0SGhennadi Procopciuc return ret; 50de950ef0SGhennadi Procopciuc } 51de950ef0SGhennadi Procopciuc 52b5101c45SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_VCO); 53b5101c45SGhennadi Procopciuc if (ret != 0) { 54b5101c45SGhennadi Procopciuc return ret; 55b5101c45SGhennadi Procopciuc } 56b5101c45SGhennadi Procopciuc 5784e82085SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0); 5884e82085SGhennadi Procopciuc if (ret != 0) { 5984e82085SGhennadi Procopciuc return ret; 6084e82085SGhennadi Procopciuc } 6184e82085SGhennadi Procopciuc 62*d3869455SGhennadi Procopciuc return ret; 63*d3869455SGhennadi Procopciuc } 64*d3869455SGhennadi Procopciuc 65*d3869455SGhennadi Procopciuc static int enable_a53_clk(void) 66*d3869455SGhennadi Procopciuc { 67*d3869455SGhennadi Procopciuc int ret; 68*d3869455SGhennadi Procopciuc 69*d3869455SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0); 70*d3869455SGhennadi Procopciuc if (ret != 0) { 71*d3869455SGhennadi Procopciuc return ret; 72*d3869455SGhennadi Procopciuc } 73*d3869455SGhennadi Procopciuc 74*d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL); 75*d3869455SGhennadi Procopciuc if (ret != 0) { 76*d3869455SGhennadi Procopciuc return ret; 77*d3869455SGhennadi Procopciuc } 78*d3869455SGhennadi Procopciuc 797004f678SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_A53_CORE); 807004f678SGhennadi Procopciuc if (ret != 0) { 817004f678SGhennadi Procopciuc return ret; 827004f678SGhennadi Procopciuc } 837004f678SGhennadi Procopciuc 8466af5425SGhennadi Procopciuc return ret; 8566af5425SGhennadi Procopciuc } 86*d3869455SGhennadi Procopciuc 87*d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void) 88*d3869455SGhennadi Procopciuc { 89*d3869455SGhennadi Procopciuc int ret; 90*d3869455SGhennadi Procopciuc 91*d3869455SGhennadi Procopciuc s32cc_clk_register_drv(); 92*d3869455SGhennadi Procopciuc 93*d3869455SGhennadi Procopciuc ret = enable_fxosc_clk(); 94*d3869455SGhennadi Procopciuc if (ret != 0) { 95*d3869455SGhennadi Procopciuc return ret; 96*d3869455SGhennadi Procopciuc } 97*d3869455SGhennadi Procopciuc 98*d3869455SGhennadi Procopciuc ret = enable_arm_pll(); 99*d3869455SGhennadi Procopciuc if (ret != 0) { 100*d3869455SGhennadi Procopciuc return ret; 101*d3869455SGhennadi Procopciuc } 102*d3869455SGhennadi Procopciuc 103*d3869455SGhennadi Procopciuc ret = enable_a53_clk(); 104*d3869455SGhennadi Procopciuc if (ret != 0) { 105*d3869455SGhennadi Procopciuc return ret; 106*d3869455SGhennadi Procopciuc } 107*d3869455SGhennadi Procopciuc 108*d3869455SGhennadi Procopciuc return ret; 109*d3869455SGhennadi Procopciuc } 110