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) 15*b8ad8800SGhennadi Procopciuc #define S32CC_XBAR_2X_FREQ (800U * MHZ) 1666af5425SGhennadi Procopciuc 17d3869455SGhennadi Procopciuc static int enable_fxosc_clk(void) 1866af5425SGhennadi Procopciuc { 1966af5425SGhennadi Procopciuc int ret; 2066af5425SGhennadi Procopciuc 21d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL); 22d3869455SGhennadi Procopciuc if (ret != 0) { 23d3869455SGhennadi Procopciuc return ret; 24d3869455SGhennadi Procopciuc } 25d3869455SGhennadi Procopciuc 26d3869455SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_FXOSC); 27d3869455SGhennadi Procopciuc if (ret != 0) { 28d3869455SGhennadi Procopciuc return ret; 29d3869455SGhennadi Procopciuc } 30d3869455SGhennadi Procopciuc 31d3869455SGhennadi Procopciuc return ret; 32d3869455SGhennadi Procopciuc } 33d3869455SGhennadi Procopciuc 34d3869455SGhennadi Procopciuc static int enable_arm_pll(void) 35d3869455SGhennadi Procopciuc { 36d3869455SGhennadi Procopciuc int ret; 3766af5425SGhennadi Procopciuc 3883af4504SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC); 3983af4504SGhennadi Procopciuc if (ret != 0) { 4083af4504SGhennadi Procopciuc return ret; 4183af4504SGhennadi Procopciuc } 4283af4504SGhennadi Procopciuc 437ad4e231SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL); 447ad4e231SGhennadi Procopciuc if (ret != 0) { 457ad4e231SGhennadi Procopciuc return ret; 467ad4e231SGhennadi Procopciuc } 477ad4e231SGhennadi Procopciuc 48de950ef0SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL); 49de950ef0SGhennadi Procopciuc if (ret != 0) { 50de950ef0SGhennadi Procopciuc return ret; 51de950ef0SGhennadi Procopciuc } 52de950ef0SGhennadi Procopciuc 53b5101c45SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_VCO); 54b5101c45SGhennadi Procopciuc if (ret != 0) { 55b5101c45SGhennadi Procopciuc return ret; 56b5101c45SGhennadi Procopciuc } 57b5101c45SGhennadi Procopciuc 5884e82085SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0); 5984e82085SGhennadi Procopciuc if (ret != 0) { 6084e82085SGhennadi Procopciuc return ret; 6184e82085SGhennadi Procopciuc } 6284e82085SGhennadi Procopciuc 63d3869455SGhennadi Procopciuc return ret; 64d3869455SGhennadi Procopciuc } 65d3869455SGhennadi Procopciuc 66d3869455SGhennadi Procopciuc static int enable_a53_clk(void) 67d3869455SGhennadi Procopciuc { 68d3869455SGhennadi Procopciuc int ret; 69d3869455SGhennadi Procopciuc 70d3869455SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0); 71d3869455SGhennadi Procopciuc if (ret != 0) { 72d3869455SGhennadi Procopciuc return ret; 73d3869455SGhennadi Procopciuc } 74d3869455SGhennadi Procopciuc 75d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL); 76d3869455SGhennadi Procopciuc if (ret != 0) { 77d3869455SGhennadi Procopciuc return ret; 78d3869455SGhennadi Procopciuc } 79d3869455SGhennadi Procopciuc 807004f678SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_A53_CORE); 817004f678SGhennadi Procopciuc if (ret != 0) { 827004f678SGhennadi Procopciuc return ret; 837004f678SGhennadi Procopciuc } 847004f678SGhennadi Procopciuc 8566af5425SGhennadi Procopciuc return ret; 8666af5425SGhennadi Procopciuc } 87d3869455SGhennadi Procopciuc 88*b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void) 89*b8ad8800SGhennadi Procopciuc { 90*b8ad8800SGhennadi Procopciuc int ret; 91*b8ad8800SGhennadi Procopciuc 92*b8ad8800SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1); 93*b8ad8800SGhennadi Procopciuc if (ret != 0) { 94*b8ad8800SGhennadi Procopciuc return ret; 95*b8ad8800SGhennadi Procopciuc } 96*b8ad8800SGhennadi Procopciuc 97*b8ad8800SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL); 98*b8ad8800SGhennadi Procopciuc if (ret != 0) { 99*b8ad8800SGhennadi Procopciuc return ret; 100*b8ad8800SGhennadi Procopciuc } 101*b8ad8800SGhennadi Procopciuc 102*b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1); 103*b8ad8800SGhennadi Procopciuc if (ret != 0) { 104*b8ad8800SGhennadi Procopciuc return ret; 105*b8ad8800SGhennadi Procopciuc } 106*b8ad8800SGhennadi Procopciuc 107*b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_XBAR_2X); 108*b8ad8800SGhennadi Procopciuc if (ret != 0) { 109*b8ad8800SGhennadi Procopciuc return ret; 110*b8ad8800SGhennadi Procopciuc } 111*b8ad8800SGhennadi Procopciuc 112*b8ad8800SGhennadi Procopciuc return ret; 113*b8ad8800SGhennadi Procopciuc } 114*b8ad8800SGhennadi Procopciuc 115d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void) 116d3869455SGhennadi Procopciuc { 117d3869455SGhennadi Procopciuc int ret; 118d3869455SGhennadi Procopciuc 119d3869455SGhennadi Procopciuc s32cc_clk_register_drv(); 120d3869455SGhennadi Procopciuc 121d3869455SGhennadi Procopciuc ret = enable_fxosc_clk(); 122d3869455SGhennadi Procopciuc if (ret != 0) { 123d3869455SGhennadi Procopciuc return ret; 124d3869455SGhennadi Procopciuc } 125d3869455SGhennadi Procopciuc 126d3869455SGhennadi Procopciuc ret = enable_arm_pll(); 127d3869455SGhennadi Procopciuc if (ret != 0) { 128d3869455SGhennadi Procopciuc return ret; 129d3869455SGhennadi Procopciuc } 130d3869455SGhennadi Procopciuc 131d3869455SGhennadi Procopciuc ret = enable_a53_clk(); 132d3869455SGhennadi Procopciuc if (ret != 0) { 133d3869455SGhennadi Procopciuc return ret; 134d3869455SGhennadi Procopciuc } 135d3869455SGhennadi Procopciuc 136*b8ad8800SGhennadi Procopciuc ret = enable_xbar_clk(); 137*b8ad8800SGhennadi Procopciuc if (ret != 0) { 138*b8ad8800SGhennadi Procopciuc return ret; 139*b8ad8800SGhennadi Procopciuc } 140*b8ad8800SGhennadi Procopciuc 141d3869455SGhennadi Procopciuc return ret; 142d3869455SGhennadi Procopciuc } 143