|
| 1 | +/* |
| 2 | + * Copyright 2025 NXP |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: BSD-3-Clause |
| 5 | + */ |
| 6 | +#include "fsl_clock.h" |
| 7 | + |
| 8 | +/******************************************************************************* |
| 9 | + * Definitions |
| 10 | + ******************************************************************************/ |
| 11 | +/* Component ID definition, used by tools. */ |
| 12 | +#ifndef FSL_COMPONENT_ID |
| 13 | +#define FSL_COMPONENT_ID "platform.drivers.clock" |
| 14 | +#endif |
| 15 | + |
| 16 | +/* ROM initializes PLLs with default frequencies except audio/video/ext */ |
| 17 | +volatile uint32_t g_clockSourceFreq[kCLOCK_Ext + 1] = { |
| 18 | + 24000000U, /* kCLOCK_Osc24M */ |
| 19 | + 2000000000U, /* kCLOCK_ArmPll */ |
| 20 | + 2000000000U, /* kCLOCK_ArmPllOut */ |
| 21 | + 1000000000U, /* kCLOCK_DramPll */ |
| 22 | + 1000000000U, /* kCLOCK_DramPllOut */ |
| 23 | + 4000000000U, /* kCLOCK_SysPll1 */ |
| 24 | + 1000000000U, /* kCLOCK_SysPll1Pfd0 */ |
| 25 | + 500000000U, /* kCLOCK_SysPll1Pfd0Div2 */ |
| 26 | + 800000000U, /* kCLOCK_SysPll1Pfd1 */ |
| 27 | + 400000000U, /* kCLOCK_SysPll1Pfd1Div2 */ |
| 28 | + 625000000U, /* kCLOCK_SysPll1Pfd2 */ |
| 29 | + 312500000U, /* kCLOCK_SysPll1Pfd2Div2 */ |
| 30 | + 0U, /* kCLOCK_AudioPll1 */ |
| 31 | + 0U, /* kCLOCK_AudioPll1Out */ |
| 32 | + 0U, /* kCLOCK_VideoPll1 */ |
| 33 | + 0U, /* kCLOCK_VideoPll1Out */ |
| 34 | + 0U /* kCLOCK_Ext */ |
| 35 | +}; |
| 36 | + |
| 37 | +const clock_name_t s_clockSourceName[][4] = { |
| 38 | + /*SRC0, SRC1, SRC2, SRC3, */ |
| 39 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Arm A55 Periph */ |
| 40 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Arm A55 MTR BUS */ |
| 41 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Arm A55 */ |
| 42 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* M33 */ |
| 43 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Sentinel */ |
| 44 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Bus Wakeup */ |
| 45 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Bus Aon */ |
| 46 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Wakeup Axi */ |
| 47 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Swo Trace */ |
| 48 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* M33 Systick */ |
| 49 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Flexio1 */ |
| 50 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Flexio2 */ |
| 51 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpit1 */ |
| 52 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpit2 */ |
| 53 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lptmr1 */ |
| 54 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lptmr2 */ |
| 55 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_AudioPll1Out, kCLOCK_Ext}, /* Tpm1 */ |
| 56 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_AudioPll1Out, kCLOCK_Ext}, /* Tpm2 */ |
| 57 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_AudioPll1Out, kCLOCK_Ext}, /* Tpm3 */ |
| 58 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_AudioPll1Out, kCLOCK_Ext}, /* Tpm4 */ |
| 59 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_AudioPll1Out, kCLOCK_Ext}, /* Tpm5 */ |
| 60 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_AudioPll1Out, kCLOCK_Ext}, /* Tpm6 */ |
| 61 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Flexspi1 */ |
| 62 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Can1 */ |
| 63 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Can2 */ |
| 64 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart1 */ |
| 65 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart2 */ |
| 66 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart3 */ |
| 67 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart4 */ |
| 68 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart5 */ |
| 69 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart6 */ |
| 70 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart7 */ |
| 71 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpuart8 */ |
| 72 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c1 */ |
| 73 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c2 */ |
| 74 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c3 */ |
| 75 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c4 */ |
| 76 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c5 */ |
| 77 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c6 */ |
| 78 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c7 */ |
| 79 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpi2c8 */ |
| 80 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi1 */ |
| 81 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi2 */ |
| 82 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi3 */ |
| 83 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi4 */ |
| 84 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi5 */ |
| 85 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi6 */ |
| 86 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi7 */ |
| 87 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Lpspi8 */ |
| 88 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* I3c1 */ |
| 89 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* I3c2 */ |
| 90 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Usdhc1 */ |
| 91 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Usdhc2 */ |
| 92 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Usdhc3 */ |
| 93 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_Ext}, /* Sai1 */ |
| 94 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_Ext}, /* Sai2 */ |
| 95 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_Ext}, /* Sai3 */ |
| 96 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_AudioPll1Out}, /* Ccm Cko1 */ |
| 97 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_VideoPll1Out}, /* Ccm Cko2 */ |
| 98 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_AudioPll1Out}, /* Ccm Cko3 */ |
| 99 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_VideoPll1Out}, /* Ccm Cko4 */ |
| 100 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Hsio */ |
| 101 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Hsio Usb Test 60M */ |
| 102 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Hsio Acscan 80M */ |
| 103 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_SysPll1Pfd2}, /* Hsio Acscan 480M */ |
| 104 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Nic */ |
| 105 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Nic Apb */ |
| 106 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Ml Apb */ |
| 107 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Ml */ |
| 108 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Media Axi */ |
| 109 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Media Apb */ |
| 110 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_SysPll1Pfd0}, /* Media Ldb */ |
| 111 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_SysPll1Pfd0}, /* Media Disp Pix */ |
| 112 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_SysPll1Pfd0}, /* Cam Pix */ |
| 113 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_SysPll1Pfd0}, /* Mipi Test Byte */ |
| 114 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_SysPll1Pfd0}, /* Mipi Phy Cfg */ |
| 115 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0, kCLOCK_SysPll1Pfd1, kCLOCK_SysPll1Pfd2}, /* Dram Alt */ |
| 116 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_SysPll1Pfd2Div2}, /* Dram Apb */ |
| 117 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Adc */ |
| 118 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_Ext}, /* Pdm */ |
| 119 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Tstmr1 */ |
| 120 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Tstmr2 */ |
| 121 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_Ext}, /* Mqs1 */ |
| 122 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_Ext}, /* Mqs2 */ |
| 123 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_SysPll1Pfd2Div2}, /* Audio XCVR */ |
| 124 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_Ext}, /* Spdif */ |
| 125 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_SysPll1Pfd2Div2}, /* Enet */ |
| 126 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Enet Timer1 */ |
| 127 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Enet Timer2 */ |
| 128 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_SysPll1Pfd2Div2}, /* Enet Ref */ |
| 129 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Enet Ref Phy */ |
| 130 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* I3c1 Slow */ |
| 131 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* I3c2 Slow */ |
| 132 | + {kCLOCK_Osc24M, kCLOCK_SysPll1Pfd0Div2, kCLOCK_SysPll1Pfd1Div2, kCLOCK_VideoPll1Out}, /* Usb Phy Burunin */ |
| 133 | + {kCLOCK_Osc24M, kCLOCK_AudioPll1Out, kCLOCK_VideoPll1Out, kCLOCK_SysPll1Pfd2} /* Pal Came Scan */ |
| 134 | +}; |
| 135 | + |
| 136 | +uint32_t CLOCK_GetIpFreq(clock_root_t name) |
| 137 | +{ |
| 138 | + clock_name_t clock; |
| 139 | + uint32_t mux; |
| 140 | + uint32_t div; |
| 141 | + |
| 142 | + mux = CLOCK_GetRootClockMux(name); |
| 143 | + div = CLOCK_GetRootClockDiv(name); |
| 144 | + |
| 145 | + clock = CLOCK_GetRootClockSource(name, mux); |
| 146 | + assert(clock <= kCLOCK_Ext); |
| 147 | + |
| 148 | + return g_clockSourceFreq[clock] / div; |
| 149 | +} |
0 commit comments