1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (c) 2016 Maxime Ripard. All rights reserved.
4 */
5
6 #ifndef _CCU_GATE_H_
7 #define _CCU_GATE_H_
8
9 #include <linux/clk-provider.h>
10
11 #include "ccu_common.h"
12
13 struct ccu_gate {
14 u32 enable;
15
16 struct ccu_common common;
17 };
18
19 #define SUNXI_CCU_GATE(_struct, _name, _parent, _reg, _gate, _flags) \
20 struct ccu_gate _struct = { \
21 .enable = _gate, \
22 .common = { \
23 .reg = _reg, \
24 .hw.init = CLK_HW_INIT(_name, \
25 _parent, \
26 &ccu_gate_ops, \
27 _flags), \
28 } \
29 }
30
31 #define SUNXI_CCU_GATE_HW(_struct, _name, _parent, _reg, _gate, _flags) \
32 struct ccu_gate _struct = { \
33 .enable = _gate, \
34 .common = { \
35 .reg = _reg, \
36 .hw.init = CLK_HW_INIT_HW(_name, \
37 _parent, \
38 &ccu_gate_ops, \
39 _flags), \
40 } \
41 }
42
43 #define SUNXI_CCU_GATE_FW(_struct, _name, _parent, _reg, _gate, _flags) \
44 struct ccu_gate _struct = { \
45 .enable = _gate, \
46 .common = { \
47 .reg = _reg, \
48 .hw.init = CLK_HW_INIT_FW_NAME(_name, \
49 _parent, \
50 &ccu_gate_ops, \
51 _flags), \
52 } \
53 }
54
55 /*
56 * The following macros allow the re-use of the data structure
57 * holding the parent info.
58 */
59 #define SUNXI_CCU_GATE_HWS(_struct, _name, _parent, _reg, _gate, _flags) \
60 struct ccu_gate _struct = { \
61 .enable = _gate, \
62 .common = { \
63 .reg = _reg, \
64 .hw.init = CLK_HW_INIT_HWS(_name, \
65 _parent, \
66 &ccu_gate_ops, \
67 _flags), \
68 } \
69 }
70
71 #define SUNXI_CCU_GATE_HWS_WITH_PREDIV(_struct, _name, _parent, _reg, \
72 _gate, _prediv, _flags) \
73 struct ccu_gate _struct = { \
74 .enable = _gate, \
75 .common = { \
76 .reg = _reg, \
77 .prediv = _prediv, \
78 .features = CCU_FEATURE_ALL_PREDIV, \
79 .hw.init = CLK_HW_INIT_HWS(_name, \
80 _parent, \
81 &ccu_gate_ops, \
82 _flags), \
83 } \
84 }
85
86 #define SUNXI_CCU_GATE_DATA(_struct, _name, _data, _reg, _gate, _flags) \
87 struct ccu_gate _struct = { \
88 .enable = _gate, \
89 .common = { \
90 .reg = _reg, \
91 .hw.init = \
92 CLK_HW_INIT_PARENTS_DATA(_name, \
93 _data, \
94 &ccu_gate_ops, \
95 _flags), \
96 } \
97 }
98
99 #define SUNXI_CCU_GATE_DATA_WITH_PREDIV(_struct, _name, _parent, _reg, \
100 _gate, _prediv, _flags) \
101 struct ccu_gate _struct = { \
102 .enable = _gate, \
103 .common = { \
104 .reg = _reg, \
105 .prediv = _prediv, \
106 .features = CCU_FEATURE_ALL_PREDIV, \
107 .hw.init = CLK_HW_INIT_PARENTS_DATA(_name, \
108 _parent, \
109 &ccu_gate_ops, \
110 _flags), \
111 } \
112 }
113
hw_to_ccu_gate(struct clk_hw * hw)114 static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
115 {
116 struct ccu_common *common = hw_to_ccu_common(hw);
117
118 return container_of(common, struct ccu_gate, common);
119 }
120
121 void ccu_gate_helper_disable(struct ccu_common *common, u32 gate);
122 int ccu_gate_helper_enable(struct ccu_common *common, u32 gate);
123 int ccu_gate_helper_is_enabled(struct ccu_common *common, u32 gate);
124
125 extern const struct clk_ops ccu_gate_ops;
126
127 #endif /* _CCU_GATE_H_ */
128