diff options
author | David Kershner <david.kershner@unisys.com> | 2016-03-12 21:27:08 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-03-28 07:30:36 -0700 |
commit | 4000622ec21ba5e93fdb74bc4168a9545a089ce7 (patch) | |
tree | 63c107427246e91c5e40ff252135dda86fca1c47 /drivers/staging/unisys | |
parent | c6af7a9cbcfa65b9322436836ad7cc323d2d5d6d (diff) | |
download | blackbird-op-linux-4000622ec21ba5e93fdb74bc4168a9545a089ce7.tar.gz blackbird-op-linux-4000622ec21ba5e93fdb74bc4168a9545a089ce7.zip |
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: David Kershner <david.kershner@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/unisys')
-rw-r--r-- | drivers/staging/unisys/visorbus/visorbus_main.c | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c index 533bb5b3d284..6a12829151e0 100644 --- a/drivers/staging/unisys/visorbus/visorbus_main.c +++ b/drivers/staging/unisys/visorbus/visorbus_main.c @@ -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(); - get_device(&dev->device); - if (!drv->probe) { - up(&dev->visordriver_callback_lock); - rc = -ENODEV; - goto away; + + res = drv->probe(dev); + if (res >= 0) { + /* success: reference kept via unmatched get_device() */ + get_device(&dev->device); + 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 |