]> err.no Git - linux-2.6/blobdiff - drivers/ieee1394/hosts.c
Merge branch 'acpi' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
[linux-2.6] / drivers / ieee1394 / hosts.c
index fbf17cfe79b09759ce115b052792016d594676ed..32a1309219384537a21b8f8a6f972affb5a7d33b 100644 (file)
@@ -131,10 +131,8 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
                return NULL;
 
        h->csr.rom = csr1212_create_csr(&csr_bus_ops, CSR_BUS_INFO_SIZE, h);
-       if (!h->csr.rom) {
-               kfree(h);
-               return NULL;
-       }
+       if (!h->csr.rom)
+               goto fail;
 
        h->hostdata = h + 1;
        h->driver = drv;
@@ -173,25 +171,38 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
        h->class_dev.class = &hpsb_host_class;
        snprintf(h->class_dev.class_id, BUS_ID_SIZE, "fw-host%d", h->id);
 
-       device_register(&h->device);
-       class_device_register(&h->class_dev);
+       if (device_register(&h->device))
+               goto fail;
+       if (class_device_register(&h->class_dev)) {
+               device_unregister(&h->device);
+               goto fail;
+       }
        get_device(&h->device);
 
        return h;
+
+fail:
+       kfree(h);
+       return NULL;
 }
 
 int hpsb_add_host(struct hpsb_host *host)
 {
        if (hpsb_default_host_entry(host))
                return -ENOMEM;
-
        hpsb_add_extra_config_roms(host);
-
        highlevel_add_host(host);
-
        return 0;
 }
 
+void hpsb_resume_host(struct hpsb_host *host)
+{
+       if (host->driver->set_hw_config_rom)
+               host->driver->set_hw_config_rom(host,
+                                               host->csr.rom->bus_info_data);
+       host->driver->devctl(host, RESET_BUS, SHORT_RESET);
+}
+
 void hpsb_remove_host(struct hpsb_host *host)
 {
        host->is_shutdown = 1;
@@ -200,9 +211,7 @@ void hpsb_remove_host(struct hpsb_host *host)
        flush_scheduled_work();
 
        host->driver = &dummy_driver;
-
        highlevel_remove_host(host);
-
        hpsb_remove_extra_config_roms(host);
 
        class_device_unregister(&host->class_dev);