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