The IRQ handler may rely on the bus or the root device. Register the
adapter IRQ after setting up the bus and the root device to avoid any
race conditions.
Signed-off-by: Holger Dengler <dengler@linux.ibm.com>
Reviewed-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
ap_domain_index = -1;
}
- /* enable interrupts if available */
- rc = ap_irq_init();
- if (rc)
- goto out;
-
/* Create /sys/bus/ap. */
rc = bus_register(&ap_bus_type);
if (rc)
- goto out_irq;
+ goto out;
/* Create /sys/devices/ap. */
ap_root_device = root_device_register("ap");
goto out_bus;
ap_root_device->bus = &ap_bus_type;
+ /* enable interrupts if available */
+ rc = ap_irq_init();
+ if (rc)
+ goto out_device;
+
/* Setup asynchronous work (timers, workqueue, etc). */
rc = ap_async_init();
if (rc)
- goto out_device;
+ goto out_irq;
return 0;
+out_irq:
+ ap_irq_exit();
out_device:
root_device_unregister(ap_root_device);
out_bus:
bus_unregister(&ap_bus_type);
-out_irq:
- ap_irq_exit();
out:
ap_debug_exit();
return rc;