diff options
Diffstat (limited to 'drivers/ide/pci/sgiioc4.c')
-rw-r--r-- | drivers/ide/pci/sgiioc4.c | 49 |
1 files changed, 11 insertions, 38 deletions
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index dd634541ce36..8af9b23499fd 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -101,18 +101,8 @@ sgiioc4_init_hwif_ports(hw_regs_t * hw, unsigned long data_port, | |||
101 | for (i = 0; i <= 7; i++) | 101 | for (i = 0; i <= 7; i++) |
102 | hw->io_ports_array[i] = reg + i * 4; | 102 | hw->io_ports_array[i] = reg + i * 4; |
103 | 103 | ||
104 | if (ctrl_port) | 104 | hw->io_ports.ctl_addr = ctrl_port; |
105 | hw->io_ports.ctl_addr = ctrl_port; | 105 | hw->io_ports.irq_addr = irq_port; |
106 | |||
107 | if (irq_port) | ||
108 | hw->io_ports.irq_addr = irq_port; | ||
109 | } | ||
110 | |||
111 | static void | ||
112 | sgiioc4_maskproc(ide_drive_t * drive, int mask) | ||
113 | { | ||
114 | writeb(ATA_DEVCTL_OBS | (mask ? 2 : 0), | ||
115 | (void __iomem *)drive->hwif->io_ports.ctl_addr); | ||
116 | } | 106 | } |
117 | 107 | ||
118 | static int | 108 | static int |
@@ -310,16 +300,14 @@ static u8 sgiioc4_read_status(ide_hwif_t *hwif) | |||
310 | unsigned long port = hwif->io_ports.status_addr; | 300 | unsigned long port = hwif->io_ports.status_addr; |
311 | u8 reg = (u8) readb((void __iomem *) port); | 301 | u8 reg = (u8) readb((void __iomem *) port); |
312 | 302 | ||
313 | if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */ | 303 | if (!(reg & ATA_BUSY)) { /* Not busy... check for interrupt */ |
314 | if (!(reg & ATA_BUSY)) { /* Not busy... check for interrupt */ | 304 | unsigned long other_ir = port - 0x110; |
315 | unsigned long other_ir = port - 0x110; | 305 | unsigned int intr_reg = (u32) readl((void __iomem *) other_ir); |
316 | unsigned int intr_reg = (u32) readl((void __iomem *) other_ir); | ||
317 | 306 | ||
318 | /* Clear the Interrupt, Error bits on the IOC4 */ | 307 | /* Clear the Interrupt, Error bits on the IOC4 */ |
319 | if (intr_reg & 0x03) { | 308 | if (intr_reg & 0x03) { |
320 | writel(0x03, (void __iomem *) other_ir); | 309 | writel(0x03, (void __iomem *) other_ir); |
321 | intr_reg = (u32) readl((void __iomem *) other_ir); | 310 | intr_reg = (u32) readl((void __iomem *) other_ir); |
322 | } | ||
323 | } | 311 | } |
324 | } | 312 | } |
325 | 313 | ||
@@ -332,13 +320,9 @@ ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
332 | { | 320 | { |
333 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 321 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
334 | unsigned long dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; | 322 | unsigned long dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; |
335 | void __iomem *virt_dma_base; | ||
336 | int num_ports = sizeof (ioc4_dma_regs_t); | 323 | int num_ports = sizeof (ioc4_dma_regs_t); |
337 | void *pad; | 324 | void *pad; |
338 | 325 | ||
339 | if (dma_base == 0) | ||
340 | return -1; | ||
341 | |||
342 | printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name); | 326 | printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name); |
343 | 327 | ||
344 | if (request_mem_region(dma_base, num_ports, hwif->name) == NULL) { | 328 | if (request_mem_region(dma_base, num_ports, hwif->name) == NULL) { |
@@ -348,14 +332,8 @@ ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
348 | return -1; | 332 | return -1; |
349 | } | 333 | } |
350 | 334 | ||
351 | virt_dma_base = ioremap(dma_base, num_ports); | 335 | hwif->dma_base = (unsigned long)hwif->io_ports.irq_addr + |
352 | if (virt_dma_base == NULL) { | 336 | IOC4_DMA_OFFSET; |
353 | printk(KERN_ERR "%s(%s) -- ERROR: unable to map addresses " | ||
354 | "0x%lx to 0x%lx\n", __func__, hwif->name, | ||
355 | dma_base, dma_base + num_ports - 1); | ||
356 | goto dma_remap_failure; | ||
357 | } | ||
358 | hwif->dma_base = (unsigned long) virt_dma_base; | ||
359 | 337 | ||
360 | hwif->sg_max_nents = IOC4_PRD_ENTRIES; | 338 | hwif->sg_max_nents = IOC4_PRD_ENTRIES; |
361 | 339 | ||
@@ -379,9 +357,6 @@ ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
379 | printk(KERN_INFO "%s: changing from DMA to PIO mode", hwif->name); | 357 | printk(KERN_INFO "%s: changing from DMA to PIO mode", hwif->name); |
380 | 358 | ||
381 | dma_pci_alloc_failure: | 359 | dma_pci_alloc_failure: |
382 | iounmap(virt_dma_base); | ||
383 | |||
384 | dma_remap_failure: | ||
385 | release_mem_region(dma_base, num_ports); | 360 | release_mem_region(dma_base, num_ports); |
386 | 361 | ||
387 | return -1; | 362 | return -1; |
@@ -563,8 +538,6 @@ static const struct ide_port_ops sgiioc4_port_ops = { | |||
563 | .set_dma_mode = sgiioc4_set_dma_mode, | 538 | .set_dma_mode = sgiioc4_set_dma_mode, |
564 | /* reset DMA engine, clear IRQs */ | 539 | /* reset DMA engine, clear IRQs */ |
565 | .resetproc = sgiioc4_resetproc, | 540 | .resetproc = sgiioc4_resetproc, |
566 | /* mask on/off NIEN register */ | ||
567 | .maskproc = sgiioc4_maskproc, | ||
568 | }; | 541 | }; |
569 | 542 | ||
570 | static const struct ide_dma_ops sgiioc4_dma_ops = { | 543 | static const struct ide_dma_ops sgiioc4_dma_ops = { |