diff options
| author | lhxj <[email protected]> | 2025-12-25 17:56:52 +0800 |
|---|---|---|
| committer | R b b666 <[email protected]> | 2026-01-20 22:05:28 +0800 |
| commit | 7641ef68855601bc73252546bf41a96d6078444e (patch) | |
| tree | 58e3dcf31552a868ab1bbd27b8c07ab731c2dede /components/drivers/core | |
| parent | 306505ea24d22f908e052836918029d82259bc83 (diff) | |
[drivers] Fix OFW bus conflict and prevent duplicate device creation
Problem:
When enumerating device tree nodes, platform bus and native buses (I2C/SPI)
may create duplicate devices for the same OFW node, causing cross-bus conflicts.
This triggers assertion failure '(dev->bus != new_bus)' in
rt_bus_reload_driver_device() during boot on minimal DM-enabled systems.
Root Cause:
1. Platform bus tries to reload devices that already belong to other buses
by calling rt_bus_reload_driver_device(dev->bus, dev), which violates
the API contract (requires dev->bus != new_bus).
2. Native buses (I2C/SPI) do not mark OFW nodes as occupied, so platform
bus creates duplicate platform devices for I2C/SPI client nodes.
Solution:
1. components/drivers/core/platform_ofw.c: Return RT_EOK when np->dev exists,
letting the native bus handle device lifecycle instead of cross-bus reload.
2. components/drivers/i2c/dev_i2c_bus.c: Mark i2c_client_np->dev during scan
to prevent platform bus from duplicating I2C client devices.
3. components/drivers/spi/dev_spi_bus.c: Mark spi_dev_np->dev during scan
to prevent platform bus from duplicating SPI devices.
Tested on Spacemit K1 RISC-V platform with minimal DM configuration.
Signed-off-by: lhxj <[email protected]>
Diffstat (limited to 'components/drivers/core')
| -rw-r--r-- | components/drivers/core/platform_ofw.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/components/drivers/core/platform_ofw.c b/components/drivers/core/platform_ofw.c index 38065dd3eb..d617f112fa 100644 --- a/components/drivers/core/platform_ofw.c +++ b/components/drivers/core/platform_ofw.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2023-06-04 GuEe-GUI the first version + * 2025-12-25 lhxj fix OFW bus conflict and prevent duplicate device creation */ #include <rtthread.h> @@ -223,16 +224,14 @@ rt_err_t rt_platform_ofw_request(struct rt_ofw_node *np) if (dev) { - /* Was create */ - if (dev->drv) - { - /* Was probe OK */ - err = RT_EOK; - } - else - { - err = rt_bus_reload_driver_device(dev->bus, dev); - } + /* + * Device was already created (np->dev != NULL). + * - If it's already probed (dev->drv != NULL), nothing to do. + * - If not yet probed (dev->drv == NULL), it belongs to its native bus + * (e.g. I2C/SPI) which will handle probing; platform bus should not reload + * or transfer it, to avoid cross-bus conflicts. + */ + err = RT_EOK; } else { |
