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 two 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_DATA(_struct, _name, _data, _reg, _gate, _flags) \
72 struct ccu_gate _struct = { \
73 .enable = _gate, \
74 .common = { \
75 .reg = _reg, \
76 .hw.init = \
77 CLK_HW_INIT_PARENTS_DATA(_name, \
78 _data, \
79 &ccu_gate_ops, \
80 _flags), \
81 } \
82 }
83
hw_to_ccu_gate(struct clk_hw * hw)84 static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
85 {
86 struct ccu_common *common = hw_to_ccu_common(hw);
87
88 return container_of(common, struct ccu_gate, common);
89 }
90
91 void ccu_gate_helper_disable(struct ccu_common *common, u32 gate);
92 int ccu_gate_helper_enable(struct ccu_common *common, u32 gate);
93 int ccu_gate_helper_is_enabled(struct ccu_common *common, u32 gate);
94
95 extern const struct clk_ops ccu_gate_ops;
96
97 #endif /* _CCU_GATE_H_ */
98