72
72
static bool console = 1; /* Allow fbcon to open framebuffer */
73
73
static bool fb_defio = 1; /* Detect mmap writes using page faults */
74
74
static bool shadow = 1; /* Optionally disable shadow framebuffer */
75
static int pixel_limit; /* Optionally force a pixel resolution limit */
76
77
/* dlfb keeps a list of urbs for efficient bulk transfers */
77
78
static void dlfb_urb_completion(struct urb *urb);
940
937
up(&unode->dev->urbs.limit_sem);
940
static void dlfb_free_framebuffer(struct dlfb_data *dev)
942
struct fb_info *info = dev->info;
945
int node = info->node;
947
unregister_framebuffer(info);
949
if (info->cmap.len != 0)
950
fb_dealloc_cmap(&info->cmap);
951
if (info->monspecs.modedb)
952
fb_destroy_modedb(info->monspecs.modedb);
953
if (info->screen_base)
954
vfree(info->screen_base);
956
fb_destroy_modelist(&info->modelist);
960
/* Assume info structure is freed after this point */
961
framebuffer_release(info);
963
pr_warn("fb_info for /dev/fb%d has been freed\n", node);
966
/* ref taken in probe() as part of registering framebfufer */
967
kref_put(&dev->kref, dlfb_free);
943
970
static void dlfb_free_framebuffer_work(struct work_struct *work)
945
972
struct dlfb_data *dev = container_of(work, struct dlfb_data,
946
973
free_framebuffer_work.work);
947
struct fb_info *info = dev->info;
948
int node = info->node;
950
unregister_framebuffer(info);
952
if (info->cmap.len != 0)
953
fb_dealloc_cmap(&info->cmap);
954
if (info->monspecs.modedb)
955
fb_destroy_modedb(info->monspecs.modedb);
956
if (info->screen_base)
957
vfree(info->screen_base);
959
fb_destroy_modelist(&info->modelist);
963
/* Assume info structure is freed after this point */
964
framebuffer_release(info);
966
pr_warn("fb_info for /dev/fb%d has been freed\n", node);
968
/* ref taken in probe() as part of registering framebfufer */
969
kref_put(&dev->kref, dlfb_free);
974
dlfb_free_framebuffer(dev);
973
977
* Assumes caller is holding info->lock mutex (for open and release at least)
1015
pr_info("%dx%d valid mode\n", mode->xres, mode->yres);
1019
pr_info("%dx%d @ %d Hz valid mode\n", mode->xres, mode->yres,
1427
1432
struct device *fbdev = container_of(kobj, struct device, kobj);
1428
1433
struct fb_info *fb_info = dev_get_drvdata(fbdev);
1429
1434
struct dlfb_data *dev = fb_info->par;
1431
1437
/* We only support write of entire EDID at once, no offset*/
1432
1438
if ((src_size != EDID_LENGTH) || (src_off != 0))
1435
dlfb_setup_modes(dev, fb_info, src, src_size);
1437
if (dev->edid && (memcmp(src, dev->edid, src_size) == 0)) {
1438
pr_info("sysfs written EDID is new default\n");
1439
dlfb_ops_set_par(fb_info);
1441
ret = dlfb_setup_modes(dev, fb_info, src, src_size);
1445
if (!dev->edid || memcmp(src, dev->edid, src_size))
1448
pr_info("sysfs written EDID is new default\n");
1449
dlfb_ops_set_par(fb_info);
1445
1453
static ssize_t metrics_reset_store(struct device *fbdev,
1582
static void dlfb_init_framebuffer_work(struct work_struct *work);
1573
1584
static int dlfb_usb_probe(struct usb_interface *interface,
1574
1585
const struct usb_device_id *id)
1576
1587
struct usb_device *usbdev;
1577
1588
struct dlfb_data *dev = 0;
1578
struct fb_info *info = 0;
1579
1589
int retval = -ENOMEM;
1582
1591
/* usb initialization */
1592
/* we need to wait for both usb and fbdev to spin down on disconnect */
1593
1601
kref_init(&dev->kref); /* matching kref_put in usb .disconnect fn */
1594
kref_get(&dev->kref); /* matching kref_put in free_framebuffer_work */
1596
1603
dev->udev = usbdev;
1597
1604
dev->gdev = &usbdev->dev; /* our generic struct device * */
1624
pr_warn("DL chip limit of %d overriden"
1625
" by module param to %d\n",
1626
dev->sku_pixel_limit, pixel_limit);
1627
dev->sku_pixel_limit = pixel_limit;
1616
1631
if (!dlfb_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
1617
1632
retval = -ENOMEM;
1618
1633
pr_err("dlfb_alloc_urb_list failed\n");
1637
kref_get(&dev->kref); /* matching kref_put in free_framebuffer_work */
1622
1639
/* We don't register a new USB class. Our client interface is fbdev */
1641
/* Workitem keep things fast & simple during USB enumeration */
1642
INIT_DELAYED_WORK(&dev->init_framebuffer_work,
1643
dlfb_init_framebuffer_work);
1644
schedule_delayed_work(&dev->init_framebuffer_work, 0);
1651
kref_put(&dev->kref, dlfb_free); /* ref for framebuffer */
1652
kref_put(&dev->kref, dlfb_free); /* last ref from kref_init */
1654
/* dev has been deallocated. Do not dereference */
1660
static void dlfb_init_framebuffer_work(struct work_struct *work)
1662
struct dlfb_data *dev = container_of(work, struct dlfb_data,
1663
init_framebuffer_work.work);
1664
struct fb_info *info;
1624
1668
/* allocates framebuffer driver structure, not framebuffer memory */
1625
info = framebuffer_alloc(0, &interface->dev);
1669
info = framebuffer_alloc(0, dev->gdev);
1627
1671
retval = -ENOMEM;
1628
1672
pr_err("framebuffer_alloc failed\n");
1668
1712
for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) {
1669
1713
retval = device_create_file(info->dev, &fb_device_attrs[i]);
1671
pr_err("device_create_file failed %d\n", retval);
1715
pr_warn("device_create_file failed %d\n", retval);
1676
1719
retval = device_create_bin_file(info->dev, &edid_attr);
1678
pr_err("device_create_bin_file failed %d\n", retval);
1721
pr_warn("device_create_bin_file failed %d\n", retval);
1682
1724
pr_info("DisplayLink USB device /dev/fb%d attached. %dx%d resolution."
1684
1726
info->var.xres, info->var.yres,
1685
1727
((dev->backing_buffer) ?
1686
1728
info->fix.smem_len * 2 : info->fix.smem_len) >> 10);
1690
for (i -= 1; i >= 0; i--)
1691
device_remove_file(info->dev, &fb_device_attrs[i]);
1697
if (info->cmap.len != 0)
1698
fb_dealloc_cmap(&info->cmap);
1699
if (info->monspecs.modedb)
1700
fb_destroy_modedb(info->monspecs.modedb);
1701
if (info->screen_base)
1702
vfree(info->screen_base);
1704
fb_destroy_modelist(&info->modelist);
1706
framebuffer_release(info);
1709
if (dev->backing_buffer)
1710
vfree(dev->backing_buffer);
1712
kref_put(&dev->kref, dlfb_free); /* ref for framebuffer */
1713
kref_put(&dev->kref, dlfb_free); /* last ref from kref_init */
1715
/* dev has been deallocated. Do not dereference */
1732
dlfb_free_framebuffer(dev);
1721
1735
static void dlfb_usb_disconnect(struct usb_interface *interface)
1735
1749
/* When non-active we'll update virtual framebuffer, but no new urbs */
1736
1750
atomic_set(&dev->usb_active, 0);
1738
/* remove udlfb's sysfs interfaces */
1739
for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++)
1740
device_remove_file(info->dev, &fb_device_attrs[i]);
1741
device_remove_bin_file(info->dev, &edid_attr);
1742
unlink_framebuffer(info);
1752
/* this function will wait for all in-flight urbs to complete */
1753
dlfb_free_urb_list(dev);
1756
/* remove udlfb's sysfs interfaces */
1757
for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++)
1758
device_remove_file(info->dev, &fb_device_attrs[i]);
1759
device_remove_bin_file(info->dev, &edid_attr);
1760
unlink_framebuffer(info);
1743
1763
usb_set_intfdata(interface, NULL);
1745
1767
/* if clients still have us open, will be freed on last close */
1746
1768
if (dev->fb_count == 0)
1807
1829
unsigned long flags;
1809
pr_notice("Waiting for completes and freeing all render urbs\n");
1831
pr_notice("Freeing all render urbs\n");
1811
1833
/* keep waiting and freeing, until we've got 'em all */
1812
1834
while (count--) {
1814
/* Getting interrupted means a leak, but ok at shutdown*/
1836
/* Getting interrupted means a leak, but ok at disconnect */
1815
1837
ret = down_interruptible(&dev->urbs.limit_sem);
1948
1971
module_param(shadow, bool, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1949
1972
MODULE_PARM_DESC(shadow, "Shadow vid mem. Disable to save mem but lose perf");
1974
module_param(pixel_limit, int, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
1975
MODULE_PARM_DESC(pixel_limit, "Force limit on max mode (in x*y pixels)");
1951
1977
MODULE_AUTHOR("Roberto De Ioris <roberto@unbit.it>, "
1952
1978
"Jaya Kumar <jayakumar.lkml@gmail.com>, "
1953
1979
"Bernie Thompson <bernie@plugable.com>");