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

Commit 4000622e authored by David Kershner's avatar David Kershner Committed by Greg Kroah-Hartman
Browse files

staging: unisys: visorbus: Fix up visordriver_probe



Fixup the visordriver_probe function. Rearrange the function to avoid
needing gotos and removed unnecessary wmb().

Signed-off-by: default avatarDavid Kershner <david.kershner@unisys.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c6af7a9c
Loading
Loading
Loading
Loading
+12 −20
Original line number Diff line number Diff line
@@ -752,36 +752,28 @@ dev_stop_periodic_work(struct visor_device *dev)
static int
visordriver_probe_device(struct device *xdev)
{
	int rc;
	int res;
	struct visor_driver *drv;
	struct visor_device *dev;

	drv = to_visor_driver(xdev->driver);
	dev = to_visor_device(xdev);

	if (!drv->probe)
		return -ENODEV;

	down(&dev->visordriver_callback_lock);
	dev->being_removed = false;
	/*
	 * ensure that the dev->being_removed flag is cleared before
	 * we start the probe
	 */
	wmb();

	res = drv->probe(dev);
	if (res >= 0) {
		/* success: reference kept via unmatched get_device() */
		get_device(&dev->device);
	if (!drv->probe) {
		up(&dev->visordriver_callback_lock);
		rc = -ENODEV;
		goto away;
		fix_vbus_dev_info(dev);
	}
	rc = drv->probe(dev);
	if (rc < 0)
		goto away;

	fix_vbus_dev_info(dev);
	up(&dev->visordriver_callback_lock);
	rc = 0;
away:
	if (rc != 0)
		put_device(&dev->device);
	return rc;
	return res;
}

/** This is called when device_unregister() is called for each child device