aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ide/ide-dma.c32
-rw-r--r--drivers/ide/ide.c14
-rw-r--r--include/linux/ide.h4
3 files changed, 34 insertions, 16 deletions
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
index c3546fe9af63..9937fa7da546 100644
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -798,9 +798,9 @@ static int ide_release_dma_engine(ide_hwif_t *hwif)
798 798
799static int ide_release_iomio_dma(ide_hwif_t *hwif) 799static int ide_release_iomio_dma(ide_hwif_t *hwif)
800{ 800{
801 if ((hwif->dma_extra) && (hwif->channel == 0))
802 release_region((hwif->dma_base + 16), hwif->dma_extra);
803 release_region(hwif->dma_base, 8); 801 release_region(hwif->dma_base, 8);
802 if (hwif->extra_ports)
803 release_region(hwif->extra_base, hwif->extra_ports);
804 if (hwif->dma_base2) 804 if (hwif->dma_base2)
805 release_region(hwif->dma_base, 8); 805 release_region(hwif->dma_base, 8);
806 return 1; 806 return 1;
@@ -840,9 +840,7 @@ static int ide_mapped_mmio_dma(ide_hwif_t *hwif, unsigned long base, unsigned in
840{ 840{
841 printk(KERN_INFO " %s: MMIO-DMA ", hwif->name); 841 printk(KERN_INFO " %s: MMIO-DMA ", hwif->name);
842 842
843 hwif->dma_base = base; 843 hwif->dma_base = base;
844 if (hwif->cds->extra && hwif->channel == 0)
845 hwif->dma_extra = hwif->cds->extra;
846 844
847 if(hwif->mate) 845 if(hwif->mate)
848 hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base; 846 hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base;
@@ -854,17 +852,29 @@ static int ide_mapped_mmio_dma(ide_hwif_t *hwif, unsigned long base, unsigned in
854static int ide_iomio_dma(ide_hwif_t *hwif, unsigned long base, unsigned int ports) 852static int ide_iomio_dma(ide_hwif_t *hwif, unsigned long base, unsigned int ports)
855{ 853{
856 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx", 854 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx",
857 hwif->name, base, base + ports - 1); 855 hwif->name, base, base + ports - 1);
856
858 if (!request_region(base, ports, hwif->name)) { 857 if (!request_region(base, ports, hwif->name)) {
859 printk(" -- Error, ports in use.\n"); 858 printk(" -- Error, ports in use.\n");
860 return 1; 859 return 1;
861 } 860 }
861
862 hwif->dma_base = base; 862 hwif->dma_base = base;
863 if ((hwif->cds->extra) && (hwif->channel == 0)) { 863
864 request_region(base+16, hwif->cds->extra, hwif->cds->name); 864 if (hwif->cds->extra) {
865 hwif->dma_extra = hwif->cds->extra; 865 hwif->extra_base = base + (hwif->channel ? 8 : 16);
866
867 if (!hwif->mate || !hwif->mate->extra_ports) {
868 if (!request_region(hwif->extra_base,
869 hwif->cds->extra, hwif->cds->name)) {
870 printk(" -- Error, extra ports in use.\n");
871 release_region(base, ports);
872 return 1;
873 }
874 hwif->extra_ports = hwif->cds->extra;
875 }
866 } 876 }
867 877
868 if(hwif->mate) 878 if(hwif->mate)
869 hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base; 879 hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base;
870 else 880 else
@@ -874,6 +884,8 @@ static int ide_iomio_dma(ide_hwif_t *hwif, unsigned long base, unsigned int port
874 { 884 {
875 printk(" -- Error, secondary ports in use.\n"); 885 printk(" -- Error, secondary ports in use.\n");
876 release_region(base, ports); 886 release_region(base, ports);
887 if (hwif->extra_ports)
888 release_region(hwif->extra_base, hwif->extra_ports);
877 return 1; 889 return 1;
878 } 890 }
879 } 891 }
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 2b1a1389c318..8c3f06242280 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -450,7 +450,7 @@ void ide_hwif_release_regions(ide_hwif_t *hwif)
450 * @hwif: hwif to update 450 * @hwif: hwif to update
451 * @tmp_hwif: template 451 * @tmp_hwif: template
452 * 452 *
453 * Restore hwif to a previous state by copying most settngs 453 * Restore hwif to a previous state by copying most settings
454 * from the template. 454 * from the template.
455 */ 455 */
456 456
@@ -539,9 +539,10 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif)
539 hwif->dma_vendor3 = tmp_hwif->dma_vendor3; 539 hwif->dma_vendor3 = tmp_hwif->dma_vendor3;
540 hwif->dma_prdtable = tmp_hwif->dma_prdtable; 540 hwif->dma_prdtable = tmp_hwif->dma_prdtable;
541 541
542 hwif->dma_extra = tmp_hwif->dma_extra;
543 hwif->config_data = tmp_hwif->config_data; 542 hwif->config_data = tmp_hwif->config_data;
544 hwif->select_data = tmp_hwif->select_data; 543 hwif->select_data = tmp_hwif->select_data;
544 hwif->extra_base = tmp_hwif->extra_base;
545 hwif->extra_ports = tmp_hwif->extra_ports;
545 hwif->autodma = tmp_hwif->autodma; 546 hwif->autodma = tmp_hwif->autodma;
546 hwif->udma_four = tmp_hwif->udma_four; 547 hwif->udma_four = tmp_hwif->udma_four;
547 hwif->no_dsc = tmp_hwif->no_dsc; 548 hwif->no_dsc = tmp_hwif->no_dsc;
@@ -550,7 +551,7 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif)
550} 551}
551 552
552/** 553/**
553 * ide_unregister - free an ide interface 554 * ide_unregister - free an IDE interface
554 * @index: index of interface (will change soon to a pointer) 555 * @index: index of interface (will change soon to a pointer)
555 * 556 *
556 * Perform the final unregister of an IDE interface. At the moment 557 * Perform the final unregister of an IDE interface. At the moment
@@ -563,8 +564,8 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif)
563 * deadlocking the IDE layer. The shutdown callback is called 564 * deadlocking the IDE layer. The shutdown callback is called
564 * before we take the lock and free resources. It is up to the 565 * before we take the lock and free resources. It is up to the
565 * caller to be sure there is no pending I/O here, and that 566 * caller to be sure there is no pending I/O here, and that
566 * the interfce will not be reopened (present/vanishing locking 567 * the interface will not be reopened (present/vanishing locking
567 * isnt yet done btw). After we commit to the final kill we 568 * isn't yet done BTW). After we commit to the final kill we
568 * call the cleanup callback with the ide locks held. 569 * call the cleanup callback with the ide locks held.
569 * 570 *
570 * Unregister restores the hwif structures to the default state. 571 * Unregister restores the hwif structures to the default state.
@@ -674,6 +675,9 @@ void ide_unregister(unsigned int index)
674 hwif->dma_status = 0; 675 hwif->dma_status = 0;
675 hwif->dma_vendor3 = 0; 676 hwif->dma_vendor3 = 0;
676 hwif->dma_prdtable = 0; 677 hwif->dma_prdtable = 0;
678
679 hwif->extra_base = 0;
680 hwif->extra_ports = 0;
677 } 681 }
678 682
679 /* copy original settings */ 683 /* copy original settings */
diff --git a/include/linux/ide.h b/include/linux/ide.h
index 99620451d958..11608cd03d4c 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -775,10 +775,12 @@ typedef struct hwif_s {
775 unsigned long dma_prdtable; /* actual prd table address */ 775 unsigned long dma_prdtable; /* actual prd table address */
776 unsigned long dma_base2; /* extended base addr for dma ports */ 776 unsigned long dma_base2; /* extended base addr for dma ports */
777 777
778 unsigned dma_extra; /* extra addr for dma ports */
779 unsigned long config_data; /* for use by chipset-specific code */ 778 unsigned long config_data; /* for use by chipset-specific code */
780 unsigned long select_data; /* for use by chipset-specific code */ 779 unsigned long select_data; /* for use by chipset-specific code */
781 780
781 unsigned long extra_base; /* extra addr for dma ports */
782 unsigned extra_ports; /* number of extra dma ports */
783
782 unsigned noprobe : 1; /* don't probe for this interface */ 784 unsigned noprobe : 1; /* don't probe for this interface */
783 unsigned present : 1; /* this interface exists */ 785 unsigned present : 1; /* this interface exists */
784 unsigned hold : 1; /* this interface is always present */ 786 unsigned hold : 1; /* this interface is always present */