Merge tag 'net-5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / clk / uniphier / clk-uniphier.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (C) 2016 Socionext Inc.
4  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
5  */
6
7 #ifndef __CLK_UNIPHIER_H__
8 #define __CLK_UNIPHIER_H__
9
10 struct clk_hw;
11 struct device;
12 struct regmap;
13
14 #define UNIPHIER_CLK_CPUGEAR_MAX_PARENTS        16
15 #define UNIPHIER_CLK_MUX_MAX_PARENTS            8
16
17 enum uniphier_clk_type {
18         UNIPHIER_CLK_TYPE_CPUGEAR,
19         UNIPHIER_CLK_TYPE_FIXED_FACTOR,
20         UNIPHIER_CLK_TYPE_FIXED_RATE,
21         UNIPHIER_CLK_TYPE_GATE,
22         UNIPHIER_CLK_TYPE_MUX,
23 };
24
25 struct uniphier_clk_cpugear_data {
26         const char *parent_names[UNIPHIER_CLK_CPUGEAR_MAX_PARENTS];
27         unsigned int num_parents;
28         unsigned int regbase;
29         unsigned int mask;
30 };
31
32 struct uniphier_clk_fixed_factor_data {
33         const char *parent_name;
34         unsigned int mult;
35         unsigned int div;
36 };
37
38 struct uniphier_clk_fixed_rate_data {
39         unsigned long fixed_rate;
40 };
41
42 struct uniphier_clk_gate_data {
43         const char *parent_name;
44         unsigned int reg;
45         unsigned int bit;
46 };
47
48 struct uniphier_clk_mux_data {
49         const char *parent_names[UNIPHIER_CLK_MUX_MAX_PARENTS];
50         unsigned int num_parents;
51         unsigned int reg;
52         unsigned int masks[UNIPHIER_CLK_MUX_MAX_PARENTS];
53         unsigned int vals[UNIPHIER_CLK_MUX_MAX_PARENTS];
54 };
55
56 struct uniphier_clk_data {
57         const char *name;
58         enum uniphier_clk_type type;
59         int idx;
60         union {
61                 struct uniphier_clk_cpugear_data cpugear;
62                 struct uniphier_clk_fixed_factor_data factor;
63                 struct uniphier_clk_fixed_rate_data rate;
64                 struct uniphier_clk_gate_data gate;
65                 struct uniphier_clk_mux_data mux;
66         } data;
67 };
68
69 #define UNIPHIER_CLK_CPUGEAR(_name, _idx, _regbase, _mask,      \
70                              _num_parents, ...)                 \
71         {                                                       \
72                 .name = (_name),                                \
73                 .type = UNIPHIER_CLK_TYPE_CPUGEAR,              \
74                 .idx = (_idx),                                  \
75                 .data.cpugear = {                               \
76                         .parent_names = { __VA_ARGS__ },        \
77                         .num_parents = (_num_parents),          \
78                         .regbase = (_regbase),                  \
79                         .mask = (_mask)                         \
80                  },                                             \
81         }
82
83 #define UNIPHIER_CLK_FACTOR(_name, _idx, _parent, _mult, _div)  \
84         {                                                       \
85                 .name = (_name),                                \
86                 .type = UNIPHIER_CLK_TYPE_FIXED_FACTOR,         \
87                 .idx = (_idx),                                  \
88                 .data.factor = {                                \
89                         .parent_name = (_parent),               \
90                         .mult = (_mult),                        \
91                         .div = (_div),                          \
92                 },                                              \
93         }
94
95 #define UNIPHIER_CLK_GATE(_name, _idx, _parent, _reg, _bit)     \
96         {                                                       \
97                 .name = (_name),                                \
98                 .type = UNIPHIER_CLK_TYPE_GATE,                 \
99                 .idx = (_idx),                                  \
100                 .data.gate = {                                  \
101                         .parent_name = (_parent),               \
102                         .reg = (_reg),                          \
103                         .bit = (_bit),                          \
104                 },                                              \
105         }
106
107 #define UNIPHIER_CLK_DIV(parent, div)                           \
108         UNIPHIER_CLK_FACTOR(parent "/" #div, -1, parent, 1, div)
109
110 #define UNIPHIER_CLK_DIV2(parent, div0, div1)                   \
111         UNIPHIER_CLK_DIV(parent, div0),                         \
112         UNIPHIER_CLK_DIV(parent, div1)
113
114 #define UNIPHIER_CLK_DIV3(parent, div0, div1, div2)             \
115         UNIPHIER_CLK_DIV2(parent, div0, div1),                  \
116         UNIPHIER_CLK_DIV(parent, div2)
117
118 #define UNIPHIER_CLK_DIV4(parent, div0, div1, div2, div3)       \
119         UNIPHIER_CLK_DIV2(parent, div0, div1),                  \
120         UNIPHIER_CLK_DIV2(parent, div2, div3)
121
122 struct clk_hw *uniphier_clk_register_cpugear(struct device *dev,
123                                              struct regmap *regmap,
124                                              const char *name,
125                                 const struct uniphier_clk_cpugear_data *data);
126 struct clk_hw *uniphier_clk_register_fixed_factor(struct device *dev,
127                                                   const char *name,
128                         const struct uniphier_clk_fixed_factor_data *data);
129 struct clk_hw *uniphier_clk_register_fixed_rate(struct device *dev,
130                                                 const char *name,
131                         const struct uniphier_clk_fixed_rate_data *data);
132 struct clk_hw *uniphier_clk_register_gate(struct device *dev,
133                                           struct regmap *regmap,
134                                           const char *name,
135                                 const struct uniphier_clk_gate_data *data);
136 struct clk_hw *uniphier_clk_register_mux(struct device *dev,
137                                          struct regmap *regmap,
138                                          const char *name,
139                                 const struct uniphier_clk_mux_data *data);
140
141 extern const struct uniphier_clk_data uniphier_ld4_sys_clk_data[];
142 extern const struct uniphier_clk_data uniphier_pro4_sys_clk_data[];
143 extern const struct uniphier_clk_data uniphier_sld8_sys_clk_data[];
144 extern const struct uniphier_clk_data uniphier_pro5_sys_clk_data[];
145 extern const struct uniphier_clk_data uniphier_pxs2_sys_clk_data[];
146 extern const struct uniphier_clk_data uniphier_ld11_sys_clk_data[];
147 extern const struct uniphier_clk_data uniphier_ld20_sys_clk_data[];
148 extern const struct uniphier_clk_data uniphier_pxs3_sys_clk_data[];
149 extern const struct uniphier_clk_data uniphier_ld4_mio_clk_data[];
150 extern const struct uniphier_clk_data uniphier_pro5_sd_clk_data[];
151 extern const struct uniphier_clk_data uniphier_ld4_peri_clk_data[];
152 extern const struct uniphier_clk_data uniphier_pro4_peri_clk_data[];
153
154 #endif /* __CLK_UNIPHIER_H__ */