162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2014 Google, Inc.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __PISTACHIO_CLK_H
762306a36Sopenharmony_ci#define __PISTACHIO_CLK_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/clk-provider.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct pistachio_gate {
1262306a36Sopenharmony_ci	unsigned int id;
1362306a36Sopenharmony_ci	unsigned long reg;
1462306a36Sopenharmony_ci	unsigned int shift;
1562306a36Sopenharmony_ci	const char *name;
1662306a36Sopenharmony_ci	const char *parent;
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define GATE(_id, _name, _pname, _reg, _shift)	\
2062306a36Sopenharmony_ci	{					\
2162306a36Sopenharmony_ci		.id	= _id,			\
2262306a36Sopenharmony_ci		.reg	= _reg,			\
2362306a36Sopenharmony_ci		.shift	= _shift,		\
2462306a36Sopenharmony_ci		.name	= _name,		\
2562306a36Sopenharmony_ci		.parent = _pname,		\
2662306a36Sopenharmony_ci	}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct pistachio_mux {
2962306a36Sopenharmony_ci	unsigned int id;
3062306a36Sopenharmony_ci	unsigned long reg;
3162306a36Sopenharmony_ci	unsigned int shift;
3262306a36Sopenharmony_ci	unsigned int num_parents;
3362306a36Sopenharmony_ci	const char *name;
3462306a36Sopenharmony_ci	const char *const *parents;
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define PNAME(x) static const char *const x[] __initconst
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define MUX(_id, _name, _pnames, _reg, _shift)			\
4062306a36Sopenharmony_ci	{							\
4162306a36Sopenharmony_ci		.id		= _id,				\
4262306a36Sopenharmony_ci		.reg		= _reg,				\
4362306a36Sopenharmony_ci		.shift		= _shift,			\
4462306a36Sopenharmony_ci		.name		= _name,			\
4562306a36Sopenharmony_ci		.parents	= _pnames,			\
4662306a36Sopenharmony_ci		.num_parents	= ARRAY_SIZE(_pnames)		\
4762306a36Sopenharmony_ci	}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistruct pistachio_div {
5162306a36Sopenharmony_ci	unsigned int id;
5262306a36Sopenharmony_ci	unsigned long reg;
5362306a36Sopenharmony_ci	unsigned int width;
5462306a36Sopenharmony_ci	unsigned int div_flags;
5562306a36Sopenharmony_ci	const char *name;
5662306a36Sopenharmony_ci	const char *parent;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define DIV(_id, _name, _pname, _reg, _width)			\
6062306a36Sopenharmony_ci	{							\
6162306a36Sopenharmony_ci		.id		= _id,				\
6262306a36Sopenharmony_ci		.reg		= _reg,				\
6362306a36Sopenharmony_ci		.width		= _width,			\
6462306a36Sopenharmony_ci		.div_flags	= 0,				\
6562306a36Sopenharmony_ci		.name		= _name,			\
6662306a36Sopenharmony_ci		.parent		= _pname,			\
6762306a36Sopenharmony_ci	}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define DIV_F(_id, _name, _pname, _reg, _width, _div_flags)	\
7062306a36Sopenharmony_ci	{							\
7162306a36Sopenharmony_ci		.id		= _id,				\
7262306a36Sopenharmony_ci		.reg		= _reg,				\
7362306a36Sopenharmony_ci		.width		= _width,			\
7462306a36Sopenharmony_ci		.div_flags	= _div_flags,			\
7562306a36Sopenharmony_ci		.name		= _name,			\
7662306a36Sopenharmony_ci		.parent		= _pname,			\
7762306a36Sopenharmony_ci	}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct pistachio_fixed_factor {
8062306a36Sopenharmony_ci	unsigned int id;
8162306a36Sopenharmony_ci	unsigned int div;
8262306a36Sopenharmony_ci	const char *name;
8362306a36Sopenharmony_ci	const char *parent;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#define FIXED_FACTOR(_id, _name, _pname, _div)			\
8762306a36Sopenharmony_ci	{							\
8862306a36Sopenharmony_ci		.id		= _id,				\
8962306a36Sopenharmony_ci		.div		= _div,				\
9062306a36Sopenharmony_ci		.name		= _name,			\
9162306a36Sopenharmony_ci		.parent		= _pname,			\
9262306a36Sopenharmony_ci	}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct pistachio_pll_rate_table {
9562306a36Sopenharmony_ci	unsigned long long fref;
9662306a36Sopenharmony_ci	unsigned long long fout;
9762306a36Sopenharmony_ci	unsigned long long refdiv;
9862306a36Sopenharmony_ci	unsigned long long fbdiv;
9962306a36Sopenharmony_ci	unsigned long long postdiv1;
10062306a36Sopenharmony_ci	unsigned long long postdiv2;
10162306a36Sopenharmony_ci	unsigned long long frac;
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cienum pistachio_pll_type {
10562306a36Sopenharmony_ci	PLL_GF40LP_LAINT,
10662306a36Sopenharmony_ci	PLL_GF40LP_FRAC,
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistruct pistachio_pll {
11062306a36Sopenharmony_ci	unsigned int id;
11162306a36Sopenharmony_ci	unsigned long reg_base;
11262306a36Sopenharmony_ci	enum pistachio_pll_type type;
11362306a36Sopenharmony_ci	struct pistachio_pll_rate_table *rates;
11462306a36Sopenharmony_ci	unsigned int nr_rates;
11562306a36Sopenharmony_ci	const char *name;
11662306a36Sopenharmony_ci	const char *parent;
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define PLL(_id, _name, _pname, _type, _reg, _rates)		\
12062306a36Sopenharmony_ci	{							\
12162306a36Sopenharmony_ci		.id		= _id,				\
12262306a36Sopenharmony_ci		.reg_base	= _reg,				\
12362306a36Sopenharmony_ci		.type		= _type,			\
12462306a36Sopenharmony_ci		.rates		= _rates,			\
12562306a36Sopenharmony_ci		.nr_rates	= ARRAY_SIZE(_rates),		\
12662306a36Sopenharmony_ci		.name		= _name,			\
12762306a36Sopenharmony_ci		.parent		= _pname,			\
12862306a36Sopenharmony_ci	}
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci#define PLL_FIXED(_id, _name, _pname, _type, _reg)		\
13162306a36Sopenharmony_ci	{							\
13262306a36Sopenharmony_ci		.id		= _id,				\
13362306a36Sopenharmony_ci		.reg_base	= _reg,				\
13462306a36Sopenharmony_ci		.type		= _type,			\
13562306a36Sopenharmony_ci		.rates		= NULL,				\
13662306a36Sopenharmony_ci		.nr_rates	= 0,				\
13762306a36Sopenharmony_ci		.name		= _name,			\
13862306a36Sopenharmony_ci		.parent		= _pname,			\
13962306a36Sopenharmony_ci	}
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_cistruct pistachio_clk_provider {
14262306a36Sopenharmony_ci	struct device_node *node;
14362306a36Sopenharmony_ci	void __iomem *base;
14462306a36Sopenharmony_ci	struct clk_onecell_data clk_data;
14562306a36Sopenharmony_ci};
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ciextern struct pistachio_clk_provider *
14862306a36Sopenharmony_cipistachio_clk_alloc_provider(struct device_node *node, unsigned int num_clks);
14962306a36Sopenharmony_ciextern void pistachio_clk_register_provider(struct pistachio_clk_provider *p);
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ciextern void pistachio_clk_register_gate(struct pistachio_clk_provider *p,
15262306a36Sopenharmony_ci					struct pistachio_gate *gate,
15362306a36Sopenharmony_ci					unsigned int num);
15462306a36Sopenharmony_ciextern void pistachio_clk_register_mux(struct pistachio_clk_provider *p,
15562306a36Sopenharmony_ci				       struct pistachio_mux *mux,
15662306a36Sopenharmony_ci				       unsigned int num);
15762306a36Sopenharmony_ciextern void pistachio_clk_register_div(struct pistachio_clk_provider *p,
15862306a36Sopenharmony_ci				       struct pistachio_div *div,
15962306a36Sopenharmony_ci				       unsigned int num);
16062306a36Sopenharmony_ciextern void
16162306a36Sopenharmony_cipistachio_clk_register_fixed_factor(struct pistachio_clk_provider *p,
16262306a36Sopenharmony_ci				    struct pistachio_fixed_factor *ff,
16362306a36Sopenharmony_ci				    unsigned int num);
16462306a36Sopenharmony_ciextern void pistachio_clk_register_pll(struct pistachio_clk_provider *p,
16562306a36Sopenharmony_ci				       struct pistachio_pll *pll,
16662306a36Sopenharmony_ci				       unsigned int num);
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ciextern void pistachio_clk_force_enable(struct pistachio_clk_provider *p,
16962306a36Sopenharmony_ci				       unsigned int *clk_ids, unsigned int num);
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci#endif
172