diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-26 16:25:23 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-26 16:25:23 -0400 |
commit | 04216fa1befbf8c737b7bf3bcc636009723f40d9 (patch) | |
tree | 6cbde56381a48623927259019839ebe8cb40cb25 | |
parent | 91432f48094db32579776bd0a9d8432b16dc0a09 (diff) |
sgiioc4: use ->init_dma method
* Move dma_base check from sgiioc4_ide_setup_pci_device()
to ide_dma_sgiioc4().
* Replace ide_dma_sgiioc4() 'unsigned long dma_base' argument
by 'const struct ide_port_info *d'.
* Move hwif->INB setup from ide_init_sgiioc4() to
sgiioc4_ide_setup_pci_device().
* Move ide_init_sgiioc4() call from sgiioc4_ide_setup_pci_device()
to ide_dma_sgiioc4().
* Convert the driver to use ->init_dma method.
Cc: Jeremy Higdon <jeremy@sgi.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r-- | drivers/ide/pci/sgiioc4.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index ec48decb1744..47d6e0492dda 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -327,15 +327,21 @@ sgiioc4_INB(unsigned long port) | |||
327 | return reg; | 327 | return reg; |
328 | } | 328 | } |
329 | 329 | ||
330 | static void __devinit ide_init_sgiioc4(ide_hwif_t *); | ||
331 | |||
330 | /* Creates a dma map for the scatter-gather list entries */ | 332 | /* Creates a dma map for the scatter-gather list entries */ |
331 | static int __devinit | 333 | static int __devinit |
332 | ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base) | 334 | ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) |
333 | { | 335 | { |
334 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 336 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
337 | unsigned long dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; | ||
335 | void __iomem *virt_dma_base; | 338 | void __iomem *virt_dma_base; |
336 | int num_ports = sizeof (ioc4_dma_regs_t); | 339 | int num_ports = sizeof (ioc4_dma_regs_t); |
337 | void *pad; | 340 | void *pad; |
338 | 341 | ||
342 | if (dma_base == 0) | ||
343 | return -1; | ||
344 | |||
339 | printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name, | 345 | printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name, |
340 | dma_base, dma_base + num_ports - 1); | 346 | dma_base, dma_base + num_ports - 1); |
341 | 347 | ||
@@ -371,6 +377,7 @@ ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base) | |||
371 | 377 | ||
372 | if (pad) { | 378 | if (pad) { |
373 | ide_set_hwifdata(hwif, pad); | 379 | ide_set_hwifdata(hwif, pad); |
380 | ide_init_sgiioc4(hwif); | ||
374 | return 0; | 381 | return 0; |
375 | } | 382 | } |
376 | 383 | ||
@@ -551,11 +558,6 @@ static int sgiioc4_ide_dma_setup(ide_drive_t *drive) | |||
551 | static void __devinit | 558 | static void __devinit |
552 | ide_init_sgiioc4(ide_hwif_t * hwif) | 559 | ide_init_sgiioc4(ide_hwif_t * hwif) |
553 | { | 560 | { |
554 | hwif->INB = &sgiioc4_INB; | ||
555 | |||
556 | if (hwif->dma_base == 0) | ||
557 | return; | ||
558 | |||
559 | hwif->dma_host_set = &sgiioc4_dma_host_set; | 561 | hwif->dma_host_set = &sgiioc4_dma_host_set; |
560 | hwif->dma_setup = &sgiioc4_ide_dma_setup; | 562 | hwif->dma_setup = &sgiioc4_ide_dma_setup; |
561 | hwif->dma_start = &sgiioc4_ide_dma_start; | 563 | hwif->dma_start = &sgiioc4_ide_dma_start; |
@@ -575,16 +577,16 @@ static const struct ide_port_ops sgiioc4_port_ops = { | |||
575 | 577 | ||
576 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { | 578 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { |
577 | .chipset = ide_pci, | 579 | .chipset = ide_pci, |
580 | .init_dma = ide_dma_sgiioc4, | ||
578 | .port_ops = &sgiioc4_port_ops, | 581 | .port_ops = &sgiioc4_port_ops, |
579 | .host_flags = IDE_HFLAG_NO_DMA | /* no SFF-style DMA */ | 582 | .host_flags = IDE_HFLAG_NO_AUTOTUNE, |
580 | IDE_HFLAG_NO_AUTOTUNE, | ||
581 | .mwdma_mask = ATA_MWDMA2_ONLY, | 583 | .mwdma_mask = ATA_MWDMA2_ONLY, |
582 | }; | 584 | }; |
583 | 585 | ||
584 | static int __devinit | 586 | static int __devinit |
585 | sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | 587 | sgiioc4_ide_setup_pci_device(struct pci_dev *dev) |
586 | { | 588 | { |
587 | unsigned long cmd_base, dma_base, irqport; | 589 | unsigned long cmd_base, irqport; |
588 | unsigned long bar0, cmd_phys_base, ctl; | 590 | unsigned long bar0, cmd_phys_base, ctl; |
589 | void __iomem *virt_base; | 591 | void __iomem *virt_base; |
590 | ide_hwif_t *hwif; | 592 | ide_hwif_t *hwif; |
@@ -610,7 +612,6 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
610 | cmd_base = (unsigned long) virt_base + IOC4_CMD_OFFSET; | 612 | cmd_base = (unsigned long) virt_base + IOC4_CMD_OFFSET; |
611 | ctl = (unsigned long) virt_base + IOC4_CTRL_OFFSET; | 613 | ctl = (unsigned long) virt_base + IOC4_CTRL_OFFSET; |
612 | irqport = (unsigned long) virt_base + IOC4_INTR_OFFSET; | 614 | irqport = (unsigned long) virt_base + IOC4_INTR_OFFSET; |
613 | dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; | ||
614 | 615 | ||
615 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; | 616 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; |
616 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, | 617 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, |
@@ -639,13 +640,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
639 | /* Initializing chipset IRQ Registers */ | 640 | /* Initializing chipset IRQ Registers */ |
640 | writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); | 641 | writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); |
641 | 642 | ||
642 | if (dma_base == 0 || ide_dma_sgiioc4(hwif, dma_base)) { | 643 | hwif->INB = &sgiioc4_INB; |
643 | printk(KERN_INFO "%s: %s Bus-Master DMA disabled\n", | ||
644 | hwif->name, DRV_NAME); | ||
645 | d.mwdma_mask = 0; | ||
646 | } | ||
647 | |||
648 | ide_init_sgiioc4(hwif); | ||
649 | 644 | ||
650 | idx[0] = hwif->index; | 645 | idx[0] = hwif->index; |
651 | 646 | ||