summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/dm/bus.c8
-rw-r--r--test/dm/core.c82
-rw-r--r--test/dm/eth.c2
-rw-r--r--test/dm/spi.c2
-rw-r--r--test/dm/test-driver.c11
5 files changed, 91 insertions, 14 deletions
diff --git a/test/dm/bus.c b/test/dm/bus.c
index d94dcf7..6a27735 100644
--- a/test/dm/bus.c
+++ b/test/dm/bus.c
@@ -222,7 +222,7 @@ static int test_bus_parent_data(struct unit_test_state *uts)
/* Check that it starts at 0 and goes away when device is removed */
parent_data->sum += 5;
ut_asserteq(5, parent_data->sum);
- device_remove(dev);
+ device_remove(dev, DM_REMOVE_NORMAL);
ut_asserteq_ptr(NULL, dev_get_parent_priv(dev));
/* Check that we can do this twice */
@@ -323,7 +323,7 @@ static int dm_test_bus_parent_ops(struct unit_test_state *uts)
continue;
parent_data = dev_get_parent_priv(dev);
ut_asserteq(FLAG_CHILD_PROBED, parent_data->flag);
- ut_assertok(device_remove(dev));
+ ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
ut_asserteq_ptr(NULL, dev_get_parent_priv(dev));
ut_asserteq_ptr(dms->removed, dev);
}
@@ -360,7 +360,7 @@ static int test_bus_parent_platdata(struct unit_test_state *uts)
plat->count++;
ut_asserteq(1, plat->count);
device_probe(dev);
- device_remove(dev);
+ device_remove(dev, DM_REMOVE_NORMAL);
ut_asserteq_ptr(plat, dev_get_parent_platdata(dev));
ut_asserteq(1, plat->count);
@@ -370,7 +370,7 @@ static int test_bus_parent_platdata(struct unit_test_state *uts)
ut_asserteq(3, child_count);
/* Removing the bus should also have no effect (it is still bound) */
- device_remove(bus);
+ device_remove(bus, DM_REMOVE_NORMAL);
for (device_find_first_child(bus, &dev), child_count = 0;
dev;
device_find_next_child(&dev)) {
diff --git a/test/dm/core.c b/test/dm/core.c
index 70bf4d0..50ee41b 100644
--- a/test/dm/core.c
+++ b/test/dm/core.c
@@ -67,6 +67,10 @@ static struct driver_info driver_info_pre_reloc = {
.platdata = &test_pdata_pre_reloc,
};
+static struct driver_info driver_info_act_dma = {
+ .name = "test_act_dma_drv",
+};
+
void dm_leak_check_start(struct unit_test_state *uts)
{
uts->start = mallinfo();
@@ -319,7 +323,7 @@ static int dm_test_lifecycle(struct unit_test_state *uts)
/* Now remove device 3 */
ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_PRE_REMOVE]);
- ut_assertok(device_remove(dev));
+ ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_PRE_REMOVE]);
ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_UNBIND]);
@@ -352,7 +356,7 @@ static int dm_test_ordering(struct unit_test_state *uts)
ut_assert(dev_last);
/* Now remove device 3 */
- ut_assertok(device_remove(dev));
+ ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
ut_assertok(device_unbind(dev));
/* The device numbering should have shifted down one */
@@ -371,9 +375,9 @@ static int dm_test_ordering(struct unit_test_state *uts)
ut_assert(pingret == 102);
/* Remove 3 and 4 */
- ut_assertok(device_remove(dev_penultimate));
+ ut_assertok(device_remove(dev_penultimate, DM_REMOVE_NORMAL));
ut_assertok(device_unbind(dev_penultimate));
- ut_assertok(device_remove(dev_last));
+ ut_assertok(device_remove(dev_last, DM_REMOVE_NORMAL));
ut_assertok(device_unbind(dev_last));
/* Our device should now be in position 3 */
@@ -381,7 +385,7 @@ static int dm_test_ordering(struct unit_test_state *uts)
ut_assert(dev == test_dev);
/* Now remove device 3 */
- ut_assertok(device_remove(dev));
+ ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
ut_assertok(device_unbind(dev));
return 0;
@@ -457,7 +461,7 @@ static int dm_test_remove(struct unit_test_state *uts)
ut_assert(dev);
ut_assertf(dev->flags & DM_FLAG_ACTIVATED,
"Driver %d/%s not activated", i, dev->name);
- ut_assertok(device_remove(dev));
+ ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
ut_assertf(!(dev->flags & DM_FLAG_ACTIVATED),
"Driver %d/%s should have deactivated", i,
dev->name);
@@ -611,14 +615,14 @@ static int dm_test_children(struct unit_test_state *uts)
ut_asserteq(total, dm_testdrv_op_count[DM_TEST_OP_PROBE]);
/* Remove a top-level child and check that the children are removed */
- ut_assertok(device_remove(top[2]));
+ ut_assertok(device_remove(top[2], DM_REMOVE_NORMAL));
ut_asserteq(NODE_COUNT + 1, dm_testdrv_op_count[DM_TEST_OP_REMOVE]);
dm_testdrv_op_count[DM_TEST_OP_REMOVE] = 0;
/* Try one with grandchildren */
ut_assertok(uclass_get_device(UCLASS_TEST, 5, &dev));
ut_asserteq_ptr(dev, top[5]);
- ut_assertok(device_remove(dev));
+ ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
ut_asserteq(1 + NODE_COUNT * (1 + NODE_COUNT),
dm_testdrv_op_count[DM_TEST_OP_REMOVE]);
@@ -656,6 +660,68 @@ static int dm_test_pre_reloc(struct unit_test_state *uts)
}
DM_TEST(dm_test_pre_reloc, 0);
+/*
+ * Test that removal of devices, either via the "normal" device_remove()
+ * API or via the device driver selective flag works as expected
+ */
+static int dm_test_remove_active_dma(struct unit_test_state *uts)
+{
+ struct dm_test_state *dms = uts->priv;
+ struct udevice *dev;
+
+ ut_assertok(device_bind_by_name(dms->root, false, &driver_info_act_dma,
+ &dev));
+ ut_assert(dev);
+
+ /* Probe the device */
+ ut_assertok(device_probe(dev));
+
+ /* Test if device is active right now */
+ ut_asserteq(true, device_active(dev));
+
+ /* Remove the device via selective remove flag */
+ dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
+
+ /* Test if device is inactive right now */
+ ut_asserteq(false, device_active(dev));
+
+ /* Probe the device again */
+ ut_assertok(device_probe(dev));
+
+ /* Test if device is active right now */
+ ut_asserteq(true, device_active(dev));
+
+ /* Remove the device via "normal" remove API */
+ ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
+
+ /* Test if device is inactive right now */
+ ut_asserteq(false, device_active(dev));
+
+ /*
+ * Test if a device without the active DMA flags is not removed upon
+ * the active DMA remove call
+ */
+ ut_assertok(device_unbind(dev));
+ ut_assertok(device_bind_by_name(dms->root, false, &driver_info_manual,
+ &dev));
+ ut_assert(dev);
+
+ /* Probe the device */
+ ut_assertok(device_probe(dev));
+
+ /* Test if device is active right now */
+ ut_asserteq(true, device_active(dev));
+
+ /* Remove the device via selective remove flag */
+ dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
+
+ /* Test if device is still active right now */
+ ut_asserteq(true, device_active(dev));
+
+ return 0;
+}
+DM_TEST(dm_test_remove_active_dma, 0);
+
static int dm_test_uclass_before_ready(struct unit_test_state *uts)
{
struct uclass *uc;
diff --git a/test/dm/eth.c b/test/dm/eth.c
index 6288ae2..564ad36 100644
--- a/test/dm/eth.c
+++ b/test/dm/eth.c
@@ -116,7 +116,7 @@ static int dm_test_eth_act(struct unit_test_state *uts)
for (i = 0; i < DM_TEST_ETH_NUM; i++) {
ut_assertok(uclass_find_device_by_name(UCLASS_ETH,
ethname[i], &dev[i]));
- ut_assertok(device_remove(dev[i]));
+ ut_assertok(device_remove(dev[i], DM_REMOVE_NORMAL));
/* Invalidate MAC address */
strcpy(ethaddr[i], getenv(addrname[i]));
diff --git a/test/dm/spi.c b/test/dm/spi.c
index f52cb73..24fa2a4 100644
--- a/test/dm/spi.c
+++ b/test/dm/spi.c
@@ -36,7 +36,7 @@ static int dm_test_spi_find(struct unit_test_state *uts)
ut_asserteq(0, uclass_get_device_by_seq(UCLASS_SPI, busnum, &bus));
ut_assertok(spi_cs_info(bus, cs, &info));
of_offset = dev_of_offset(info.dev);
- device_remove(info.dev);
+ device_remove(info.dev, DM_REMOVE_NORMAL);
device_unbind(info.dev);
/*
diff --git a/test/dm/test-driver.c b/test/dm/test-driver.c
index d10af51..2b432a7 100644
--- a/test/dm/test-driver.c
+++ b/test/dm/test-driver.c
@@ -157,3 +157,14 @@ U_BOOT_DRIVER(test_pre_reloc_drv) = {
.unbind = test_manual_unbind,
.flags = DM_FLAG_PRE_RELOC,
};
+
+U_BOOT_DRIVER(test_act_dma_drv) = {
+ .name = "test_act_dma_drv",
+ .id = UCLASS_TEST,
+ .ops = &test_manual_ops,
+ .bind = test_manual_bind,
+ .probe = test_manual_probe,
+ .remove = test_manual_remove,
+ .unbind = test_manual_unbind,
+ .flags = DM_FLAG_ACTIVE_DMA,
+};