| /* SPDX-License-Identifier: GPL-2.0-or-later */ | |
| /* | |
| * Copyright (C) 2016 Socionext Inc. | |
| * Author: Masahiro Yamada <yamada.masahiro@socionext.com> | |
| */ | |
| #ifndef __CLK_UNIPHIER_H__ | |
| #define __CLK_UNIPHIER_H__ | |
| struct clk_hw; | |
| struct device; | |
| struct regmap; | |
| #define UNIPHIER_CLK_CPUGEAR_MAX_PARENTS 16 | |
| #define UNIPHIER_CLK_MUX_MAX_PARENTS 8 | |
| enum uniphier_clk_type { | |
| UNIPHIER_CLK_TYPE_CPUGEAR, | |
| UNIPHIER_CLK_TYPE_FIXED_FACTOR, | |
| UNIPHIER_CLK_TYPE_FIXED_RATE, | |
| UNIPHIER_CLK_TYPE_GATE, | |
| UNIPHIER_CLK_TYPE_MUX, | |
| }; | |
| struct uniphier_clk_cpugear_data { | |
| const char *parent_names[UNIPHIER_CLK_CPUGEAR_MAX_PARENTS]; | |
| unsigned int num_parents; | |
| unsigned int regbase; | |
| unsigned int mask; | |
| }; | |
| struct uniphier_clk_fixed_factor_data { | |
| const char *parent_name; | |
| unsigned int mult; | |
| unsigned int div; | |
| }; | |
| struct uniphier_clk_fixed_rate_data { | |
| unsigned long fixed_rate; | |
| }; | |
| struct uniphier_clk_gate_data { | |
| const char *parent_name; | |
| unsigned int reg; | |
| unsigned int bit; | |
| }; | |
| struct uniphier_clk_mux_data { | |
| const char *parent_names[UNIPHIER_CLK_MUX_MAX_PARENTS]; | |
| unsigned int num_parents; | |
| unsigned int reg; | |
| unsigned int masks[UNIPHIER_CLK_MUX_MAX_PARENTS]; | |
| unsigned int vals[UNIPHIER_CLK_MUX_MAX_PARENTS]; | |
| }; | |
| struct uniphier_clk_data { | |
| const char *name; | |
| enum uniphier_clk_type type; | |
| int idx; | |
| union { | |
| struct uniphier_clk_cpugear_data cpugear; | |
| struct uniphier_clk_fixed_factor_data factor; | |
| struct uniphier_clk_fixed_rate_data rate; | |
| struct uniphier_clk_gate_data gate; | |
| struct uniphier_clk_mux_data mux; | |
| } data; | |
| }; | |
| #define UNIPHIER_CLK_CPUGEAR(_name, _idx, _regbase, _mask, \ | |
| _num_parents, ...) \ | |
| { \ | |
| .name = (_name), \ | |
| .type = UNIPHIER_CLK_TYPE_CPUGEAR, \ | |
| .idx = (_idx), \ | |
| .data.cpugear = { \ | |
| .parent_names = { __VA_ARGS__ }, \ | |
| .num_parents = (_num_parents), \ | |
| .regbase = (_regbase), \ | |
| .mask = (_mask) \ | |
| }, \ | |
| } | |
| #define UNIPHIER_CLK_FACTOR(_name, _idx, _parent, _mult, _div) \ | |
| { \ | |
| .name = (_name), \ | |
| .type = UNIPHIER_CLK_TYPE_FIXED_FACTOR, \ | |
| .idx = (_idx), \ | |
| .data.factor = { \ | |
| .parent_name = (_parent), \ | |
| .mult = (_mult), \ | |
| .div = (_div), \ | |
| }, \ | |
| } | |
| #define UNIPHIER_CLK_GATE(_name, _idx, _parent, _reg, _bit) \ | |
| { \ | |
| .name = (_name), \ | |
| .type = UNIPHIER_CLK_TYPE_GATE, \ | |
| .idx = (_idx), \ | |
| .data.gate = { \ | |
| .parent_name = (_parent), \ | |
| .reg = (_reg), \ | |
| .bit = (_bit), \ | |
| }, \ | |
| } | |
| #define UNIPHIER_CLK_DIV(parent, div) \ | |
| UNIPHIER_CLK_FACTOR(parent "/" #div, -1, parent, 1, div) | |
| #define UNIPHIER_CLK_DIV2(parent, div0, div1) \ | |
| UNIPHIER_CLK_DIV(parent, div0), \ | |
| UNIPHIER_CLK_DIV(parent, div1) | |
| #define UNIPHIER_CLK_DIV3(parent, div0, div1, div2) \ | |
| UNIPHIER_CLK_DIV2(parent, div0, div1), \ | |
| UNIPHIER_CLK_DIV(parent, div2) | |
| #define UNIPHIER_CLK_DIV4(parent, div0, div1, div2, div3) \ | |
| UNIPHIER_CLK_DIV2(parent, div0, div1), \ | |
| UNIPHIER_CLK_DIV2(parent, div2, div3) | |
| #define UNIPHIER_CLK_DIV5(parent, div0, div1, div2, div3, div4) \ | |
| UNIPHIER_CLK_DIV4(parent, div0, div1, div2, div3), \ | |
| UNIPHIER_CLK_DIV(parent, div4) | |
| struct clk_hw *uniphier_clk_register_cpugear(struct device *dev, | |
| struct regmap *regmap, | |
| const char *name, | |
| const struct uniphier_clk_cpugear_data *data); | |
| struct clk_hw *uniphier_clk_register_fixed_factor(struct device *dev, | |
| const char *name, | |
| const struct uniphier_clk_fixed_factor_data *data); | |
| struct clk_hw *uniphier_clk_register_fixed_rate(struct device *dev, | |
| const char *name, | |
| const struct uniphier_clk_fixed_rate_data *data); | |
| struct clk_hw *uniphier_clk_register_gate(struct device *dev, | |
| struct regmap *regmap, | |
| const char *name, | |
| const struct uniphier_clk_gate_data *data); | |
| struct clk_hw *uniphier_clk_register_mux(struct device *dev, | |
| struct regmap *regmap, | |
| const char *name, | |
| const struct uniphier_clk_mux_data *data); | |
| extern const struct uniphier_clk_data uniphier_ld4_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_pro4_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_sld8_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_pro5_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_pxs2_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_ld11_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_ld20_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_pxs3_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_nx1_sys_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_ld4_mio_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_pro5_sd_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_ld4_peri_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_pro4_peri_clk_data[]; | |
| extern const struct uniphier_clk_data uniphier_pro4_sg_clk_data[]; | |
| #endif /* __CLK_UNIPHIER_H__ */ |