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

Merge tag 'fbdev-for-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev

Pull fbdev updates from Helge Deller:
"Here's a fix for the smscufx USB graphics card to prevent a kernel
crash if it's plugged in/out too fast.

The other patches are mostly small cleanups, fixes in failure paths
and code removal:

- fix an use-after-free in smscufx USB graphics driver

- add missing pci_disable_device() in tridentfb failure paths

- correctly handle irq detection failure in mb862xx driver

- fix resume code in omapfb/dss

- drop unused code in controlfb, tridentfb, arkfb, imxfb and udlfb

- convert uvesafb to use scnprintf() instead of snprintf()

- convert gbefb to use dev_groups

- add MODULE_DEVICE_TABLE() entry to vga16fb"

* tag 'fbdev-for-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev:
fbdev: mb862xx: Fix check of return value from irq_of_parse_and_map()
fbdev: vga16fb: Add missing MODULE_DEVICE_TABLE() entry
fbdev: tridentfb: Fix missing pci_disable_device() in probe and remove
fbdev: smscufx: Fix use-after-free in ufx_ops_open()
fbdev: gbefb: Convert to use dev_groups
fbdev: imxfb: Remove redundant dev_err() call
fbdev: omapfb/dss: Use pm_runtime_resume_and_get() instead of pm_runtime_get_sync()
fbdev: uvesafb: Convert snprintf to scnprintf
fbdev: arkfb: Remove the unused function dac_read_reg()
fbdev: tridentfb: Remove the unused function shadowmode_off()
fbdev: controlfb: Remove the unused function VAR_MATCH()
fbdev: udlfb: Remove redundant initialization to variable identical

+41 -71
-8
drivers/video/fbdev/arkfb.c
··· 318 318 void *data; 319 319 }; 320 320 321 - 322 - static inline u8 dac_read_reg(struct dac_info *info, u8 reg) 323 - { 324 - u8 code[2] = {reg, 0}; 325 - info->dac_read_regs(info->data, code, 1); 326 - return code[1]; 327 - } 328 - 329 321 static inline void dac_read_regs(struct dac_info *info, u8 *code, int count) 330 322 { 331 323 info->dac_read_regs(info->data, code, count);
-7
drivers/video/fbdev/controlfb.c
··· 108 108 return (!DIRTY(cmode) && !DIRTY(xres) && !DIRTY(yres) 109 109 && !DIRTY(vxres) && !DIRTY(vyres)); 110 110 } 111 - static inline int VAR_MATCH(struct fb_var_screeninfo *x, struct fb_var_screeninfo *y) 112 - { 113 - return (!DIRTY(bits_per_pixel) && !DIRTY(xres) 114 - && !DIRTY(yres) && !DIRTY(xres_virtual) 115 - && !DIRTY(yres_virtual) 116 - && !DIRTY_CMAP(red) && !DIRTY_CMAP(green) && !DIRTY_CMAP(blue)); 117 - } 118 111 119 112 struct fb_info_control { 120 113 struct fb_info info;
+7 -13
drivers/video/fbdev/gbefb.c
··· 1072 1072 1073 1073 static DEVICE_ATTR(revision, S_IRUGO, gbefb_show_rev, NULL); 1074 1074 1075 - static void gbefb_remove_sysfs(struct device *dev) 1076 - { 1077 - device_remove_file(dev, &dev_attr_size); 1078 - device_remove_file(dev, &dev_attr_revision); 1079 - } 1080 - 1081 - static void gbefb_create_sysfs(struct device *dev) 1082 - { 1083 - device_create_file(dev, &dev_attr_size); 1084 - device_create_file(dev, &dev_attr_revision); 1085 - } 1075 + static struct attribute *gbefb_attrs[] = { 1076 + &dev_attr_size.attr, 1077 + &dev_attr_revision.attr, 1078 + NULL, 1079 + }; 1080 + ATTRIBUTE_GROUPS(gbefb); 1086 1081 1087 1082 /* 1088 1083 * Initialization ··· 1216 1221 } 1217 1222 1218 1223 platform_set_drvdata(p_dev, info); 1219 - gbefb_create_sysfs(&p_dev->dev); 1220 1224 1221 1225 fb_info(info, "%s rev %d @ 0x%08x using %dkB memory\n", 1222 1226 info->fix.id, gbe_revision, (unsigned)GBE_BASE, ··· 1242 1248 gbe_turn_off(); 1243 1249 arch_phys_wc_del(par->wc_cookie); 1244 1250 release_mem_region(GBE_BASE, sizeof(struct sgi_gbe)); 1245 - gbefb_remove_sysfs(&p_dev->dev); 1246 1251 framebuffer_release(info); 1247 1252 1248 1253 return 0; ··· 1252 1259 .remove = gbefb_remove, 1253 1260 .driver = { 1254 1261 .name = "gbefb", 1262 + .dev_groups = gbefb_groups, 1255 1263 }, 1256 1264 }; 1257 1265
-1
drivers/video/fbdev/imxfb.c
··· 972 972 973 973 fbi->regs = devm_ioremap_resource(&pdev->dev, res); 974 974 if (IS_ERR(fbi->regs)) { 975 - dev_err(&pdev->dev, "Cannot map frame buffer registers\n"); 976 975 ret = PTR_ERR(fbi->regs); 977 976 goto failed_ioremap; 978 977 }
+1 -1
drivers/video/fbdev/mb862xx/mb862xxfbdrv.c
··· 693 693 par->dev = dev; 694 694 695 695 par->irq = irq_of_parse_and_map(np, 0); 696 - if (par->irq == NO_IRQ) { 696 + if (!par->irq) { 697 697 dev_err(dev, "failed to map irq\n"); 698 698 ret = -ENODEV; 699 699 goto fbrel;
+2 -4
drivers/video/fbdev/omap2/omapfb/dss/dispc.c
··· 519 519 520 520 DSSDBG("dispc_runtime_get\n"); 521 521 522 - r = pm_runtime_get_sync(&dispc.pdev->dev); 523 - if (WARN_ON(r < 0)) { 524 - pm_runtime_put_sync(&dispc.pdev->dev); 522 + r = pm_runtime_resume_and_get(&dispc.pdev->dev); 523 + if (WARN_ON(r < 0)) 525 524 return r; 526 - } 527 525 return 0; 528 526 } 529 527 EXPORT_SYMBOL(dispc_runtime_get);
+2 -4
drivers/video/fbdev/omap2/omapfb/dss/dsi.c
··· 1136 1136 1137 1137 DSSDBG("dsi_runtime_get\n"); 1138 1138 1139 - r = pm_runtime_get_sync(&dsi->pdev->dev); 1140 - if (WARN_ON(r < 0)) { 1141 - pm_runtime_put_sync(&dsi->pdev->dev); 1139 + r = pm_runtime_resume_and_get(&dsi->pdev->dev); 1140 + if (WARN_ON(r < 0)) 1142 1141 return r; 1143 - } 1144 1142 return 0; 1145 1143 } 1146 1144
+2 -4
drivers/video/fbdev/omap2/omapfb/dss/dss.c
··· 767 767 768 768 DSSDBG("dss_runtime_get\n"); 769 769 770 - r = pm_runtime_get_sync(&dss.pdev->dev); 771 - if (WARN_ON(r < 0)) { 772 - pm_runtime_put_sync(&dss.pdev->dev); 770 + r = pm_runtime_resume_and_get(&dss.pdev->dev); 771 + if (WARN_ON(r < 0)) 773 772 return r; 774 - } 775 773 return 0; 776 774 } 777 775
+2 -4
drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c
··· 38 38 39 39 DSSDBG("hdmi_runtime_get\n"); 40 40 41 - r = pm_runtime_get_sync(&hdmi.pdev->dev); 42 - if (WARN_ON(r < 0)) { 43 - pm_runtime_put_sync(&hdmi.pdev->dev); 41 + r = pm_runtime_resume_and_get(&hdmi.pdev->dev); 42 + if (WARN_ON(r < 0)) 44 43 return r; 45 - } 46 44 47 45 return 0; 48 46 }
+2 -4
drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c
··· 42 42 43 43 DSSDBG("hdmi_runtime_get\n"); 44 44 45 - r = pm_runtime_get_sync(&hdmi.pdev->dev); 46 - if (WARN_ON(r < 0)) { 47 - pm_runtime_put_sync(&hdmi.pdev->dev); 45 + r = pm_runtime_resume_and_get(&hdmi.pdev->dev); 46 + if (WARN_ON(r < 0)) 48 47 return r; 49 - } 50 48 51 49 return 0; 52 50 }
+2 -4
drivers/video/fbdev/omap2/omapfb/dss/venc.c
··· 347 347 348 348 DSSDBG("venc_runtime_get\n"); 349 349 350 - r = pm_runtime_get_sync(&venc.pdev->dev); 351 - if (WARN_ON(r < 0)) { 352 - pm_runtime_put_sync(&venc.pdev->dev); 350 + r = pm_runtime_resume_and_get(&venc.pdev->dev); 351 + if (WARN_ON(r < 0)) 353 352 return r; 354 - } 355 353 return 0; 356 354 } 357 355
+13 -1
drivers/video/fbdev/smscufx.c
··· 137 137 static int ufx_alloc_urb_list(struct ufx_data *dev, int count, size_t size); 138 138 static void ufx_free_urb_list(struct ufx_data *dev); 139 139 140 + static DEFINE_MUTEX(disconnect_mutex); 141 + 140 142 /* reads a control register */ 141 143 static int ufx_reg_read(struct ufx_data *dev, u32 index, u32 *data) 142 144 { ··· 1073 1071 if (user == 0 && !console) 1074 1072 return -EBUSY; 1075 1073 1074 + mutex_lock(&disconnect_mutex); 1075 + 1076 1076 /* If the USB device is gone, we don't accept new opens */ 1077 - if (dev->virtualized) 1077 + if (dev->virtualized) { 1078 + mutex_unlock(&disconnect_mutex); 1078 1079 return -ENODEV; 1080 + } 1079 1081 1080 1082 dev->fb_count++; 1081 1083 ··· 1102 1096 1103 1097 pr_debug("open /dev/fb%d user=%d fb_info=%p count=%d", 1104 1098 info->node, user, info, dev->fb_count); 1099 + 1100 + mutex_unlock(&disconnect_mutex); 1105 1101 1106 1102 return 0; 1107 1103 } ··· 1749 1741 { 1750 1742 struct ufx_data *dev; 1751 1743 1744 + mutex_lock(&disconnect_mutex); 1745 + 1752 1746 dev = usb_get_intfdata(interface); 1753 1747 1754 1748 pr_debug("USB disconnect starting\n"); ··· 1771 1761 kref_put(&dev->kref, ufx_free); 1772 1762 1773 1763 /* consider ufx_data freed */ 1764 + 1765 + mutex_unlock(&disconnect_mutex); 1774 1766 } 1775 1767 1776 1768 static struct usb_driver ufx_driver = {
+1 -10
drivers/video/fbdev/tridentfb.c
··· 1128 1128 write3CE(par, CyberControl, read3CE(par, CyberControl) | 0x81); 1129 1129 } 1130 1130 1131 - static inline void shadowmode_off(struct tridentfb_par *par) 1132 - { 1133 - write3CE(par, CyberControl, read3CE(par, CyberControl) & 0x7E); 1134 - } 1135 - 1136 1131 /* Set the hardware to the requested video mode */ 1137 1132 static int tridentfb_set_par(struct fb_info *info) 1138 1133 { ··· 1470 1475 if (err) 1471 1476 return err; 1472 1477 1473 - err = pci_enable_device(dev); 1478 + err = pcim_enable_device(dev); 1474 1479 if (err) 1475 1480 return err; 1476 1481 ··· 1710 1715 kfree(info->pixmap.addr); 1711 1716 if (info->screen_base) 1712 1717 iounmap(info->screen_base); 1713 - release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); 1714 1718 disable_mmio(info->par); 1715 1719 out_unmap1: 1716 1720 if (default_par->io_virt) 1717 1721 iounmap(default_par->io_virt); 1718 - release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); 1719 1722 framebuffer_release(info); 1720 1723 return err; 1721 1724 } ··· 1728 1735 i2c_del_adapter(&par->ddc_adapter); 1729 1736 iounmap(par->io_virt); 1730 1737 iounmap(info->screen_base); 1731 - release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); 1732 - release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); 1733 1738 kfree(info->pixmap.addr); 1734 1739 fb_dealloc_cmap(&info->cmap); 1735 1740 framebuffer_release(info);
+1 -1
drivers/video/fbdev/udlfb.c
··· 370 370 const unsigned long *back = (const unsigned long *) bback; 371 371 const unsigned long *front = (const unsigned long *) *bfront; 372 372 const int width = *width_bytes / sizeof(unsigned long); 373 - int identical = width; 373 + int identical; 374 374 int start = width; 375 375 int end = width; 376 376
+5 -5
drivers/video/fbdev/uvesafb.c
··· 1580 1580 struct uvesafb_par *par = info->par; 1581 1581 1582 1582 if (par->vbe_ib.oem_vendor_name_ptr) 1583 - return snprintf(buf, PAGE_SIZE, "%s\n", (char *) 1583 + return scnprintf(buf, PAGE_SIZE, "%s\n", (char *) 1584 1584 (&par->vbe_ib) + par->vbe_ib.oem_vendor_name_ptr); 1585 1585 else 1586 1586 return 0; ··· 1595 1595 struct uvesafb_par *par = info->par; 1596 1596 1597 1597 if (par->vbe_ib.oem_product_name_ptr) 1598 - return snprintf(buf, PAGE_SIZE, "%s\n", (char *) 1598 + return scnprintf(buf, PAGE_SIZE, "%s\n", (char *) 1599 1599 (&par->vbe_ib) + par->vbe_ib.oem_product_name_ptr); 1600 1600 else 1601 1601 return 0; ··· 1610 1610 struct uvesafb_par *par = info->par; 1611 1611 1612 1612 if (par->vbe_ib.oem_product_rev_ptr) 1613 - return snprintf(buf, PAGE_SIZE, "%s\n", (char *) 1613 + return scnprintf(buf, PAGE_SIZE, "%s\n", (char *) 1614 1614 (&par->vbe_ib) + par->vbe_ib.oem_product_rev_ptr); 1615 1615 else 1616 1616 return 0; ··· 1625 1625 struct uvesafb_par *par = info->par; 1626 1626 1627 1627 if (par->vbe_ib.oem_string_ptr) 1628 - return snprintf(buf, PAGE_SIZE, "%s\n", 1628 + return scnprintf(buf, PAGE_SIZE, "%s\n", 1629 1629 (char *)(&par->vbe_ib) + par->vbe_ib.oem_string_ptr); 1630 1630 else 1631 1631 return 0; ··· 1639 1639 struct fb_info *info = dev_get_drvdata(dev); 1640 1640 struct uvesafb_par *par = info->par; 1641 1641 1642 - return snprintf(buf, PAGE_SIZE, "%d\n", par->nocrtc); 1642 + return scnprintf(buf, PAGE_SIZE, "%d\n", par->nocrtc); 1643 1643 } 1644 1644 1645 1645 static ssize_t uvesafb_store_nocrtc(struct device *dev,
+1
drivers/video/fbdev/vga16fb.c
··· 1421 1421 {"vga-framebuffer", 0}, 1422 1422 { } 1423 1423 }; 1424 + MODULE_DEVICE_TABLE(platform, vga16fb_driver_id_table); 1424 1425 1425 1426 static struct platform_driver vga16fb_driver = { 1426 1427 .probe = vga16fb_probe,