162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2013 Samsung Electronics Co., Ltd.
462306a36Sopenharmony_ci * Copyright (c) 2013 Linaro Ltd.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Common Clock Framework support for all PLL's in Samsung platforms
762306a36Sopenharmony_ci*/
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __SAMSUNG_CLK_PLL_H
1062306a36Sopenharmony_ci#define __SAMSUNG_CLK_PLL_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cienum samsung_pll_type {
1362306a36Sopenharmony_ci	pll_2126,
1462306a36Sopenharmony_ci	pll_3000,
1562306a36Sopenharmony_ci	pll_35xx,
1662306a36Sopenharmony_ci	pll_36xx,
1762306a36Sopenharmony_ci	pll_2550,
1862306a36Sopenharmony_ci	pll_2650,
1962306a36Sopenharmony_ci	pll_4500,
2062306a36Sopenharmony_ci	pll_4502,
2162306a36Sopenharmony_ci	pll_4508,
2262306a36Sopenharmony_ci	pll_4600,
2362306a36Sopenharmony_ci	pll_4650,
2462306a36Sopenharmony_ci	pll_4650c,
2562306a36Sopenharmony_ci	pll_6552,
2662306a36Sopenharmony_ci	pll_6552_s3c2416,
2762306a36Sopenharmony_ci	pll_6553,
2862306a36Sopenharmony_ci	pll_2550x,
2962306a36Sopenharmony_ci	pll_2550xx,
3062306a36Sopenharmony_ci	pll_2650x,
3162306a36Sopenharmony_ci	pll_2650xx,
3262306a36Sopenharmony_ci	pll_1417x,
3362306a36Sopenharmony_ci	pll_1450x,
3462306a36Sopenharmony_ci	pll_1451x,
3562306a36Sopenharmony_ci	pll_1452x,
3662306a36Sopenharmony_ci	pll_1460x,
3762306a36Sopenharmony_ci	pll_0818x,
3862306a36Sopenharmony_ci	pll_0822x,
3962306a36Sopenharmony_ci	pll_0831x,
4062306a36Sopenharmony_ci	pll_142xx,
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \
4462306a36Sopenharmony_ci	((u64)(_fin) * (BIT(_ks) * (_m) + (_k)) / BIT(_ks) / ((_p) << (_s)))
4562306a36Sopenharmony_ci#define PLL_VALID_RATE(_fin, _fout, _m, _p, _s, _k, _ks) ((_fout) + \
4662306a36Sopenharmony_ci	BUILD_BUG_ON_ZERO(PLL_RATE(_fin, _m, _p, _s, _k, _ks) != (_fout)))
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define PLL_35XX_RATE(_fin, _rate, _m, _p, _s)			\
4962306a36Sopenharmony_ci	{							\
5062306a36Sopenharmony_ci		.rate	=	PLL_VALID_RATE(_fin, _rate,	\
5162306a36Sopenharmony_ci				_m, _p, _s, 0, 16),		\
5262306a36Sopenharmony_ci		.mdiv	=	(_m),				\
5362306a36Sopenharmony_ci		.pdiv	=	(_p),				\
5462306a36Sopenharmony_ci		.sdiv	=	(_s),				\
5562306a36Sopenharmony_ci	}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define PLL_36XX_RATE(_fin, _rate, _m, _p, _s, _k)		\
5862306a36Sopenharmony_ci	{							\
5962306a36Sopenharmony_ci		.rate	=	PLL_VALID_RATE(_fin, _rate,	\
6062306a36Sopenharmony_ci				_m, _p, _s, _k, 16),		\
6162306a36Sopenharmony_ci		.mdiv	=	(_m),				\
6262306a36Sopenharmony_ci		.pdiv	=	(_p),				\
6362306a36Sopenharmony_ci		.sdiv	=	(_s),				\
6462306a36Sopenharmony_ci		.kdiv	=	(_k),				\
6562306a36Sopenharmony_ci	}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define PLL_4508_RATE(_fin, _rate, _m, _p, _s, _afc)		\
6862306a36Sopenharmony_ci	{							\
6962306a36Sopenharmony_ci		.rate	=	PLL_VALID_RATE(_fin, _rate,	\
7062306a36Sopenharmony_ci				_m, _p, _s - 1, 0, 16),		\
7162306a36Sopenharmony_ci		.mdiv	=	(_m),				\
7262306a36Sopenharmony_ci		.pdiv	=	(_p),				\
7362306a36Sopenharmony_ci		.sdiv	=	(_s),				\
7462306a36Sopenharmony_ci		.afc	=	(_afc),				\
7562306a36Sopenharmony_ci	}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define PLL_4600_RATE(_fin, _rate, _m, _p, _s, _k, _vsel)	\
7862306a36Sopenharmony_ci	{							\
7962306a36Sopenharmony_ci		.rate	=	PLL_VALID_RATE(_fin, _rate,	\
8062306a36Sopenharmony_ci				_m, _p, _s, _k, 16),		\
8162306a36Sopenharmony_ci		.mdiv	=	(_m),				\
8262306a36Sopenharmony_ci		.pdiv	=	(_p),				\
8362306a36Sopenharmony_ci		.sdiv	=	(_s),				\
8462306a36Sopenharmony_ci		.kdiv	=	(_k),				\
8562306a36Sopenharmony_ci		.vsel	=	(_vsel),			\
8662306a36Sopenharmony_ci	}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#define PLL_4650_RATE(_fin, _rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \
8962306a36Sopenharmony_ci	{							\
9062306a36Sopenharmony_ci		.rate	=	PLL_VALID_RATE(_fin, _rate,	\
9162306a36Sopenharmony_ci				_m, _p, _s, _k, 10),		\
9262306a36Sopenharmony_ci		.mdiv	=	(_m),				\
9362306a36Sopenharmony_ci		.pdiv	=	(_p),				\
9462306a36Sopenharmony_ci		.sdiv	=	(_s),				\
9562306a36Sopenharmony_ci		.kdiv	=	(_k),				\
9662306a36Sopenharmony_ci		.mfr	=	(_mfr),				\
9762306a36Sopenharmony_ci		.mrr	=	(_mrr),				\
9862306a36Sopenharmony_ci		.vsel	=	(_vsel),			\
9962306a36Sopenharmony_ci	}
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/* NOTE: Rate table should be kept sorted in descending order. */
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistruct samsung_pll_rate_table {
10462306a36Sopenharmony_ci	unsigned int rate;
10562306a36Sopenharmony_ci	unsigned int pdiv;
10662306a36Sopenharmony_ci	unsigned int mdiv;
10762306a36Sopenharmony_ci	unsigned int sdiv;
10862306a36Sopenharmony_ci	unsigned int kdiv;
10962306a36Sopenharmony_ci	unsigned int afc;
11062306a36Sopenharmony_ci	unsigned int mfr;
11162306a36Sopenharmony_ci	unsigned int mrr;
11262306a36Sopenharmony_ci	unsigned int vsel;
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#endif /* __SAMSUNG_CLK_PLL_H */
116