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> 7*e4462daeSGhennadi 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) 18*e4462daeSGhennadi Procopciuc #define S32CC_PERIPH_PLL_PHI3_FREQ UART_CLOCK_HZ 1966af5425SGhennadi Procopciuc 20d3869455SGhennadi Procopciuc static int enable_fxosc_clk(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 ret = clk_enable(S32CC_CLK_FXOSC); 30d3869455SGhennadi Procopciuc if (ret != 0) { 31d3869455SGhennadi Procopciuc return ret; 32d3869455SGhennadi Procopciuc } 33d3869455SGhennadi Procopciuc 34d3869455SGhennadi Procopciuc return ret; 35d3869455SGhennadi Procopciuc } 36d3869455SGhennadi Procopciuc 37d3869455SGhennadi Procopciuc static int enable_arm_pll(void) 38d3869455SGhennadi Procopciuc { 39d3869455SGhennadi Procopciuc int ret; 4066af5425SGhennadi Procopciuc 4183af4504SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC); 4283af4504SGhennadi Procopciuc if (ret != 0) { 4383af4504SGhennadi Procopciuc return ret; 4483af4504SGhennadi Procopciuc } 4583af4504SGhennadi Procopciuc 467ad4e231SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL); 477ad4e231SGhennadi Procopciuc if (ret != 0) { 487ad4e231SGhennadi Procopciuc return ret; 497ad4e231SGhennadi Procopciuc } 507ad4e231SGhennadi Procopciuc 51de950ef0SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL); 52de950ef0SGhennadi Procopciuc if (ret != 0) { 53de950ef0SGhennadi Procopciuc return ret; 54de950ef0SGhennadi Procopciuc } 55de950ef0SGhennadi Procopciuc 56b5101c45SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_VCO); 57b5101c45SGhennadi Procopciuc if (ret != 0) { 58b5101c45SGhennadi Procopciuc return ret; 59b5101c45SGhennadi Procopciuc } 60b5101c45SGhennadi Procopciuc 6184e82085SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0); 6284e82085SGhennadi Procopciuc if (ret != 0) { 6384e82085SGhennadi Procopciuc return ret; 6484e82085SGhennadi Procopciuc } 6584e82085SGhennadi Procopciuc 66d3869455SGhennadi Procopciuc return ret; 67d3869455SGhennadi Procopciuc } 68d3869455SGhennadi Procopciuc 698653352aSGhennadi Procopciuc static int enable_periph_pll(void) 708653352aSGhennadi Procopciuc { 718653352aSGhennadi Procopciuc int ret; 728653352aSGhennadi Procopciuc 738653352aSGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC); 748653352aSGhennadi Procopciuc if (ret != 0) { 758653352aSGhennadi Procopciuc return ret; 768653352aSGhennadi Procopciuc } 778653352aSGhennadi Procopciuc 788653352aSGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL); 798653352aSGhennadi Procopciuc if (ret != 0) { 808653352aSGhennadi Procopciuc return ret; 818653352aSGhennadi Procopciuc } 828653352aSGhennadi Procopciuc 838653352aSGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL); 848653352aSGhennadi Procopciuc if (ret != 0) { 858653352aSGhennadi Procopciuc return ret; 868653352aSGhennadi Procopciuc } 878653352aSGhennadi Procopciuc 888653352aSGhennadi Procopciuc ret = clk_enable(S32CC_CLK_PERIPH_PLL_VCO); 898653352aSGhennadi Procopciuc if (ret != 0) { 908653352aSGhennadi Procopciuc return ret; 918653352aSGhennadi Procopciuc } 928653352aSGhennadi Procopciuc 938653352aSGhennadi Procopciuc ret = clk_enable(S32CC_CLK_PERIPH_PLL_PHI3); 948653352aSGhennadi Procopciuc if (ret != 0) { 958653352aSGhennadi Procopciuc return ret; 968653352aSGhennadi Procopciuc } 978653352aSGhennadi Procopciuc 988653352aSGhennadi Procopciuc return ret; 998653352aSGhennadi Procopciuc } 1008653352aSGhennadi Procopciuc 101d3869455SGhennadi Procopciuc static int enable_a53_clk(void) 102d3869455SGhennadi Procopciuc { 103d3869455SGhennadi Procopciuc int ret; 104d3869455SGhennadi Procopciuc 105d3869455SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0); 106d3869455SGhennadi Procopciuc if (ret != 0) { 107d3869455SGhennadi Procopciuc return ret; 108d3869455SGhennadi Procopciuc } 109d3869455SGhennadi Procopciuc 110d3869455SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL); 111d3869455SGhennadi Procopciuc if (ret != 0) { 112d3869455SGhennadi Procopciuc return ret; 113d3869455SGhennadi Procopciuc } 114d3869455SGhennadi Procopciuc 1157004f678SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_A53_CORE); 1167004f678SGhennadi Procopciuc if (ret != 0) { 1177004f678SGhennadi Procopciuc return ret; 1187004f678SGhennadi Procopciuc } 1197004f678SGhennadi Procopciuc 12066af5425SGhennadi Procopciuc return ret; 12166af5425SGhennadi Procopciuc } 122d3869455SGhennadi Procopciuc 123b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void) 124b8ad8800SGhennadi Procopciuc { 125b8ad8800SGhennadi Procopciuc int ret; 126b8ad8800SGhennadi Procopciuc 127b8ad8800SGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1); 128b8ad8800SGhennadi Procopciuc if (ret != 0) { 129b8ad8800SGhennadi Procopciuc return ret; 130b8ad8800SGhennadi Procopciuc } 131b8ad8800SGhennadi Procopciuc 132b8ad8800SGhennadi Procopciuc ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL); 133b8ad8800SGhennadi Procopciuc if (ret != 0) { 134b8ad8800SGhennadi Procopciuc return ret; 135b8ad8800SGhennadi Procopciuc } 136b8ad8800SGhennadi Procopciuc 137b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1); 138b8ad8800SGhennadi Procopciuc if (ret != 0) { 139b8ad8800SGhennadi Procopciuc return ret; 140b8ad8800SGhennadi Procopciuc } 141b8ad8800SGhennadi Procopciuc 142b8ad8800SGhennadi Procopciuc ret = clk_enable(S32CC_CLK_XBAR_2X); 143b8ad8800SGhennadi Procopciuc if (ret != 0) { 144b8ad8800SGhennadi Procopciuc return ret; 145b8ad8800SGhennadi Procopciuc } 146b8ad8800SGhennadi Procopciuc 147b8ad8800SGhennadi Procopciuc return ret; 148b8ad8800SGhennadi Procopciuc } 149b8ad8800SGhennadi Procopciuc 150*e4462daeSGhennadi Procopciuc static int enable_uart_clk(void) 151*e4462daeSGhennadi Procopciuc { 152*e4462daeSGhennadi Procopciuc int ret; 153*e4462daeSGhennadi Procopciuc 154*e4462daeSGhennadi Procopciuc ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX8, S32CC_CLK_PERIPH_PLL_PHI3); 155*e4462daeSGhennadi Procopciuc if (ret != 0) { 156*e4462daeSGhennadi Procopciuc return ret; 157*e4462daeSGhennadi Procopciuc } 158*e4462daeSGhennadi Procopciuc 159*e4462daeSGhennadi Procopciuc ret = clk_enable(S32CC_CLK_LINFLEX_BAUD); 160*e4462daeSGhennadi Procopciuc if (ret != 0) { 161*e4462daeSGhennadi Procopciuc return ret; 162*e4462daeSGhennadi Procopciuc } 163*e4462daeSGhennadi Procopciuc 164*e4462daeSGhennadi Procopciuc return ret; 165*e4462daeSGhennadi Procopciuc } 166*e4462daeSGhennadi Procopciuc 167d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void) 168d3869455SGhennadi Procopciuc { 169d3869455SGhennadi Procopciuc int ret; 170d3869455SGhennadi Procopciuc 171d3869455SGhennadi Procopciuc s32cc_clk_register_drv(); 172d3869455SGhennadi Procopciuc 173d3869455SGhennadi Procopciuc ret = enable_fxosc_clk(); 174d3869455SGhennadi Procopciuc if (ret != 0) { 175d3869455SGhennadi Procopciuc return ret; 176d3869455SGhennadi Procopciuc } 177d3869455SGhennadi Procopciuc 178d3869455SGhennadi Procopciuc ret = enable_arm_pll(); 179d3869455SGhennadi Procopciuc if (ret != 0) { 180d3869455SGhennadi Procopciuc return ret; 181d3869455SGhennadi Procopciuc } 182d3869455SGhennadi Procopciuc 1838653352aSGhennadi Procopciuc ret = enable_periph_pll(); 1848653352aSGhennadi Procopciuc if (ret != 0) { 1858653352aSGhennadi Procopciuc return ret; 1868653352aSGhennadi Procopciuc } 1878653352aSGhennadi Procopciuc 188d3869455SGhennadi Procopciuc ret = enable_a53_clk(); 189d3869455SGhennadi Procopciuc if (ret != 0) { 190d3869455SGhennadi Procopciuc return ret; 191d3869455SGhennadi Procopciuc } 192d3869455SGhennadi Procopciuc 193b8ad8800SGhennadi Procopciuc ret = enable_xbar_clk(); 194b8ad8800SGhennadi Procopciuc if (ret != 0) { 195b8ad8800SGhennadi Procopciuc return ret; 196b8ad8800SGhennadi Procopciuc } 197b8ad8800SGhennadi Procopciuc 198*e4462daeSGhennadi Procopciuc ret = enable_uart_clk(); 199*e4462daeSGhennadi Procopciuc if (ret != 0) { 200*e4462daeSGhennadi Procopciuc return ret; 201*e4462daeSGhennadi Procopciuc } 202*e4462daeSGhennadi Procopciuc 203d3869455SGhennadi Procopciuc return ret; 204d3869455SGhennadi Procopciuc } 205