9
0
Fork 0

i.MX: Use more accurate decode pll function from kernel

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2009-09-08 10:03:18 +02:00
parent 77a3b6a96a
commit 222abdccec
1 changed files with 27 additions and 11 deletions

View File

@ -32,23 +32,39 @@
* f = 2 * f_ref * --------------------
* pd + 1
*/
unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref)
unsigned int imx_decode_pll(unsigned int reg_val, unsigned int freq)
{
unsigned long long ll;
unsigned int quot;
int mfn_abs;
unsigned int mfi, mfn, mfd, pd;
unsigned int mfi = (pll >> 10) & 0xf;
unsigned int mfn = pll & 0x3ff;
unsigned int mfd = (pll >> 16) & 0x3ff;
unsigned int pd = (pll >> 26) & 0xf;
mfi = (reg_val >> 10) & 0xf;
mfn = reg_val & 0x3ff;
mfd = (reg_val >> 16) & 0x3ff;
pd = (reg_val >> 26) & 0xf;
mfi = mfi <= 5 ? 5 : mfi;
ll = 2 * (unsigned long long)f_ref * ( (mfi << 16) + (mfn << 16) / (mfd + 1));
quot = (pd + 1) * (1 << 16);
ll += quot / 2;
do_div(ll, quot);
return (unsigned int) ll;
mfn_abs = mfn;
#if !defined CONFIG_ARCH_MX1 && !defined CONFIG_ARCH_MX21
if (mfn >= 0x200) {
mfn |= 0xFFFFFE00;
mfn_abs = -mfn;
}
#endif
freq *= 2;
freq /= pd + 1;
ll = (unsigned long long)freq * mfn_abs;
do_div(ll, mfd + 1);
if (mfn < 0)
ll = -ll;
ll = (freq * mfi) + ll;
return ll;
}
extern void imx_dump_clocks(void);