hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/video/fbdev/smscufx.c
....@@ -1621,7 +1621,7 @@
16211621 struct usb_device *usbdev;
16221622 struct ufx_data *dev;
16231623 struct fb_info *info;
1624
- int retval;
1624
+ int retval = -ENOMEM;
16251625 u32 id_rev, fpga_rev;
16261626
16271627 /* usb initialization */
....@@ -1653,15 +1653,17 @@
16531653
16541654 if (!ufx_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
16551655 dev_err(dev->gdev, "ufx_alloc_urb_list failed\n");
1656
- goto e_nomem;
1656
+ goto put_ref;
16571657 }
16581658
16591659 /* We don't register a new USB class. Our client interface is fbdev */
16601660
16611661 /* allocates framebuffer driver structure, not framebuffer memory */
16621662 info = framebuffer_alloc(0, &usbdev->dev);
1663
- if (!info)
1664
- goto e_nomem;
1663
+ if (!info) {
1664
+ dev_err(dev->gdev, "framebuffer_alloc failed\n");
1665
+ goto free_urb_list;
1666
+ }
16651667
16661668 dev->info = info;
16671669 info->par = dev;
....@@ -1704,22 +1706,34 @@
17041706 check_warn_goto_error(retval, "unable to find common mode for display and adapter");
17051707
17061708 retval = ufx_reg_set_bits(dev, 0x4000, 0x00000001);
1707
- check_warn_goto_error(retval, "error %d enabling graphics engine", retval);
1709
+ if (retval < 0) {
1710
+ dev_err(dev->gdev, "error %d enabling graphics engine", retval);
1711
+ goto setup_modes;
1712
+ }
17081713
17091714 /* ready to begin using device */
17101715 atomic_set(&dev->usb_active, 1);
17111716
17121717 dev_dbg(dev->gdev, "checking var");
17131718 retval = ufx_ops_check_var(&info->var, info);
1714
- check_warn_goto_error(retval, "error %d ufx_ops_check_var", retval);
1719
+ if (retval < 0) {
1720
+ dev_err(dev->gdev, "error %d ufx_ops_check_var", retval);
1721
+ goto reset_active;
1722
+ }
17151723
17161724 dev_dbg(dev->gdev, "setting par");
17171725 retval = ufx_ops_set_par(info);
1718
- check_warn_goto_error(retval, "error %d ufx_ops_set_par", retval);
1726
+ if (retval < 0) {
1727
+ dev_err(dev->gdev, "error %d ufx_ops_set_par", retval);
1728
+ goto reset_active;
1729
+ }
17191730
17201731 dev_dbg(dev->gdev, "registering framebuffer");
17211732 retval = register_framebuffer(info);
1722
- check_warn_goto_error(retval, "error %d register_framebuffer", retval);
1733
+ if (retval < 0) {
1734
+ dev_err(dev->gdev, "error %d register_framebuffer", retval);
1735
+ goto reset_active;
1736
+ }
17231737
17241738 dev_info(dev->gdev, "SMSC UDX USB device /dev/fb%d attached. %dx%d resolution."
17251739 " Using %dK framebuffer memory\n", info->node,
....@@ -1727,21 +1741,23 @@
17271741
17281742 return 0;
17291743
1730
-error:
1731
- fb_dealloc_cmap(&info->cmap);
1732
-destroy_modedb:
1744
+reset_active:
1745
+ atomic_set(&dev->usb_active, 0);
1746
+setup_modes:
17331747 fb_destroy_modedb(info->monspecs.modedb);
17341748 vfree(info->screen_base);
17351749 fb_destroy_modelist(&info->modelist);
1750
+error:
1751
+ fb_dealloc_cmap(&info->cmap);
1752
+destroy_modedb:
17361753 framebuffer_release(info);
1754
+free_urb_list:
1755
+ if (dev->urbs.count > 0)
1756
+ ufx_free_urb_list(dev);
17371757 put_ref:
17381758 kref_put(&dev->kref, ufx_free); /* ref for framebuffer */
17391759 kref_put(&dev->kref, ufx_free); /* last ref from kref_init */
17401760 return retval;
1741
-
1742
-e_nomem:
1743
- retval = -ENOMEM;
1744
- goto put_ref;
17451761 }
17461762
17471763 static void ufx_usb_disconnect(struct usb_interface *interface)