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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-3-08 GuEe-GUI the first version
*/
#ifndef __CLK_RK_H__
#define __CLK_RK_H__
#include <rockchip.h>
struct rockchip_clk_provider
{
void *reg_base;
struct rt_syscon *grf;
struct rt_syscon *pmugrf;
};
struct clk_div_table
{
rt_uint32_t val;
rt_uint32_t div;
};
struct rockchip_clk_cell
{
struct rt_clk_cell cell;
int id;
int muxdiv_offset;
rt_uint8_t mux_shift;
rt_uint8_t mux_width;
#define CLK_MUX_INDEX_ONE RT_BIT(0)
#define CLK_MUX_INDEX_BIT RT_BIT(1)
#define CLK_MUX_HIWORD_MASK RT_BIT(2)
#define CLK_MUX_READ_ONLY RT_BIT(3)
#define CLK_MUX_ROUND_CLOSEST RT_BIT(4)
#define CLK_MUX_BIG_ENDIAN RT_BIT(5)
rt_uint8_t mux_flags;
rt_uint32_t mux_mask;
rt_uint32_t *mux_table;
int div_offset;
rt_uint8_t div_shift;
rt_uint8_t div_width;
#define CLK_DIVIDER_ONE_BASED RT_BIT(0)
#define CLK_DIVIDER_POWER_OF_TWO RT_BIT(1)
#define CLK_DIVIDER_ALLOW_ZERO RT_BIT(2)
#define CLK_DIVIDER_HIWORD_MASK RT_BIT(3)
#define CLK_DIVIDER_ROUND_CLOSEST RT_BIT(4)
#define CLK_DIVIDER_READ_ONLY RT_BIT(5)
#define CLK_DIVIDER_MAX_AT_ZERO RT_BIT(6)
#define CLK_DIVIDER_BIG_ENDIAN RT_BIT(7)
#define CLK_FRAC_DIVIDER_ZERO_BASED RT_BIT(0)
#define CLK_FRAC_DIVIDER_BIG_ENDIAN RT_BIT(1)
#define CLK_FRAC_DIVIDER_POWER_OF_TWO_PS RT_BIT(2)
#define CLK_FRAC_DIVIDER_NO_LIMIT RT_BIT(3)
rt_uint8_t div_flags;
struct clk_div_table *div_table;
int gate_offset;
rt_uint8_t gate_shift;
#define CLK_GATE_SET_TO_DISABLE RT_BIT(0)
#define CLK_GATE_HIWORD_MASK RT_BIT(1)
#define CLK_GATE_BIG_ENDIAN RT_BIT(2)
rt_uint8_t gate_flags;
struct rockchip_clk_provider *provider;
void (*init)(struct rockchip_clk_cell *cell);
void (*setup)(struct rockchip_clk_cell *cell);
};
#define cell_to_rockchip_clk_cell(cell) rt_container_of(cell, struct rockchip_clk_cell, cell)
#define PNAME(x) static const char *const x
#define PNAMES(x) PNAME(x)[]
void rational_best_approximation(rt_ubase_t given_numerator,
rt_ubase_t given_denominator,
rt_ubase_t max_numerator,
rt_ubase_t max_denominator,
rt_ubase_t *best_numerator,
rt_ubase_t *best_denominator);
#define ROCKCHIP_SOFTRST_HIWORD_MASK RT_BIT(0)
int rockchip_gcd(int m, int n);
void rockchip_clk_init(struct rockchip_clk_provider *provider,
struct rt_clk_cell **cells, rt_size_t cells_nr);
void rockchip_clk_setup(struct rockchip_clk_provider *provider,
struct rt_clk_cell **cells, rt_size_t cells_nr);
rt_err_t rockchip_register_softrst(struct rt_reset_controller *rstcer,
struct rt_ofw_node *np, const int *lookup_table, void *regs, rt_uint8_t flags);
void rockchip_register_restart_notifier(struct rockchip_clk_provider *provider,
rt_uint32_t reg, void (*callback)(struct rockchip_clk_provider *provider));
#endif /* __CLK_RK_H__ */
|