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> 7e4462daeSGhennadi Procopciuc #include <platform_def.h> 866af5425SGhennadi Procopciuc #include <s32cc-clk-drv.h> 966af5425SGhennadi Procopciuc #include <s32cc-clk-ids.h> 1066af5425SGhennadi Procopciuc #include <s32cc-clk-utils.h> 1166af5425SGhennadi Procopciuc 1266af5425SGhennadi Procopciuc #define S32CC_FXOSC_FREQ (40U * MHZ) 137ad4e231SGhennadi Procopciuc #define S32CC_ARM_PLL_VCO_FREQ (2U * GHZ) 14de950ef0SGhennadi Procopciuc #define S32CC_ARM_PLL_PHI0_FREQ (1U * GHZ) 1564e0c226SGhennadi Procopciuc #define S32CC_A53_FREQ (1U * GHZ) 16b8ad8800SGhennadi Procopciuc #define S32CC_XBAR_2X_FREQ (800U * MHZ) 178653352aSGhennadi Procopciuc #define S32CC_PERIPH_PLL_VCO_FREQ (2U * GHZ) 18e4462daeSGhennadi Procopciuc #define S32CC_PERIPH_PLL_PHI3_FREQ UART_CLOCK_HZ 1966af5425SGhennadi Procopciuc 20*5300040bSGhennadi Procopciuc static int setup_fxosc(void) 2166af5425SGhennadi Procopciuc { 2266af5425SGhennadi Procopciuc int ret; 2366af5425SGhennadi Procopciuc 24d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL); 25d3869455SGhennadi Procopciuc if (ret != 0) { 26d3869455SGhennadi Procopciuc return ret; 27d3869455SGhennadi Procopciuc } 28d3869455SGhennadi Procopciuc 29d3869455SGhennadi Procopciuc return ret; 30d3869455SGhennadi Procopciuc } 31d3869455SGhennadi Procopciuc 32*5300040bSGhennadi Procopciuc static int setup_arm_pll(void) 33d3869455SGhennadi Procopciuc { 34d3869455SGhennadi Procopciuc int ret; 3566af5425SGhennadi Procopciuc 3683af4504SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC); 3783af4504SGhennadi Procopciuc if (ret != 0) { 3883af4504SGhennadi Procopciuc return ret; 3983af4504SGhennadi Procopciuc } 4083af4504SGhennadi Procopciuc 417ad4e231SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL); 427ad4e231SGhennadi Procopciuc if (ret != 0) { 437ad4e231SGhennadi Procopciuc return ret; 447ad4e231SGhennadi Procopciuc } 457ad4e231SGhennadi Procopciuc 46de950ef0SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL); 47de950ef0SGhennadi Procopciuc if (ret != 0) { 48de950ef0SGhennadi Procopciuc return ret; 49de950ef0SGhennadi Procopciuc } 50de950ef0SGhennadi Procopciuc 51b5101c45SGhennadi Procopciuc return ret; 52b5101c45SGhennadi Procopciuc } 53b5101c45SGhennadi Procopciuc 54*5300040bSGhennadi Procopciuc static int setup_periph_pll(void) 558653352aSGhennadi Procopciuc { 568653352aSGhennadi Procopciuc int ret; 578653352aSGhennadi Procopciuc 588653352aSGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC); 598653352aSGhennadi Procopciuc if (ret != 0) { 608653352aSGhennadi Procopciuc return ret; 618653352aSGhennadi Procopciuc } 628653352aSGhennadi Procopciuc 638653352aSGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL); 648653352aSGhennadi Procopciuc if (ret != 0) { 658653352aSGhennadi Procopciuc return ret; 668653352aSGhennadi Procopciuc } 678653352aSGhennadi Procopciuc 688653352aSGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL); 698653352aSGhennadi Procopciuc if (ret != 0) { 708653352aSGhennadi Procopciuc return ret; 718653352aSGhennadi Procopciuc } 728653352aSGhennadi Procopciuc 738653352aSGhennadi Procopciuc return ret; 748653352aSGhennadi Procopciuc } 758653352aSGhennadi Procopciuc 76d3869455SGhennadi Procopciuc static int enable_a53_clk(void) 77d3869455SGhennadi Procopciuc { 78d3869455SGhennadi Procopciuc int ret; 79d3869455SGhennadi Procopciuc 80d3869455SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0); 81d3869455SGhennadi Procopciuc if (ret != 0) { 82d3869455SGhennadi Procopciuc return ret; 83d3869455SGhennadi Procopciuc } 84d3869455SGhennadi Procopciuc 85d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL); 86d3869455SGhennadi Procopciuc if (ret != 0) { 87d3869455SGhennadi Procopciuc return ret; 88d3869455SGhennadi Procopciuc } 89d3869455SGhennadi Procopciuc 907004f678SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_A53_CORE); 917004f678SGhennadi Procopciuc if (ret != 0) { 927004f678SGhennadi Procopciuc return ret; 937004f678SGhennadi Procopciuc } 947004f678SGhennadi Procopciuc 9566af5425SGhennadi Procopciuc return ret; 9666af5425SGhennadi Procopciuc } 97d3869455SGhennadi Procopciuc 98b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void) 99b8ad8800SGhennadi Procopciuc { 100b8ad8800SGhennadi Procopciuc int ret; 101b8ad8800SGhennadi Procopciuc 102b8ad8800SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1); 103b8ad8800SGhennadi Procopciuc if (ret != 0) { 104b8ad8800SGhennadi Procopciuc return ret; 105b8ad8800SGhennadi Procopciuc } 106b8ad8800SGhennadi Procopciuc 107b8ad8800SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL); 108b8ad8800SGhennadi Procopciuc if (ret != 0) { 109b8ad8800SGhennadi Procopciuc return ret; 110b8ad8800SGhennadi Procopciuc } 111b8ad8800SGhennadi Procopciuc 112b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1); 113b8ad8800SGhennadi Procopciuc if (ret != 0) { 114b8ad8800SGhennadi Procopciuc return ret; 115b8ad8800SGhennadi Procopciuc } 116b8ad8800SGhennadi Procopciuc 117b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_XBAR_2X); 118b8ad8800SGhennadi Procopciuc if (ret != 0) { 119b8ad8800SGhennadi Procopciuc return ret; 120b8ad8800SGhennadi Procopciuc } 121b8ad8800SGhennadi Procopciuc 122b8ad8800SGhennadi Procopciuc return ret; 123b8ad8800SGhennadi Procopciuc } 124b8ad8800SGhennadi Procopciuc 125e4462daeSGhennadi Procopciuc static int enable_uart_clk(void) 126e4462daeSGhennadi Procopciuc { 127e4462daeSGhennadi Procopciuc int ret; 128e4462daeSGhennadi Procopciuc 129e4462daeSGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX8, S32CC_CLK_PERIPH_PLL_PHI3); 130e4462daeSGhennadi Procopciuc if (ret != 0) { 131e4462daeSGhennadi Procopciuc return ret; 132e4462daeSGhennadi Procopciuc } 133e4462daeSGhennadi Procopciuc 134e4462daeSGhennadi Procopciuc ret = clk_enable(S32CC_CLK_LINFLEX_BAUD); 135e4462daeSGhennadi Procopciuc if (ret != 0) { 136e4462daeSGhennadi Procopciuc return ret; 137e4462daeSGhennadi Procopciuc } 138e4462daeSGhennadi Procopciuc 139e4462daeSGhennadi Procopciuc return ret; 140e4462daeSGhennadi Procopciuc } 141e4462daeSGhennadi Procopciuc 142d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void) 143d3869455SGhennadi Procopciuc { 144d3869455SGhennadi Procopciuc int ret; 145d3869455SGhennadi Procopciuc 146d3869455SGhennadi Procopciuc s32cc_clk_register_drv(); 147d3869455SGhennadi Procopciuc 148*5300040bSGhennadi Procopciuc ret = setup_fxosc(); 149d3869455SGhennadi Procopciuc if (ret != 0) { 150d3869455SGhennadi Procopciuc return ret; 151d3869455SGhennadi Procopciuc } 152d3869455SGhennadi Procopciuc 153*5300040bSGhennadi Procopciuc ret = setup_arm_pll(); 1548653352aSGhennadi Procopciuc if (ret != 0) { 1558653352aSGhennadi Procopciuc return ret; 1568653352aSGhennadi Procopciuc } 1578653352aSGhennadi Procopciuc 158d3869455SGhennadi Procopciuc ret = enable_a53_clk(); 159d3869455SGhennadi Procopciuc if (ret != 0) { 160d3869455SGhennadi Procopciuc return ret; 161d3869455SGhennadi Procopciuc } 162d3869455SGhennadi Procopciuc 163b8ad8800SGhennadi Procopciuc ret = enable_xbar_clk(); 164b8ad8800SGhennadi Procopciuc if (ret != 0) { 165b8ad8800SGhennadi Procopciuc return ret; 166b8ad8800SGhennadi Procopciuc } 167b8ad8800SGhennadi Procopciuc 168*5300040bSGhennadi Procopciuc ret = setup_periph_pll(); 169*5300040bSGhennadi Procopciuc if (ret != 0) { 170*5300040bSGhennadi Procopciuc return ret; 171*5300040bSGhennadi Procopciuc } 172*5300040bSGhennadi Procopciuc 173e4462daeSGhennadi Procopciuc ret = enable_uart_clk(); 174e4462daeSGhennadi Procopciuc if (ret != 0) { 175e4462daeSGhennadi Procopciuc return ret; 176e4462daeSGhennadi Procopciuc } 177e4462daeSGhennadi Procopciuc 178d3869455SGhennadi Procopciuc return ret; 179d3869455SGhennadi Procopciuc } 180