diff options
author | Peter Huewe <peterhuewe@gmx.de> | 2009-09-28 19:22:40 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-10-30 17:47:43 -0400 |
commit | 0b0595bfdaae1f19a052ceee2a63c307793b9c22 (patch) | |
tree | 043c075bf3ce71932376770cbaaeaf7d14fd5bea | |
parent | 9fcfeab4e99c0e26df7426dbc6530d741934ed83 (diff) |
Staging: Panel: prevent driver from calling misc_deregister twice on same ressource
This patch prevents the driver from calling misc_deregister twice on the same
ressouce when unloading the driver.
Unloading the driver without this patch results in a Kernel BUG like this:
Panel driver version 0.9.5 registered on parport0 (io=0x378).
BUG: unable to handle kernel paging request at 0000000000100108
IP: [<ffffffff803c02ee>] misc_deregister+0x2d/0x90
PGD 6caff067 PUD 762b7067 PMD 0
Oops: 0002 [#1] PREEMPT SMP
last sysfs file: /sys/devices/platform/w83627hf.656/in8_input
...
This patch fixes this issue, although maybe not in the best way possible :)
linux version v2.6.32-rc1 - linus git tree, Di 29. Sep 01:10:18 CEST 2009
Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/panel/panel.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c index dd7d3fde9699..4ce399b6d237 100644 --- a/drivers/staging/panel/panel.c +++ b/drivers/staging/panel/panel.c | |||
@@ -2071,11 +2071,15 @@ static void panel_detach(struct parport *port) | |||
2071 | return; | 2071 | return; |
2072 | } | 2072 | } |
2073 | 2073 | ||
2074 | if (keypad_enabled && keypad_initialized) | 2074 | if (keypad_enabled && keypad_initialized) { |
2075 | misc_deregister(&keypad_dev); | 2075 | misc_deregister(&keypad_dev); |
2076 | keypad_initialized = 0; | ||
2077 | } | ||
2076 | 2078 | ||
2077 | if (lcd_enabled && lcd_initialized) | 2079 | if (lcd_enabled && lcd_initialized) { |
2078 | misc_deregister(&lcd_dev); | 2080 | misc_deregister(&lcd_dev); |
2081 | lcd_initialized = 0; | ||
2082 | } | ||
2079 | 2083 | ||
2080 | parport_release(pprt); | 2084 | parport_release(pprt); |
2081 | parport_unregister_device(pprt); | 2085 | parport_unregister_device(pprt); |
@@ -2211,13 +2215,16 @@ static void __exit panel_cleanup_module(void) | |||
2211 | del_timer(&scan_timer); | 2215 | del_timer(&scan_timer); |
2212 | 2216 | ||
2213 | if (pprt != NULL) { | 2217 | if (pprt != NULL) { |
2214 | if (keypad_enabled) | 2218 | if (keypad_enabled) { |
2215 | misc_deregister(&keypad_dev); | 2219 | misc_deregister(&keypad_dev); |
2220 | keypad_initialized = 0; | ||
2221 | } | ||
2216 | 2222 | ||
2217 | if (lcd_enabled) { | 2223 | if (lcd_enabled) { |
2218 | panel_lcd_print("\x0cLCD driver " PANEL_VERSION | 2224 | panel_lcd_print("\x0cLCD driver " PANEL_VERSION |
2219 | "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-"); | 2225 | "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-"); |
2220 | misc_deregister(&lcd_dev); | 2226 | misc_deregister(&lcd_dev); |
2227 | lcd_initialized = 0; | ||
2221 | } | 2228 | } |
2222 | 2229 | ||
2223 | /* TODO: free all input signals */ | 2230 | /* TODO: free all input signals */ |