18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2013 Samsung Electronics Co., Ltd. 48c2ecf20Sopenharmony_ci * Copyright (c) 2013 Linaro Ltd. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Common Clock Framework support for all PLL's in Samsung platforms 78c2ecf20Sopenharmony_ci*/ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifndef __SAMSUNG_CLK_PLL_H 108c2ecf20Sopenharmony_ci#define __SAMSUNG_CLK_PLL_H 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cienum samsung_pll_type { 138c2ecf20Sopenharmony_ci pll_2126, 148c2ecf20Sopenharmony_ci pll_3000, 158c2ecf20Sopenharmony_ci pll_35xx, 168c2ecf20Sopenharmony_ci pll_36xx, 178c2ecf20Sopenharmony_ci pll_2550, 188c2ecf20Sopenharmony_ci pll_2650, 198c2ecf20Sopenharmony_ci pll_4500, 208c2ecf20Sopenharmony_ci pll_4502, 218c2ecf20Sopenharmony_ci pll_4508, 228c2ecf20Sopenharmony_ci pll_4600, 238c2ecf20Sopenharmony_ci pll_4650, 248c2ecf20Sopenharmony_ci pll_4650c, 258c2ecf20Sopenharmony_ci pll_6552, 268c2ecf20Sopenharmony_ci pll_6552_s3c2416, 278c2ecf20Sopenharmony_ci pll_6553, 288c2ecf20Sopenharmony_ci pll_s3c2410_mpll, 298c2ecf20Sopenharmony_ci pll_s3c2410_upll, 308c2ecf20Sopenharmony_ci pll_s3c2440_mpll, 318c2ecf20Sopenharmony_ci pll_2550x, 328c2ecf20Sopenharmony_ci pll_2550xx, 338c2ecf20Sopenharmony_ci pll_2650x, 348c2ecf20Sopenharmony_ci pll_2650xx, 358c2ecf20Sopenharmony_ci pll_1450x, 368c2ecf20Sopenharmony_ci pll_1451x, 378c2ecf20Sopenharmony_ci pll_1452x, 388c2ecf20Sopenharmony_ci pll_1460x, 398c2ecf20Sopenharmony_ci}; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \ 428c2ecf20Sopenharmony_ci ((u64)(_fin) * (BIT(_ks) * (_m) + (_k)) / BIT(_ks) / ((_p) << (_s))) 438c2ecf20Sopenharmony_ci#define PLL_VALID_RATE(_fin, _fout, _m, _p, _s, _k, _ks) ((_fout) + \ 448c2ecf20Sopenharmony_ci BUILD_BUG_ON_ZERO(PLL_RATE(_fin, _m, _p, _s, _k, _ks) != (_fout))) 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci#define PLL_35XX_RATE(_fin, _rate, _m, _p, _s) \ 478c2ecf20Sopenharmony_ci { \ 488c2ecf20Sopenharmony_ci .rate = PLL_VALID_RATE(_fin, _rate, \ 498c2ecf20Sopenharmony_ci _m, _p, _s, 0, 16), \ 508c2ecf20Sopenharmony_ci .mdiv = (_m), \ 518c2ecf20Sopenharmony_ci .pdiv = (_p), \ 528c2ecf20Sopenharmony_ci .sdiv = (_s), \ 538c2ecf20Sopenharmony_ci } 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#define PLL_S3C2410_MPLL_RATE(_fin, _rate, _m, _p, _s) \ 568c2ecf20Sopenharmony_ci { \ 578c2ecf20Sopenharmony_ci .rate = PLL_VALID_RATE(_fin, _rate, \ 588c2ecf20Sopenharmony_ci _m + 8, _p + 2, _s, 0, 16), \ 598c2ecf20Sopenharmony_ci .mdiv = (_m), \ 608c2ecf20Sopenharmony_ci .pdiv = (_p), \ 618c2ecf20Sopenharmony_ci .sdiv = (_s), \ 628c2ecf20Sopenharmony_ci } 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci#define PLL_S3C2440_MPLL_RATE(_fin, _rate, _m, _p, _s) \ 658c2ecf20Sopenharmony_ci { \ 668c2ecf20Sopenharmony_ci .rate = PLL_VALID_RATE(_fin, _rate, \ 678c2ecf20Sopenharmony_ci 2 * (_m + 8), _p + 2, _s, 0, 16), \ 688c2ecf20Sopenharmony_ci .mdiv = (_m), \ 698c2ecf20Sopenharmony_ci .pdiv = (_p), \ 708c2ecf20Sopenharmony_ci .sdiv = (_s), \ 718c2ecf20Sopenharmony_ci } 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci#define PLL_36XX_RATE(_fin, _rate, _m, _p, _s, _k) \ 748c2ecf20Sopenharmony_ci { \ 758c2ecf20Sopenharmony_ci .rate = PLL_VALID_RATE(_fin, _rate, \ 768c2ecf20Sopenharmony_ci _m, _p, _s, _k, 16), \ 778c2ecf20Sopenharmony_ci .mdiv = (_m), \ 788c2ecf20Sopenharmony_ci .pdiv = (_p), \ 798c2ecf20Sopenharmony_ci .sdiv = (_s), \ 808c2ecf20Sopenharmony_ci .kdiv = (_k), \ 818c2ecf20Sopenharmony_ci } 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci#define PLL_4508_RATE(_fin, _rate, _m, _p, _s, _afc) \ 848c2ecf20Sopenharmony_ci { \ 858c2ecf20Sopenharmony_ci .rate = PLL_VALID_RATE(_fin, _rate, \ 868c2ecf20Sopenharmony_ci _m, _p, _s - 1, 0, 16), \ 878c2ecf20Sopenharmony_ci .mdiv = (_m), \ 888c2ecf20Sopenharmony_ci .pdiv = (_p), \ 898c2ecf20Sopenharmony_ci .sdiv = (_s), \ 908c2ecf20Sopenharmony_ci .afc = (_afc), \ 918c2ecf20Sopenharmony_ci } 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci#define PLL_4600_RATE(_fin, _rate, _m, _p, _s, _k, _vsel) \ 948c2ecf20Sopenharmony_ci { \ 958c2ecf20Sopenharmony_ci .rate = PLL_VALID_RATE(_fin, _rate, \ 968c2ecf20Sopenharmony_ci _m, _p, _s, _k, 16), \ 978c2ecf20Sopenharmony_ci .mdiv = (_m), \ 988c2ecf20Sopenharmony_ci .pdiv = (_p), \ 998c2ecf20Sopenharmony_ci .sdiv = (_s), \ 1008c2ecf20Sopenharmony_ci .kdiv = (_k), \ 1018c2ecf20Sopenharmony_ci .vsel = (_vsel), \ 1028c2ecf20Sopenharmony_ci } 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci#define PLL_4650_RATE(_fin, _rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \ 1058c2ecf20Sopenharmony_ci { \ 1068c2ecf20Sopenharmony_ci .rate = PLL_VALID_RATE(_fin, _rate, \ 1078c2ecf20Sopenharmony_ci _m, _p, _s, _k, 10), \ 1088c2ecf20Sopenharmony_ci .mdiv = (_m), \ 1098c2ecf20Sopenharmony_ci .pdiv = (_p), \ 1108c2ecf20Sopenharmony_ci .sdiv = (_s), \ 1118c2ecf20Sopenharmony_ci .kdiv = (_k), \ 1128c2ecf20Sopenharmony_ci .mfr = (_mfr), \ 1138c2ecf20Sopenharmony_ci .mrr = (_mrr), \ 1148c2ecf20Sopenharmony_ci .vsel = (_vsel), \ 1158c2ecf20Sopenharmony_ci } 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/* NOTE: Rate table should be kept sorted in descending order. */ 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistruct samsung_pll_rate_table { 1208c2ecf20Sopenharmony_ci unsigned int rate; 1218c2ecf20Sopenharmony_ci unsigned int pdiv; 1228c2ecf20Sopenharmony_ci unsigned int mdiv; 1238c2ecf20Sopenharmony_ci unsigned int sdiv; 1248c2ecf20Sopenharmony_ci unsigned int kdiv; 1258c2ecf20Sopenharmony_ci unsigned int afc; 1268c2ecf20Sopenharmony_ci unsigned int mfr; 1278c2ecf20Sopenharmony_ci unsigned int mrr; 1288c2ecf20Sopenharmony_ci unsigned int vsel; 1298c2ecf20Sopenharmony_ci}; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci#endif /* __SAMSUNG_CLK_PLL_H */ 132