Merge tag 'u-boot-atmel-2021.01-a' of https://gitlab.denx.de/u-boot/custodians/u-boot-atmel into next

First set of u-boot-atmel features for 2021.01 cycle:

This feature set includes a new CPU driver for at91 family, new driver
for PIT64B hardware timer, support for new at91 family SoC named sama7g5
which adds: clock support, including conversion of the clock tree to
CCF; SoC support in mach-at91, pinctrl and mmc drivers update.  The
feature set also includes updates for mmc driver and some other minor
fixes and features regarding building without the old Atmel PIT and the
possibility to read a secondary MAC address from a second i2c EEPROM.
This commit is contained in:
Tom Rini
2020-10-05 10:54:27 -04:00
46 changed files with 6736 additions and 951 deletions

View File

@@ -22,6 +22,10 @@ static int dm_test_clk_ccf(struct unit_test_state *uts)
struct udevice *dev;
long long rate;
int ret;
#if CONFIG_IS_ENABLED(CLK_CCF)
const char *clkname;
int clkid, i;
#endif
/* Get the device using the clk device */
ut_assertok(uclass_get_device_by_name(UCLASS_CLK, "clk-ccf", &dev));
@@ -130,6 +134,59 @@ static int dm_test_clk_ccf(struct unit_test_state *uts)
ret = sandbox_clk_enable_count(pclk);
ut_asserteq(ret, 0);
/* Test clock re-parenting. */
ret = clk_get_by_id(SANDBOX_CLK_USDHC1_SEL, &clk);
ut_assertok(ret);
ut_asserteq_str("usdhc1_sel", clk->dev->name);
pclk = clk_get_parent(clk);
ut_assertok_ptr(pclk);
if (!strcmp(pclk->dev->name, "pll3_60m")) {
clkname = "pll3_80m";
clkid = SANDBOX_CLK_PLL3_80M;
} else {
clkname = "pll3_60m";
clkid = SANDBOX_CLK_PLL3_60M;
}
ret = clk_get_by_id(clkid, &pclk);
ut_assertok(ret);
ret = clk_set_parent(clk, pclk);
ut_assertok(ret);
pclk = clk_get_parent(clk);
ut_assertok_ptr(pclk);
ut_asserteq_str(clkname, pclk->dev->name);
/* Test disabling critical clock. */
ret = clk_get_by_id(SANDBOX_CLK_I2C_ROOT, &clk);
ut_assertok(ret);
ut_asserteq_str("i2c_root", clk->dev->name);
/* Disable it, if any. */
ret = sandbox_clk_enable_count(clk);
for (i = 0; i < ret; i++) {
ret = clk_disable(clk);
ut_assertok(ret);
}
ret = sandbox_clk_enable_count(clk);
ut_asserteq(ret, 0);
clk->flags = CLK_IS_CRITICAL;
ret = clk_enable(clk);
ut_assertok(ret);
ret = clk_disable(clk);
ut_assertok(ret);
ret = sandbox_clk_enable_count(clk);
ut_asserteq(ret, 1);
clk->flags &= ~CLK_IS_CRITICAL;
ret = clk_disable(clk);
ut_assertok(ret);
ret = sandbox_clk_enable_count(clk);
ut_asserteq(ret, 0);
#endif
return 1;

View File

@@ -643,6 +643,166 @@ static int dm_test_children(struct unit_test_state *uts)
}
DM_TEST(dm_test_children, 0);
static int dm_test_device_reparent(struct unit_test_state *uts)
{
struct dm_test_state *dms = uts->priv;
struct udevice *top[NODE_COUNT];
struct udevice *child[NODE_COUNT];
struct udevice *grandchild[NODE_COUNT];
struct udevice *dev;
int total;
int ret;
int i;
/* We don't care about the numbering for this test */
dms->skip_post_probe = 1;
ut_assert(NODE_COUNT > 5);
/* First create 10 top-level children */
ut_assertok(create_children(uts, dms->root, NODE_COUNT, 0, top));
/* Now a few have their own children */
ut_assertok(create_children(uts, top[2], NODE_COUNT, 2, NULL));
ut_assertok(create_children(uts, top[5], NODE_COUNT, 5, child));
/* And grandchildren */
for (i = 0; i < NODE_COUNT; i++)
ut_assertok(create_children(uts, child[i], NODE_COUNT, 50 * i,
i == 2 ? grandchild : NULL));
/* Check total number of devices */
total = NODE_COUNT * (3 + NODE_COUNT);
ut_asserteq(total, dm_testdrv_op_count[DM_TEST_OP_BIND]);
/* Probe everything */
for (i = 0; i < total; i++)
ut_assertok(uclass_get_device(UCLASS_TEST, i, &dev));
/* Re-parent top-level children with no grandchildren. */
ut_assertok(device_reparent(top[3], top[0]));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_reparent(top[4], top[0]));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
/* Re-parent top-level children with grandchildren. */
ut_assertok(device_reparent(top[2], top[0]));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_reparent(top[5], top[2]));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
/* Re-parent grandchildren. */
ut_assertok(device_reparent(grandchild[0], top[1]));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_reparent(grandchild[1], top[1]));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
/* Remove re-pareneted devices. */
ut_assertok(device_remove(top[3], DM_REMOVE_NORMAL));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_remove(top[4], DM_REMOVE_NORMAL));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_remove(top[5], DM_REMOVE_NORMAL));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_remove(top[2], DM_REMOVE_NORMAL));
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_remove(grandchild[0], DM_REMOVE_NORMAL));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
ut_assertok(device_remove(grandchild[1], DM_REMOVE_NORMAL));
/* try to get devices */
for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
dev;
ret = uclass_find_next_device(&dev)) {
ut_assert(!ret);
ut_assertnonnull(dev);
}
/* Try the same with unbind */
ut_assertok(device_unbind(top[3]));
ut_assertok(device_unbind(top[4]));
ut_assertok(device_unbind(top[5]));
ut_assertok(device_unbind(top[2]));
ut_assertok(device_unbind(grandchild[0]));
ut_assertok(device_unbind(grandchild[1]));
return 0;
}
DM_TEST(dm_test_device_reparent, 0);
/* Test that pre-relocation devices work as expected */
static int dm_test_pre_reloc(struct unit_test_state *uts)
{