mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 12:46:17 +00:00
ide: move hwif_register() call out of ide_probe_port()
* Add BUG_ON(hwif->present) at the start of ide_probe_port(). * Move hwif_register() call (along with setting hwif->present) from ide_probe_port() to ide_device_add_all(). As a result the port will be registered with the device tree _after_: - probing both devices (if both are present) - port reset (if hwif->reset is set) - restoring local IRQs state and re-enabling port IRQ While at it: * Rename hwif_register() to ide_register_port(). Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
e84e7ea7c4
commit
a14dc57495
1 changed files with 13 additions and 14 deletions
|
@ -613,7 +613,7 @@ static void hwif_release_dev (struct device *dev)
|
||||||
complete(&hwif->gendev_rel_comp);
|
complete(&hwif->gendev_rel_comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hwif_register (ide_hwif_t *hwif)
|
static void ide_register_port(ide_hwif_t *hwif)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -742,7 +742,9 @@ static int ide_probe_port(ide_hwif_t *hwif)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int irqd;
|
unsigned int irqd;
|
||||||
int unit;
|
int unit, rc = -ENODEV;
|
||||||
|
|
||||||
|
BUG_ON(hwif->present);
|
||||||
|
|
||||||
if (hwif->noprobe)
|
if (hwif->noprobe)
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
@ -767,14 +769,8 @@ static int ide_probe_port(ide_hwif_t *hwif)
|
||||||
ide_drive_t *drive = &hwif->drives[unit];
|
ide_drive_t *drive = &hwif->drives[unit];
|
||||||
drive->dn = (hwif->channel ? 2 : 0) + unit;
|
drive->dn = (hwif->channel ? 2 : 0) + unit;
|
||||||
(void) probe_for_drive(drive);
|
(void) probe_for_drive(drive);
|
||||||
if (drive->present && !hwif->present) {
|
if (drive->present)
|
||||||
hwif->present = 1;
|
rc = 0;
|
||||||
if (hwif->chipset != ide_4drives ||
|
|
||||||
!hwif->mate ||
|
|
||||||
!hwif->mate->present) {
|
|
||||||
hwif_register(hwif);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (hwif->io_ports[IDE_CONTROL_OFFSET] && hwif->reset) {
|
if (hwif->io_ports[IDE_CONTROL_OFFSET] && hwif->reset) {
|
||||||
printk(KERN_WARNING "%s: reset\n", hwif->name);
|
printk(KERN_WARNING "%s: reset\n", hwif->name);
|
||||||
|
@ -791,10 +787,7 @@ static int ide_probe_port(ide_hwif_t *hwif)
|
||||||
if (irqd)
|
if (irqd)
|
||||||
enable_irq(irqd);
|
enable_irq(irqd);
|
||||||
|
|
||||||
if (!hwif->present)
|
return rc;
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_port_tune_devices(ide_hwif_t *hwif)
|
static void ide_port_tune_devices(ide_hwif_t *hwif)
|
||||||
|
@ -1319,6 +1312,12 @@ int ide_device_add_all(u8 *idx)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hwif->present = 1;
|
||||||
|
|
||||||
|
if (hwif->chipset != ide_4drives || !hwif->mate ||
|
||||||
|
!hwif->mate->present)
|
||||||
|
ide_register_port(hwif);
|
||||||
|
|
||||||
ide_port_tune_devices(hwif);
|
ide_port_tune_devices(hwif);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue