162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2016 Socionext Inc. 462306a36Sopenharmony_ci * Author: Masahiro Yamada <yamada.masahiro@socionext.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __CLK_UNIPHIER_H__ 862306a36Sopenharmony_ci#define __CLK_UNIPHIER_H__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistruct clk_hw; 1162306a36Sopenharmony_cistruct device; 1262306a36Sopenharmony_cistruct regmap; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define UNIPHIER_CLK_CPUGEAR_MAX_PARENTS 16 1562306a36Sopenharmony_ci#define UNIPHIER_CLK_MUX_MAX_PARENTS 8 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cienum uniphier_clk_type { 1862306a36Sopenharmony_ci UNIPHIER_CLK_TYPE_CPUGEAR, 1962306a36Sopenharmony_ci UNIPHIER_CLK_TYPE_FIXED_FACTOR, 2062306a36Sopenharmony_ci UNIPHIER_CLK_TYPE_FIXED_RATE, 2162306a36Sopenharmony_ci UNIPHIER_CLK_TYPE_GATE, 2262306a36Sopenharmony_ci UNIPHIER_CLK_TYPE_MUX, 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct uniphier_clk_cpugear_data { 2662306a36Sopenharmony_ci const char *parent_names[UNIPHIER_CLK_CPUGEAR_MAX_PARENTS]; 2762306a36Sopenharmony_ci unsigned int num_parents; 2862306a36Sopenharmony_ci unsigned int regbase; 2962306a36Sopenharmony_ci unsigned int mask; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct uniphier_clk_fixed_factor_data { 3362306a36Sopenharmony_ci const char *parent_name; 3462306a36Sopenharmony_ci unsigned int mult; 3562306a36Sopenharmony_ci unsigned int div; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct uniphier_clk_fixed_rate_data { 3962306a36Sopenharmony_ci unsigned long fixed_rate; 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct uniphier_clk_gate_data { 4362306a36Sopenharmony_ci const char *parent_name; 4462306a36Sopenharmony_ci unsigned int reg; 4562306a36Sopenharmony_ci unsigned int bit; 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistruct uniphier_clk_mux_data { 4962306a36Sopenharmony_ci const char *parent_names[UNIPHIER_CLK_MUX_MAX_PARENTS]; 5062306a36Sopenharmony_ci unsigned int num_parents; 5162306a36Sopenharmony_ci unsigned int reg; 5262306a36Sopenharmony_ci unsigned int masks[UNIPHIER_CLK_MUX_MAX_PARENTS]; 5362306a36Sopenharmony_ci unsigned int vals[UNIPHIER_CLK_MUX_MAX_PARENTS]; 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistruct uniphier_clk_data { 5762306a36Sopenharmony_ci const char *name; 5862306a36Sopenharmony_ci enum uniphier_clk_type type; 5962306a36Sopenharmony_ci int idx; 6062306a36Sopenharmony_ci union { 6162306a36Sopenharmony_ci struct uniphier_clk_cpugear_data cpugear; 6262306a36Sopenharmony_ci struct uniphier_clk_fixed_factor_data factor; 6362306a36Sopenharmony_ci struct uniphier_clk_fixed_rate_data rate; 6462306a36Sopenharmony_ci struct uniphier_clk_gate_data gate; 6562306a36Sopenharmony_ci struct uniphier_clk_mux_data mux; 6662306a36Sopenharmony_ci } data; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define UNIPHIER_CLK_CPUGEAR(_name, _idx, _regbase, _mask, \ 7062306a36Sopenharmony_ci _num_parents, ...) \ 7162306a36Sopenharmony_ci { \ 7262306a36Sopenharmony_ci .name = (_name), \ 7362306a36Sopenharmony_ci .type = UNIPHIER_CLK_TYPE_CPUGEAR, \ 7462306a36Sopenharmony_ci .idx = (_idx), \ 7562306a36Sopenharmony_ci .data.cpugear = { \ 7662306a36Sopenharmony_ci .parent_names = { __VA_ARGS__ }, \ 7762306a36Sopenharmony_ci .num_parents = (_num_parents), \ 7862306a36Sopenharmony_ci .regbase = (_regbase), \ 7962306a36Sopenharmony_ci .mask = (_mask) \ 8062306a36Sopenharmony_ci }, \ 8162306a36Sopenharmony_ci } 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define UNIPHIER_CLK_FACTOR(_name, _idx, _parent, _mult, _div) \ 8462306a36Sopenharmony_ci { \ 8562306a36Sopenharmony_ci .name = (_name), \ 8662306a36Sopenharmony_ci .type = UNIPHIER_CLK_TYPE_FIXED_FACTOR, \ 8762306a36Sopenharmony_ci .idx = (_idx), \ 8862306a36Sopenharmony_ci .data.factor = { \ 8962306a36Sopenharmony_ci .parent_name = (_parent), \ 9062306a36Sopenharmony_ci .mult = (_mult), \ 9162306a36Sopenharmony_ci .div = (_div), \ 9262306a36Sopenharmony_ci }, \ 9362306a36Sopenharmony_ci } 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define UNIPHIER_CLK_GATE(_name, _idx, _parent, _reg, _bit) \ 9662306a36Sopenharmony_ci { \ 9762306a36Sopenharmony_ci .name = (_name), \ 9862306a36Sopenharmony_ci .type = UNIPHIER_CLK_TYPE_GATE, \ 9962306a36Sopenharmony_ci .idx = (_idx), \ 10062306a36Sopenharmony_ci .data.gate = { \ 10162306a36Sopenharmony_ci .parent_name = (_parent), \ 10262306a36Sopenharmony_ci .reg = (_reg), \ 10362306a36Sopenharmony_ci .bit = (_bit), \ 10462306a36Sopenharmony_ci }, \ 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define UNIPHIER_CLK_DIV(parent, div) \ 10862306a36Sopenharmony_ci UNIPHIER_CLK_FACTOR(parent "/" #div, -1, parent, 1, div) 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define UNIPHIER_CLK_DIV2(parent, div0, div1) \ 11162306a36Sopenharmony_ci UNIPHIER_CLK_DIV(parent, div0), \ 11262306a36Sopenharmony_ci UNIPHIER_CLK_DIV(parent, div1) 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#define UNIPHIER_CLK_DIV3(parent, div0, div1, div2) \ 11562306a36Sopenharmony_ci UNIPHIER_CLK_DIV2(parent, div0, div1), \ 11662306a36Sopenharmony_ci UNIPHIER_CLK_DIV(parent, div2) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#define UNIPHIER_CLK_DIV4(parent, div0, div1, div2, div3) \ 11962306a36Sopenharmony_ci UNIPHIER_CLK_DIV2(parent, div0, div1), \ 12062306a36Sopenharmony_ci UNIPHIER_CLK_DIV2(parent, div2, div3) 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#define UNIPHIER_CLK_DIV5(parent, div0, div1, div2, div3, div4) \ 12362306a36Sopenharmony_ci UNIPHIER_CLK_DIV4(parent, div0, div1, div2, div3), \ 12462306a36Sopenharmony_ci UNIPHIER_CLK_DIV(parent, div4) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistruct clk_hw *uniphier_clk_register_cpugear(struct device *dev, 12762306a36Sopenharmony_ci struct regmap *regmap, 12862306a36Sopenharmony_ci const char *name, 12962306a36Sopenharmony_ci const struct uniphier_clk_cpugear_data *data); 13062306a36Sopenharmony_cistruct clk_hw *uniphier_clk_register_fixed_factor(struct device *dev, 13162306a36Sopenharmony_ci const char *name, 13262306a36Sopenharmony_ci const struct uniphier_clk_fixed_factor_data *data); 13362306a36Sopenharmony_cistruct clk_hw *uniphier_clk_register_fixed_rate(struct device *dev, 13462306a36Sopenharmony_ci const char *name, 13562306a36Sopenharmony_ci const struct uniphier_clk_fixed_rate_data *data); 13662306a36Sopenharmony_cistruct clk_hw *uniphier_clk_register_gate(struct device *dev, 13762306a36Sopenharmony_ci struct regmap *regmap, 13862306a36Sopenharmony_ci const char *name, 13962306a36Sopenharmony_ci const struct uniphier_clk_gate_data *data); 14062306a36Sopenharmony_cistruct clk_hw *uniphier_clk_register_mux(struct device *dev, 14162306a36Sopenharmony_ci struct regmap *regmap, 14262306a36Sopenharmony_ci const char *name, 14362306a36Sopenharmony_ci const struct uniphier_clk_mux_data *data); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_ld4_sys_clk_data[]; 14662306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_pro4_sys_clk_data[]; 14762306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_sld8_sys_clk_data[]; 14862306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_pro5_sys_clk_data[]; 14962306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_pxs2_sys_clk_data[]; 15062306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_ld11_sys_clk_data[]; 15162306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_ld20_sys_clk_data[]; 15262306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_pxs3_sys_clk_data[]; 15362306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_nx1_sys_clk_data[]; 15462306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_ld4_mio_clk_data[]; 15562306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_pro5_sd_clk_data[]; 15662306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_ld4_peri_clk_data[]; 15762306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_pro4_peri_clk_data[]; 15862306a36Sopenharmony_ciextern const struct uniphier_clk_data uniphier_pro4_sg_clk_data[]; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#endif /* __CLK_UNIPHIER_H__ */ 161