Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'fbdev/udlfb'

+64 -126
-2
drivers/staging/Kconfig
··· 111 111 112 112 source "drivers/staging/vt6656/Kconfig" 113 113 114 - source "drivers/staging/udlfb/Kconfig" 115 - 116 114 source "drivers/staging/hv/Kconfig" 117 115 118 116 source "drivers/staging/vme/Kconfig"
-1
drivers/staging/Makefile
··· 38 38 obj-$(CONFIG_OCTEON_ETHERNET) += octeon/ 39 39 obj-$(CONFIG_VT6655) += vt6655/ 40 40 obj-$(CONFIG_VT6656) += vt6656/ 41 - obj-$(CONFIG_FB_UDL) += udlfb/ 42 41 obj-$(CONFIG_HYPERV) += hv/ 43 42 obj-$(CONFIG_VME_BUS) += vme/ 44 43 obj-$(CONFIG_MRST_RAR_HANDLER) += memrar/
-14
drivers/staging/udlfb/Kconfig
··· 1 - config FB_UDL 2 - tristate "Displaylink USB Framebuffer support" 3 - depends on FB && USB 4 - select FB_MODE_HELPERS 5 - select FB_SYS_FILLRECT 6 - select FB_SYS_COPYAREA 7 - select FB_SYS_IMAGEBLIT 8 - select FB_SYS_FOPS 9 - select FB_DEFERRED_IO 10 - ---help--- 11 - This is a kernel framebuffer driver for DisplayLink USB devices. 12 - Supports fbdev clients like xf86-video-fbdev, kdrive, fbi, and 13 - mplayer -vo fbdev. Supports all USB 2.0 era DisplayLink devices. 14 - To compile as a module, choose M here: the module name is udlfb.
-1
drivers/staging/udlfb/Makefile
··· 1 - obj-$(CONFIG_FB_UDL) += udlfb.o
+49 -86
drivers/staging/udlfb/udlfb.c drivers/video/udlfb.c
··· 16 16 * from Florian Echtler, Henrik Bjerregaard Pedersen, and others. 17 17 */ 18 18 19 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 20 + 19 21 #include <linux/module.h> 20 22 #include <linux/kernel.h> 21 23 #include <linux/init.h> ··· 28 26 #include <linux/vmalloc.h> 29 27 #include <linux/slab.h> 30 28 #include <linux/delay.h> 31 - 32 - #include "udlfb.h" 29 + #include <video/udlfb.h> 30 + #include "edid.h" 33 31 34 32 static struct fb_fix_screeninfo dlfb_fix = { 35 33 .id = "udlfb", ··· 42 40 }; 43 41 44 42 static const u32 udlfb_info_flags = FBINFO_DEFAULT | FBINFO_READS_FAST | 45 - #ifdef FBINFO_VIRTFB 46 43 FBINFO_VIRTFB | 47 - #endif 48 44 FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_FILLRECT | 49 45 FBINFO_HWACCEL_COPYAREA | FBINFO_MISC_ALWAYS_SETPAR; 50 46 ··· 293 293 294 294 pos = (unsigned long)info->fix.smem_start + offset; 295 295 296 - dl_notice("mmap() framebuffer addr:%lu size:%lu\n", 296 + pr_notice("mmap() framebuffer addr:%lu size:%lu\n", 297 297 pos, size); 298 298 299 299 while (size > 0) { ··· 595 595 return 0; 596 596 } 597 597 598 - static ssize_t dlfb_ops_read(struct fb_info *info, char __user *buf, 599 - size_t count, loff_t *ppos) 600 - { 601 - ssize_t result = -ENOSYS; 602 - 603 - #if defined CONFIG_FB_SYS_FOPS || defined CONFIG_FB_SYS_FOPS_MODULE 604 - result = fb_sys_read(info, buf, count, ppos); 605 - #endif 606 - 607 - return result; 608 - } 609 - 610 598 /* 611 599 * Path triggered by usermode clients who write to filesystem 612 600 * e.g. cat filename > /dev/fb1 ··· 604 616 static ssize_t dlfb_ops_write(struct fb_info *info, const char __user *buf, 605 617 size_t count, loff_t *ppos) 606 618 { 607 - ssize_t result = -ENOSYS; 619 + ssize_t result; 608 620 struct dlfb_data *dev = info->par; 609 621 u32 offset = (u32) *ppos; 610 - 611 - #if defined CONFIG_FB_SYS_FOPS || defined CONFIG_FB_SYS_FOPS_MODULE 612 622 613 623 result = fb_sys_write(info, buf, count, ppos); 614 624 ··· 618 632 dlfb_handle_damage(dev, 0, start, info->var.xres, 619 633 lines, info->screen_base); 620 634 } 621 - #endif 622 635 623 636 return result; 624 637 } ··· 629 644 630 645 struct dlfb_data *dev = info->par; 631 646 632 - #if defined CONFIG_FB_SYS_COPYAREA || defined CONFIG_FB_SYS_COPYAREA_MODULE 633 - 634 647 sys_copyarea(info, area); 635 648 636 649 dlfb_handle_damage(dev, area->dx, area->dy, 637 650 area->width, area->height, info->screen_base); 638 - #endif 639 - 640 651 } 641 652 642 653 static void dlfb_ops_imageblit(struct fb_info *info, ··· 640 659 { 641 660 struct dlfb_data *dev = info->par; 642 661 643 - #if defined CONFIG_FB_SYS_IMAGEBLIT || defined CONFIG_FB_SYS_IMAGEBLIT_MODULE 644 - 645 662 sys_imageblit(info, image); 646 663 647 664 dlfb_handle_damage(dev, image->dx, image->dy, 648 665 image->width, image->height, info->screen_base); 649 - 650 - #endif 651 - 652 666 } 653 667 654 668 static void dlfb_ops_fillrect(struct fb_info *info, ··· 651 675 { 652 676 struct dlfb_data *dev = info->par; 653 677 654 - #if defined CONFIG_FB_SYS_FILLRECT || defined CONFIG_FB_SYS_FILLRECT_MODULE 655 - 656 678 sys_fillrect(info, rect); 657 679 658 680 dlfb_handle_damage(dev, rect->dx, rect->dy, rect->width, 659 681 rect->height, info->screen_base); 660 - #endif 661 - 662 682 } 663 683 664 - #ifdef CONFIG_FB_DEFERRED_IO 665 684 /* 666 685 * NOTE: fb_defio.c is holding info->fbdefio.mutex 667 686 * Touching ANY framebuffer memory that triggers a page fault ··· 718 747 &dev->cpu_kcycles_used); 719 748 } 720 749 721 - #endif 722 - 723 750 static int dlfb_get_edid(struct dlfb_data *dev, char *edid, int len) 724 751 { 725 752 int i; ··· 734 765 (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2, 735 766 HZ); 736 767 if (ret < 1) { 737 - dl_err("Read EDID byte %d failed err %x\n", i, ret); 768 + pr_err("Read EDID byte %d failed err %x\n", i, ret); 738 769 i--; 739 770 break; 740 771 } ··· 850 881 851 882 kref_get(&dev->kref); 852 883 853 - #ifdef CONFIG_FB_DEFERRED_IO 854 884 if (fb_defio && (info->fbdefio == NULL)) { 855 885 /* enable defio at last moment if not disabled by client */ 856 886 ··· 865 897 info->fbdefio = fbdefio; 866 898 fb_deferred_io_init(info); 867 899 } 868 - #endif 869 900 870 - dl_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n", 901 + pr_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n", 871 902 info->node, user, info, dev->fb_count); 872 903 873 904 return 0; ··· 890 923 891 924 kfree(dev->edid); 892 925 893 - dl_warn("freeing dlfb_data %p\n", dev); 926 + pr_warn("freeing dlfb_data %p\n", dev); 894 927 895 928 kfree(dev); 896 929 } ··· 926 959 /* Assume info structure is freed after this point */ 927 960 framebuffer_release(info); 928 961 929 - dl_warn("fb_info for /dev/fb%d has been freed\n", node); 962 + pr_warn("fb_info for /dev/fb%d has been freed\n", node); 930 963 931 964 /* ref taken in probe() as part of registering framebfufer */ 932 965 kref_put(&dev->kref, dlfb_free); ··· 945 978 if (dev->virtualized && (dev->fb_count == 0)) 946 979 schedule_delayed_work(&dev->free_framebuffer_work, HZ); 947 980 948 - #ifdef CONFIG_FB_DEFERRED_IO 949 981 if ((dev->fb_count == 0) && (info->fbdefio)) { 950 982 fb_deferred_io_cleanup(info); 951 983 kfree(info->fbdefio); 952 984 info->fbdefio = NULL; 953 985 info->fbops->fb_mmap = dlfb_ops_mmap; 954 986 } 955 - #endif 956 987 957 - dl_warn("released /dev/fb%d user=%d count=%d\n", 988 + pr_warn("released /dev/fb%d user=%d count=%d\n", 958 989 info->node, user, dev->fb_count); 959 990 960 991 kref_put(&dev->kref, dlfb_free); ··· 970 1005 struct dlfb_data *dev = info->par; 971 1006 972 1007 if (mode->xres * mode->yres > dev->sku_pixel_limit) { 973 - dl_warn("%dx%d beyond chip capabilities\n", 1008 + pr_warn("%dx%d beyond chip capabilities\n", 974 1009 mode->xres, mode->yres); 975 1010 return 0; 976 1011 } 977 1012 978 - dl_info("%dx%d valid mode\n", mode->xres, mode->yres); 1013 + pr_info("%dx%d valid mode\n", mode->xres, mode->yres); 979 1014 980 1015 return 1; 981 1016 } ··· 1019 1054 u16 *pix_framebuffer; 1020 1055 int i; 1021 1056 1022 - dl_notice("set_par mode %dx%d\n", info->var.xres, info->var.yres); 1057 + pr_notice("set_par mode %dx%d\n", info->var.xres, info->var.yres); 1023 1058 1024 1059 result = dlfb_set_video_mode(dev, &info->var); 1025 1060 ··· 1069 1104 1070 1105 static struct fb_ops dlfb_ops = { 1071 1106 .owner = THIS_MODULE, 1072 - .fb_read = dlfb_ops_read, 1107 + .fb_read = fb_sys_read, 1073 1108 .fb_write = dlfb_ops_write, 1074 1109 .fb_setcolreg = dlfb_ops_setcolreg, 1075 1110 .fb_fillrect = dlfb_ops_fillrect, ··· 1098 1133 unsigned char *new_fb; 1099 1134 unsigned char *new_back; 1100 1135 1101 - dl_warn("Reallocating framebuffer. Addresses will change!\n"); 1136 + pr_warn("Reallocating framebuffer. Addresses will change!\n"); 1102 1137 1103 1138 new_len = info->fix.line_length * info->var.yres; 1104 1139 ··· 1108 1143 */ 1109 1144 new_fb = vmalloc(new_len); 1110 1145 if (!new_fb) { 1111 - dl_err("Virtual framebuffer alloc failed\n"); 1146 + pr_err("Virtual framebuffer alloc failed\n"); 1112 1147 goto error; 1113 1148 } 1114 1149 ··· 1130 1165 */ 1131 1166 new_back = vmalloc(new_len); 1132 1167 if (!new_back) 1133 - dl_info("No shadow/backing buffer allcoated\n"); 1168 + pr_info("No shadow/backing buffer allcoated\n"); 1134 1169 else { 1135 1170 if (dev->backing_buffer) 1136 1171 vfree(dev->backing_buffer); ··· 1172 1207 if (info->dev) /* only use mutex if info has been registered */ 1173 1208 mutex_lock(&info->lock); 1174 1209 1175 - edid = kmalloc(MAX_EDID_SIZE, GFP_KERNEL); 1210 + edid = kmalloc(EDID_LENGTH, GFP_KERNEL); 1176 1211 if (!edid) { 1177 1212 result = -ENOMEM; 1178 1213 goto error; ··· 1188 1223 */ 1189 1224 while (tries--) { 1190 1225 1191 - i = dlfb_get_edid(dev, edid, MAX_EDID_SIZE); 1226 + i = dlfb_get_edid(dev, edid, EDID_LENGTH); 1192 1227 1193 - if (i >= MIN_EDID_SIZE) 1228 + if (i >= EDID_LENGTH) 1194 1229 fb_edid_to_monspecs(edid, &info->monspecs); 1195 1230 1196 1231 if (info->monspecs.modedb_len > 0) { ··· 1203 1238 /* If that fails, use a previously returned EDID if available */ 1204 1239 if (info->monspecs.modedb_len == 0) { 1205 1240 1206 - dl_err("Unable to get valid EDID from device/display\n"); 1241 + pr_err("Unable to get valid EDID from device/display\n"); 1207 1242 1208 1243 if (dev->edid) { 1209 1244 fb_edid_to_monspecs(dev->edid, &info->monspecs); 1210 1245 if (info->monspecs.modedb_len > 0) 1211 - dl_err("Using previously queried EDID\n"); 1246 + pr_err("Using previously queried EDID\n"); 1212 1247 } 1213 1248 } 1214 1249 1215 1250 /* If that fails, use the default EDID we were handed */ 1216 1251 if (info->monspecs.modedb_len == 0) { 1217 - if (default_edid_size >= MIN_EDID_SIZE) { 1252 + if (default_edid_size >= EDID_LENGTH) { 1218 1253 fb_edid_to_monspecs(default_edid, &info->monspecs); 1219 1254 if (info->monspecs.modedb_len > 0) { 1220 1255 memcpy(edid, default_edid, default_edid_size); 1221 1256 dev->edid = edid; 1222 1257 dev->edid_size = default_edid_size; 1223 - dl_err("Using default/backup EDID\n"); 1258 + pr_err("Using default/backup EDID\n"); 1224 1259 } 1225 1260 } 1226 1261 } ··· 1346 1381 if (off + count > dev->edid_size) 1347 1382 count = dev->edid_size - off; 1348 1383 1349 - dl_info("sysfs edid copy %p to %p, %d bytes\n", 1384 + pr_info("sysfs edid copy %p to %p, %d bytes\n", 1350 1385 dev->edid, buf, (int) count); 1351 1386 1352 1387 memcpy(buf, dev->edid, count); ··· 1363 1398 struct dlfb_data *dev = fb_info->par; 1364 1399 1365 1400 /* We only support write of entire EDID at once, no offset*/ 1366 - if ((src_size < MIN_EDID_SIZE) || 1367 - (src_size > MAX_EDID_SIZE) || 1368 - (src_off != 0)) 1401 + if ((src_size != EDID_LENGTH) || (src_off != 0)) 1369 1402 return 0; 1370 1403 1371 1404 dlfb_setup_modes(dev, fb_info, src, src_size); 1372 1405 1373 1406 if (dev->edid && (memcmp(src, dev->edid, src_size) == 0)) { 1374 - dl_info("sysfs written EDID is new default\n"); 1407 + pr_info("sysfs written EDID is new default\n"); 1375 1408 dlfb_ops_set_par(fb_info); 1376 1409 return src_size; 1377 1410 } else ··· 1394 1431 static struct bin_attribute edid_attr = { 1395 1432 .attr.name = "edid", 1396 1433 .attr.mode = 0666, 1397 - .size = MAX_EDID_SIZE, 1434 + .size = EDID_LENGTH, 1398 1435 .read = edid_show, 1399 1436 .write = edid_store 1400 1437 }; ··· 1442 1479 total_len = usb_get_descriptor(usbdev, 0x5f, /* vendor specific */ 1443 1480 0, desc, MAX_VENDOR_DESCRIPTOR_SIZE); 1444 1481 if (total_len > 5) { 1445 - dl_info("vendor descriptor length:%x data:%02x %02x %02x %02x" \ 1482 + pr_info("vendor descriptor length:%x data:%02x %02x %02x %02x" \ 1446 1483 "%02x %02x %02x %02x %02x %02x %02x\n", 1447 1484 total_len, desc[0], 1448 1485 desc[1], desc[2], desc[3], desc[4], desc[5], desc[6], ··· 1471 1508 case 0x0200: { /* max_area */ 1472 1509 u32 max_area; 1473 1510 max_area = le32_to_cpu(*((u32 *)desc)); 1474 - dl_warn("DL chip limited to %d pixel modes\n", 1511 + pr_warn("DL chip limited to %d pixel modes\n", 1475 1512 max_area); 1476 1513 dev->sku_pixel_limit = max_area; 1477 1514 break; ··· 1487 1524 1488 1525 unrecognized: 1489 1526 /* allow udlfb to load for now even if firmware unrecognized */ 1490 - dl_err("Unrecognized vendor firmware descriptor\n"); 1527 + pr_err("Unrecognized vendor firmware descriptor\n"); 1491 1528 1492 1529 success: 1493 1530 kfree(buf); ··· 1520 1557 dev->gdev = &usbdev->dev; /* our generic struct device * */ 1521 1558 usb_set_intfdata(interface, dev); 1522 1559 1523 - dl_info("%s %s - serial #%s\n", 1560 + pr_info("%s %s - serial #%s\n", 1524 1561 usbdev->manufacturer, usbdev->product, usbdev->serial); 1525 - dl_info("vid_%04x&pid_%04x&rev_%04x driver's dlfb_data struct at %p\n", 1562 + pr_info("vid_%04x&pid_%04x&rev_%04x driver's dlfb_data struct at %p\n", 1526 1563 usbdev->descriptor.idVendor, usbdev->descriptor.idProduct, 1527 1564 usbdev->descriptor.bcdDevice, dev); 1528 - dl_info("console enable=%d\n", console); 1529 - dl_info("fb_defio enable=%d\n", fb_defio); 1565 + pr_info("console enable=%d\n", console); 1566 + pr_info("fb_defio enable=%d\n", fb_defio); 1530 1567 1531 1568 dev->sku_pixel_limit = 2048 * 1152; /* default to maximum */ 1532 1569 1533 1570 if (!dlfb_parse_vendor_descriptor(dev, usbdev)) { 1534 - dl_err("firmware not recognized. Assume incompatible device\n"); 1571 + pr_err("firmware not recognized. Assume incompatible device\n"); 1535 1572 goto error; 1536 1573 } 1537 1574 1538 1575 if (!dlfb_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) { 1539 1576 retval = -ENOMEM; 1540 - dl_err("dlfb_alloc_urb_list failed\n"); 1577 + pr_err("dlfb_alloc_urb_list failed\n"); 1541 1578 goto error; 1542 1579 } 1543 1580 ··· 1547 1584 info = framebuffer_alloc(0, &usbdev->dev); 1548 1585 if (!info) { 1549 1586 retval = -ENOMEM; 1550 - dl_err("framebuffer_alloc failed\n"); 1587 + pr_err("framebuffer_alloc failed\n"); 1551 1588 goto error; 1552 1589 } 1553 1590 ··· 1558 1595 1559 1596 retval = fb_alloc_cmap(&info->cmap, 256, 0); 1560 1597 if (retval < 0) { 1561 - dl_err("fb_alloc_cmap failed %x\n", retval); 1598 + pr_err("fb_alloc_cmap failed %x\n", retval); 1562 1599 goto error; 1563 1600 } 1564 1601 ··· 1569 1606 1570 1607 retval = dlfb_setup_modes(dev, info, NULL, 0); 1571 1608 if (retval != 0) { 1572 - dl_err("unable to find common mode for display and adapter\n"); 1609 + pr_err("unable to find common mode for display and adapter\n"); 1573 1610 goto error; 1574 1611 } 1575 1612 ··· 1583 1620 1584 1621 retval = register_framebuffer(info); 1585 1622 if (retval < 0) { 1586 - dl_err("register_framebuffer failed %d\n", retval); 1623 + pr_err("register_framebuffer failed %d\n", retval); 1587 1624 goto error; 1588 1625 } 1589 1626 ··· 1592 1629 1593 1630 device_create_bin_file(info->dev, &edid_attr); 1594 1631 1595 - dl_info("DisplayLink USB device /dev/fb%d attached. %dx%d resolution." 1632 + pr_info("DisplayLink USB device /dev/fb%d attached. %dx%d resolution." 1596 1633 " Using %dK framebuffer memory\n", info->node, 1597 1634 info->var.xres, info->var.yres, 1598 1635 ((dev->backing_buffer) ? ··· 1636 1673 dev = usb_get_intfdata(interface); 1637 1674 info = dev->info; 1638 1675 1639 - dl_info("USB disconnect starting\n"); 1676 + pr_info("USB disconnect starting\n"); 1640 1677 1641 1678 /* we virtualize until all fb clients release. Then we free */ 1642 1679 dev->virtualized = true; ··· 1700 1737 if (!(urb->status == -ENOENT || 1701 1738 urb->status == -ECONNRESET || 1702 1739 urb->status == -ESHUTDOWN)) { 1703 - dl_err("%s - nonzero write bulk status received: %d\n", 1740 + pr_err("%s - nonzero write bulk status received: %d\n", 1704 1741 __func__, urb->status); 1705 1742 atomic_set(&dev->lost_pixels, 1); 1706 1743 } ··· 1732 1769 int ret; 1733 1770 unsigned long flags; 1734 1771 1735 - dl_notice("Waiting for completes and freeing all render urbs\n"); 1772 + pr_notice("Waiting for completes and freeing all render urbs\n"); 1736 1773 1737 1774 /* keep waiting and freeing, until we've got 'em all */ 1738 1775 while (count--) { ··· 1811 1848 dev->urbs.count = i; 1812 1849 dev->urbs.available = i; 1813 1850 1814 - dl_notice("allocated %d %d byte urbs\n", i, (int) size); 1851 + pr_notice("allocated %d %d byte urbs\n", i, (int) size); 1815 1852 1816 1853 return i; 1817 1854 } ··· 1828 1865 ret = down_timeout(&dev->urbs.limit_sem, GET_URB_TIMEOUT); 1829 1866 if (ret) { 1830 1867 atomic_set(&dev->lost_pixels, 1); 1831 - dl_warn("wait for urb interrupted: %x available: %d\n", 1868 + pr_warn("wait for urb interrupted: %x available: %d\n", 1832 1869 ret, dev->urbs.available); 1833 1870 goto error; 1834 1871 } ··· 1860 1897 if (ret) { 1861 1898 dlfb_urb_completion(urb); /* because no one else will */ 1862 1899 atomic_set(&dev->lost_pixels, 1); 1863 - dl_err("usb_submit_urb error %x\n", ret); 1900 + pr_err("usb_submit_urb error %x\n", ret); 1864 1901 } 1865 1902 return ret; 1866 1903 }
-22
drivers/staging/udlfb/udlfb.h include/video/udlfb.h
··· 65 65 #define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE) 66 66 #define WRITES_IN_FLIGHT (4) 67 67 68 - #define MIN_EDID_SIZE 128 69 - #define MAX_EDID_SIZE 128 70 - 71 68 #define MAX_VENDOR_DESCRIPTOR_SIZE 256 72 69 73 70 #define GET_URB_TIMEOUT HZ ··· 91 94 /* remove these once align.h patch is taken into kernel */ 92 95 #define DL_ALIGN_UP(x, a) ALIGN(x, a) 93 96 #define DL_ALIGN_DOWN(x, a) ALIGN(x-(a-1), a) 94 - 95 - /* remove once this gets added to sysfs.h */ 96 - #define __ATTR_RW(attr) __ATTR(attr, 0644, attr##_show, attr##_store) 97 - 98 - /* 99 - * udlfb is both a usb device, and a framebuffer device. 100 - * They may exist at the same time, but during various stages 101 - * inactivity, teardown, or "virtual" operation, only one or the 102 - * other will exist (one will outlive the other). So we can't 103 - * call the dev_*() macros, because we don't have a stable dev object. 104 - */ 105 - #define dl_err(format, arg...) \ 106 - pr_err("udlfb: " format, ## arg) 107 - #define dl_warn(format, arg...) \ 108 - pr_warning("udlfb: " format, ## arg) 109 - #define dl_notice(format, arg...) \ 110 - pr_notice("udlfb: " format, ## arg) 111 - #define dl_info(format, arg...) \ 112 - pr_info("udlfb: " format, ## arg) 113 97 114 98 #endif
drivers/staging/udlfb/udlfb.txt Documentation/fb/udlfb.txt
+14
drivers/video/Kconfig
··· 2116 2116 2117 2117 If unsure, say N. 2118 2118 2119 + config FB_UDL 2120 + tristate "Displaylink USB Framebuffer support" 2121 + depends on FB && USB 2122 + select FB_MODE_HELPERS 2123 + select FB_SYS_FILLRECT 2124 + select FB_SYS_COPYAREA 2125 + select FB_SYS_IMAGEBLIT 2126 + select FB_SYS_FOPS 2127 + select FB_DEFERRED_IO 2128 + ---help--- 2129 + This is a kernel framebuffer driver for DisplayLink USB devices. 2130 + Supports fbdev clients like xf86-video-fbdev, kdrive, fbi, and 2131 + mplayer -vo fbdev. Supports all USB 2.0 era DisplayLink devices. 2132 + To compile as a module, choose M here: the module name is udlfb. 2119 2133 2120 2134 config FB_PNX4008_DUM 2121 2135 tristate "Display Update Module support on Philips PNX4008 board"
+1
drivers/video/Makefile
··· 125 125 obj-$(CONFIG_FB_IBM_GXT4500) += gxt4500.o 126 126 obj-$(CONFIG_FB_PS3) += ps3fb.o 127 127 obj-$(CONFIG_FB_SM501) += sm501fb.o 128 + obj-$(CONFIG_FB_UDL) += udlfb.o 128 129 obj-$(CONFIG_FB_XILINX) += xilinxfb.o 129 130 obj-$(CONFIG_SH_MIPI_DSI) += sh_mipi_dsi.o 130 131 obj-$(CONFIG_FB_SH_MOBILE_HDMI) += sh_mobile_hdmi.o