1 /* SPDX-License-Identifier: GPL-2.0 */
2 //
3 // Spreadtrum gate clock driver
4 //
5 // Copyright (C) 2017 Spreadtrum, Inc.
6 // Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
7
8 #ifndef _SPRD_GATE_H_
9 #define _SPRD_GATE_H_
10
11 #include "common.h"
12
13 struct sprd_gate {
14 u32 enable_mask;
15 u16 flags;
16 u16 sc_offset;
17 u16 udelay;
18
19 struct sprd_clk_common common;
20 };
21
22 /*
23 * sprd_gate->flags is used for:
24 * CLK_GATE_SET_TO_DISABLE BIT(0)
25 * CLK_GATE_HIWORD_MASK BIT(1)
26 * CLK_GATE_BIG_ENDIAN BIT(2)
27 * so we define new flags from BIT(3)
28 */
29 #define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */
30
31 #define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
32 _sc_offset, _enable_mask, _flags, \
33 _gate_flags, _udelay, _ops, _fn) \
34 struct sprd_gate _struct = { \
35 .enable_mask = _enable_mask, \
36 .sc_offset = _sc_offset, \
37 .flags = _gate_flags, \
38 .udelay = _udelay, \
39 .common = { \
40 .regmap = NULL, \
41 .reg = _reg, \
42 .hw.init = _fn(_name, _parent, \
43 _ops, _flags), \
44 } \
45 }
46
47 #define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
48 _sc_offset, _enable_mask, _flags, \
49 _gate_flags, _udelay, _ops) \
50 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
51 _sc_offset, _enable_mask, _flags, \
52 _gate_flags, _udelay, _ops, CLK_HW_INIT)
53
54 #define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \
55 _enable_mask, _flags, _gate_flags, _ops) \
56 SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
57 _sc_offset, _enable_mask, _flags, \
58 _gate_flags, 0, _ops)
59
60 #define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \
61 _enable_mask, _flags, _gate_flags) \
62 SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \
63 _enable_mask, _flags, _gate_flags, \
64 &sprd_sc_gate_ops)
65
66 #define SPRD_GATE_CLK(_struct, _name, _parent, _reg, \
67 _enable_mask, _flags, _gate_flags) \
68 SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0, \
69 _enable_mask, _flags, _gate_flags, \
70 &sprd_gate_ops)
71
72 #define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \
73 _enable_mask, _flags, _gate_flags, \
74 _udelay) \
75 SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
76 _sc_offset, _enable_mask, _flags, \
77 _gate_flags, _udelay, \
78 &sprd_pll_sc_gate_ops)
79
80
81 #define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
82 _sc_offset, _enable_mask, \
83 _flags, _gate_flags, \
84 _udelay, _ops) \
85 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
86 _sc_offset, _enable_mask, _flags, \
87 _gate_flags, _udelay, _ops, \
88 CLK_HW_INIT_HW)
89
90 #define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \
91 _sc_offset, _enable_mask, _flags, \
92 _gate_flags, _ops) \
93 SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
94 _sc_offset, _enable_mask, \
95 _flags, _gate_flags, 0, _ops)
96
97 #define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \
98 _sc_offset, _enable_mask, _flags, \
99 _gate_flags) \
100 SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \
101 _sc_offset, _enable_mask, _flags, \
102 _gate_flags, &sprd_sc_gate_ops)
103
104 #define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg, \
105 _enable_mask, _flags, _gate_flags) \
106 SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0, \
107 _enable_mask, _flags, _gate_flags, \
108 &sprd_gate_ops)
109
110 #define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \
111 _sc_offset, _enable_mask, _flags, \
112 _gate_flags, _udelay) \
113 SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
114 _sc_offset, _enable_mask, \
115 _flags, _gate_flags, _udelay, \
116 &sprd_pll_sc_gate_ops)
117
118 #define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
119 _reg, _sc_offset, \
120 _enable_mask, _flags, \
121 _gate_flags, _udelay, _ops) \
122 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
123 _sc_offset, _enable_mask, _flags, \
124 _gate_flags, _udelay, _ops, \
125 CLK_HW_INIT_FW_NAME)
126
127 #define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \
128 _sc_offset, _enable_mask, _flags, \
129 _gate_flags, _ops) \
130 SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
131 _reg, _sc_offset, \
132 _enable_mask, _flags, \
133 _gate_flags, 0, _ops)
134
135 #define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
136 _sc_offset, _enable_mask, _flags, \
137 _gate_flags) \
138 SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \
139 _sc_offset, _enable_mask, _flags, \
140 _gate_flags, &sprd_sc_gate_ops)
141
142 #define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
143 _enable_mask, _flags, _gate_flags) \
144 SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0, \
145 _enable_mask, _flags, _gate_flags, \
146 &sprd_gate_ops)
147
148 #define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
149 _sc_offset, _enable_mask, _flags, \
150 _gate_flags, _udelay) \
151 SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
152 _reg, _sc_offset, \
153 _enable_mask, _flags, \
154 _gate_flags, _udelay, \
155 &sprd_pll_sc_gate_ops)
156
hw_to_sprd_gate(const struct clk_hw * hw)157 static inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw)
158 {
159 struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
160
161 return container_of(common, struct sprd_gate, common);
162 }
163
164 extern const struct clk_ops sprd_gate_ops;
165 extern const struct clk_ops sprd_sc_gate_ops;
166 extern const struct clk_ops sprd_pll_sc_gate_ops;
167
168 #endif /* _SPRD_GATE_H_ */
169