Skip to content

Commit

Permalink
libata: pata_pdc2027x PLL input clock fix
Browse files Browse the repository at this point in the history
Recently the PLL input clock of pata_pdc2027x is sometimes detected
higer than expected (e.g. 20.027 MHz compared to 16.714 MHz).
It seems sometimes the mdelay() function is not as precise as it
used to be. Per Alan's advice, HT or power management might affect
the precision of mdelay().

This patch calls gettimeofday() to mesure the time elapsed and
calculate the PLL input clock accordingly.

Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Albert Lee authored and Jeff Garzik committed Jul 2, 2007
1 parent abcdceb commit 8c781bf
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions drivers/ata/pata_pdc2027x.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,10 +689,12 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
void __iomem *mmio_base = host->iomap[PDC_MMIO_BAR];
u32 scr;
long start_count, end_count;
long pll_clock;
struct timeval start_time, end_time;
long pll_clock, usec_elapsed;

/* Read current counter value */
start_count = pdc_read_counter(host);
do_gettimeofday(&start_time);

/* Start the test mode */
scr = readl(mmio_base + PDC_SYS_CTL);
Expand All @@ -705,6 +707,7 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)

/* Read the counter values again */
end_count = pdc_read_counter(host);
do_gettimeofday(&end_time);

/* Stop the test mode */
scr = readl(mmio_base + PDC_SYS_CTL);
Expand All @@ -713,7 +716,11 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
readl(mmio_base + PDC_SYS_CTL); /* flush */

/* calculate the input clock in Hz */
pll_clock = (start_count - end_count) * 10;
usec_elapsed = (end_time.tv_sec - start_time.tv_sec) * 1000000 +
(end_time.tv_usec - start_time.tv_usec);

pll_clock = (start_count - end_count) / 100 *
(100000000 / usec_elapsed);

PDPRINTK("start[%ld] end[%ld] \n", start_count, end_count);
PDPRINTK("PLL input clock[%ld]Hz\n", pll_clock);
Expand Down

0 comments on commit 8c781bf

Please sign in to comment.