1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2024 Jari Sihvola <jsihv@gmx.com>
*/
#ifndef _JH7110_CLK_H_
#define _JH7110_CLK_H_
#include <dev/clk/clk.h>
#define JH7110_CLK_HAS_GATE 0x01
#define JH7110_CLK_HAS_MUX 0x02
#define JH7110_CLK_HAS_DIV 0x04
#define JH7110_CLK_HAS_INV 0x08
#define AONCRG_RESET_SELECTOR 0x38
#define AONCRG_RESET_STATUS 0x3c
#define STGCRG_RESET_SELECTOR 0x74
#define STGCRG_RESET_STATUS 0x78
#define SYSCRG_RESET_SELECTOR 0x2f8
#define SYSCRG_RESET_STATUS 0x308
struct jh7110_clkgen_softc {
struct mtx mtx;
struct clkdom *clkdom;
struct resource *mem_res;
uint32_t reset_status_offset;
uint32_t reset_selector_offset;
};
struct jh7110_clk_def {
struct clknode_init_def clkdef;
uint32_t offset;
uint32_t flags;
uint64_t d_max;
};
#define JH7110_CLK(_idx, _name, _pn, _d_max, _flags) \
{ \
.clkdef.id = _idx, \
.clkdef.name = _name, \
.clkdef.parent_names = _pn, \
.clkdef.parent_cnt = nitems(_pn), \
.clkdef.flags = CLK_NODE_STATIC_STRINGS, \
.flags = _flags, \
.d_max = _d_max, \
}
#define JH7110_GATE(_idx, _name, _pn) \
JH7110_CLK(_idx, _name, _pn, 0, JH7110_CLK_HAS_GATE)
#define JH7110_MUX(_idx, _name, _pn) \
JH7110_CLK(_idx, _name, _pn, 0, JH7110_CLK_HAS_MUX)
#define JH7110_DIV(_idx, _name, _pn, _d_max) \
JH7110_CLK(_idx, _name, _pn, _d_max, JH7110_CLK_HAS_DIV)
#define JH7110_GATEMUX(_idx, _name, _pn) \
JH7110_CLK(_idx, _name, _pn, 0, JH7110_CLK_HAS_GATE | \
JH7110_CLK_HAS_MUX)
#define JH7110_GATEDIV(_idx, _name, _pn, _d_max) \
JH7110_CLK(_idx, _name, _pn, _d_max, JH7110_CLK_HAS_GATE | \
JH7110_CLK_HAS_DIV)
#define JH7110_INV(_idx, _name, _pn) \
JH7110_CLK(_idx, _name, _pn, 0, JH7110_CLK_HAS_INV)
int jh7110_clk_register(struct clkdom *clkdom,
const struct jh7110_clk_def *clkdef);
int jh7110_ofw_map(struct clkdom *clkdom, uint32_t ncells, phandle_t *cells,
struct clknode **clk);
int jh7110_reset_is_asserted(device_t dev, intptr_t id, bool *reset);
int jh7110_reset_assert(device_t dev, intptr_t id, bool assert);
#endif /* _JH7110_CLK_H_ */
|