aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r--drivers/ide/ide.c86
1 files changed, 4 insertions, 82 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index d868ca44d033..bced02f9f2c3 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -227,79 +227,6 @@ static int ide_system_bus_speed(void)
227 return pci_dev_present(pci_default) ? 33 : 50; 227 return pci_dev_present(pci_default) ? 33 : 50;
228} 228}
229 229
230static struct resource* hwif_request_region(ide_hwif_t *hwif,
231 unsigned long addr, int num)
232{
233 struct resource *res = request_region(addr, num, hwif->name);
234
235 if (!res)
236 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
237 hwif->name, addr, addr+num-1);
238 return res;
239}
240
241/**
242 * ide_hwif_request_regions - request resources for IDE
243 * @hwif: interface to use
244 *
245 * Requests all the needed resources for an interface.
246 * Right now core IDE code does this work which is deeply wrong.
247 * MMIO leaves it to the controller driver,
248 * PIO will migrate this way over time.
249 */
250
251int ide_hwif_request_regions(ide_hwif_t *hwif)
252{
253 unsigned long addr;
254
255 if (hwif->mmio)
256 return 0;
257
258 addr = hwif->io_ports[IDE_CONTROL_OFFSET];
259
260 if (addr && !hwif_request_region(hwif, addr, 1))
261 goto control_region_busy;
262
263 addr = hwif->io_ports[IDE_DATA_OFFSET];
264 BUG_ON((addr | 7) != hwif->io_ports[IDE_STATUS_OFFSET]);
265
266 if (!hwif_request_region(hwif, addr, 8))
267 goto data_region_busy;
268
269 return 0;
270
271data_region_busy:
272 addr = hwif->io_ports[IDE_CONTROL_OFFSET];
273 if (addr)
274 release_region(addr, 1);
275control_region_busy:
276 /* If any errors are return, we drop the hwif interface. */
277 return -EBUSY;
278}
279
280/**
281 * ide_hwif_release_regions - free IDE resources
282 *
283 * Note that we only release the standard ports,
284 * and do not even try to handle any extra ports
285 * allocated for weird IDE interface chipsets.
286 *
287 * Note also that we don't yet handle mmio resources here. More
288 * importantly our caller should be doing this so we need to
289 * restructure this as a helper function for drivers.
290 */
291
292void ide_hwif_release_regions(ide_hwif_t *hwif)
293{
294 if (hwif->mmio)
295 return;
296
297 if (hwif->io_ports[IDE_CONTROL_OFFSET])
298 release_region(hwif->io_ports[IDE_CONTROL_OFFSET], 1);
299
300 release_region(hwif->io_ports[IDE_DATA_OFFSET], 8);
301}
302
303void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) 230void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
304{ 231{
305 ide_hwgroup_t *hwgroup = hwif->hwgroup; 232 ide_hwgroup_t *hwgroup = hwif->hwgroup;
@@ -436,9 +363,7 @@ void ide_unregister(unsigned int index)
436 spin_lock_irq(&ide_lock); 363 spin_lock_irq(&ide_lock);
437 364
438 if (hwif->dma_base) 365 if (hwif->dma_base)
439 (void)ide_release_dma(hwif); 366 ide_release_dma_engine(hwif);
440
441 ide_hwif_release_regions(hwif);
442 367
443 /* restore hwif data to pristine status */ 368 /* restore hwif data to pristine status */
444 ide_init_port_data(hwif, index); 369 ide_init_port_data(hwif, index);
@@ -454,7 +379,6 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
454{ 379{
455 memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports)); 380 memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports));
456 hwif->irq = hw->irq; 381 hwif->irq = hw->irq;
457 hwif->noprobe = 0;
458 hwif->chipset = hw->chipset; 382 hwif->chipset = hw->chipset;
459 hwif->gendev.parent = hw->dev; 383 hwif->gendev.parent = hw->dev;
460 hwif->ack_intr = hw->ack_intr; 384 hwif->ack_intr = hw->ack_intr;
@@ -545,7 +469,7 @@ int set_using_dma(ide_drive_t *drive, int arg)
545 if (!drive->id || !(drive->id->capability & 1)) 469 if (!drive->id || !(drive->id->capability & 1))
546 goto out; 470 goto out;
547 471
548 if (hwif->dma_host_set == NULL) 472 if (hwif->dma_ops == NULL)
549 goto out; 473 goto out;
550 474
551 err = -EBUSY; 475 err = -EBUSY;
@@ -585,11 +509,12 @@ int set_pio_mode(ide_drive_t *drive, int arg)
585{ 509{
586 struct request rq; 510 struct request rq;
587 ide_hwif_t *hwif = drive->hwif; 511 ide_hwif_t *hwif = drive->hwif;
512 const struct ide_port_ops *port_ops = hwif->port_ops;
588 513
589 if (arg < 0 || arg > 255) 514 if (arg < 0 || arg > 255)
590 return -EINVAL; 515 return -EINVAL;
591 516
592 if (hwif->set_pio_mode == NULL || 517 if (port_ops == NULL || port_ops->set_pio_mode == NULL ||
593 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)) 518 (hwif->host_flags & IDE_HFLAG_NO_SET_MODE))
594 return -ENOSYS; 519 return -ENOSYS;
595 520
@@ -1005,14 +930,12 @@ static int __init ide_setup(char *s)
1005 goto done; 930 goto done;
1006 case -3: /* "nowerr" */ 931 case -3: /* "nowerr" */
1007 drive->bad_wstat = BAD_R_STAT; 932 drive->bad_wstat = BAD_R_STAT;
1008 hwif->noprobe = 0;
1009 goto done; 933 goto done;
1010 case -4: /* "cdrom" */ 934 case -4: /* "cdrom" */
1011 drive->present = 1; 935 drive->present = 1;
1012 drive->media = ide_cdrom; 936 drive->media = ide_cdrom;
1013 /* an ATAPI device ignores DRDY */ 937 /* an ATAPI device ignores DRDY */
1014 drive->ready_stat = 0; 938 drive->ready_stat = 0;
1015 hwif->noprobe = 0;
1016 goto done; 939 goto done;
1017 case -5: /* nodma */ 940 case -5: /* nodma */
1018 drive->nodma = 1; 941 drive->nodma = 1;
@@ -1043,7 +966,6 @@ static int __init ide_setup(char *s)
1043 drive->sect = drive->bios_sect = vals[2]; 966 drive->sect = drive->bios_sect = vals[2];
1044 drive->present = 1; 967 drive->present = 1;
1045 drive->forced_geom = 1; 968 drive->forced_geom = 1;
1046 hwif->noprobe = 0;
1047 goto done; 969 goto done;
1048 default: 970 default:
1049 goto bad_option; 971 goto bad_option;