提交 206d4d2b 编写于 作者: S Simon Glass

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: NSimon Glass <sjg@chromium.org>
Reviewed-by: NMarek Vasut <marex@denx.de>
上级 39de8433
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册