#include <linux/libata.h>
 
 #define DRV_NAME       "pata_hpt3x2n"
-#define DRV_VERSION    "0.3.18"
+#define DRV_VERSION    "0.3.19"
 
 enum {
        PCI66           =       (1 << 1),
        return 0;
 }
 
-static int hpt3x2n_pci_clock(struct pci_dev *pdev)
+static int hpt3x2n_pci_clock(struct pci_dev *pdev, unsigned int base)
 {
-       unsigned long freq;
+       unsigned int freq;
        u32 fcnt;
-       unsigned long iobase = pci_resource_start(pdev, 4);
 
-       fcnt = inl(iobase + 0x90);      /* Not PCI readable for some chips */
+       /*
+        * Some devices do not let this value be accessed via PCI space
+        * according to the old driver.
+        */
+       fcnt = inl(pci_resource_start(pdev, 4) + 0x90);
        if ((fcnt >> 12) != 0xABCDE) {
+               u32 total = 0;
                int i;
                u16 sr;
-               u32 total = 0;
 
                dev_warn(&pdev->dev, "BIOS clock data not set\n");
 
        }
        fcnt &= 0x1FF;
 
-       freq = (fcnt * 77) / 192;
+       freq = (fcnt * base) / 192;     /* in MHz */
 
        /* Clamp to bands */
        if (freq < 40)
         * 50 for UDMA100. Right now we always use 66
         */
 
-       pci_mhz = hpt3x2n_pci_clock(dev);
+       pci_mhz = hpt3x2n_pci_clock(dev, 77);
 
        f_low = (pci_mhz * 48) / 66;    /* PCI Mhz for 66Mhz DPLL */
        f_high = f_low + 2;             /* Tolerance */