summaryrefslogtreecommitdiff
path: root/drivers/platform/x86/msi-wmi.c
diff options
context:
space:
mode:
authorAnisse Astier <anisse@astier.eu>2009-12-10 16:18:15 +0300
committerLen Brown <len.brown@intel.com>2009-12-16 20:40:53 +0300
commit46b51eb9e14afb3bde4bc2fe3bbc22ce012647d4 (patch)
tree05ab778507e4ba9a13c8dec630fccb8646cf9623 /drivers/platform/x86/msi-wmi.c
parentaddd65aac7bcfed7348048b3ce24774718fc44c3 (diff)
downloadlinux-46b51eb9e14afb3bde4bc2fe3bbc22ce012647d4.tar.xz
msi-wmi: rework init
There should be less code duplication with usage of gotos Driver won't load if there's no hardware to control Safer error handling at input driver allocation Signed-off-by: Anisse Astier <anisse@astier.eu> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/platform/x86/msi-wmi.c')
-rw-r--r--drivers/platform/x86/msi-wmi.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/drivers/platform/x86/msi-wmi.c b/drivers/platform/x86/msi-wmi.c
index fb988d8f4267..dcb048c0793f 100644
--- a/drivers/platform/x86/msi-wmi.c
+++ b/drivers/platform/x86/msi-wmi.c
@@ -284,6 +284,8 @@ static int __init msi_wmi_input_setup(void)
int err;
msi_wmi_input_dev = input_allocate_device();
+ if (!msi_wmi_input_dev)
+ return -ENOMEM;
msi_wmi_input_dev->name = "MSI WMI hotkeys";
msi_wmi_input_dev->phys = "wmi/input0";
@@ -314,40 +316,44 @@ static int __init msi_wmi_init(void)
{
int err;
- if (wmi_has_guid(MSIWMI_EVENT_GUID)) {
- err = wmi_install_notify_handler(MSIWMI_EVENT_GUID,
- msi_wmi_notify, NULL);
- if (err)
- return -EINVAL;
-
- err = msi_wmi_input_setup();
- if (err) {
- wmi_remove_notify_handler(MSIWMI_EVENT_GUID);
- return -EINVAL;
- }
+ if (!wmi_has_guid(MSIWMI_EVENT_GUID)) {
+ printk(KERN_ERR
+ "This machine doesn't have MSI-hotkeys through WMI\n");
+ return -ENODEV;
+ }
+ err = wmi_install_notify_handler(MSIWMI_EVENT_GUID,
+ msi_wmi_notify, NULL);
+ if (err)
+ return -EINVAL;
- if (!acpi_video_backlight_support()) {
- backlight = backlight_device_register(DRV_NAME,
- NULL, NULL, &msi_backlight_ops);
- if (IS_ERR(backlight)) {
- wmi_remove_notify_handler(MSIWMI_EVENT_GUID);
- input_unregister_device(msi_wmi_input_dev);
- return -EINVAL;
- }
+ err = msi_wmi_input_setup();
+ if (err)
+ goto err_uninstall_notifier;
- backlight->props.max_brightness = ARRAY_SIZE(backlight_map) - 1;
- err = bl_get(NULL);
- if (err < 0) {
- wmi_remove_notify_handler(MSIWMI_EVENT_GUID);
- input_unregister_device(msi_wmi_input_dev);
- backlight_device_unregister(backlight);
- return -EINVAL;
- }
- backlight->props.brightness = err;
- }
+ if (!acpi_video_backlight_support()) {
+ backlight = backlight_device_register(DRV_NAME,
+ NULL, NULL, &msi_backlight_ops);
+ if (IS_ERR(backlight))
+ goto err_free_input;
+
+ backlight->props.max_brightness = ARRAY_SIZE(backlight_map) - 1;
+ err = bl_get(NULL);
+ if (err < 0)
+ goto err_free_backlight;
+
+ backlight->props.brightness = err;
}
printk(KERN_INFO DRV_PFX "Event handler installed\n");
+
return 0;
+
+err_free_backlight:
+ backlight_device_unregister(backlight);
+err_free_input:
+ input_unregister_device(msi_wmi_input_dev);
+err_uninstall_notifier:
+ wmi_remove_notify_handler(MSIWMI_EVENT_GUID);
+ return err;
}
static void __exit msi_wmi_exit(void)