diff options
author | Antonino A. Daplas <adaplas@gmail.com> | 2006-06-26 00:27:05 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 09:58:32 -0700 |
commit | e55186fe5fad31962d0ea5ef267bf0c23d98abd4 (patch) | |
tree | cd9dc9399fbf82dc7b329980c291a17b5b5697bf /drivers/video | |
parent | 9a17917671d407d37bf23a527aa55acca3cb4735 (diff) | |
download | kernel_samsung_tuna-e55186fe5fad31962d0ea5ef267bf0c23d98abd4.zip kernel_samsung_tuna-e55186fe5fad31962d0ea5ef267bf0c23d98abd4.tar.gz kernel_samsung_tuna-e55186fe5fad31962d0ea5ef267bf0c23d98abd4.tar.bz2 |
[PATCH] Detaching fbcon: clean up exit code
To detach fbcon, it must also clean up all resources it allocated. This was
never done before because fbcon cannot be unloaded.
Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/console/fbcon.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 746225b..0b74249 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c @@ -3112,6 +3112,49 @@ static void __exit fbcon_deinit_class_device(void) static void __exit fbcon_exit(void) { + struct fb_info *info; + int i, j, mapped; + + for (i = 0; i < FB_MAX; i++) { + info = registered_fb[i]; + + if (info && info->fbcon_par) + fbcon_del_cursor_timer(info); + } + +#ifdef CONFIG_ATARI + free_irq(IRQ_AUTO_4, fbcon_vbl_handler); +#endif +#ifdef CONFIG_MAC + if (MACH_IS_MAC && vbl_detected) + free_irq(IRQ_MAC_VBL, fbcon_vbl_handler); +#endif + + kfree((void *)softback_buf); + + for (i = 0; i < FB_MAX; i++) { + mapped = 0; + info = registered_fb[i]; + + if (info == NULL) + continue; + + for (j = 0; j < MAX_NR_CONSOLES; j++) { + if (con2fb_map[j] == i) { + con2fb_map[j] = -1; + mapped = 1; + } + } + + if (mapped) { + if (info->fbops->fb_release) + info->fbops->fb_release(info, 0); + module_put(info->fbops->owner); + kfree(info->fbcon_par); + info->fbcon_par = NULL; + } + } + fbcon_deinit_class_device(); class_device_destroy(fb_class, MKDEV(FB_MAJOR, FB_MAX)); } |