slimbus: core: update device status in probe
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Sun, 16 Sep 2018 23:45:41 +0000 (16:45 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Sep 2018 18:21:02 +0000 (20:21 +0200)
device status update can be racy with probe in some cases, so make sure
it take lock during the probe. Also after probe the device is expected
to be ready for communications, so make sure that a logical address
can be assigned to it after probe. If it fails to do so then probe
defer such instances.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/slimbus/core.c

index 7cd635eb44ed272a2e1f422ee4d20f92d5a4506e..1888fafc0e73b0bfd0a827dacf04e0ea4108f14d 100644 (file)
@@ -43,8 +43,23 @@ static int slim_device_probe(struct device *dev)
 {
        struct slim_device      *sbdev = to_slim_device(dev);
        struct slim_driver      *sbdrv = to_slim_driver(dev->driver);
+       int ret;
+
+       ret = sbdrv->probe(sbdev);
+       if (ret)
+               return ret;
+
+       /* try getting the logical address after probe */
+       ret = slim_get_logical_addr(sbdev);
+       if (!ret) {
+               if (sbdrv->device_status)
+                       sbdrv->device_status(sbdev, sbdev->status);
+       } else {
+               dev_err(&sbdev->dev, "Failed to get logical address\n");
+               ret = -EPROBE_DEFER;
+       }
 
-       return sbdrv->probe(sbdev);
+       return ret;
 }
 
 static int slim_device_remove(struct device *dev)