dm: core: Mark device as active before calling uclass probe() methods
The uclass pre-probe functions may end up calling back into the device in some circumstances. This can fail if recursion takes place. Adjust the ordering so that we mark the device as active early, then retract this later if needed. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Marek Vasut <marex@denx.de>
This commit is contained in:
parent
39de843352
commit
206d4d2b4b
@ -243,6 +243,8 @@ int device_probe_child(struct udevice *dev, void *parent_priv)
|
||||
}
|
||||
dev->seq = seq;
|
||||
|
||||
dev->flags |= DM_FLAG_ACTIVATED;
|
||||
|
||||
ret = uclass_pre_probe_device(dev);
|
||||
if (ret)
|
||||
goto fail;
|
||||
@ -269,10 +271,8 @@ int device_probe_child(struct udevice *dev, void *parent_priv)
|
||||
}
|
||||
|
||||
ret = uclass_post_probe_device(dev);
|
||||
if (ret) {
|
||||
dev->flags &= ~DM_FLAG_ACTIVATED;
|
||||
if (ret)
|
||||
goto fail_uclass;
|
||||
}
|
||||
|
||||
return 0;
|
||||
fail_uclass:
|
||||
@ -281,6 +281,8 @@ fail_uclass:
|
||||
__func__, dev->name);
|
||||
}
|
||||
fail:
|
||||
dev->flags &= ~DM_FLAG_ACTIVATED;
|
||||
|
||||
dev->seq = -1;
|
||||
device_free(dev);
|
||||
|
||||
|
@ -31,6 +31,7 @@ int test_ping(struct udevice *dev, int pingval, int *pingret)
|
||||
static int test_post_bind(struct udevice *dev)
|
||||
{
|
||||
dm_testdrv_op_count[DM_TEST_OP_POST_BIND]++;
|
||||
ut_assert(!device_active(dev));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -48,7 +49,7 @@ static int test_pre_probe(struct udevice *dev)
|
||||
|
||||
dm_testdrv_op_count[DM_TEST_OP_PRE_PROBE]++;
|
||||
ut_assert(priv);
|
||||
ut_assert(!device_active(dev));
|
||||
ut_assert(device_active(dev));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user