From 3f6add69da049bb0513ab3d4a0b5032f09697c78 Mon Sep 17 00:00:00 2001 From: Gerard Marull-Paretas Date: Thu, 9 Jan 2025 17:57:17 +0100 Subject: [PATCH] init: drop device union from struct init_entry Such union is rather redundant, considering a simple const cast can be done when initializing the init entry. Note that the init_entry does not need to be touched now that struct device stores the init call. It is merely an init entry sorted by linker scripts, so we can intertwine devices and SYS_INIT. Signed-off-by: Gerard Marull-Paretas --- include/zephyr/device.h | 8 ++------ include/zephyr/init.h | 7 +------ kernel/init.c | 4 ++-- tests/lib/devicetree/devices/src/main.c | 20 ++++++++++---------- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/include/zephyr/device.h b/include/zephyr/device.h index d8394ef75a6..e0ba141fac0 100644 --- a/include/zephyr/device.h +++ b/include/zephyr/device.h @@ -1156,18 +1156,14 @@ device_get_dt_nodelabels(const struct device *dev) static const Z_DECL_ALIGN(struct init_entry) __used __noasan Z_INIT_ENTRY_SECTION( \ level, prio, Z_DEVICE_INIT_SUB_PRIO(node_id)) \ Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = { \ - COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), \ - (.dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \ - (.dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \ + .dev = (const struct device *)&DEVICE_NAME_GET(dev_id) \ } #define Z_DEFER_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id) \ static const Z_DECL_ALIGN(struct init_entry) __used __noasan \ __attribute__((__section__(".z_deferred_init"))) \ Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = { \ - COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), \ - (.dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \ - (.dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \ + .dev = (const struct device *)&DEVICE_NAME_GET(dev_id) \ } /** diff --git a/include/zephyr/init.h b/include/zephyr/init.h index d071445a0aa..8d476e1a645 100644 --- a/include/zephyr/init.h +++ b/include/zephyr/init.h @@ -73,12 +73,7 @@ struct init_entry { * If the init entry belongs to a device, this fields stores a * reference to it, otherwise it is set to NULL. */ - union { - const struct device *dev; -#ifdef CONFIG_DEVICE_MUTABLE - struct device *dev_rw; -#endif - } dev; + const struct device *dev; }; /** @cond INTERNAL_HIDDEN */ diff --git a/kernel/init.c b/kernel/init.c index 6eeed757c6d..2c3b13deb35 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -360,7 +360,7 @@ static void z_sys_init_run_level(enum init_level level) const struct init_entry *entry; for (entry = levels[level]; entry < levels[level+1]; entry++) { - const struct device *dev = entry->dev.dev; + const struct device *dev = entry->dev; int result; sys_trace_sys_init_enter(entry, level); @@ -381,7 +381,7 @@ int z_impl_device_init(const struct device *dev) } STRUCT_SECTION_FOREACH_ALTERNATE(_deferred_init, init_entry, entry) { - if (entry->dev.dev == dev) { + if (entry->dev == dev) { return do_device_init(dev); } } diff --git a/tests/lib/devicetree/devices/src/main.c b/tests/lib/devicetree/devices/src/main.c index d40917077c6..6b4f700f82b 100644 --- a/tests/lib/devicetree/devices/src/main.c +++ b/tests/lib/devicetree/devices/src/main.c @@ -64,25 +64,25 @@ DEVICE_DT_DEFINE(TEST_NOLABEL, dev_init, NULL, ZTEST(devicetree_devices, test_init_get) { /* Check device pointers */ - zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO)->dev, DEVICE_DT_GET(TEST_GPIO), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_I2C)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_I2C)->dev, DEVICE_DT_GET(TEST_I2C), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVA)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVA)->dev, DEVICE_DT_GET(TEST_DEVA), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVB)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVB)->dev, DEVICE_DT_GET(TEST_DEVB), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIOX)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIOX)->dev, DEVICE_DT_GET(TEST_GPIOX), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVC)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVC)->dev, DEVICE_DT_GET(TEST_DEVC), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_PARTITION)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_PARTITION)->dev, DEVICE_DT_GET(TEST_PARTITION), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO_INJECTED)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO_INJECTED)->dev, DEVICE_DT_GET(TEST_GPIO_INJECTED), NULL); - zassert_equal(DEVICE_INIT_GET(manual_dev)->dev.dev, + zassert_equal(DEVICE_INIT_GET(manual_dev)->dev, DEVICE_GET(manual_dev), NULL); - zassert_equal(DEVICE_INIT_DT_GET(TEST_NOLABEL)->dev.dev, + zassert_equal(DEVICE_INIT_DT_GET(TEST_NOLABEL)->dev, DEVICE_DT_GET(TEST_NOLABEL), NULL); /* Check init functions */