xref: /rk3399_ARM-atf/include/drivers/nxp/clk/s32cc/s32cc-clk-modules.h (revision d9373519873b11cf7d9cad57742272c80d8967e7)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*
3  * Copyright 2020-2024 NXP
4  */
5 #ifndef S32CC_CLK_MODULES_H
6 #define S32CC_CLK_MODULES_H
7 
8 #include <inttypes.h>
9 #include <stddef.h>
10 
11 #define MHZ	UL(1000000)
12 #define GHZ	(UL(1000) * MHZ)
13 
14 enum s32cc_clkm_type {
15 	s32cc_osc_t,
16 	s32cc_clk_t,
17 };
18 
19 enum s32cc_clk_source {
20 	S32CC_FIRC,
21 	S32CC_FXOSC,
22 	S32CC_SIRC,
23 };
24 
25 struct s32cc_clk_obj {
26 	enum s32cc_clkm_type type;
27 	uint32_t refcount;
28 };
29 
30 struct s32cc_osc {
31 	struct s32cc_clk_obj desc;
32 	enum s32cc_clk_source source;
33 	unsigned long freq;
34 	void *base;
35 };
36 
37 #define S32CC_OSC_INIT(SOURCE)       \
38 {                                    \
39 	.desc = {                    \
40 		.type = s32cc_osc_t, \
41 	},                           \
42 	.source = (SOURCE),          \
43 }
44 
45 struct s32cc_clk {
46 	struct s32cc_clk_obj desc;
47 	struct s32cc_clk_obj *module;
48 	struct s32cc_clk *pclock;
49 	unsigned long min_freq;
50 	unsigned long max_freq;
51 };
52 
53 struct s32cc_clk_array {
54 	unsigned long type_mask;
55 	struct s32cc_clk **clks;
56 	size_t n_clks;
57 };
58 
59 #define S32CC_FREQ_MODULE(PARENT_MODULE, MIN_F, MAX_F) \
60 {                                                      \
61 	.desc = {                                      \
62 		.type = s32cc_clk_t,                   \
63 	},                                             \
64 	.module = &(PARENT_MODULE).desc,               \
65 	.min_freq = (MIN_F),                           \
66 	.max_freq = (MAX_F),                           \
67 }
68 
69 #define S32CC_FREQ_MODULE_CLK(PARENT_MODULE, MIN_F, MAX_F) \
70 	S32CC_FREQ_MODULE(PARENT_MODULE, MIN_F, MAX_F)
71 
72 #define S32CC_MODULE_CLK(PARENT_MODULE) \
73 	S32CC_FREQ_MODULE_CLK(PARENT_MODULE, 0, 0)
74 
75 static inline struct s32cc_osc *s32cc_obj2osc(const struct s32cc_clk_obj *mod)
76 {
77 	uintptr_t osc_addr;
78 
79 	osc_addr = ((uintptr_t)mod) - offsetof(struct s32cc_osc, desc);
80 	return (struct s32cc_osc *)osc_addr;
81 }
82 
83 static inline struct s32cc_clk *s32cc_obj2clk(const struct s32cc_clk_obj *mod)
84 {
85 	uintptr_t clk_addr;
86 
87 	clk_addr = ((uintptr_t)mod) - offsetof(struct s32cc_clk, desc);
88 	return (struct s32cc_clk *)clk_addr;
89 }
90 
91 #endif /* S32CC_CLK_MODULES_H */
92