diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-26 16:25:22 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-26 16:25:22 -0400 |
commit | b123f56e04c7c112f754f948198d1ea5a80e649d (patch) | |
tree | c58e83e954159d7755aa7f04d433e4c7e25dc330 /drivers/ide/pci | |
parent | f629b38beddf2ff8bc3fda1754bbd6cc7d3acc03 (diff) |
ide: do complete DMA setup in ->init_dma method (take 2)
* Make ide_hwif_setup_dma() return an error value.
* Pass 'const struct ide_port_info *d' instead of 'unsigned long dmabase'
to ->init_dma method and make it return an error value.
* Rename ide_get_or_set_dma_base() to ide_pci_dma_base(),
change ordering of its arguments and then export it.
* Export ide_pci_set_master().
* Do complete DMA setup inside ->init_dma method and update ->init_dma
users accordingly.
* Sanitize code for DMA setup in ide_init_port().
v2:
* Fix for CONFIG_BLK_DEV_IDEDMA_PCI=n configs
(from Jiri Slaby <jirislaby@gmail.com>):
Fix following compiler warning by returning EINVAL:
In file included from ANYTHING-INCLUDING-IDE.H:45:
include/linux/ide.h: In function ‘ide_hwif_setup_dma’:
include/linux/ide.h:1022: warning: no return statement in function returning non-void
Cc: Jiri Slaby <jirislaby@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci')
-rw-r--r-- | drivers/ide/pci/alim15x3.c | 27 | ||||
-rw-r--r-- | drivers/ide/pci/hpt366.c | 27 |
2 files changed, 42 insertions, 12 deletions
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index fbb55fa2d067..5261f308d946 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -723,17 +723,32 @@ static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) | |||
723 | /** | 723 | /** |
724 | * init_dma_ali15x3 - set up DMA on ALi15x3 | 724 | * init_dma_ali15x3 - set up DMA on ALi15x3 |
725 | * @hwif: IDE interface | 725 | * @hwif: IDE interface |
726 | * @dmabase: DMA interface base PCI address | 726 | * @d: IDE port info |
727 | * | 727 | * |
728 | * Set up the DMA functionality on the ALi 15x3. For the ALi | 728 | * Set up the DMA functionality on the ALi 15x3. |
729 | * controllers this is generic so we can let the generic code do | ||
730 | * the actual work. | ||
731 | */ | 729 | */ |
732 | 730 | ||
733 | static void __devinit init_dma_ali15x3 (ide_hwif_t *hwif, unsigned long dmabase) | 731 | static int __devinit init_dma_ali15x3(ide_hwif_t *hwif, |
732 | const struct ide_port_info *d) | ||
734 | { | 733 | { |
734 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
735 | unsigned long base = ide_pci_dma_base(hwif, d); | ||
736 | |||
737 | if (base == 0 || ide_pci_set_master(dev, d->name) < 0) | ||
738 | return -1; | ||
739 | |||
735 | if (!hwif->channel) | 740 | if (!hwif->channel) |
736 | outb(inb(dmabase + 2) & 0x60, dmabase + 2); | 741 | outb(inb(base + 2) & 0x60, base + 2); |
742 | |||
743 | printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n", | ||
744 | hwif->name, base, base + 7); | ||
745 | |||
746 | if (ide_allocate_dma_engine(hwif)) | ||
747 | return -1; | ||
748 | |||
749 | ide_setup_dma(hwif, base); | ||
750 | |||
751 | return 0; | ||
737 | } | 752 | } |
738 | 753 | ||
739 | static const struct ide_port_ops ali_port_ops = { | 754 | static const struct ide_port_ops ali_port_ops = { |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index df45098157f6..e5e64436ffd9 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1327,14 +1327,17 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | |||
1327 | hwif->dma_lost_irq = &hpt366_dma_lost_irq; | 1327 | hwif->dma_lost_irq = &hpt366_dma_lost_irq; |
1328 | } | 1328 | } |
1329 | 1329 | ||
1330 | static void __devinit init_dma_hpt366(ide_hwif_t *hwif, unsigned long dmabase) | 1330 | static int __devinit init_dma_hpt366(ide_hwif_t *hwif, |
1331 | const struct ide_port_info *d) | ||
1331 | { | 1332 | { |
1332 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 1333 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
1333 | u8 masterdma = 0, slavedma = 0; | 1334 | unsigned long flags, base = ide_pci_dma_base(hwif, d); |
1334 | u8 dma_new = 0, dma_old = 0; | 1335 | u8 dma_old, dma_new, masterdma = 0, slavedma = 0; |
1335 | unsigned long flags; | ||
1336 | 1336 | ||
1337 | dma_old = inb(dmabase + 2); | 1337 | if (base == 0 || ide_pci_set_master(dev, d->name) < 0) |
1338 | return -1; | ||
1339 | |||
1340 | dma_old = inb(base + 2); | ||
1338 | 1341 | ||
1339 | local_irq_save(flags); | 1342 | local_irq_save(flags); |
1340 | 1343 | ||
@@ -1345,9 +1348,21 @@ static void __devinit init_dma_hpt366(ide_hwif_t *hwif, unsigned long dmabase) | |||
1345 | if (masterdma & 0x30) dma_new |= 0x20; | 1348 | if (masterdma & 0x30) dma_new |= 0x20; |
1346 | if ( slavedma & 0x30) dma_new |= 0x40; | 1349 | if ( slavedma & 0x30) dma_new |= 0x40; |
1347 | if (dma_new != dma_old) | 1350 | if (dma_new != dma_old) |
1348 | outb(dma_new, dmabase + 2); | 1351 | outb(dma_new, base + 2); |
1349 | 1352 | ||
1350 | local_irq_restore(flags); | 1353 | local_irq_restore(flags); |
1354 | |||
1355 | printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n", | ||
1356 | hwif->name, base, base + 7); | ||
1357 | |||
1358 | hwif->extra_base = base + (hwif->channel ? 8 : 16); | ||
1359 | |||
1360 | if (ide_allocate_dma_engine(hwif)) | ||
1361 | return -1; | ||
1362 | |||
1363 | ide_setup_dma(hwif, base); | ||
1364 | |||
1365 | return 0; | ||
1351 | } | 1366 | } |
1352 | 1367 | ||
1353 | static void __devinit hpt374_init(struct pci_dev *dev, struct pci_dev *dev2) | 1368 | static void __devinit hpt374_init(struct pci_dev *dev, struct pci_dev *dev2) |