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