dm: blk: Allow finding block devices without probing
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>
This commit is contained in:
parent
e7017a3c7d
commit
6139281a64
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user