1 /* SPDX-License-Identifier: GPL-2.0+ */
5 * Peng Fan <peng.fan at nxp.com>
8 #include <linux/bitops.h>
11 #include <asm/arch/clock_imx8mq.h>
12 #elif defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN) || \
13 defined(CONFIG_IMX8MP)
14 #include <asm/arch/clock_imx8mm.h>
16 #error "Error no clock.h"
19 #define MHZ(X) ((X) * 1000000UL)
21 /* Mainly for compatible to imx common code. */
45 CLK_ROOT_PRE_DIV1 = 0,
56 CLK_ROOT_POST_DIV1 = 0,
122 struct clk_root_map {
123 enum clk_root_index entry;
124 enum clk_slice_type slice_type;
146 u32 nm_post_root_set;
147 u32 nm_post_root_clr;
148 u32 nm_post_root_tog;
154 u32 db_post_root_set;
155 u32 db_post_root_clr;
156 u32 db_post_root_tog;
163 u32 access_ctrl_root_set;
164 u32 access_ctrl_root_clr;
165 u32 access_ctrl_root_tog;
169 u32 reserved_0[4096];
170 struct ccm_ccgr ccgr_array[192];
171 u32 reserved_1[3328];
172 struct ccm_root core_root[5];
174 struct ccm_root bus_root[12];
176 struct ccm_root ahb_ipg_root[4];
178 struct ccm_root dram_sel;
179 struct ccm_root core_sel;
181 struct ccm_root ip_root[78];
190 #define DRAM_BYPASS_ROOT_CONFIG(_rate, _m, _p, _s, _k) \
193 .alt_root_sel = (_m), \
194 .alt_pre_div = (_p), \
195 .apb_root_sel = (_s), \
196 .apb_pre_div = (_k), \
199 struct dram_bypass_clk_setting {
202 enum root_pre_div alt_pre_div;
204 enum root_pre_div apb_pre_div;
207 #define CCGR_CLK_ON_MASK 0x03
208 #define CLK_SRC_ON_MASK 0x03
210 #define CLK_ROOT_ON BIT(28)
211 #define CLK_ROOT_OFF (0 << 28)
212 #define CLK_ROOT_ENABLE_MASK BIT(28)
213 #define CLK_ROOT_ENABLE_SHIFT 28
214 #define CLK_ROOT_SOURCE_SEL(n) (((n) & 0x7) << 24)
216 /* For SEL, only use 1 bit */
217 #define CLK_ROOT_SRC_MUX_MASK 0x07000000
218 #define CLK_ROOT_SRC_MUX_SHIFT 24
219 #define CLK_ROOT_SRC_0 0x00000000
220 #define CLK_ROOT_SRC_1 0x01000000
221 #define CLK_ROOT_SRC_2 0x02000000
222 #define CLK_ROOT_SRC_3 0x03000000
223 #define CLK_ROOT_SRC_4 0x04000000
224 #define CLK_ROOT_SRC_5 0x05000000
225 #define CLK_ROOT_SRC_6 0x06000000
226 #define CLK_ROOT_SRC_7 0x07000000
228 #define CLK_ROOT_PRE_DIV_MASK (0x00070000)
229 #define CLK_ROOT_PRE_DIV_SHIFT 16
230 #define CLK_ROOT_PRE_DIV(n) (((n) << 16) & 0x00070000)
232 #define CLK_ROOT_AUDO_SLOW_EN 0x1000
234 #define CLK_ROOT_AUDO_DIV_MASK 0x700
235 #define CLK_ROOT_AUDO_DIV_SHIFT 0x8
236 #define CLK_ROOT_AUDO_DIV(n) (((n) << 8) & 0x700)
238 /* For CORE: mask is 0x7; For IPG: mask is 0x3 */
239 #define CLK_ROOT_POST_DIV_MASK 0x3f
240 #define CLK_ROOT_CORE_POST_DIV_MASK 0x7
241 #define CLK_ROOT_IPG_POST_DIV_MASK 0x3
242 #define CLK_ROOT_POST_DIV_SHIFT 0
243 #define CLK_ROOT_POST_DIV(n) ((n) & 0x3f)
244 #define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK 0x01000000
245 #define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK 0x02000000
246 #define ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK 0x03000000
247 #define ENET_AXI_CLK_ROOT_FROM_PLL_SYS_PFD4_CLK 0x07000000
248 #define ENET_AXI_CLK_ROOT_FROM_SYS1_PLL_266M 0x01000000
249 #define ENET1_TIME_CLK_ROOT_FROM_PLL_ENET_MAIN_100M_CLK 0x01000000
250 #define ENET_PHY_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK 0x01000000
252 void dram_pll_init(ulong pll_val);
253 void dram_enable_bypass(ulong clk_val);
254 void dram_disable_bypass(void);
255 u32 imx_get_fecclk(void);
256 u32 imx_get_uartclk(void);
257 int clock_init(void);
258 void init_clk_usdhc(u32 index);
259 void init_nand_clk(void);
260 void init_uart_clk(u32 index);
261 void init_usb_clk(void);
262 void init_wdog_clk(void);
263 unsigned int mxc_get_clock(enum mxc_clock clk);
264 int clock_enable(enum clk_ccgr_index index, bool enable);
265 int clock_root_enabled(enum clk_root_index clock_id);
266 int clock_root_cfg(enum clk_root_index clock_id, enum root_pre_div pre_div,
267 enum root_post_div post_div, enum clk_root_src clock_src);
268 int clock_set_target_val(enum clk_root_index clock_id, u32 val);
269 int clock_get_target_val(enum clk_root_index clock_id, u32 *val);
270 int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div);
271 int clock_get_postdiv(enum clk_root_index clock_id,
272 enum root_post_div *post_div);
273 int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src);
274 void mxs_set_lcdclk(u32 base_addr, u32 freq);
275 int set_clk_qspi(void);
276 void enable_ocotp_clk(unsigned char enable);
277 int enable_i2c_clk(unsigned char enable, unsigned int i2c_num);
278 int set_clk_enet(enum enet_freq type);
279 int set_clk_eqos(enum enet_freq type);
280 void hab_caam_clock_enable(unsigned char enable);