]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
dm: blk: Allow finding block devices without probing
authorSimon Glass <sjg@chromium.org>
Mon, 24 Apr 2017 02:02:05 +0000 (20:02 -0600)
committerSimon Glass <sjg@chromium.org>
Thu, 1 Jun 2017 13:03:04 +0000 (07:03 -0600)
Sometimes it is useful to be able to find a block device without also
probing it. Add a function for this as well as the associated test.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/block/blk-uclass.c
include/blk.h
test/dm/blk.c

index af3c35f6d0b5de9d1c8990c4bed9a326d4a241fc..8b6b28d8901eb8554407dc626cb1ca816b514836 100644 (file)
@@ -363,7 +363,7 @@ int blk_next_device(struct udevice **devp)
        } while (1);
 }
 
-int blk_get_device(int if_type, int devnum, struct udevice **devp)
+int blk_find_device(int if_type, int devnum, struct udevice **devp)
 {
        struct uclass *uc;
        struct udevice *dev;
@@ -379,13 +379,24 @@ int blk_get_device(int if_type, int devnum, struct udevice **devp)
                      if_type, devnum, dev->name, desc->if_type, desc->devnum);
                if (desc->if_type == if_type && desc->devnum == devnum) {
                        *devp = dev;
-                       return device_probe(dev);
+                       return 0;
                }
        }
 
        return -ENODEV;
 }
 
+int blk_get_device(int if_type, int devnum, struct udevice **devp)
+{
+       int ret;
+
+       ret = blk_find_device(if_type, devnum, devp);
+       if (ret)
+               return ret;
+
+       return device_probe(*devp);
+}
+
 unsigned long blk_dread(struct blk_desc *block_dev, lbaint_t start,
                        lbaint_t blkcnt, void *buffer)
 {
index 66a1c55cc8b69c256e9caf214642bbc60c439406..a128ee484145f306e1e994249626ef80ac915367 100644 (file)
@@ -252,13 +252,26 @@ unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
 unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
                         lbaint_t blkcnt);
 
+/**
+ * blk_find_device() - Find a block device
+ *
+ * This function does not activate the device. The device will be returned
+ * whether or not it is activated.
+ *
+ * @if_type:   Interface type (enum if_type_t)
+ * @devnum:    Device number (specific to each interface type)
+ * @devp:      the device, if found
+ * @return 0 if found, -ENODEV if no device found, or other -ve error value
+ */
+int blk_find_device(int if_type, int devnum, struct udevice **devp);
+
 /**
  * blk_get_device() - Find and probe a block device ready for use
  *
  * @if_type:   Interface type (enum if_type_t)
  * @devnum:    Device number (specific to each interface type)
  * @devp:      the device, if found
- * @return - if found, -ENODEV if no device found, or other -ve error value
+ * @return 0 if found, -ENODEV if no device found, or other -ve error value
  */
 int blk_get_device(int if_type, int devnum, struct udevice **devp);
 
index 012bf4cab56ef43fbfa605c7bac9a32eebd4baa1..3e34336fae1d2db895fda0ccd4e5b96204b55c44 100644 (file)
@@ -94,3 +94,24 @@ static int dm_test_blk_usb(struct unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_blk_usb, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test that we can find block devices without probing them */
+static int dm_test_blk_find(struct unit_test_state *uts)
+{
+       struct udevice *blk, *dev;
+
+       ut_assertok(blk_create_device(gd->dm_root, "sandbox_host_blk", "test",
+                                     IF_TYPE_HOST, 1, 512, 1024, &blk));
+       ut_asserteq(-ENODEV, blk_find_device(IF_TYPE_HOST, 0, &dev));
+       ut_assertok(blk_find_device(IF_TYPE_HOST, 1, &dev));
+       ut_asserteq_ptr(blk, dev);
+       ut_asserteq(false, device_active(dev));
+
+       /* Now activate it */
+       ut_assertok(blk_get_device(IF_TYPE_HOST, 1, &dev));
+       ut_asserteq_ptr(blk, dev);
+       ut_asserteq(true, device_active(dev));
+
+       return 0;
+}
+DM_TEST(dm_test_blk_find, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);