xref: /freebsd/sys/arm/mv/clk/periph.h (revision be82b3a0bf72ed3b5f01ac9fcd8dcd3802e3c742)
1f21c469dSHubert Mazur /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3f21c469dSHubert Mazur  *
4f21c469dSHubert Mazur  * Copyright (c) 2021 Semihalf.
5f21c469dSHubert Mazur  *
6f21c469dSHubert Mazur  * Redistribution and use in source and binary forms, with or without
7f21c469dSHubert Mazur  * modification, are permitted provided that the following conditions
8f21c469dSHubert Mazur  * are met:
9f21c469dSHubert Mazur  * 1. Redistributions of source code must retain the above copyright
10f21c469dSHubert Mazur  *    notice, this list of conditions and the following disclaimer.
11f21c469dSHubert Mazur  * 2. Redistributions in binary form must reproduce the above copyright
12f21c469dSHubert Mazur  *    notice, this list of conditions and the following disclaimer in the
13f21c469dSHubert Mazur  *    documentation and/or other materials provided with the distribution.
14f21c469dSHubert Mazur  *
15f21c469dSHubert Mazur  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16f21c469dSHubert Mazur  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17f21c469dSHubert Mazur  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18f21c469dSHubert Mazur  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19f21c469dSHubert Mazur  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20f21c469dSHubert Mazur  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21f21c469dSHubert Mazur  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22f21c469dSHubert Mazur  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23f21c469dSHubert Mazur  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24f21c469dSHubert Mazur  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25f21c469dSHubert Mazur  * SUCH DAMAGE.
26f21c469dSHubert Mazur  *
27f21c469dSHubert Mazur  */
28f21c469dSHubert Mazur 
29f21c469dSHubert Mazur #ifndef	_PERIPH_H_
30f21c469dSHubert Mazur #define	_PERIPH_H_
31f21c469dSHubert Mazur 
32*be82b3a0SEmmanuel Vadot #include <dev/clk/clk.h>
33*be82b3a0SEmmanuel Vadot #include <dev/clk/clk_mux.h>
34*be82b3a0SEmmanuel Vadot #include <dev/clk/clk_div.h>
35*be82b3a0SEmmanuel Vadot #include <dev/clk/clk_gate.h>
36f21c469dSHubert Mazur 
37f21c469dSHubert Mazur #define TBG_SEL                 0x0
38f21c469dSHubert Mazur #define DIV_SEL0                0x4
39f21c469dSHubert Mazur #define DIV_SEL1                0x8
40f21c469dSHubert Mazur #define DIV_SEL2                0xC
41f21c469dSHubert Mazur #define CLK_SEL                 0x10
42f21c469dSHubert Mazur #define CLK_DIS                 0x14
43f21c469dSHubert Mazur #define DIV_MASK		0x7
44f21c469dSHubert Mazur 
45f21c469dSHubert Mazur #define MUX_POS			1
46f21c469dSHubert Mazur #define DIV1_POS		2
47f21c469dSHubert Mazur #define DIV2_POS		3
48f21c469dSHubert Mazur #define GATE_POS		4
49f21c469dSHubert Mazur #define FIXED1_POS		5
50f21c469dSHubert Mazur #define FIXED2_POS		6
51f21c469dSHubert Mazur #define CLK_MUX_POS		7
52f21c469dSHubert Mazur 
53f21c469dSHubert Mazur #define RD4(_clk, offset, val)			\
54f21c469dSHubert Mazur     CLKDEV_READ_4(clknode_get_device(_clk), offset, val)
55f21c469dSHubert Mazur 
56f21c469dSHubert Mazur #define A37x0_INTERNAL_CLK_ID(_base, _pos)	\
57f21c469dSHubert Mazur     ((_base * 10) + (_pos))
58f21c469dSHubert Mazur 
59f21c469dSHubert Mazur #define CLK_FULL_DD(_name, _id, _gate_shift, _tbg_mux_shift,		\
60f21c469dSHubert Mazur     _clk_mux_shift, _div1_reg, _div2_reg, _div1_shift, _div2_shift,	\
61f21c469dSHubert Mazur     _tbg_mux_name, _div1_name, _div2_name, _clk_mux_name)		\
62f21c469dSHubert Mazur {									\
63f21c469dSHubert Mazur 	.type = CLK_FULL_DD,						\
64f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
65f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
66f21c469dSHubert Mazur 	.clk_def.full_dd.tbg_mux.clkdef.name = _tbg_mux_name,		\
67f21c469dSHubert Mazur 	.clk_def.full_dd.tbg_mux.offset = TBG_SEL,			\
68f21c469dSHubert Mazur 	.clk_def.full_dd.tbg_mux.shift = _tbg_mux_shift,		\
69f21c469dSHubert Mazur 	.clk_def.full_dd.tbg_mux.width = 0x2,				\
70f21c469dSHubert Mazur 	.clk_def.full_dd.tbg_mux.mux_flags = 0x0,			\
71f21c469dSHubert Mazur 	.clk_def.full_dd.div1.clkdef.name = _div1_name,			\
72f21c469dSHubert Mazur 	.clk_def.full_dd.div1.offset = _div1_reg,			\
73f21c469dSHubert Mazur 	.clk_def.full_dd.div1.i_shift = _div1_shift,			\
74f21c469dSHubert Mazur 	.clk_def.full_dd.div1.i_width = 0x3,				\
75f21c469dSHubert Mazur 	.clk_def.full_dd.div1.f_shift = 0x0,				\
76f21c469dSHubert Mazur 	.clk_def.full_dd.div1.f_width = 0x0,				\
77f21c469dSHubert Mazur 	.clk_def.full_dd.div1.div_flags = 0x0,				\
78f21c469dSHubert Mazur 	.clk_def.full_dd.div1.div_table = NULL,				\
79f21c469dSHubert Mazur 	.clk_def.full_dd.div2.clkdef.name = _div2_name,			\
80f21c469dSHubert Mazur 	.clk_def.full_dd.div2.offset = _div2_reg,			\
81f21c469dSHubert Mazur 	.clk_def.full_dd.div2.i_shift = _div2_shift,			\
82f21c469dSHubert Mazur 	.clk_def.full_dd.div2.i_width = 0x3,				\
83f21c469dSHubert Mazur 	.clk_def.full_dd.div2.f_shift = 0x0,				\
84f21c469dSHubert Mazur 	.clk_def.full_dd.div2.f_width = 0x0,				\
85f21c469dSHubert Mazur 	.clk_def.full_dd.div2.div_flags = 0x0,				\
86f21c469dSHubert Mazur 	.clk_def.full_dd.div2.div_table = NULL,				\
87f21c469dSHubert Mazur 	.clk_def.full_dd.clk_mux.clkdef.name = _clk_mux_name,		\
88f21c469dSHubert Mazur 	.clk_def.full_dd.clk_mux.offset = CLK_SEL,			\
89f21c469dSHubert Mazur 	.clk_def.full_dd.clk_mux.shift = _clk_mux_shift,		\
90f21c469dSHubert Mazur 	.clk_def.full_dd.clk_mux.width = 0x1,				\
91f21c469dSHubert Mazur 	.clk_def.full_dd.clk_mux.mux_flags = 0x0,			\
92f21c469dSHubert Mazur 	.clk_def.full_dd.gate.clkdef.name = _name,			\
93f21c469dSHubert Mazur 	.clk_def.full_dd.gate.offset = CLK_DIS,				\
94f21c469dSHubert Mazur 	.clk_def.full_dd.gate.shift = _gate_shift,			\
95f21c469dSHubert Mazur 	.clk_def.full_dd.gate.on_value = 0,				\
96f21c469dSHubert Mazur 	.clk_def.full_dd.gate.off_value = 1,				\
97f21c469dSHubert Mazur 	.clk_def.full_dd.gate.mask = 0x1,				\
98f21c469dSHubert Mazur 	.clk_def.full_dd.gate.gate_flags = 0x0				\
99f21c469dSHubert Mazur }
100f21c469dSHubert Mazur 
101f21c469dSHubert Mazur #define CLK_FULL(_name, _id, _gate_shift, _tbg_mux_shift,		\
102f21c469dSHubert Mazur     _clk_mux_shift, _div1_reg, _div1_shift, _div_table, _tbg_mux_name,	\
103f21c469dSHubert Mazur     _div1_name, _clk_mux_name)						\
104f21c469dSHubert Mazur {									\
105f21c469dSHubert Mazur 	.type = CLK_FULL,						\
106f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
107f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
108f21c469dSHubert Mazur 	.clk_def.full_d.tbg_mux.clkdef.name = _tbg_mux_name,		\
109f21c469dSHubert Mazur 	.clk_def.full_d.tbg_mux.offset = TBG_SEL,			\
110f21c469dSHubert Mazur 	.clk_def.full_d.tbg_mux.shift = _tbg_mux_shift,			\
111f21c469dSHubert Mazur 	.clk_def.full_d.tbg_mux.width = 0x2,				\
112f21c469dSHubert Mazur 	.clk_def.full_d.tbg_mux.mux_flags = 0x0,			\
113f21c469dSHubert Mazur 	.clk_def.full_d.div.clkdef.name = _div1_name,			\
114f21c469dSHubert Mazur 	.clk_def.full_d.div.offset = _div1_reg,				\
115f21c469dSHubert Mazur 	.clk_def.full_d.div.i_shift = _div1_shift,			\
116f21c469dSHubert Mazur 	.clk_def.full_d.div.i_width = 0x3,				\
117f21c469dSHubert Mazur 	.clk_def.full_d.div.f_shift = 0x0,				\
118f21c469dSHubert Mazur 	.clk_def.full_d.div.f_width = 0x0,				\
119f21c469dSHubert Mazur 	.clk_def.full_d.div.div_flags = 0x0,				\
120f21c469dSHubert Mazur 	.clk_def.full_d.div.div_table = _div_table,			\
121f21c469dSHubert Mazur 	.clk_def.full_d.clk_mux.clkdef.name = _clk_mux_name,		\
122f21c469dSHubert Mazur 	.clk_def.full_d.clk_mux.offset = CLK_SEL,			\
123f21c469dSHubert Mazur 	.clk_def.full_d.clk_mux.shift = _clk_mux_shift,			\
124f21c469dSHubert Mazur 	.clk_def.full_d.clk_mux.width = 0x1,				\
125f21c469dSHubert Mazur 	.clk_def.full_d.clk_mux.mux_flags = 0x0,			\
126f21c469dSHubert Mazur 	.clk_def.full_d.gate.clkdef.name = _name,			\
127f21c469dSHubert Mazur 	.clk_def.full_d.gate.offset = CLK_DIS,				\
128f21c469dSHubert Mazur 	.clk_def.full_d.gate.shift = _gate_shift,			\
129f21c469dSHubert Mazur 	.clk_def.full_d.gate.on_value = 0,				\
130f21c469dSHubert Mazur 	.clk_def.full_d.gate.off_value = 1,				\
131f21c469dSHubert Mazur 	.clk_def.full_d.gate.mask = 0x1,				\
132f21c469dSHubert Mazur 	.clk_def.full_d.gate.gate_flags = 0x0				\
133f21c469dSHubert Mazur }
134f21c469dSHubert Mazur 
135f21c469dSHubert Mazur #define CLK_CPU(_name, _id, _tbg_mux_shift, _clk_mux_shift, _div1_reg,	\
136f21c469dSHubert Mazur     _div1_shift, _div_table, _tbg_mux_name, _div1_name)			\
137f21c469dSHubert Mazur {									\
138f21c469dSHubert Mazur 	.type = CLK_CPU,						\
139f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
140f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
141f21c469dSHubert Mazur 	.clk_def.cpu.tbg_mux.clkdef.name = _tbg_mux_name,		\
142f21c469dSHubert Mazur 	.clk_def.cpu.tbg_mux.offset = TBG_SEL,				\
143f21c469dSHubert Mazur 	.clk_def.cpu.tbg_mux.shift = _tbg_mux_shift,			\
144f21c469dSHubert Mazur 	.clk_def.cpu.tbg_mux.width = 0x2,				\
145f21c469dSHubert Mazur 	.clk_def.cpu.tbg_mux.mux_flags = 0x0,				\
146f21c469dSHubert Mazur 	.clk_def.cpu.div.clkdef.name = _div1_name,			\
147f21c469dSHubert Mazur 	.clk_def.cpu.div.offset = _div1_reg,				\
148f21c469dSHubert Mazur 	.clk_def.cpu.div.i_shift = _div1_shift,				\
149f21c469dSHubert Mazur 	.clk_def.cpu.div.i_width = 0x3,					\
150f21c469dSHubert Mazur 	.clk_def.cpu.div.f_shift = 0x0,					\
151f21c469dSHubert Mazur 	.clk_def.cpu.div.f_width = 0x0,					\
152f21c469dSHubert Mazur 	.clk_def.cpu.div.div_flags = 0x0,				\
153f21c469dSHubert Mazur 	.clk_def.cpu.div.div_table = _div_table,			\
154f21c469dSHubert Mazur 	.clk_def.cpu.clk_mux.clkdef.name = _name,			\
155f21c469dSHubert Mazur 	.clk_def.cpu.clk_mux.offset = CLK_SEL,				\
156f21c469dSHubert Mazur 	.clk_def.cpu.clk_mux.shift = _clk_mux_shift,			\
157f21c469dSHubert Mazur 	.clk_def.cpu.clk_mux.width = 0x1,				\
158f21c469dSHubert Mazur 	.clk_def.cpu.clk_mux.mux_flags = 0x0,				\
159f21c469dSHubert Mazur }
160f21c469dSHubert Mazur 
161f21c469dSHubert Mazur #define CLK_GATE(_name, _id, _gate_shift, _pname)			\
162f21c469dSHubert Mazur {									\
163f21c469dSHubert Mazur 	.type = CLK_GATE,						\
164f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
165f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
166f21c469dSHubert Mazur 	.common_def.pname = _pname,					\
167f21c469dSHubert Mazur 	.clk_def.gate.gate.clkdef.name = _name,				\
168f21c469dSHubert Mazur 	.clk_def.gate.gate.clkdef.parent_cnt = 1,			\
169f21c469dSHubert Mazur 	.clk_def.gate.gate.offset = CLK_DIS,				\
170f21c469dSHubert Mazur 	.clk_def.gate.gate.shift = _gate_shift,				\
171f21c469dSHubert Mazur 	.clk_def.gate.gate.on_value = 0,				\
172f21c469dSHubert Mazur 	.clk_def.gate.gate.off_value = 1,				\
173f21c469dSHubert Mazur 	.clk_def.gate.gate.mask = 0x1,					\
174f21c469dSHubert Mazur 	.clk_def.gate.gate.gate_flags = 0x0				\
175f21c469dSHubert Mazur }
176f21c469dSHubert Mazur 
177f21c469dSHubert Mazur #define CLK_MDD(_name, _id, _tbg_mux_shift, _clk_mux_shift, _div1_reg,	\
178f21c469dSHubert Mazur     _div2_reg, _div1_shift, _div2_shift, _tbg_mux_name, _div1_name,	\
179f21c469dSHubert Mazur     _div2_name)								\
180f21c469dSHubert Mazur {									\
181f21c469dSHubert Mazur 	.type = CLK_MDD,						\
182f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
183f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
184f21c469dSHubert Mazur 	.clk_def.mdd.tbg_mux.clkdef.name = _tbg_mux_name,		\
185f21c469dSHubert Mazur 	.clk_def.mdd.tbg_mux.offset = TBG_SEL,				\
186f21c469dSHubert Mazur 	.clk_def.mdd.tbg_mux.shift = _tbg_mux_shift,			\
187f21c469dSHubert Mazur 	.clk_def.mdd.tbg_mux.width = 0x2,				\
188f21c469dSHubert Mazur 	.clk_def.mdd.tbg_mux.mux_flags = 0x0,				\
189f21c469dSHubert Mazur 	.clk_def.mdd.div1.clkdef.name = _div1_name,			\
190f21c469dSHubert Mazur 	.clk_def.mdd.div1.offset = _div1_reg,				\
191f21c469dSHubert Mazur 	.clk_def.mdd.div1.i_shift = _div1_shift,			\
192f21c469dSHubert Mazur 	.clk_def.mdd.div1.i_width = 0x3,				\
193f21c469dSHubert Mazur 	.clk_def.mdd.div1.f_shift = 0x0,				\
194f21c469dSHubert Mazur 	.clk_def.mdd.div1.f_width = 0x0,				\
195f21c469dSHubert Mazur 	.clk_def.mdd.div1.div_flags = 0x0,				\
196f21c469dSHubert Mazur 	.clk_def.mdd.div1.div_table = NULL,				\
197f21c469dSHubert Mazur 	.clk_def.mdd.div2.clkdef.name = _div2_name,			\
198f21c469dSHubert Mazur 	.clk_def.mdd.div2.offset = _div2_reg,				\
199f21c469dSHubert Mazur 	.clk_def.mdd.div2.i_shift = _div2_shift,			\
200f21c469dSHubert Mazur 	.clk_def.mdd.div2.i_width = 0x3,				\
201f21c469dSHubert Mazur 	.clk_def.mdd.div2.f_shift = 0x0,				\
202f21c469dSHubert Mazur 	.clk_def.mdd.div2.f_width = 0x0,				\
203f21c469dSHubert Mazur 	.clk_def.mdd.div2.div_flags = 0x0,				\
204f21c469dSHubert Mazur 	.clk_def.mdd.div2.div_table = NULL,				\
205f21c469dSHubert Mazur 	.clk_def.mdd.clk_mux.clkdef.name = _name,			\
206f21c469dSHubert Mazur 	.clk_def.mdd.clk_mux.offset = CLK_SEL,				\
207f21c469dSHubert Mazur 	.clk_def.mdd.clk_mux.shift = _clk_mux_shift,			\
208f21c469dSHubert Mazur 	.clk_def.mdd.clk_mux.width = 0x1,				\
209f21c469dSHubert Mazur 	.clk_def.mdd.clk_mux.mux_flags = 0x0				\
210f21c469dSHubert Mazur }
211f21c469dSHubert Mazur 
212f21c469dSHubert Mazur #define CLK_MUX_GATE(_name, _id, _gate_shift, _mux_shift, _pname,	\
213f21c469dSHubert Mazur      _mux_name, _fixed_name)						\
214f21c469dSHubert Mazur {									\
215f21c469dSHubert Mazur 	.type = CLK_MUX_GATE,						\
216f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
217f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
218f21c469dSHubert Mazur 	.common_def.pname = _pname,					\
219f21c469dSHubert Mazur 	.clk_def.mux_gate.mux.clkdef.name = _mux_name,			\
220f21c469dSHubert Mazur 	.clk_def.mux_gate.mux.offset = TBG_SEL,				\
221f21c469dSHubert Mazur 	.clk_def.mux_gate.mux.shift = _mux_shift,			\
222f21c469dSHubert Mazur 	.clk_def.mux_gate.mux.width = 0x1,				\
223f21c469dSHubert Mazur 	.clk_def.mux_gate.mux.mux_flags = 0x0,				\
224f21c469dSHubert Mazur 	.clk_def.mux_gate.gate.clkdef.name = _name,			\
225f21c469dSHubert Mazur 	.clk_def.mux_gate.gate.offset = CLK_DIS,			\
226f21c469dSHubert Mazur 	.clk_def.mux_gate.gate.shift = _gate_shift,			\
227f21c469dSHubert Mazur 	.clk_def.mux_gate.gate.on_value = 0,				\
228f21c469dSHubert Mazur 	.clk_def.mux_gate.gate.off_value = 1,				\
229f21c469dSHubert Mazur 	.clk_def.mux_gate.gate.mask = 0x1,				\
230f21c469dSHubert Mazur 	.clk_def.mux_gate.gate.gate_flags = 0x0,			\
231f21c469dSHubert Mazur 	.clk_def.mux_gate.fixed.clkdef.name = _fixed_name		\
232f21c469dSHubert Mazur }
233f21c469dSHubert Mazur 
234f21c469dSHubert Mazur #define CLK_MUX_GATE_FIXED(_name, _id, _gate_shift, _mux_shift, 	\
235f21c469dSHubert Mazur      _mux_name, _gate_name, _fixed1_name)				\
236f21c469dSHubert Mazur {									\
237f21c469dSHubert Mazur 	.type = CLK_MUX_GATE_FIXED,					\
238f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
239f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
240f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.mux.clkdef.name = _mux_name,		\
241f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.mux.offset = TBG_SEL,			\
242f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.mux.shift = _mux_shift,			\
243f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.mux.width = 0x1,			\
244f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.mux.mux_flags = 0x0,			\
245f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.gate.clkdef.name = _gate_name,		\
246f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.gate.offset = CLK_DIS,			\
247f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.gate.shift = _gate_shift,		\
248f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.gate.on_value = 0,			\
249f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.gate.off_value = 1,			\
250f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.gate.mask = 0x1,			\
251f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.gate.gate_flags = 0x0,			\
252f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.fixed1.clkdef.name = _fixed1_name,	\
253f21c469dSHubert Mazur 	.clk_def.mux_gate_fixed.fixed2.clkdef.name = _name		\
254f21c469dSHubert Mazur }
255f21c469dSHubert Mazur 
256f21c469dSHubert Mazur #define CLK_FIXED(_name, _id, _gate_shift, _mux_shift, _mux_name,	\
257f21c469dSHubert Mazur     _fixed_name)							\
258f21c469dSHubert Mazur {									\
259f21c469dSHubert Mazur 	.type = CLK_FIXED,						\
260f21c469dSHubert Mazur 	.common_def.device_name = _name,				\
261f21c469dSHubert Mazur 	.common_def.device_id = _id,					\
262f21c469dSHubert Mazur 	.clk_def.fixed.mux.clkdef.name = _mux_name,			\
263f21c469dSHubert Mazur 	.clk_def.fixed.mux.offset = TBG_SEL,				\
264f21c469dSHubert Mazur 	.clk_def.fixed.mux.shift = _mux_shift,				\
265f21c469dSHubert Mazur 	.clk_def.fixed.mux.width = 0x1,					\
266f21c469dSHubert Mazur 	.clk_def.fixed.mux.mux_flags = 0x0,				\
267f21c469dSHubert Mazur 	.clk_def.fixed.gate.clkdef.name = _name,			\
268f21c469dSHubert Mazur 	.clk_def.fixed.gate.offset = CLK_DIS,				\
269f21c469dSHubert Mazur 	.clk_def.fixed.gate.shift = _gate_shift,			\
270f21c469dSHubert Mazur 	.clk_def.fixed.gate.on_value = 0,				\
271f21c469dSHubert Mazur 	.clk_def.fixed.gate.off_value = 1,				\
272f21c469dSHubert Mazur 	.clk_def.fixed.gate.mask = 0x1,					\
273f21c469dSHubert Mazur 	.clk_def.fixed.gate.gate_flags = 0x0,				\
274f21c469dSHubert Mazur 	.clk_def.fixed.fixed.clkdef.name = _fixed_name			\
275f21c469dSHubert Mazur }
276f21c469dSHubert Mazur 
277f21c469dSHubert Mazur struct a37x0_periph_clk_softc {
278f21c469dSHubert Mazur 	device_t			dev;
279f21c469dSHubert Mazur 	struct resource			*res;
280f21c469dSHubert Mazur 	struct clkdom			*clkdom;
281f21c469dSHubert Mazur 	struct mtx			mtx;
282f21c469dSHubert Mazur 	struct a37x0_periph_clknode_def *devices;
283f21c469dSHubert Mazur 	int 				device_count;
284f21c469dSHubert Mazur };
285f21c469dSHubert Mazur 
286f21c469dSHubert Mazur struct a37x0_periph_clk_dd_def {
287f21c469dSHubert Mazur 	struct clk_mux_def 	tbg_mux;
288f21c469dSHubert Mazur 	struct clk_div_def	div1;
289f21c469dSHubert Mazur 	struct clk_div_def	div2;
290f21c469dSHubert Mazur 	struct clk_mux_def	clk_mux;
291f21c469dSHubert Mazur 	struct clk_gate_def	gate;
292f21c469dSHubert Mazur };
293f21c469dSHubert Mazur 
294f21c469dSHubert Mazur struct a37x0_periph_clk_cpu_def {
295f21c469dSHubert Mazur 	struct clk_mux_def 	tbg_mux;
296f21c469dSHubert Mazur 	struct clk_div_def	div;
297f21c469dSHubert Mazur 	struct clk_mux_def	clk_mux;
298f21c469dSHubert Mazur };
299f21c469dSHubert Mazur 
300f21c469dSHubert Mazur struct a37x0_periph_clk_d_def {
301f21c469dSHubert Mazur 	struct clk_mux_def 	tbg_mux;
302f21c469dSHubert Mazur 	struct clk_div_def	div;
303f21c469dSHubert Mazur 	struct clk_mux_def	clk_mux;
304f21c469dSHubert Mazur 	struct clk_gate_def	gate;
305f21c469dSHubert Mazur };
306f21c469dSHubert Mazur 
307f21c469dSHubert Mazur struct a37x0_periph_clk_fixed_def {
308f21c469dSHubert Mazur 	struct clk_mux_def 	mux;
309f21c469dSHubert Mazur 	struct clk_fixed_def	fixed;
310f21c469dSHubert Mazur 	struct clk_gate_def	gate;
311f21c469dSHubert Mazur };
312f21c469dSHubert Mazur 
313f21c469dSHubert Mazur struct a37x0_periph_clk_gate_def {
314f21c469dSHubert Mazur 	struct clk_gate_def	gate;
315f21c469dSHubert Mazur };
316f21c469dSHubert Mazur 
317f21c469dSHubert Mazur struct a37x0_periph_clk_mux_dd_def {
318f21c469dSHubert Mazur 	struct clk_mux_def 	tbg_mux;
319f21c469dSHubert Mazur 	struct clk_div_def	div1;
320f21c469dSHubert Mazur 	struct clk_div_def	div2;
321f21c469dSHubert Mazur 	struct clk_mux_def	clk_mux;
322f21c469dSHubert Mazur };
323f21c469dSHubert Mazur 
324f21c469dSHubert Mazur struct a37x0_periph_clk_mux_div_def {
325f21c469dSHubert Mazur 	struct clk_mux_def 	mux;
326f21c469dSHubert Mazur 	struct clk_div_def	div;
327f21c469dSHubert Mazur };
328f21c469dSHubert Mazur 
329f21c469dSHubert Mazur struct a37x0_periph_clk_mux_gate_def {
330f21c469dSHubert Mazur 	struct clk_mux_def 	mux;
331f21c469dSHubert Mazur 	struct clk_fixed_def	fixed;
332f21c469dSHubert Mazur 	struct clk_gate_def	gate;
333f21c469dSHubert Mazur };
334f21c469dSHubert Mazur 
335f21c469dSHubert Mazur struct a37x0_periph_clk_mux_gate_fixed_def {
336f21c469dSHubert Mazur 	struct clk_fixed_def	fixed1;
337f21c469dSHubert Mazur 	struct clk_mux_def 	mux;
338f21c469dSHubert Mazur 	struct clk_gate_def	gate;
339f21c469dSHubert Mazur 	struct clk_fixed_def	fixed2;
340f21c469dSHubert Mazur };
341f21c469dSHubert Mazur 
342f21c469dSHubert Mazur enum a37x0_periph_clk_type {
343f21c469dSHubert Mazur 	/* Double divider clock */
344f21c469dSHubert Mazur         CLK_FULL_DD,
345f21c469dSHubert Mazur 	/* Single divider clock */
346f21c469dSHubert Mazur         CLK_FULL,
347f21c469dSHubert Mazur 	/* Gate clock */
348f21c469dSHubert Mazur         CLK_GATE,
349f21c469dSHubert Mazur 	/* Mux, gate clock */
350f21c469dSHubert Mazur         CLK_MUX_GATE,
351f21c469dSHubert Mazur 	/* CPU clock */
352f21c469dSHubert Mazur         CLK_CPU,
353f21c469dSHubert Mazur 	/* Clock with fixed frequency divider */
354f21c469dSHubert Mazur 	CLK_FIXED,
355f21c469dSHubert Mazur 	/* Clock with double divider, without gate */
356f21c469dSHubert Mazur 	CLK_MDD,
357f21c469dSHubert Mazur 	/* Clock with two fixed frequency dividers */
358f21c469dSHubert Mazur 	CLK_MUX_GATE_FIXED
359f21c469dSHubert Mazur };
360f21c469dSHubert Mazur 
361f21c469dSHubert Mazur struct a37x0_periph_common_defs {
362f21c469dSHubert Mazur 	char		*device_name;
363f21c469dSHubert Mazur 	int		device_id;
364f21c469dSHubert Mazur 	int		tbg_cnt;
365f21c469dSHubert Mazur 	const char	*pname;
366f21c469dSHubert Mazur 	const char 	**tbgs;
367f21c469dSHubert Mazur 	const char	*xtal;
368f21c469dSHubert Mazur };
369f21c469dSHubert Mazur 
370f21c469dSHubert Mazur union a37x0_periph_clocks_defs {
371f21c469dSHubert Mazur 	struct a37x0_periph_clk_dd_def full_dd;
372f21c469dSHubert Mazur 	struct a37x0_periph_clk_d_def full_d;
373f21c469dSHubert Mazur 	struct a37x0_periph_clk_gate_def gate;
374f21c469dSHubert Mazur 	struct a37x0_periph_clk_mux_gate_def mux_gate;
375f21c469dSHubert Mazur 	struct a37x0_periph_clk_cpu_def cpu;
376f21c469dSHubert Mazur 	struct a37x0_periph_clk_fixed_def fixed;
377f21c469dSHubert Mazur 	struct a37x0_periph_clk_mux_dd_def mdd;
378f21c469dSHubert Mazur 	struct a37x0_periph_clk_mux_gate_fixed_def mux_gate_fixed;
379f21c469dSHubert Mazur };
380f21c469dSHubert Mazur 
381f21c469dSHubert Mazur struct a37x0_periph_clknode_def {
382f21c469dSHubert Mazur 	enum a37x0_periph_clk_type		type;
383f21c469dSHubert Mazur 	struct a37x0_periph_common_defs		common_def;
384f21c469dSHubert Mazur 	union a37x0_periph_clocks_defs		clk_def;
385f21c469dSHubert Mazur };
386f21c469dSHubert Mazur 
387f21c469dSHubert Mazur int a37x0_periph_create_mux(struct clkdom *,
388f21c469dSHubert Mazur     struct clk_mux_def *, int);
389f21c469dSHubert Mazur int a37x0_periph_create_div(struct clkdom *,
390f21c469dSHubert Mazur     struct clk_div_def *, int);
391f21c469dSHubert Mazur int a37x0_periph_create_gate(struct clkdom *,
392f21c469dSHubert Mazur     struct clk_gate_def *, int);
393f21c469dSHubert Mazur void a37x0_periph_set_props(struct clknode_init_def *, const char **,
394f21c469dSHubert Mazur     unsigned int);
395f21c469dSHubert Mazur int a37x0_periph_d_register_full_clk_dd(struct clkdom *,
396f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
397f21c469dSHubert Mazur int a37x0_periph_d_register_full_clk(struct clkdom *,
398f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
399f21c469dSHubert Mazur int a37x0_periph_d_register_periph_cpu(struct clkdom *,
400f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
401f21c469dSHubert Mazur int a37x0_periph_fixed_register_fixed(struct clkdom*,
402f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
403f21c469dSHubert Mazur int a37x0_periph_gate_register_gate(struct clkdom *,
404f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
405f21c469dSHubert Mazur int a37x0_periph_d_register_mdd(struct clkdom *,
406f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
407f21c469dSHubert Mazur int a37x0_periph_d_register_mux_div_clk(struct clkdom *,
408f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
409f21c469dSHubert Mazur int a37x0_periph_register_mux_gate(struct clkdom *,
410f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
411f21c469dSHubert Mazur int a37x0_periph_register_mux_gate_fixed(struct clkdom *,
412f21c469dSHubert Mazur     struct a37x0_periph_clknode_def *);
413f21c469dSHubert Mazur 
414f21c469dSHubert Mazur int a37x0_periph_clk_read_4(device_t, bus_addr_t, uint32_t *);
415f21c469dSHubert Mazur void a37x0_periph_clk_device_unlock(device_t);
416f21c469dSHubert Mazur void a37x0_periph_clk_device_lock(device_t);
417f21c469dSHubert Mazur int a37x0_periph_clk_attach(device_t);
418f21c469dSHubert Mazur int a37x0_periph_clk_detach(device_t);
419f21c469dSHubert Mazur 
420f21c469dSHubert Mazur #endif
421