]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ide/pci/siimage.c
siimage: fix kernel oops on PPC 44x
[linux-2.6-omap-h63xx.git] / drivers / ide / pci / siimage.c
index accac8342e17d4355d32b4135fbb5a6ad09599d3..8d624afe8529995988f328770ac3cc266e9e14d4 100644 (file)
@@ -39,7 +39,6 @@
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/pci.h>
-#include <linux/delay.h>
 #include <linux/hdreg.h>
 #include <linux/ide.h>
 #include <linux/init.h>
@@ -332,15 +331,18 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
 {
        ide_hwif_t *hwif        = HWIF(drive);
        unsigned long addr      = siimage_selreg(hwif, 0x1);
+       void __iomem *sata_error_addr
+               = (void __iomem *)hwif->sata_scr[SATA_ERROR_OFFSET];
 
-       if (SATA_ERROR_REG) {
+       if (sata_error_addr) {
                unsigned long base = (unsigned long)hwif->hwif_data;
-
                u32 ext_stat = readl((void __iomem *)(base + 0x10));
                u8 watchdog = 0;
+
                if (ext_stat & ((hwif->channel) ? 0x40 : 0x10)) {
-                       u32 sata_error = readl((void __iomem *)SATA_ERROR_REG);
-                       writel(sata_error, (void __iomem *)SATA_ERROR_REG);
+                       u32 sata_error = readl(sata_error_addr);
+
+                       writel(sata_error, sata_error_addr);
                        watchdog = (sata_error & 0x00680000) ? 1 : 0;
                        printk(KERN_WARNING "%s: sata_error = 0x%08x, "
                                "watchdog = %d, %s\n",
@@ -419,13 +421,17 @@ static int sil_sata_busproc(ide_drive_t * drive, int state)
 
 static int sil_sata_reset_poll(ide_drive_t *drive)
 {
-       if (SATA_STATUS_REG) {
-               ide_hwif_t *hwif        = HWIF(drive);
+       ide_hwif_t *hwif = drive->hwif;
+       void __iomem *sata_status_addr
+               = (void __iomem *)hwif->sata_scr[SATA_STATUS_OFFSET];
+
+       if (sata_status_addr) {
+               /* SATA Status is available only when in MMIO mode */
+               u32 sata_stat = readl(sata_status_addr);
 
-               /* SATA_STATUS_REG is valid only when in MMIO mode */
-               if ((readl((void __iomem *)SATA_STATUS_REG) & 0x03) != 0x03) {
+               if ((sata_stat & 0x03) != 0x03) {
                        printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n",
-                               hwif->name, readl((void __iomem *)SATA_STATUS_REG));
+                                           hwif->name, sata_stat);
                        HWGROUP(drive)->polling = 0;
                        return ide_started;
                }
@@ -486,7 +492,7 @@ static void proc_reports_siimage (struct pci_dev *dev, u8 clocking, const char *
  
 static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name)
 {
-       unsigned long bar5      = pci_resource_start(dev, 5);
+       resource_size_t bar5    = pci_resource_start(dev, 5);
        unsigned long barsize   = pci_resource_len(dev, 5);
        u8 tmpbyte      = 0;
        void __iomem *ioaddr;
@@ -698,9 +704,6 @@ static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif)
                hwif->sata_scr[SATA_STATUS_OFFSET]      = base + 0x104;
                hwif->sata_scr[SATA_ERROR_OFFSET]       = base + 0x108;
                hwif->sata_scr[SATA_CONTROL_OFFSET]     = base + 0x100;
-               hwif->sata_misc[SATA_MISC_OFFSET]       = base + 0x140;
-               hwif->sata_misc[SATA_PHY_OFFSET]        = base + 0x144;
-               hwif->sata_misc[SATA_IEN_OFFSET]        = base + 0x148;
        }
 
        memcpy(hwif->io_ports, hw.io_ports, sizeof(hwif->io_ports));