1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2023 Inochi Amaoto <inochiama@outlook.com>
6 #ifndef _CLK_SOPHGO_CV1800_IP_H_
7 #define _CLK_SOPHGO_CV1800_IP_H_
9 #include "clk-cv18xx-common.h"
11 struct cv1800_clk_gate
{
12 struct cv1800_clk_common common
;
13 struct cv1800_clk_regbit gate
;
16 struct cv1800_clk_div_data
{
24 struct cv1800_clk_div
{
25 struct cv1800_clk_common common
;
26 struct cv1800_clk_regbit gate
;
27 struct cv1800_clk_regfield div
;
30 struct cv1800_clk_bypass_div
{
31 struct cv1800_clk_div div
;
32 struct cv1800_clk_regbit bypass
;
35 struct cv1800_clk_mux
{
36 struct cv1800_clk_common common
;
37 struct cv1800_clk_regbit gate
;
38 struct cv1800_clk_regfield div
;
39 struct cv1800_clk_regfield mux
;
42 struct cv1800_clk_bypass_mux
{
43 struct cv1800_clk_mux mux
;
44 struct cv1800_clk_regbit bypass
;
47 struct cv1800_clk_mmux
{
48 struct cv1800_clk_common common
;
49 struct cv1800_clk_regbit gate
;
50 struct cv1800_clk_regfield div
[2];
51 struct cv1800_clk_regfield mux
[2];
52 struct cv1800_clk_regbit bypass
;
53 struct cv1800_clk_regbit clk_sel
;
55 const u8
*sel2parent
[2];
58 struct cv1800_clk_audio
{
59 struct cv1800_clk_common common
;
60 struct cv1800_clk_regbit src_en
;
61 struct cv1800_clk_regbit output_en
;
62 struct cv1800_clk_regbit div_en
;
63 struct cv1800_clk_regbit div_up
;
64 struct cv1800_clk_regfield m
;
65 struct cv1800_clk_regfield n
;
69 #define CV1800_GATE(_name, _parent, _gate_reg, _gate_shift, _flags) \
70 struct cv1800_clk_gate _name = { \
71 .common = CV1800_CLK_COMMON(#_name, _parent, \
72 &cv1800_clk_gate_ops, \
74 .gate = CV1800_CLK_BIT(_gate_reg, _gate_shift), \
77 #define _CV1800_DIV(_name, _parent, _gate_reg, _gate_shift, \
78 _div_reg, _div_shift, _div_width, _div_init, \
79 _div_flag, _ops, _flags) \
81 .common = CV1800_CLK_COMMON(#_name, _parent, \
83 .gate = CV1800_CLK_BIT(_gate_reg, \
85 .div = CV1800_CLK_REG(_div_reg, _div_shift, \
86 _div_width, _div_init, \
90 #define _CV1800_FIXED_DIV_FLAG \
91 (CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST)
93 #define _CV1800_FIXED_DIV(_name, _parent, _gate_reg, _gate_shift, \
94 _fix_div, _ops, _flags) \
96 .common = CV1800_CLK_COMMON(#_name, _parent, \
98 .gate = CV1800_CLK_BIT(_gate_reg, \
100 .div = CV1800_CLK_REG(0, 0, 0, \
102 _CV1800_FIXED_DIV_FLAG),\
105 #define CV1800_DIV(_name, _parent, _gate_reg, _gate_shift, \
106 _div_reg, _div_shift, _div_width, _div_init, \
108 struct cv1800_clk_div _name = \
109 _CV1800_DIV(_name, _parent, _gate_reg, _gate_shift, \
110 _div_reg, _div_shift, _div_width, _div_init,\
111 _div_flag, &cv1800_clk_div_ops, _flags)
113 #define CV1800_BYPASS_DIV(_name, _parent, _gate_reg, _gate_shift, \
114 _div_reg, _div_shift, _div_width, _div_init, \
115 _div_flag, _bypass_reg, _bypass_shift, _flags)\
116 struct cv1800_clk_bypass_div _name = { \
117 .div = _CV1800_DIV(_name, _parent, \
118 _gate_reg, _gate_shift, \
119 _div_reg, _div_shift, \
120 _div_width, _div_init, _div_flag, \
121 &cv1800_clk_bypass_div_ops, \
123 .bypass = CV1800_CLK_BIT(_bypass_reg, _bypass_shift), \
126 #define CV1800_FIXED_DIV(_name, _parent, _gate_reg, _gate_shift, \
128 struct cv1800_clk_div _name = \
129 _CV1800_FIXED_DIV(_name, _parent, \
130 _gate_reg, _gate_shift, \
132 &cv1800_clk_div_ops, _flags) \
134 #define CV1800_BYPASS_FIXED_DIV(_name, _parent, _gate_reg, _gate_shift, \
135 _fix_div, _bypass_reg, _bypass_shift, \
137 struct cv1800_clk_bypass_div _name = { \
138 .div = _CV1800_FIXED_DIV(_name, _parent, \
139 _gate_reg, _gate_shift, \
141 &cv1800_clk_bypass_div_ops, \
143 .bypass = CV1800_CLK_BIT(_bypass_reg, _bypass_shift), \
146 #define _CV1800_MUX(_name, _parent, _gate_reg, _gate_shift, \
147 _div_reg, _div_shift, _div_width, _div_init, \
149 _mux_reg, _mux_shift, _mux_width, \
152 .common = CV1800_CLK_COMMON(#_name, _parent, \
154 .gate = CV1800_CLK_BIT(_gate_reg, \
156 .div = CV1800_CLK_REG(_div_reg, _div_shift, \
157 _div_width, _div_init, \
159 .mux = CV1800_CLK_REG(_mux_reg, _mux_shift, \
163 #define CV1800_MUX(_name, _parent, _gate_reg, _gate_shift, \
164 _div_reg, _div_shift, _div_width, _div_init, \
166 _mux_reg, _mux_shift, _mux_width, _flags) \
167 struct cv1800_clk_mux _name = \
168 _CV1800_MUX(_name, _parent, _gate_reg, _gate_shift, \
169 _div_reg, _div_shift, _div_width, _div_init,\
170 _div_flag, _mux_reg, _mux_shift, _mux_width,\
171 &cv1800_clk_mux_ops, _flags)
173 #define CV1800_BYPASS_MUX(_name, _parent, _gate_reg, _gate_shift, \
174 _div_reg, _div_shift, _div_width, _div_init, \
176 _mux_reg, _mux_shift, _mux_width, \
177 _bypass_reg, _bypass_shift, _flags) \
178 struct cv1800_clk_bypass_mux _name = { \
179 .mux = _CV1800_MUX(_name, _parent, \
180 _gate_reg, _gate_shift, \
181 _div_reg, _div_shift, _div_width, \
182 _div_init, _div_flag, \
183 _mux_reg, _mux_shift, _mux_width, \
184 &cv1800_clk_bypass_mux_ops, \
186 .bypass = CV1800_CLK_BIT(_bypass_reg, _bypass_shift), \
189 #define CV1800_MMUX(_name, _parent, _gate_reg, _gate_shift, \
190 _div0_reg, _div0_shift, _div0_width, _div0_init, \
192 _div1_reg, _div1_shift, _div1_width, _div1_init, \
194 _mux0_reg, _mux0_shift, _mux0_width, \
195 _mux1_reg, _mux1_shift, _mux1_width, \
196 _bypass_reg, _bypass_shift, \
197 _clk_sel_reg, _clk_sel_shift, \
198 _parent2sel, _sel2parent0, _sel2parent1, _flags) \
199 struct cv1800_clk_mmux _name = { \
200 .common = CV1800_CLK_COMMON(#_name, _parent, \
201 &cv1800_clk_mmux_ops,\
203 .gate = CV1800_CLK_BIT(_gate_reg, _gate_shift),\
205 CV1800_CLK_REG(_div0_reg, _div0_shift, \
206 _div0_width, _div0_init, \
208 CV1800_CLK_REG(_div1_reg, _div1_shift, \
209 _div1_width, _div1_init, \
213 CV1800_CLK_REG(_mux0_reg, _mux0_shift, \
214 _mux0_width, 0, 0), \
215 CV1800_CLK_REG(_mux1_reg, _mux1_shift, \
216 _mux1_width, 0, 0), \
218 .bypass = CV1800_CLK_BIT(_bypass_reg, \
220 .clk_sel = CV1800_CLK_BIT(_clk_sel_reg, \
222 .parent2sel = _parent2sel, \
223 .sel2parent = { _sel2parent0, _sel2parent1 }, \
226 #define CV1800_ACLK(_name, _parent, \
227 _src_en_reg, _src_en_reg_shift, \
228 _output_en_reg, _output_en_shift, \
229 _div_en_reg, _div_en_reg_shift, \
230 _div_up_reg, _div_up_reg_shift, \
231 _m_reg, _m_shift, _m_width, _m_flag, \
232 _n_reg, _n_shift, _n_width, _n_flag, \
233 _target_rate, _flags) \
234 struct cv1800_clk_audio _name = { \
235 .common = CV1800_CLK_COMMON(#_name, _parent, \
236 &cv1800_clk_audio_ops,\
238 .src_en = CV1800_CLK_BIT(_src_en_reg, \
239 _src_en_reg_shift), \
240 .output_en = CV1800_CLK_BIT(_output_en_reg, \
242 .div_en = CV1800_CLK_BIT(_div_en_reg, \
243 _div_en_reg_shift), \
244 .div_up = CV1800_CLK_BIT(_div_up_reg, \
245 _div_up_reg_shift), \
246 .m = CV1800_CLK_REG(_m_reg, _m_shift, \
247 _m_width, 0, _m_flag), \
248 .n = CV1800_CLK_REG(_n_reg, _n_shift, \
249 _n_width, 0, _n_flag), \
250 .target_rate = _target_rate, \
253 extern const struct clk_ops cv1800_clk_gate_ops
;
254 extern const struct clk_ops cv1800_clk_div_ops
;
255 extern const struct clk_ops cv1800_clk_bypass_div_ops
;
256 extern const struct clk_ops cv1800_clk_mux_ops
;
257 extern const struct clk_ops cv1800_clk_bypass_mux_ops
;
258 extern const struct clk_ops cv1800_clk_mmux_ops
;
259 extern const struct clk_ops cv1800_clk_audio_ops
;
261 #endif // _CLK_SOPHGO_CV1800_IP_H_