Rewrote picos_to_clk() to avoid rounding errors.
Clarified that conversion is to DRAM clocks rather than platform clocks. Made function static to spd_sdram.c. Signed-off-by: James Yang <James.Yang@freescale.com> Signed-off-by: Jon Loeliger <jdl@freescale.com>
This commit is contained in:
parent
2e343b9a57
commit
c1ab82669d
|
@ -51,20 +51,32 @@ extern int dma_xfer(void *dest, uint count, void *src);
|
|||
#define CFG_SUPER_BANK_INTERLEAVING 0
|
||||
|
||||
/*
|
||||
* Convert picoseconds into clock cycles (rounding up if needed).
|
||||
* Convert picoseconds into DRAM clock cycles (rounding up if needed).
|
||||
*/
|
||||
|
||||
int
|
||||
picos_to_clk(int picos)
|
||||
static unsigned int
|
||||
picos_to_clk(unsigned int picos)
|
||||
{
|
||||
int clks;
|
||||
/* use unsigned long long to avoid rounding errors */
|
||||
const unsigned long long ULL_2e12 = 2000000000000ULL;
|
||||
unsigned long long clks;
|
||||
unsigned long long clks_temp;
|
||||
|
||||
clks = picos / (2000000000 / (get_bus_freq(0) / 1000));
|
||||
if (picos % (2000000000 / (get_bus_freq(0) / 1000)) != 0) {
|
||||
if (! picos)
|
||||
return 0;
|
||||
|
||||
clks = get_bus_freq(0) * (unsigned long long) picos;
|
||||
clks_temp = clks;
|
||||
clks = clks / ULL_2e12;
|
||||
if (clks_temp % ULL_2e12) {
|
||||
clks++;
|
||||
}
|
||||
|
||||
return clks;
|
||||
if (clks > 0xFFFFFFFFULL) {
|
||||
clks = 0xFFFFFFFFULL;
|
||||
}
|
||||
|
||||
return (unsigned int) clks;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue