diff options
author | Jiri Kosina <jkosina@suse.cz> | 2010-08-10 13:22:08 +0200 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-08-10 13:22:08 +0200 |
commit | fb8231a8b139035476f2a8aaac837d0099b66dad (patch) | |
tree | 2875806beb96ea0cdab292146767a5085721dc6a /drivers/firmware | |
parent | 426d31071ac476ea62c62656b242930c17b58c00 (diff) | |
parent | f6cec0ae58c17522a7bc4e2f39dae19f199ab534 (diff) |
Merge branch 'master' into for-next
Conflicts:
arch/arm/mach-omap1/board-nokia770.c
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/dcdbas.c | 5 | ||||
-rw-r--r-- | drivers/firmware/dmi-id.c | 4 | ||||
-rw-r--r-- | drivers/firmware/dmi_scan.c | 25 | ||||
-rw-r--r-- | drivers/firmware/edd.c | 20 |
4 files changed, 43 insertions, 11 deletions
diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c index aa9bc9e980e..69ad529d92f 100644 --- a/drivers/firmware/dcdbas.c +++ b/drivers/firmware/dcdbas.c @@ -634,9 +634,6 @@ static void __exit dcdbas_exit(void) * before platform_device_unregister */ unregister_reboot_notifier(&dcdbas_reboot_nb); - smi_data_buf_free(); - platform_device_unregister(dcdbas_pdev); - platform_driver_unregister(&dcdbas_driver); /* * We have to free the buffer here instead of dcdbas_remove @@ -645,6 +642,8 @@ static void __exit dcdbas_exit(void) * released. */ smi_data_buf_free(); + platform_device_unregister(dcdbas_pdev); + platform_driver_unregister(&dcdbas_driver); } module_init(dcdbas_init); diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c index a777a35381d..94a58a082b9 100644 --- a/drivers/firmware/dmi-id.c +++ b/drivers/firmware/dmi-id.c @@ -229,10 +229,12 @@ static int __init dmi_id_init(void) ret = device_register(dmi_dev); if (ret) - goto fail_class_unregister; + goto fail_free_dmi_dev; return 0; +fail_free_dmi_dev: + kfree(dmi_dev); fail_class_unregister: class_unregister(&dmi_class); diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index d4646727134..b3d22d65999 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -277,6 +277,29 @@ static void __init dmi_save_ipmi_device(const struct dmi_header *dm) list_add_tail(&dev->list, &dmi_devices); } +static void __init dmi_save_dev_onboard(int instance, int segment, int bus, + int devfn, const char *name) +{ + struct dmi_dev_onboard *onboard_dev; + + onboard_dev = dmi_alloc(sizeof(*onboard_dev) + strlen(name) + 1); + if (!onboard_dev) { + printk(KERN_ERR "dmi_save_dev_onboard: out of memory.\n"); + return; + } + onboard_dev->instance = instance; + onboard_dev->segment = segment; + onboard_dev->bus = bus; + onboard_dev->devfn = devfn; + + strcpy((char *)&onboard_dev[1], name); + onboard_dev->dev.type = DMI_DEV_TYPE_DEV_ONBOARD; + onboard_dev->dev.name = (char *)&onboard_dev[1]; + onboard_dev->dev.device_data = onboard_dev; + + list_add(&onboard_dev->dev.list, &dmi_devices); +} + static void __init dmi_save_extended_devices(const struct dmi_header *dm) { const u8 *d = (u8*) dm + 5; @@ -285,6 +308,8 @@ static void __init dmi_save_extended_devices(const struct dmi_header *dm) if ((*d & 0x80) == 0) return; + dmi_save_dev_onboard(*(d+1), *(u16 *)(d+2), *(d+4), *(d+5), + dmi_string_nosave(dm, *(d-1))); dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d - 1))); } diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c index 110e24e5088..f287fe79edc 100644 --- a/drivers/firmware/edd.c +++ b/drivers/firmware/edd.c @@ -744,7 +744,7 @@ static inline int edd_num_devices(void) static int __init edd_init(void) { - unsigned int i; + int i; int rc=0; struct edd_device *edev; @@ -760,21 +760,27 @@ edd_init(void) if (!edd_kset) return -ENOMEM; - for (i = 0; i < edd_num_devices() && !rc; i++) { + for (i = 0; i < edd_num_devices(); i++) { edev = kzalloc(sizeof (*edev), GFP_KERNEL); - if (!edev) - return -ENOMEM; + if (!edev) { + rc = -ENOMEM; + goto out; + } rc = edd_device_register(edev, i); if (rc) { kfree(edev); - break; + goto out; } edd_devices[i] = edev; } - if (rc) - kset_unregister(edd_kset); + return 0; + +out: + while (--i >= 0) + edd_device_unregister(edd_devices[i]); + kset_unregister(edd_kset); return rc; } |