2019-06-04 16:11:33 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2013-03-09 16:02:48 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2013 Samsung Electronics Co., Ltd.
|
|
|
|
* Copyright (c) 2013 Linaro Ltd.
|
|
|
|
*
|
|
|
|
* Common Clock Framework support for all PLL's in Samsung platforms
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __SAMSUNG_CLK_PLL_H
|
|
|
|
#define __SAMSUNG_CLK_PLL_H
|
|
|
|
|
2013-06-11 17:31:07 +08:00
|
|
|
enum samsung_pll_type {
|
2014-02-19 08:25:41 +08:00
|
|
|
pll_2126,
|
|
|
|
pll_3000,
|
2013-06-11 17:31:07 +08:00
|
|
|
pll_35xx,
|
|
|
|
pll_36xx,
|
|
|
|
pll_2550,
|
|
|
|
pll_2650,
|
2013-08-27 01:09:04 +08:00
|
|
|
pll_4500,
|
|
|
|
pll_4502,
|
|
|
|
pll_4508,
|
2013-08-27 01:09:06 +08:00
|
|
|
pll_4600,
|
|
|
|
pll_4650,
|
|
|
|
pll_4650c,
|
2013-08-21 08:33:21 +08:00
|
|
|
pll_6552,
|
2014-02-19 08:25:36 +08:00
|
|
|
pll_6552_s3c2416,
|
2013-08-21 08:33:21 +08:00
|
|
|
pll_6553,
|
2014-02-25 08:50:43 +08:00
|
|
|
pll_s3c2410_mpll,
|
|
|
|
pll_s3c2410_upll,
|
|
|
|
pll_s3c2440_mpll,
|
2016-08-18 23:01:20 +08:00
|
|
|
pll_2550x,
|
2014-03-12 22:56:45 +08:00
|
|
|
pll_2550xx,
|
2016-09-09 16:09:05 +08:00
|
|
|
pll_2650x,
|
2014-03-12 22:56:46 +08:00
|
|
|
pll_2650xx,
|
2014-09-22 12:47:01 +08:00
|
|
|
pll_1450x,
|
|
|
|
pll_1451x,
|
|
|
|
pll_1452x,
|
|
|
|
pll_1460x,
|
2013-06-11 17:31:07 +08:00
|
|
|
};
|
|
|
|
|
2018-02-20 15:05:39 +08:00
|
|
|
#define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \
|
|
|
|
((u64)(_fin) * (BIT(_ks) * (_m) + (_k)) / BIT(_ks) / ((_p) << (_s)))
|
|
|
|
#define PLL_VALID_RATE(_fin, _fout, _m, _p, _s, _k, _ks) ((_fout) + \
|
|
|
|
BUILD_BUG_ON_ZERO(PLL_RATE(_fin, _m, _p, _s, _k, _ks) != (_fout)))
|
|
|
|
|
|
|
|
#define PLL_35XX_RATE(_fin, _rate, _m, _p, _s) \
|
|
|
|
{ \
|
|
|
|
.rate = PLL_VALID_RATE(_fin, _rate, \
|
|
|
|
_m, _p, _s, 0, 16), \
|
|
|
|
.mdiv = (_m), \
|
|
|
|
.pdiv = (_p), \
|
|
|
|
.sdiv = (_s), \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define PLL_S3C2410_MPLL_RATE(_fin, _rate, _m, _p, _s) \
|
|
|
|
{ \
|
|
|
|
.rate = PLL_VALID_RATE(_fin, _rate, \
|
|
|
|
_m + 8, _p + 2, _s, 0, 16), \
|
|
|
|
.mdiv = (_m), \
|
|
|
|
.pdiv = (_p), \
|
|
|
|
.sdiv = (_s), \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define PLL_S3C2440_MPLL_RATE(_fin, _rate, _m, _p, _s) \
|
2013-06-11 17:31:12 +08:00
|
|
|
{ \
|
2018-02-20 15:05:39 +08:00
|
|
|
.rate = PLL_VALID_RATE(_fin, _rate, \
|
|
|
|
2 * (_m + 8), _p + 2, _s, 0, 16), \
|
2013-06-11 17:31:12 +08:00
|
|
|
.mdiv = (_m), \
|
|
|
|
.pdiv = (_p), \
|
|
|
|
.sdiv = (_s), \
|
|
|
|
}
|
|
|
|
|
2018-02-20 15:05:39 +08:00
|
|
|
#define PLL_36XX_RATE(_fin, _rate, _m, _p, _s, _k) \
|
2013-06-11 17:31:12 +08:00
|
|
|
{ \
|
2018-02-20 15:05:39 +08:00
|
|
|
.rate = PLL_VALID_RATE(_fin, _rate, \
|
|
|
|
_m, _p, _s, _k, 16), \
|
2013-06-11 17:31:12 +08:00
|
|
|
.mdiv = (_m), \
|
|
|
|
.pdiv = (_p), \
|
|
|
|
.sdiv = (_s), \
|
|
|
|
.kdiv = (_k), \
|
|
|
|
}
|
|
|
|
|
2018-02-20 15:05:39 +08:00
|
|
|
#define PLL_4508_RATE(_fin, _rate, _m, _p, _s, _afc) \
|
2013-08-27 01:09:05 +08:00
|
|
|
{ \
|
2018-02-20 15:05:39 +08:00
|
|
|
.rate = PLL_VALID_RATE(_fin, _rate, \
|
|
|
|
_m, _p, _s - 1, 0, 16), \
|
2013-08-27 01:09:05 +08:00
|
|
|
.mdiv = (_m), \
|
|
|
|
.pdiv = (_p), \
|
|
|
|
.sdiv = (_s), \
|
|
|
|
.afc = (_afc), \
|
|
|
|
}
|
|
|
|
|
2018-02-20 15:05:39 +08:00
|
|
|
#define PLL_4600_RATE(_fin, _rate, _m, _p, _s, _k, _vsel) \
|
2013-08-27 01:09:07 +08:00
|
|
|
{ \
|
2018-02-20 15:05:39 +08:00
|
|
|
.rate = PLL_VALID_RATE(_fin, _rate, \
|
|
|
|
_m, _p, _s, _k, 16), \
|
2013-08-27 01:09:07 +08:00
|
|
|
.mdiv = (_m), \
|
|
|
|
.pdiv = (_p), \
|
|
|
|
.sdiv = (_s), \
|
|
|
|
.kdiv = (_k), \
|
|
|
|
.vsel = (_vsel), \
|
|
|
|
}
|
|
|
|
|
2018-02-20 15:05:39 +08:00
|
|
|
#define PLL_4650_RATE(_fin, _rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \
|
2013-08-27 01:09:07 +08:00
|
|
|
{ \
|
2018-02-20 15:05:39 +08:00
|
|
|
.rate = PLL_VALID_RATE(_fin, _rate, \
|
|
|
|
_m, _p, _s, _k, 10), \
|
2013-08-27 01:09:07 +08:00
|
|
|
.mdiv = (_m), \
|
|
|
|
.pdiv = (_p), \
|
|
|
|
.sdiv = (_s), \
|
|
|
|
.kdiv = (_k), \
|
|
|
|
.mfr = (_mfr), \
|
|
|
|
.mrr = (_mrr), \
|
|
|
|
.vsel = (_vsel), \
|
|
|
|
}
|
|
|
|
|
2013-06-11 17:31:12 +08:00
|
|
|
/* NOTE: Rate table should be kept sorted in descending order. */
|
|
|
|
|
|
|
|
struct samsung_pll_rate_table {
|
|
|
|
unsigned int rate;
|
|
|
|
unsigned int pdiv;
|
|
|
|
unsigned int mdiv;
|
|
|
|
unsigned int sdiv;
|
|
|
|
unsigned int kdiv;
|
2013-08-27 01:09:05 +08:00
|
|
|
unsigned int afc;
|
2013-08-27 01:09:07 +08:00
|
|
|
unsigned int mfr;
|
|
|
|
unsigned int mrr;
|
|
|
|
unsigned int vsel;
|
2013-06-11 17:31:12 +08:00
|
|
|
};
|
|
|
|
|
2013-03-09 16:02:48 +08:00
|
|
|
#endif /* __SAMSUNG_CLK_PLL_H */
|