aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide')
-rw-r--r--drivers/ide/ide-dma-sff.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/drivers/ide/ide-dma-sff.c b/drivers/ide/ide-dma-sff.c
index bcdadc777564..123d393658af 100644
--- a/drivers/ide/ide-dma-sff.c
+++ b/drivers/ide/ide-dma-sff.c
@@ -61,6 +61,16 @@ u8 ide_dma_sff_read_status(ide_hwif_t *hwif)
61} 61}
62EXPORT_SYMBOL_GPL(ide_dma_sff_read_status); 62EXPORT_SYMBOL_GPL(ide_dma_sff_read_status);
63 63
64static void ide_dma_sff_write_status(ide_hwif_t *hwif, u8 val)
65{
66 unsigned long addr = hwif->dma_base + ATA_DMA_STATUS;
67
68 if (hwif->host_flags & IDE_HFLAG_MMIO)
69 writeb(val, (void __iomem *)addr);
70 else
71 outb(val, addr);
72}
73
64/** 74/**
65 * ide_dma_host_set - Enable/disable DMA on a host 75 * ide_dma_host_set - Enable/disable DMA on a host
66 * @drive: drive to control 76 * @drive: drive to control
@@ -80,11 +90,7 @@ void ide_dma_host_set(ide_drive_t *drive, int on)
80 else 90 else
81 dma_stat &= ~(1 << (5 + unit)); 91 dma_stat &= ~(1 << (5 + unit));
82 92
83 if (hwif->host_flags & IDE_HFLAG_MMIO) 93 ide_dma_sff_write_status(hwif, dma_stat);
84 writeb(dma_stat,
85 (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
86 else
87 outb(dma_stat, hwif->dma_base + ATA_DMA_STATUS);
88} 94}
89EXPORT_SYMBOL_GPL(ide_dma_host_set); 95EXPORT_SYMBOL_GPL(ide_dma_host_set);
90 96
@@ -198,7 +204,7 @@ int ide_dma_setup(ide_drive_t *drive)
198 } 204 }
199 205
200 /* PRD table */ 206 /* PRD table */
201 if (hwif->host_flags & IDE_HFLAG_MMIO) 207 if (mmio)
202 writel(hwif->dmatable_dma, 208 writel(hwif->dmatable_dma,
203 (void __iomem *)(hwif->dma_base + ATA_DMA_TABLE_OFS)); 209 (void __iomem *)(hwif->dma_base + ATA_DMA_TABLE_OFS));
204 else 210 else
@@ -214,12 +220,7 @@ int ide_dma_setup(ide_drive_t *drive)
214 dma_stat = hwif->dma_ops->dma_sff_read_status(hwif); 220 dma_stat = hwif->dma_ops->dma_sff_read_status(hwif);
215 221
216 /* clear INTR & ERROR flags */ 222 /* clear INTR & ERROR flags */
217 if (mmio) 223 ide_dma_sff_write_status(hwif, dma_stat | ATA_DMA_ERR | ATA_DMA_INTR);
218 writeb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
219 (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
220 else
221 outb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
222 hwif->dma_base + ATA_DMA_STATUS);
223 224
224 drive->waiting_for_dma = 1; 225 drive->waiting_for_dma = 1;
225 return 0; 226 return 0;
@@ -300,13 +301,12 @@ EXPORT_SYMBOL_GPL(ide_dma_start);
300int ide_dma_end(ide_drive_t *drive) 301int ide_dma_end(ide_drive_t *drive)
301{ 302{
302 ide_hwif_t *hwif = drive->hwif; 303 ide_hwif_t *hwif = drive->hwif;
303 u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
304 u8 dma_stat = 0, dma_cmd = 0, mask; 304 u8 dma_stat = 0, dma_cmd = 0, mask;
305 305
306 drive->waiting_for_dma = 0; 306 drive->waiting_for_dma = 0;
307 307
308 /* stop DMA */ 308 /* stop DMA */
309 if (mmio) { 309 if (hwif->host_flags & IDE_HFLAG_MMIO) {
310 dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD)); 310 dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
311 writeb(dma_cmd & ~ATA_DMA_START, 311 writeb(dma_cmd & ~ATA_DMA_START,
312 (void __iomem *)(hwif->dma_base + ATA_DMA_CMD)); 312 (void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
@@ -318,13 +318,8 @@ int ide_dma_end(ide_drive_t *drive)
318 /* get DMA status */ 318 /* get DMA status */
319 dma_stat = hwif->dma_ops->dma_sff_read_status(hwif); 319 dma_stat = hwif->dma_ops->dma_sff_read_status(hwif);
320 320
321 if (mmio) 321 /* clear INTR & ERROR bits */
322 /* clear the INTR & ERROR bits */ 322 ide_dma_sff_write_status(hwif, dma_stat | ATA_DMA_ERR | ATA_DMA_INTR);
323 writeb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
324 (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
325 else
326 outb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
327 hwif->dma_base + ATA_DMA_STATUS);
328 323
329 /* purge DMA mappings */ 324 /* purge DMA mappings */
330 ide_destroy_dmatable(drive); 325 ide_destroy_dmatable(drive);