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) 15b8ad8800SGhennadi Procopciuc #define S32CC_XBAR_2X_FREQ (800U * MHZ) 16*8653352aSGhennadi Procopciuc #define S32CC_PERIPH_PLL_VCO_FREQ (2U * GHZ) 17*8653352aSGhennadi Procopciuc #define S32CC_PERIPH_PLL_PHI3_FREQ (125U * MHZ) 1866af5425SGhennadi Procopciuc 19d3869455SGhennadi Procopciuc static int enable_fxosc_clk(void) 2066af5425SGhennadi Procopciuc { 2166af5425SGhennadi Procopciuc int ret; 2266af5425SGhennadi Procopciuc 23d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL); 24d3869455SGhennadi Procopciuc if (ret != 0) { 25d3869455SGhennadi Procopciuc return ret; 26d3869455SGhennadi Procopciuc } 27d3869455SGhennadi Procopciuc 28d3869455SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_FXOSC); 29d3869455SGhennadi Procopciuc if (ret != 0) { 30d3869455SGhennadi Procopciuc return ret; 31d3869455SGhennadi Procopciuc } 32d3869455SGhennadi Procopciuc 33d3869455SGhennadi Procopciuc return ret; 34d3869455SGhennadi Procopciuc } 35d3869455SGhennadi Procopciuc 36d3869455SGhennadi Procopciuc static int enable_arm_pll(void) 37d3869455SGhennadi Procopciuc { 38d3869455SGhennadi Procopciuc int ret; 3966af5425SGhennadi Procopciuc 4083af4504SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC); 4183af4504SGhennadi Procopciuc if (ret != 0) { 4283af4504SGhennadi Procopciuc return ret; 4383af4504SGhennadi Procopciuc } 4483af4504SGhennadi Procopciuc 457ad4e231SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL); 467ad4e231SGhennadi Procopciuc if (ret != 0) { 477ad4e231SGhennadi Procopciuc return ret; 487ad4e231SGhennadi Procopciuc } 497ad4e231SGhennadi Procopciuc 50de950ef0SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL); 51de950ef0SGhennadi Procopciuc if (ret != 0) { 52de950ef0SGhennadi Procopciuc return ret; 53de950ef0SGhennadi Procopciuc } 54de950ef0SGhennadi Procopciuc 55b5101c45SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_VCO); 56b5101c45SGhennadi Procopciuc if (ret != 0) { 57b5101c45SGhennadi Procopciuc return ret; 58b5101c45SGhennadi Procopciuc } 59b5101c45SGhennadi Procopciuc 6084e82085SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0); 6184e82085SGhennadi Procopciuc if (ret != 0) { 6284e82085SGhennadi Procopciuc return ret; 6384e82085SGhennadi Procopciuc } 6484e82085SGhennadi Procopciuc 65d3869455SGhennadi Procopciuc return ret; 66d3869455SGhennadi Procopciuc } 67d3869455SGhennadi Procopciuc 68*8653352aSGhennadi Procopciuc static int enable_periph_pll(void) 69*8653352aSGhennadi Procopciuc { 70*8653352aSGhennadi Procopciuc int ret; 71*8653352aSGhennadi Procopciuc 72*8653352aSGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC); 73*8653352aSGhennadi Procopciuc if (ret != 0) { 74*8653352aSGhennadi Procopciuc return ret; 75*8653352aSGhennadi Procopciuc } 76*8653352aSGhennadi Procopciuc 77*8653352aSGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL); 78*8653352aSGhennadi Procopciuc if (ret != 0) { 79*8653352aSGhennadi Procopciuc return ret; 80*8653352aSGhennadi Procopciuc } 81*8653352aSGhennadi Procopciuc 82*8653352aSGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL); 83*8653352aSGhennadi Procopciuc if (ret != 0) { 84*8653352aSGhennadi Procopciuc return ret; 85*8653352aSGhennadi Procopciuc } 86*8653352aSGhennadi Procopciuc 87*8653352aSGhennadi Procopciuc ret = clk_enable(S32CC_CLK_PERIPH_PLL_VCO); 88*8653352aSGhennadi Procopciuc if (ret != 0) { 89*8653352aSGhennadi Procopciuc return ret; 90*8653352aSGhennadi Procopciuc } 91*8653352aSGhennadi Procopciuc 92*8653352aSGhennadi Procopciuc ret = clk_enable(S32CC_CLK_PERIPH_PLL_PHI3); 93*8653352aSGhennadi Procopciuc if (ret != 0) { 94*8653352aSGhennadi Procopciuc return ret; 95*8653352aSGhennadi Procopciuc } 96*8653352aSGhennadi Procopciuc 97*8653352aSGhennadi Procopciuc return ret; 98*8653352aSGhennadi Procopciuc } 99*8653352aSGhennadi Procopciuc 100d3869455SGhennadi Procopciuc static int enable_a53_clk(void) 101d3869455SGhennadi Procopciuc { 102d3869455SGhennadi Procopciuc int ret; 103d3869455SGhennadi Procopciuc 104d3869455SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0); 105d3869455SGhennadi Procopciuc if (ret != 0) { 106d3869455SGhennadi Procopciuc return ret; 107d3869455SGhennadi Procopciuc } 108d3869455SGhennadi Procopciuc 109d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL); 110d3869455SGhennadi Procopciuc if (ret != 0) { 111d3869455SGhennadi Procopciuc return ret; 112d3869455SGhennadi Procopciuc } 113d3869455SGhennadi Procopciuc 1147004f678SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_A53_CORE); 1157004f678SGhennadi Procopciuc if (ret != 0) { 1167004f678SGhennadi Procopciuc return ret; 1177004f678SGhennadi Procopciuc } 1187004f678SGhennadi Procopciuc 11966af5425SGhennadi Procopciuc return ret; 12066af5425SGhennadi Procopciuc } 121d3869455SGhennadi Procopciuc 122b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void) 123b8ad8800SGhennadi Procopciuc { 124b8ad8800SGhennadi Procopciuc int ret; 125b8ad8800SGhennadi Procopciuc 126b8ad8800SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1); 127b8ad8800SGhennadi Procopciuc if (ret != 0) { 128b8ad8800SGhennadi Procopciuc return ret; 129b8ad8800SGhennadi Procopciuc } 130b8ad8800SGhennadi Procopciuc 131b8ad8800SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL); 132b8ad8800SGhennadi Procopciuc if (ret != 0) { 133b8ad8800SGhennadi Procopciuc return ret; 134b8ad8800SGhennadi Procopciuc } 135b8ad8800SGhennadi Procopciuc 136b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1); 137b8ad8800SGhennadi Procopciuc if (ret != 0) { 138b8ad8800SGhennadi Procopciuc return ret; 139b8ad8800SGhennadi Procopciuc } 140b8ad8800SGhennadi Procopciuc 141b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_XBAR_2X); 142b8ad8800SGhennadi Procopciuc if (ret != 0) { 143b8ad8800SGhennadi Procopciuc return ret; 144b8ad8800SGhennadi Procopciuc } 145b8ad8800SGhennadi Procopciuc 146b8ad8800SGhennadi Procopciuc return ret; 147b8ad8800SGhennadi Procopciuc } 148b8ad8800SGhennadi Procopciuc 149d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void) 150d3869455SGhennadi Procopciuc { 151d3869455SGhennadi Procopciuc int ret; 152d3869455SGhennadi Procopciuc 153d3869455SGhennadi Procopciuc s32cc_clk_register_drv(); 154d3869455SGhennadi Procopciuc 155d3869455SGhennadi Procopciuc ret = enable_fxosc_clk(); 156d3869455SGhennadi Procopciuc if (ret != 0) { 157d3869455SGhennadi Procopciuc return ret; 158d3869455SGhennadi Procopciuc } 159d3869455SGhennadi Procopciuc 160d3869455SGhennadi Procopciuc ret = enable_arm_pll(); 161d3869455SGhennadi Procopciuc if (ret != 0) { 162d3869455SGhennadi Procopciuc return ret; 163d3869455SGhennadi Procopciuc } 164d3869455SGhennadi Procopciuc 165*8653352aSGhennadi Procopciuc ret = enable_periph_pll(); 166*8653352aSGhennadi Procopciuc if (ret != 0) { 167*8653352aSGhennadi Procopciuc return ret; 168*8653352aSGhennadi Procopciuc } 169*8653352aSGhennadi Procopciuc 170d3869455SGhennadi Procopciuc ret = enable_a53_clk(); 171d3869455SGhennadi Procopciuc if (ret != 0) { 172d3869455SGhennadi Procopciuc return ret; 173d3869455SGhennadi Procopciuc } 174d3869455SGhennadi Procopciuc 175b8ad8800SGhennadi Procopciuc ret = enable_xbar_clk(); 176b8ad8800SGhennadi Procopciuc if (ret != 0) { 177b8ad8800SGhennadi Procopciuc return ret; 178b8ad8800SGhennadi Procopciuc } 179b8ad8800SGhennadi Procopciuc 180d3869455SGhennadi Procopciuc return ret; 181d3869455SGhennadi Procopciuc } 182