diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-02-16 20:40:25 -0500 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-02-16 20:40:25 -0500 |
commit | 0ecdca26e556eae9668ce6de9554757dddb942ef (patch) | |
tree | 21d62c01d0c0d5aeea2524252ed8dec6ca20b6d4 /drivers/ide/pci/sgiioc4.c | |
parent | 7569e8dc2213ecc47024ea5edbadc8736487d926 (diff) |
ide: use PIO/MMIO operations directly where possible (v2)
This results in smaller/faster/simpler code and allows future optimizations.
Also remove no longer needed ide[_mm]_{inl,outl}() and ide_hwif_t.{INL,OUTL}.
v2:
* updated for scc_pata
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci/sgiioc4.c')
-rw-r--r-- | drivers/ide/pci/sgiioc4.c | 67 |
1 files changed, 35 insertions, 32 deletions
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index 81d44ed37f34..2af8a71e688e 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -110,24 +110,24 @@ sgiioc4_init_hwif_ports(hw_regs_t * hw, unsigned long data_port, | |||
110 | static void | 110 | static void |
111 | sgiioc4_maskproc(ide_drive_t * drive, int mask) | 111 | sgiioc4_maskproc(ide_drive_t * drive, int mask) |
112 | { | 112 | { |
113 | ide_hwif_t *hwif = HWIF(drive); | 113 | writeb(mask ? (drive->ctl | 2) : (drive->ctl & ~2), |
114 | hwif->OUTB(mask ? (drive->ctl | 2) : (drive->ctl & ~2), | 114 | (void __iomem *)IDE_CONTROL_REG); |
115 | IDE_CONTROL_REG); | ||
116 | } | 115 | } |
117 | 116 | ||
118 | 117 | ||
119 | static int | 118 | static int |
120 | sgiioc4_checkirq(ide_hwif_t * hwif) | 119 | sgiioc4_checkirq(ide_hwif_t * hwif) |
121 | { | 120 | { |
122 | u8 intr_reg = | 121 | unsigned long intr_addr = |
123 | hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + IOC4_INTR_REG * 4); | 122 | hwif->io_ports[IDE_IRQ_OFFSET] + IOC4_INTR_REG * 4; |
124 | 123 | ||
125 | if (intr_reg & 0x03) | 124 | if ((u8)readl((void __iomem *)intr_addr) & 0x03) |
126 | return 1; | 125 | return 1; |
127 | 126 | ||
128 | return 0; | 127 | return 0; |
129 | } | 128 | } |
130 | 129 | ||
130 | static u8 sgiioc4_INB(unsigned long); | ||
131 | 131 | ||
132 | static int | 132 | static int |
133 | sgiioc4_clearirq(ide_drive_t * drive) | 133 | sgiioc4_clearirq(ide_drive_t * drive) |
@@ -138,21 +138,21 @@ sgiioc4_clearirq(ide_drive_t * drive) | |||
138 | hwif->io_ports[IDE_IRQ_OFFSET] + (IOC4_INTR_REG << 2); | 138 | hwif->io_ports[IDE_IRQ_OFFSET] + (IOC4_INTR_REG << 2); |
139 | 139 | ||
140 | /* Code to check for PCI error conditions */ | 140 | /* Code to check for PCI error conditions */ |
141 | intr_reg = hwif->INL(other_ir); | 141 | intr_reg = readl((void __iomem *)other_ir); |
142 | if (intr_reg & 0x03) { /* Valid IOC4-IDE interrupt */ | 142 | if (intr_reg & 0x03) { /* Valid IOC4-IDE interrupt */ |
143 | /* | 143 | /* |
144 | * Using hwif->INB to read the IDE_STATUS_REG has a side effect | 144 | * Using sgiioc4_INB to read the IDE_STATUS_REG has a side effect |
145 | * of clearing the interrupt. The first read should clear it | 145 | * of clearing the interrupt. The first read should clear it |
146 | * if it is set. The second read should return a "clear" status | 146 | * if it is set. The second read should return a "clear" status |
147 | * if it got cleared. If not, then spin for a bit trying to | 147 | * if it got cleared. If not, then spin for a bit trying to |
148 | * clear it. | 148 | * clear it. |
149 | */ | 149 | */ |
150 | u8 stat = hwif->INB(IDE_STATUS_REG); | 150 | u8 stat = sgiioc4_INB(IDE_STATUS_REG); |
151 | int count = 0; | 151 | int count = 0; |
152 | stat = hwif->INB(IDE_STATUS_REG); | 152 | stat = sgiioc4_INB(IDE_STATUS_REG); |
153 | while ((stat & 0x80) && (count++ < 100)) { | 153 | while ((stat & 0x80) && (count++ < 100)) { |
154 | udelay(1); | 154 | udelay(1); |
155 | stat = hwif->INB(IDE_STATUS_REG); | 155 | stat = sgiioc4_INB(IDE_STATUS_REG); |
156 | } | 156 | } |
157 | 157 | ||
158 | if (intr_reg & 0x02) { | 158 | if (intr_reg & 0x02) { |
@@ -161,9 +161,9 @@ sgiioc4_clearirq(ide_drive_t * drive) | |||
161 | pci_stat_cmd_reg; | 161 | pci_stat_cmd_reg; |
162 | 162 | ||
163 | pci_err_addr_low = | 163 | pci_err_addr_low = |
164 | hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET]); | 164 | readl((void __iomem *)hwif->io_ports[IDE_IRQ_OFFSET]); |
165 | pci_err_addr_high = | 165 | pci_err_addr_high = |
166 | hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + 4); | 166 | readl((void __iomem *)(hwif->io_ports[IDE_IRQ_OFFSET] + 4)); |
167 | pci_read_config_dword(hwif->pci_dev, PCI_COMMAND, | 167 | pci_read_config_dword(hwif->pci_dev, PCI_COMMAND, |
168 | &pci_stat_cmd_reg); | 168 | &pci_stat_cmd_reg); |
169 | printk(KERN_ERR | 169 | printk(KERN_ERR |
@@ -180,9 +180,9 @@ sgiioc4_clearirq(ide_drive_t * drive) | |||
180 | } | 180 | } |
181 | 181 | ||
182 | /* Clear the Interrupt, Error bits on the IOC4 */ | 182 | /* Clear the Interrupt, Error bits on the IOC4 */ |
183 | hwif->OUTL(0x03, other_ir); | 183 | writel(0x03, (void __iomem *)other_ir); |
184 | 184 | ||
185 | intr_reg = hwif->INL(other_ir); | 185 | intr_reg = readl((void __iomem *)other_ir); |
186 | } | 186 | } |
187 | 187 | ||
188 | return intr_reg & 3; | 188 | return intr_reg & 3; |
@@ -191,23 +191,25 @@ sgiioc4_clearirq(ide_drive_t * drive) | |||
191 | static void sgiioc4_ide_dma_start(ide_drive_t * drive) | 191 | static void sgiioc4_ide_dma_start(ide_drive_t * drive) |
192 | { | 192 | { |
193 | ide_hwif_t *hwif = HWIF(drive); | 193 | ide_hwif_t *hwif = HWIF(drive); |
194 | unsigned int reg = hwif->INL(hwif->dma_base + IOC4_DMA_CTRL * 4); | 194 | unsigned long ioc4_dma_addr = hwif->dma_base + IOC4_DMA_CTRL * 4; |
195 | unsigned int reg = readl((void __iomem *)ioc4_dma_addr); | ||
195 | unsigned int temp_reg = reg | IOC4_S_DMA_START; | 196 | unsigned int temp_reg = reg | IOC4_S_DMA_START; |
196 | 197 | ||
197 | hwif->OUTL(temp_reg, hwif->dma_base + IOC4_DMA_CTRL * 4); | 198 | writel(temp_reg, (void __iomem *)ioc4_dma_addr); |
198 | } | 199 | } |
199 | 200 | ||
200 | static u32 | 201 | static u32 |
201 | sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base) | 202 | sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base) |
202 | { | 203 | { |
204 | unsigned long ioc4_dma_addr = dma_base + IOC4_DMA_CTRL * 4; | ||
203 | u32 ioc4_dma; | 205 | u32 ioc4_dma; |
204 | int count; | 206 | int count; |
205 | 207 | ||
206 | count = 0; | 208 | count = 0; |
207 | ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); | 209 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); |
208 | while ((ioc4_dma & IOC4_S_DMA_STOP) && (count++ < 200)) { | 210 | while ((ioc4_dma & IOC4_S_DMA_STOP) && (count++ < 200)) { |
209 | udelay(1); | 211 | udelay(1); |
210 | ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); | 212 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); |
211 | } | 213 | } |
212 | return ioc4_dma; | 214 | return ioc4_dma; |
213 | } | 215 | } |
@@ -218,11 +220,11 @@ sgiioc4_ide_dma_end(ide_drive_t * drive) | |||
218 | { | 220 | { |
219 | u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0; | 221 | u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0; |
220 | ide_hwif_t *hwif = HWIF(drive); | 222 | ide_hwif_t *hwif = HWIF(drive); |
221 | u64 dma_base = hwif->dma_base; | 223 | unsigned long dma_base = hwif->dma_base; |
222 | int dma_stat = 0; | 224 | int dma_stat = 0; |
223 | unsigned long *ending_dma = ide_get_hwifdata(hwif); | 225 | unsigned long *ending_dma = ide_get_hwifdata(hwif); |
224 | 226 | ||
225 | hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4); | 227 | writel(IOC4_S_DMA_STOP, (void __iomem *)(dma_base + IOC4_DMA_CTRL * 4)); |
226 | 228 | ||
227 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); | 229 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); |
228 | 230 | ||
@@ -254,8 +256,8 @@ sgiioc4_ide_dma_end(ide_drive_t * drive) | |||
254 | dma_stat = 1; | 256 | dma_stat = 1; |
255 | } | 257 | } |
256 | 258 | ||
257 | bc_dev = hwif->INL(dma_base + IOC4_BC_DEV * 4); | 259 | bc_dev = readl((void __iomem *)(dma_base + IOC4_BC_DEV * 4)); |
258 | bc_mem = hwif->INL(dma_base + IOC4_BC_MEM * 4); | 260 | bc_mem = readl((void __iomem *)(dma_base + IOC4_BC_MEM * 4)); |
259 | 261 | ||
260 | if ((bc_dev & 0x01FF) || (bc_mem & 0x1FF)) { | 262 | if ((bc_dev & 0x01FF) || (bc_mem & 0x1FF)) { |
261 | if (bc_dev > bc_mem + 8) { | 263 | if (bc_dev > bc_mem + 8) { |
@@ -436,16 +438,17 @@ sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive) | |||
436 | { | 438 | { |
437 | u32 ioc4_dma; | 439 | u32 ioc4_dma; |
438 | ide_hwif_t *hwif = HWIF(drive); | 440 | ide_hwif_t *hwif = HWIF(drive); |
439 | u64 dma_base = hwif->dma_base; | 441 | unsigned long dma_base = hwif->dma_base; |
442 | unsigned long ioc4_dma_addr = dma_base + IOC4_DMA_CTRL * 4; | ||
440 | u32 dma_addr, ending_dma_addr; | 443 | u32 dma_addr, ending_dma_addr; |
441 | 444 | ||
442 | ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); | 445 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); |
443 | 446 | ||
444 | if (ioc4_dma & IOC4_S_DMA_ACTIVE) { | 447 | if (ioc4_dma & IOC4_S_DMA_ACTIVE) { |
445 | printk(KERN_WARNING | 448 | printk(KERN_WARNING |
446 | "%s(%s):Warning!! DMA from previous transfer was still active\n", | 449 | "%s(%s):Warning!! DMA from previous transfer was still active\n", |
447 | __FUNCTION__, drive->name); | 450 | __FUNCTION__, drive->name); |
448 | hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4); | 451 | writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); |
449 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); | 452 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); |
450 | 453 | ||
451 | if (ioc4_dma & IOC4_S_DMA_STOP) | 454 | if (ioc4_dma & IOC4_S_DMA_STOP) |
@@ -454,13 +457,13 @@ sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive) | |||
454 | __FUNCTION__, drive->name); | 457 | __FUNCTION__, drive->name); |
455 | } | 458 | } |
456 | 459 | ||
457 | ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); | 460 | ioc4_dma = readl((void __iomem *)ioc4_dma_addr); |
458 | if (ioc4_dma & IOC4_S_DMA_ERROR) { | 461 | if (ioc4_dma & IOC4_S_DMA_ERROR) { |
459 | printk(KERN_WARNING | 462 | printk(KERN_WARNING |
460 | "%s(%s) : Warning!! - DMA Error during Previous" | 463 | "%s(%s) : Warning!! - DMA Error during Previous" |
461 | " transfer | status 0x%x\n", | 464 | " transfer | status 0x%x\n", |
462 | __FUNCTION__, drive->name, ioc4_dma); | 465 | __FUNCTION__, drive->name, ioc4_dma); |
463 | hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4); | 466 | writel(IOC4_S_DMA_STOP, (void __iomem *)ioc4_dma_addr); |
464 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); | 467 | ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base); |
465 | 468 | ||
466 | if (ioc4_dma & IOC4_S_DMA_STOP) | 469 | if (ioc4_dma & IOC4_S_DMA_STOP) |
@@ -471,14 +474,14 @@ sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive) | |||
471 | 474 | ||
472 | /* Address of the Scatter Gather List */ | 475 | /* Address of the Scatter Gather List */ |
473 | dma_addr = cpu_to_le32(hwif->dmatable_dma); | 476 | dma_addr = cpu_to_le32(hwif->dmatable_dma); |
474 | hwif->OUTL(dma_addr, dma_base + IOC4_DMA_PTR_L * 4); | 477 | writel(dma_addr, (void __iomem *)(dma_base + IOC4_DMA_PTR_L * 4)); |
475 | 478 | ||
476 | /* Address of the Ending DMA */ | 479 | /* Address of the Ending DMA */ |
477 | memset(ide_get_hwifdata(hwif), 0, IOC4_IDE_CACHELINE_SIZE); | 480 | memset(ide_get_hwifdata(hwif), 0, IOC4_IDE_CACHELINE_SIZE); |
478 | ending_dma_addr = cpu_to_le32(hwif->dma_status); | 481 | ending_dma_addr = cpu_to_le32(hwif->dma_status); |
479 | hwif->OUTL(ending_dma_addr, dma_base + IOC4_DMA_END_ADDR * 4); | 482 | writel(ending_dma_addr, (void __iomem *)(dma_base + IOC4_DMA_END_ADDR * 4)); |
480 | 483 | ||
481 | hwif->OUTL(dma_direction, dma_base + IOC4_DMA_CTRL * 4); | 484 | writel(dma_direction, (void __iomem *)ioc4_dma_addr); |
482 | drive->waiting_for_dma = 1; | 485 | drive->waiting_for_dma = 1; |
483 | } | 486 | } |
484 | 487 | ||
@@ -688,7 +691,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d) | |||
688 | default_hwif_mmiops(hwif); | 691 | default_hwif_mmiops(hwif); |
689 | 692 | ||
690 | /* Initializing chipset IRQ Registers */ | 693 | /* Initializing chipset IRQ Registers */ |
691 | hwif->OUTL(0x03, irqport + IOC4_INTR_SET * 4); | 694 | writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4)); |
692 | 695 | ||
693 | ide_init_sgiioc4(hwif); | 696 | ide_init_sgiioc4(hwif); |
694 | 697 | ||