]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - drivers/clk/uniphier/clk-uniphier.h
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[mirror_ubuntu-focal-kernel.git] / drivers / clk / uniphier / clk-uniphier.h
CommitLineData
734d82f4
MY
1/*
2 * Copyright (C) 2016 Socionext Inc.
3 * Author: Masahiro Yamada <yamada.masahiro@socionext.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#ifndef __CLK_UNIPHIER_H__
17#define __CLK_UNIPHIER_H__
18
19struct clk_hw;
20struct device;
21struct regmap;
22
d08f1f0d
MY
23#define UNIPHIER_CLK_CPUGEAR_MAX_PARENTS 16
24#define UNIPHIER_CLK_MUX_MAX_PARENTS 8
734d82f4
MY
25
26enum uniphier_clk_type {
d08f1f0d 27 UNIPHIER_CLK_TYPE_CPUGEAR,
734d82f4
MY
28 UNIPHIER_CLK_TYPE_FIXED_FACTOR,
29 UNIPHIER_CLK_TYPE_FIXED_RATE,
30 UNIPHIER_CLK_TYPE_GATE,
31 UNIPHIER_CLK_TYPE_MUX,
32};
33
d08f1f0d
MY
34struct uniphier_clk_cpugear_data {
35 const char *parent_names[UNIPHIER_CLK_CPUGEAR_MAX_PARENTS];
36 unsigned int num_parents;
37 unsigned int regbase;
38 unsigned int mask;
39};
40
734d82f4
MY
41struct uniphier_clk_fixed_factor_data {
42 const char *parent_name;
43 unsigned int mult;
44 unsigned int div;
45};
46
47struct uniphier_clk_fixed_rate_data {
48 unsigned long fixed_rate;
49};
50
51struct uniphier_clk_gate_data {
52 const char *parent_name;
53 unsigned int reg;
54 unsigned int bit;
55};
56
57struct uniphier_clk_mux_data {
58 const char *parent_names[UNIPHIER_CLK_MUX_MAX_PARENTS];
59 unsigned int num_parents;
60 unsigned int reg;
61 unsigned int masks[UNIPHIER_CLK_MUX_MAX_PARENTS];
62 unsigned int vals[UNIPHIER_CLK_MUX_MAX_PARENTS];
63};
64
65struct uniphier_clk_data {
66 const char *name;
67 enum uniphier_clk_type type;
68 int idx;
69 union {
d08f1f0d 70 struct uniphier_clk_cpugear_data cpugear;
734d82f4
MY
71 struct uniphier_clk_fixed_factor_data factor;
72 struct uniphier_clk_fixed_rate_data rate;
73 struct uniphier_clk_gate_data gate;
74 struct uniphier_clk_mux_data mux;
75 } data;
76};
77
1221ae21
MY
78#define UNIPHIER_CLK_CPUGEAR(_name, _idx, _regbase, _mask, \
79 _num_parents, ...) \
80 { \
81 .name = (_name), \
82 .type = UNIPHIER_CLK_TYPE_CPUGEAR, \
83 .idx = (_idx), \
84 .data.cpugear = { \
85 .parent_names = { __VA_ARGS__ }, \
86 .num_parents = (_num_parents), \
87 .regbase = (_regbase), \
88 .mask = (_mask) \
89 }, \
90 }
91
734d82f4
MY
92#define UNIPHIER_CLK_FACTOR(_name, _idx, _parent, _mult, _div) \
93 { \
94 .name = (_name), \
95 .type = UNIPHIER_CLK_TYPE_FIXED_FACTOR, \
96 .idx = (_idx), \
97 .data.factor = { \
98 .parent_name = (_parent), \
99 .mult = (_mult), \
100 .div = (_div), \
101 }, \
102 }
103
734d82f4
MY
104#define UNIPHIER_CLK_GATE(_name, _idx, _parent, _reg, _bit) \
105 { \
106 .name = (_name), \
107 .type = UNIPHIER_CLK_TYPE_GATE, \
108 .idx = (_idx), \
109 .data.gate = { \
110 .parent_name = (_parent), \
111 .reg = (_reg), \
112 .bit = (_bit), \
113 }, \
114 }
115
1221ae21
MY
116#define UNIPHIER_CLK_DIV(parent, div) \
117 UNIPHIER_CLK_FACTOR(parent "/" #div, -1, parent, 1, div)
118
119#define UNIPHIER_CLK_DIV2(parent, div0, div1) \
120 UNIPHIER_CLK_DIV(parent, div0), \
121 UNIPHIER_CLK_DIV(parent, div1)
122
123#define UNIPHIER_CLK_DIV3(parent, div0, div1, div2) \
124 UNIPHIER_CLK_DIV2(parent, div0, div1), \
125 UNIPHIER_CLK_DIV(parent, div2)
126
127#define UNIPHIER_CLK_DIV4(parent, div0, div1, div2, div3) \
128 UNIPHIER_CLK_DIV2(parent, div0, div1), \
129 UNIPHIER_CLK_DIV2(parent, div2, div3)
130
d08f1f0d
MY
131struct clk_hw *uniphier_clk_register_cpugear(struct device *dev,
132 struct regmap *regmap,
133 const char *name,
134 const struct uniphier_clk_cpugear_data *data);
734d82f4
MY
135struct clk_hw *uniphier_clk_register_fixed_factor(struct device *dev,
136 const char *name,
137 const struct uniphier_clk_fixed_factor_data *data);
138struct clk_hw *uniphier_clk_register_fixed_rate(struct device *dev,
139 const char *name,
140 const struct uniphier_clk_fixed_rate_data *data);
141struct clk_hw *uniphier_clk_register_gate(struct device *dev,
142 struct regmap *regmap,
143 const char *name,
144 const struct uniphier_clk_gate_data *data);
145struct clk_hw *uniphier_clk_register_mux(struct device *dev,
146 struct regmap *regmap,
147 const char *name,
148 const struct uniphier_clk_mux_data *data);
149
7f4d3b52
MY
150extern const struct uniphier_clk_data uniphier_ld4_sys_clk_data[];
151extern const struct uniphier_clk_data uniphier_pro4_sys_clk_data[];
152extern const struct uniphier_clk_data uniphier_sld8_sys_clk_data[];
153extern const struct uniphier_clk_data uniphier_pro5_sys_clk_data[];
154extern const struct uniphier_clk_data uniphier_pxs2_sys_clk_data[];
155extern const struct uniphier_clk_data uniphier_ld11_sys_clk_data[];
156extern const struct uniphier_clk_data uniphier_ld20_sys_clk_data[];
736de651 157extern const struct uniphier_clk_data uniphier_pxs3_sys_clk_data[];
e66d57a9 158extern const struct uniphier_clk_data uniphier_ld4_mio_clk_data[];
5c6201e6 159extern const struct uniphier_clk_data uniphier_pro5_sd_clk_data[];
7f4d3b52
MY
160extern const struct uniphier_clk_data uniphier_ld4_peri_clk_data[];
161extern const struct uniphier_clk_data uniphier_pro4_peri_clk_data[];
162
734d82f4 163#endif /* __CLK_UNIPHIER_H__ */