The following commit has been merged in the linux branch: commit 0b0595bfdaae1f19a052ceee2a63c307793b9c22 Author: Peter Huewe peterhuewe@gmx.de Date: Tue Sep 29 01:22:40 2009 +0200
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
diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c index dd7d3fd..4ce399b 100644 --- a/drivers/staging/panel/panel.c +++ b/drivers/staging/panel/panel.c @@ -2071,11 +2071,15 @@ static void panel_detach(struct parport *port) return; }
- if (keypad_enabled && keypad_initialized) + if (keypad_enabled && keypad_initialized) { misc_deregister(&keypad_dev); + keypad_initialized = 0; + }
- if (lcd_enabled && lcd_initialized) + if (lcd_enabled && lcd_initialized) { misc_deregister(&lcd_dev); + lcd_initialized = 0; + }
parport_release(pprt); parport_unregister_device(pprt); @@ -2211,13 +2215,16 @@ static void __exit panel_cleanup_module(void) del_timer(&scan_timer);
if (pprt != NULL) { - if (keypad_enabled) + if (keypad_enabled) { misc_deregister(&keypad_dev); + keypad_initialized = 0; + }
if (lcd_enabled) { panel_lcd_print("\x0cLCD driver " PANEL_VERSION "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-"); misc_deregister(&lcd_dev); + lcd_initialized = 0; }
/* TODO: free all input signals */