summaryrefslogtreecommitdiffstats
path: root/drivers/video/console/fbcon.c
diff options
context:
space:
mode:
authorAntonino A. Daplas <adaplas@gmail.com>2006-06-26 09:27:05 +0200
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-26 18:58:32 +0200
commite55186fe5fad31962d0ea5ef267bf0c23d98abd4 (patch)
treecd9dc9399fbf82dc7b329980c291a17b5b5697bf /drivers/video/console/fbcon.c
parent[PATCH] Detaching fbcon: sdd sysfs class device entry for fbcon (diff)
downloadlinux-e55186fe5fad31962d0ea5ef267bf0c23d98abd4.tar.xz
linux-e55186fe5fad31962d0ea5ef267bf0c23d98abd4.zip
[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/console/fbcon.c')
-rw-r--r--drivers/video/console/fbcon.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 746225bf8c44..0b742497055e 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));
}