Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit daa0524b authored by Markus Elfring's avatar Markus Elfring Committed by Bartlomiej Zolnierkiewicz
Browse files

video: smscufx: Less checks in ufx_usb_probe() after error detection



Up to four checks could be repeated by the ufx_usb_probe() function
during error handling even if the relevant properties can be determined
for the involved variables before by source code analysis.

* Return directly after a call of the function "kzalloc" failed
  at the beginning.

* Adjust jump targets so that extra checks can be omitted at the end.

* Delete initialisations for the variables "info" and "retval"
  which became unnecessary with this refactoring.

Signed-off-by: default avatarMarkus Elfring <elfring@users.sourceforge.net>
Cc: Steve Glendinning <steve.glendinning@shawell.net>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
parent 3c097b06
Loading
Loading
Loading
Loading
+19 −27
Original line number Diff line number Diff line
@@ -1620,8 +1620,8 @@ static int ufx_usb_probe(struct usb_interface *interface,
{
	struct usb_device *usbdev;
	struct ufx_data *dev;
	struct fb_info *info = NULL;
	int retval = -ENOMEM;
	struct fb_info *info;
	int retval;
	u32 id_rev, fpga_rev;

	/* usb initialization */
@@ -1631,7 +1631,7 @@ static int ufx_usb_probe(struct usb_interface *interface,
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (dev == NULL) {
		dev_err(&usbdev->dev, "ufx_usb_probe: failed alloc of dev struct\n");
		goto error;
		return -ENOMEM;
	}

	/* we need to wait for both usb and fbdev to spin down on disconnect */
@@ -1652,9 +1652,8 @@ static int ufx_usb_probe(struct usb_interface *interface,
	dev_dbg(dev->gdev, "fb_defio enable=%d\n", fb_defio);

	if (!ufx_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
		retval = -ENOMEM;
		dev_err(dev->gdev, "ufx_alloc_urb_list failed\n");
		goto error;
		goto e_nomem;
	}

	/* We don't register a new USB class. Our client interface is fbdev */
@@ -1662,9 +1661,8 @@ static int ufx_usb_probe(struct usb_interface *interface,
	/* allocates framebuffer driver structure, not framebuffer memory */
	info = framebuffer_alloc(0, &usbdev->dev);
	if (!info) {
		retval = -ENOMEM;
		dev_err(dev->gdev, "framebuffer_alloc failed\n");
		goto error;
		goto e_nomem;
	}

	dev->info = info;
@@ -1675,7 +1673,7 @@ static int ufx_usb_probe(struct usb_interface *interface,
	retval = fb_alloc_cmap(&info->cmap, 256, 0);
	if (retval < 0) {
		dev_err(dev->gdev, "fb_alloc_cmap failed %x\n", retval);
		goto error;
		goto destroy_modedb;
	}

	INIT_DELAYED_WORK(&dev->free_framebuffer_work,
@@ -1736,26 +1734,20 @@ static int ufx_usb_probe(struct usb_interface *interface,
	return 0;

error:
	if (dev) {
		if (info) {
			if (info->cmap.len != 0)
	fb_dealloc_cmap(&info->cmap);
			if (info->monspecs.modedb)
destroy_modedb:
	fb_destroy_modedb(info->monspecs.modedb);
	vfree(info->screen_base);

	fb_destroy_modelist(&info->modelist);

	framebuffer_release(info);
		}

put_ref:
	kref_put(&dev->kref, ufx_free); /* ref for framebuffer */
	kref_put(&dev->kref, ufx_free); /* last ref from kref_init */

		/* dev has been deallocated. Do not dereference */
	}

	return retval;

e_nomem:
	retval = -ENOMEM;
	goto put_ref;
}

static void ufx_usb_disconnect(struct usb_interface *interface)