diff options
| author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-07-31 04:46:02 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2009-08-28 15:17:08 -0400 |
| commit | 72afeeafe54853881a4e53dc78d538e249130ad8 (patch) | |
| tree | f31f9be2ed7856762b7c763f9c00aabc9b69f6b2 /drivers/platform | |
| parent | 67059406219d30a36b7ca93f863eb1f3032f05ce (diff) | |
fujitsu-laptop: driver [un]registration fixes
* Move led_classdev_unregister() calls from fujitsu_cleanup() to
acpi_fujitsu_hotkey_remove().
* Fix ordering in fujitsu_cleanup().
* Fix backlight_device_register() failure handling in fujitsu_init().
* Add missing sysfs group removal on failure to fujitsu_init().
* Add input device unregistering on failure to acpi_fujitsu_add()
and acpi_fujitsu_hotkey_add().
* Add input device unregistering/freeing to acpi_fujitsu_remove()
and acpi_fujitsu_hotkey_remove() (also remove superfluous 'device'
and 'acpi_driver_data(device)' checks while at it).
* Do few minor cleanups.
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Acked-by: Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/platform')
| -rw-r--r-- | drivers/platform/x86/fujitsu-laptop.c | 86 |
1 files changed, 41 insertions, 45 deletions
diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index f9e3e3afca13..b87a5a2084a9 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c | |||
| @@ -691,7 +691,7 @@ static int acpi_fujitsu_add(struct acpi_device *device) | |||
| 691 | result = acpi_bus_get_power(fujitsu->acpi_handle, &state); | 691 | result = acpi_bus_get_power(fujitsu->acpi_handle, &state); |
| 692 | if (result) { | 692 | if (result) { |
| 693 | printk(KERN_ERR "Error reading power state\n"); | 693 | printk(KERN_ERR "Error reading power state\n"); |
| 694 | goto end; | 694 | goto err_unregister_input_dev; |
| 695 | } | 695 | } |
| 696 | 696 | ||
| 697 | printk(KERN_INFO PREFIX "%s [%s] (%s)\n", | 697 | printk(KERN_INFO PREFIX "%s [%s] (%s)\n", |
| @@ -722,22 +722,22 @@ static int acpi_fujitsu_add(struct acpi_device *device) | |||
| 722 | 722 | ||
| 723 | return result; | 723 | return result; |
| 724 | 724 | ||
| 725 | end: | 725 | err_unregister_input_dev: |
| 726 | input_unregister_device(input); | ||
| 726 | err_free_input_dev: | 727 | err_free_input_dev: |
| 727 | input_free_device(input); | 728 | input_free_device(input); |
| 728 | err_stop: | 729 | err_stop: |
| 729 | |||
| 730 | return result; | 730 | return result; |
| 731 | } | 731 | } |
| 732 | 732 | ||
| 733 | static int acpi_fujitsu_remove(struct acpi_device *device, int type) | 733 | static int acpi_fujitsu_remove(struct acpi_device *device, int type) |
| 734 | { | 734 | { |
| 735 | struct fujitsu_t *fujitsu = NULL; | 735 | struct fujitsu_t *fujitsu = acpi_driver_data(device); |
| 736 | struct input_dev *input = fujitsu->input; | ||
| 736 | 737 | ||
| 737 | if (!device || !acpi_driver_data(device)) | 738 | input_unregister_device(input); |
| 738 | return -EINVAL; | ||
| 739 | 739 | ||
| 740 | fujitsu = acpi_driver_data(device); | 740 | input_free_device(input); |
| 741 | 741 | ||
| 742 | fujitsu->acpi_handle = NULL; | 742 | fujitsu->acpi_handle = NULL; |
| 743 | 743 | ||
| @@ -862,7 +862,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
| 862 | result = acpi_bus_get_power(fujitsu_hotkey->acpi_handle, &state); | 862 | result = acpi_bus_get_power(fujitsu_hotkey->acpi_handle, &state); |
| 863 | if (result) { | 863 | if (result) { |
| 864 | printk(KERN_ERR "Error reading power state\n"); | 864 | printk(KERN_ERR "Error reading power state\n"); |
| 865 | goto end; | 865 | goto err_unregister_input_dev; |
| 866 | } | 866 | } |
| 867 | 867 | ||
| 868 | printk(KERN_INFO PREFIX "%s [%s] (%s)\n", | 868 | printk(KERN_INFO PREFIX "%s [%s] (%s)\n", |
| @@ -902,7 +902,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
| 902 | printk(KERN_INFO "fujitsu-laptop: BTNI: [0x%x]\n", | 902 | printk(KERN_INFO "fujitsu-laptop: BTNI: [0x%x]\n", |
| 903 | call_fext_func(FUNC_BUTTONS, 0x0, 0x0, 0x0)); | 903 | call_fext_func(FUNC_BUTTONS, 0x0, 0x0, 0x0)); |
| 904 | 904 | ||
| 905 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) | 905 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) |
| 906 | if (call_fext_func(FUNC_LEDS, 0x0, 0x0, 0x0) & LOGOLAMP_POWERON) { | 906 | if (call_fext_func(FUNC_LEDS, 0x0, 0x0, 0x0) & LOGOLAMP_POWERON) { |
| 907 | result = led_classdev_register(&fujitsu->pf_device->dev, | 907 | result = led_classdev_register(&fujitsu->pf_device->dev, |
| 908 | &logolamp_led); | 908 | &logolamp_led); |
| @@ -925,33 +925,41 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
| 925 | "LED handler for keyboard lamps, error %i\n", result); | 925 | "LED handler for keyboard lamps, error %i\n", result); |
| 926 | } | 926 | } |
| 927 | } | 927 | } |
| 928 | #endif | 928 | #endif |
| 929 | 929 | ||
| 930 | return result; | 930 | return result; |
| 931 | 931 | ||
| 932 | end: | 932 | err_unregister_input_dev: |
| 933 | input_unregister_device(input); | ||
| 933 | err_free_input_dev: | 934 | err_free_input_dev: |
| 934 | input_free_device(input); | 935 | input_free_device(input); |
| 935 | err_free_fifo: | 936 | err_free_fifo: |
| 936 | kfifo_free(fujitsu_hotkey->fifo); | 937 | kfifo_free(fujitsu_hotkey->fifo); |
| 937 | err_stop: | 938 | err_stop: |
| 938 | |||
| 939 | return result; | 939 | return result; |
| 940 | } | 940 | } |
| 941 | 941 | ||
| 942 | static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) | 942 | static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) |
| 943 | { | 943 | { |
| 944 | struct fujitsu_hotkey_t *fujitsu_hotkey = NULL; | 944 | struct fujitsu_hotkey_t *fujitsu_hotkey = acpi_driver_data(device); |
| 945 | struct input_dev *input = fujitsu_hotkey->input; | ||
| 945 | 946 | ||
| 946 | if (!device || !acpi_driver_data(device)) | 947 | #ifdef CONFIG_LEDS_CLASS |
| 947 | return -EINVAL; | 948 | if (fujitsu_hotkey->logolamp_registered) |
| 949 | led_classdev_unregister(&logolamp_led); | ||
| 950 | |||
| 951 | if (fujitsu_hotkey->kblamps_registered) | ||
| 952 | led_classdev_unregister(&kblamps_led); | ||
| 953 | #endif | ||
| 948 | 954 | ||
| 949 | fujitsu_hotkey = acpi_driver_data(device); | 955 | input_unregister_device(input); |
| 950 | 956 | ||
| 951 | fujitsu_hotkey->acpi_handle = NULL; | 957 | input_free_device(input); |
| 952 | 958 | ||
| 953 | kfifo_free(fujitsu_hotkey->fifo); | 959 | kfifo_free(fujitsu_hotkey->fifo); |
| 954 | 960 | ||
| 961 | fujitsu_hotkey->acpi_handle = NULL; | ||
| 962 | |||
| 955 | return 0; | 963 | return 0; |
| 956 | } | 964 | } |
| 957 | 965 | ||
| @@ -1121,8 +1129,11 @@ static int __init fujitsu_init(void) | |||
| 1121 | fujitsu->bl_device = | 1129 | fujitsu->bl_device = |
| 1122 | backlight_device_register("fujitsu-laptop", NULL, NULL, | 1130 | backlight_device_register("fujitsu-laptop", NULL, NULL, |
| 1123 | &fujitsubl_ops); | 1131 | &fujitsubl_ops); |
| 1124 | if (IS_ERR(fujitsu->bl_device)) | 1132 | if (IS_ERR(fujitsu->bl_device)) { |
| 1125 | return PTR_ERR(fujitsu->bl_device); | 1133 | ret = PTR_ERR(fujitsu->bl_device); |
| 1134 | fujitsu->bl_device = NULL; | ||
| 1135 | goto fail_sysfs_group; | ||
| 1136 | } | ||
| 1126 | max_brightness = fujitsu->max_brightness; | 1137 | max_brightness = fujitsu->max_brightness; |
| 1127 | fujitsu->bl_device->props.max_brightness = max_brightness - 1; | 1138 | fujitsu->bl_device->props.max_brightness = max_brightness - 1; |
| 1128 | fujitsu->bl_device->props.brightness = fujitsu->brightness_level; | 1139 | fujitsu->bl_device->props.brightness = fujitsu->brightness_level; |
| @@ -1162,32 +1173,22 @@ static int __init fujitsu_init(void) | |||
| 1162 | return 0; | 1173 | return 0; |
| 1163 | 1174 | ||
| 1164 | fail_hotkey1: | 1175 | fail_hotkey1: |
| 1165 | |||
| 1166 | kfree(fujitsu_hotkey); | 1176 | kfree(fujitsu_hotkey); |
| 1167 | |||
| 1168 | fail_hotkey: | 1177 | fail_hotkey: |
| 1169 | |||
| 1170 | platform_driver_unregister(&fujitsupf_driver); | 1178 | platform_driver_unregister(&fujitsupf_driver); |
| 1171 | |||
| 1172 | fail_backlight: | 1179 | fail_backlight: |
| 1173 | |||
| 1174 | if (fujitsu->bl_device) | 1180 | if (fujitsu->bl_device) |
| 1175 | backlight_device_unregister(fujitsu->bl_device); | 1181 | backlight_device_unregister(fujitsu->bl_device); |
| 1176 | 1182 | fail_sysfs_group: | |
| 1183 | sysfs_remove_group(&fujitsu->pf_device->dev.kobj, | ||
| 1184 | &fujitsupf_attribute_group); | ||
| 1177 | fail_platform_device2: | 1185 | fail_platform_device2: |
| 1178 | |||
| 1179 | platform_device_del(fujitsu->pf_device); | 1186 | platform_device_del(fujitsu->pf_device); |
| 1180 | |||
| 1181 | fail_platform_device1: | 1187 | fail_platform_device1: |
| 1182 | |||
| 1183 | platform_device_put(fujitsu->pf_device); | 1188 | platform_device_put(fujitsu->pf_device); |
| 1184 | |||
| 1185 | fail_platform_driver: | 1189 | fail_platform_driver: |
| 1186 | |||
| 1187 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); | 1190 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); |
| 1188 | |||
| 1189 | fail_acpi: | 1191 | fail_acpi: |
| 1190 | |||
| 1191 | kfree(fujitsu); | 1192 | kfree(fujitsu); |
| 1192 | 1193 | ||
| 1193 | return ret; | 1194 | return ret; |
| @@ -1195,28 +1196,23 @@ fail_acpi: | |||
| 1195 | 1196 | ||
| 1196 | static void __exit fujitsu_cleanup(void) | 1197 | static void __exit fujitsu_cleanup(void) |
| 1197 | { | 1198 | { |
| 1198 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) | 1199 | acpi_bus_unregister_driver(&acpi_fujitsu_hotkey_driver); |
| 1199 | if (fujitsu_hotkey->logolamp_registered != 0) | ||
| 1200 | led_classdev_unregister(&logolamp_led); | ||
| 1201 | 1200 | ||
| 1202 | if (fujitsu_hotkey->kblamps_registered != 0) | 1201 | kfree(fujitsu_hotkey); |
| 1203 | led_classdev_unregister(&kblamps_led); | ||
| 1204 | #endif | ||
| 1205 | 1202 | ||
| 1206 | sysfs_remove_group(&fujitsu->pf_device->dev.kobj, | ||
| 1207 | &fujitsupf_attribute_group); | ||
| 1208 | platform_device_unregister(fujitsu->pf_device); | ||
| 1209 | platform_driver_unregister(&fujitsupf_driver); | 1203 | platform_driver_unregister(&fujitsupf_driver); |
| 1204 | |||
| 1210 | if (fujitsu->bl_device) | 1205 | if (fujitsu->bl_device) |
| 1211 | backlight_device_unregister(fujitsu->bl_device); | 1206 | backlight_device_unregister(fujitsu->bl_device); |
| 1212 | 1207 | ||
| 1213 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); | 1208 | sysfs_remove_group(&fujitsu->pf_device->dev.kobj, |
| 1209 | &fujitsupf_attribute_group); | ||
| 1214 | 1210 | ||
| 1215 | kfree(fujitsu); | 1211 | platform_device_unregister(fujitsu->pf_device); |
| 1216 | 1212 | ||
| 1217 | acpi_bus_unregister_driver(&acpi_fujitsu_hotkey_driver); | 1213 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); |
| 1218 | 1214 | ||
| 1219 | kfree(fujitsu_hotkey); | 1215 | kfree(fujitsu); |
| 1220 | 1216 | ||
| 1221 | printk(KERN_INFO "fujitsu-laptop: driver unloaded.\n"); | 1217 | printk(KERN_INFO "fujitsu-laptop: driver unloaded.\n"); |
| 1222 | } | 1218 | } |
