From: Peter Huewe Date: Mon, 28 Sep 2009 23:22:40 +0000 (+0200) Subject: Staging: Panel: prevent driver from calling misc_deregister twice on same ressource X-Git-Tag: v3.0~7051^2~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0b0595bfdaae1f19a052ceee2a63c307793b9c22;p=platform%2Fkernel%2Flinux-amlogic.git 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: [] 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 Signed-off-by: Greg Kroah-Hartman --- 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 */