[PATCH] fbdev: statically link the framebuffer notification functions

The backlight and lcd subsystems can be notified by the framebuffer layer
of blanking events. However, these subsystems, as a whole, can function
independently from the framebuffer layer. But in order to enable to the
lcd and backlight subsystems, the framebuffer has to be compiled also,
effectively sucking in a huge amount of unneeded code.

To prevent dependency problems, separate out the framebuffer notification
mechanism from the framebuffer layer and permanently link it to the kernel.

Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Antonino A. Daplas and committed by Linus Torvalds 256154fb 834a9b8c

+62 -47
+1 -1
drivers/video/Kconfig
··· 1620 1620 source "drivers/video/logo/Kconfig" 1621 1621 endif 1622 1622 1623 - if FB && SYSFS 1623 + if SYSFS 1624 1624 source "drivers/video/backlight/Kconfig" 1625 1625 endif 1626 1626
+1
drivers/video/Makefile
··· 4 4 5 5 # Each configuration option enables a list of files. 6 6 7 + obj-y += fb_notify.o 7 8 obj-$(CONFIG_FB) += fb.o 8 9 fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \ 9 10 modedb.o fbcvt.o
+2 -2
drivers/video/backlight/Kconfig
··· 10 10 11 11 config BACKLIGHT_CLASS_DEVICE 12 12 tristate "Lowlevel Backlight controls" 13 - depends on BACKLIGHT_LCD_SUPPORT && FB 13 + depends on BACKLIGHT_LCD_SUPPORT 14 14 default m 15 15 help 16 16 This framework adds support for low-level control of the LCD ··· 26 26 27 27 config LCD_CLASS_DEVICE 28 28 tristate "Lowlevel LCD controls" 29 - depends on BACKLIGHT_LCD_SUPPORT && FB 29 + depends on BACKLIGHT_LCD_SUPPORT 30 30 default m 31 31 help 32 32 This framework adds support for low-level control of LCD.
+46
drivers/video/fb_notify.c
··· 1 + /* 2 + * linux/drivers/video/fb_notify.c 3 + * 4 + * Copyright (C) 2006 Antonino Daplas <adaplas@pol.net> 5 + * 6 + * 2001 - Documented with DocBook 7 + * - Brad Douglas <brad@neruo.com> 8 + * 9 + * This file is subject to the terms and conditions of the GNU General Public 10 + * License. See the file COPYING in the main directory of this archive 11 + * for more details. 12 + */ 13 + #include <linux/fb.h> 14 + #include <linux/notifier.h> 15 + 16 + static BLOCKING_NOTIFIER_HEAD(fb_notifier_list); 17 + 18 + /** 19 + * fb_register_client - register a client notifier 20 + * @nb: notifier block to callback on events 21 + */ 22 + int fb_register_client(struct notifier_block *nb) 23 + { 24 + return blocking_notifier_chain_register(&fb_notifier_list, nb); 25 + } 26 + EXPORT_SYMBOL(fb_register_client); 27 + 28 + /** 29 + * fb_unregister_client - unregister a client notifier 30 + * @nb: notifier block to callback on events 31 + */ 32 + int fb_unregister_client(struct notifier_block *nb) 33 + { 34 + return blocking_notifier_chain_unregister(&fb_notifier_list, nb); 35 + } 36 + EXPORT_SYMBOL(fb_unregister_client); 37 + 38 + /** 39 + * fb_notifier_call_chain - notify clients of fb_events 40 + * 41 + */ 42 + int fb_notifier_call_chain(unsigned long val, void *v) 43 + { 44 + return blocking_notifier_call_chain(&fb_notifier_list, val, v); 45 + } 46 + EXPORT_SYMBOL_GPL(fb_notifier_call_chain);
+11 -43
drivers/video/fbmem.c
··· 52 52 53 53 #define FBPIXMAPSIZE (1024 * 8) 54 54 55 - static BLOCKING_NOTIFIER_HEAD(fb_notifier_list); 56 55 struct fb_info *registered_fb[FB_MAX]; 57 56 int num_registered_fb; 58 57 ··· 790 791 791 792 event.info = info; 792 793 event.data = &mode1; 793 - ret = blocking_notifier_call_chain(&fb_notifier_list, 794 - FB_EVENT_MODE_DELETE, &event); 794 + ret = fb_notifier_call_chain(FB_EVENT_MODE_DELETE, &event); 795 795 } 796 796 797 797 if (!ret) ··· 835 837 836 838 info->flags &= ~FBINFO_MISC_USEREVENT; 837 839 event.info = info; 838 - blocking_notifier_call_chain(&fb_notifier_list, 839 - evnt, &event); 840 + fb_notifier_call_chain(evnt, &event); 840 841 } 841 842 } 842 843 } ··· 858 861 859 862 event.info = info; 860 863 event.data = &blank; 861 - blocking_notifier_call_chain(&fb_notifier_list, 862 - FB_EVENT_BLANK, &event); 864 + fb_notifier_call_chain(FB_EVENT_BLANK, &event); 863 865 } 864 866 865 867 return ret; ··· 929 933 con2fb.framebuffer = -1; 930 934 event.info = info; 931 935 event.data = &con2fb; 932 - blocking_notifier_call_chain(&fb_notifier_list, 933 - FB_EVENT_GET_CONSOLE_MAP, &event); 936 + fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event); 934 937 return copy_to_user(argp, &con2fb, 935 938 sizeof(con2fb)) ? -EFAULT : 0; 936 939 case FBIOPUT_CON2FBMAP: ··· 947 952 return -EINVAL; 948 953 event.info = info; 949 954 event.data = &con2fb; 950 - return blocking_notifier_call_chain(&fb_notifier_list, 951 - FB_EVENT_SET_CONSOLE_MAP, 952 - &event); 955 + return fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, 956 + &event); 953 957 case FBIOBLANK: 954 958 acquire_console_sem(); 955 959 info->flags |= FBINFO_MISC_USEREVENT; ··· 1324 1330 registered_fb[i] = fb_info; 1325 1331 1326 1332 event.info = fb_info; 1327 - blocking_notifier_call_chain(&fb_notifier_list, 1328 - FB_EVENT_FB_REGISTERED, &event); 1333 + fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event); 1329 1334 return 0; 1330 1335 } 1331 1336 ··· 1358 1365 fb_cleanup_class_device(fb_info); 1359 1366 class_device_destroy(fb_class, MKDEV(FB_MAJOR, i)); 1360 1367 event.info = fb_info; 1361 - blocking_notifier_call_chain(&fb_notifier_list, 1362 - FB_EVENT_FB_UNREGISTERED, &event); 1368 + fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event); 1363 1369 return 0; 1364 - } 1365 - 1366 - /** 1367 - * fb_register_client - register a client notifier 1368 - * @nb: notifier block to callback on events 1369 - */ 1370 - int fb_register_client(struct notifier_block *nb) 1371 - { 1372 - return blocking_notifier_chain_register(&fb_notifier_list, nb); 1373 - } 1374 - 1375 - /** 1376 - * fb_unregister_client - unregister a client notifier 1377 - * @nb: notifier block to callback on events 1378 - */ 1379 - int fb_unregister_client(struct notifier_block *nb) 1380 - { 1381 - return blocking_notifier_chain_unregister(&fb_notifier_list, nb); 1382 1370 } 1383 1371 1384 1372 /** ··· 1377 1403 1378 1404 event.info = info; 1379 1405 if (state) { 1380 - blocking_notifier_call_chain(&fb_notifier_list, 1381 - FB_EVENT_SUSPEND, &event); 1406 + fb_notifier_call_chain(FB_EVENT_SUSPEND, &event); 1382 1407 info->state = FBINFO_STATE_SUSPENDED; 1383 1408 } else { 1384 1409 info->state = FBINFO_STATE_RUNNING; 1385 - blocking_notifier_call_chain(&fb_notifier_list, 1386 - FB_EVENT_RESUME, &event); 1410 + fb_notifier_call_chain(FB_EVENT_RESUME, &event); 1387 1411 } 1388 1412 } 1389 1413 ··· 1452 1480 1453 1481 if (!list_empty(&info->modelist)) { 1454 1482 event.info = info; 1455 - err = blocking_notifier_call_chain(&fb_notifier_list, 1456 - FB_EVENT_NEW_MODELIST, 1457 - &event); 1483 + err = fb_notifier_call_chain(FB_EVENT_NEW_MODELIST, &event); 1458 1484 } 1459 1485 1460 1486 return err; ··· 1564 1594 EXPORT_SYMBOL(fb_pan_display); 1565 1595 EXPORT_SYMBOL(fb_get_buffer_offset); 1566 1596 EXPORT_SYMBOL(fb_set_suspend); 1567 - EXPORT_SYMBOL(fb_register_client); 1568 - EXPORT_SYMBOL(fb_unregister_client); 1569 1597 EXPORT_SYMBOL(fb_get_options); 1570 1598 1571 1599 MODULE_LICENSE("GPL");
+1 -1
include/linux/fb.h
··· 524 524 525 525 extern int fb_register_client(struct notifier_block *nb); 526 526 extern int fb_unregister_client(struct notifier_block *nb); 527 - 527 + extern int fb_notifier_call_chain(unsigned long val, void *v); 528 528 /* 529 529 * Pixmap structure definition 530 530 *