rc = register_external_interrupt(0x4000, iucv_external_interrupt);
        if (rc)
                goto out;
-       rc = bus_register(&iucv_bus);
-       if (rc)
-               goto out_int;
        iucv_root = s390_root_dev_register("iucv");
        if (IS_ERR(iucv_root)) {
                rc = PTR_ERR(iucv_root);
-               goto out_bus;
+               goto out_int;
        }
 
        for_each_online_cpu(cpu) {
                        goto out_free;
                }
        }
-       register_hotcpu_notifier(&iucv_cpu_notifier);
+       rc = register_hotcpu_notifier(&iucv_cpu_notifier);
+       if (rc)
+               goto out_free;
        ASCEBC(iucv_error_no_listener, 16);
        ASCEBC(iucv_error_no_memory, 16);
        ASCEBC(iucv_error_pathid, 16);
        iucv_available = 1;
+       rc = bus_register(&iucv_bus);
+       if (rc)
+               goto out_cpu;
        return 0;
 
+out_cpu:
+       unregister_hotcpu_notifier(&iucv_cpu_notifier);
 out_free:
        for_each_possible_cpu(cpu) {
                kfree(iucv_param[cpu]);
                iucv_irq_data[cpu] = NULL;
        }
        s390_root_dev_unregister(iucv_root);
-out_bus:
-       bus_unregister(&iucv_bus);
 out_int:
        unregister_external_interrupt(0x4000, iucv_external_interrupt);
 out: