On 7/9/26 17:23, Emmanuel Blot wrote:
THIS PATCH IS ALREADY PART OF THE ADC128D818 SERIES
WILL BE REMOVED BEFORE FINAL REVIEW
Slaves created with i2c_slave_create_simple() were left unparented and
showed up under /machine/unattached with no stable QOM path. Add each
slave as a QOM child of its bus, named after its I2C address, so it has
a deterministic and addressable QOM path.
Signed-off-by: Emmanuel Blot <[email protected]>
(cherry picked from commit f55644fa78777e52fd90efaa59dd89b4ff0a7020)
you can drop these
Signed-off-by: Emmanuel Blot <[email protected]>
---
hw/i2c/core.c | 3 +++
include/hw/i2c/i2c.h | 7 +++++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
index 54f6bdca882..0bbce45d48d 100644
--- a/hw/i2c/core.c
+++ b/hw/i2c/core.c
@@ -382,6 +382,9 @@ I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char
*name, uint8_t addr)
{
I2CSlave *dev = i2c_slave_new(name, addr);
+ g_autofree char *childname = g_strdup_printf("0x%02x", addr);
+ object_property_add_child(OBJECT(bus), childname, OBJECT(dev));
+
This can not be merged yet. Discussions are in progress.
See :
Call to clean up QOM onboard devices lacking a parent
https://lore.kernel.org/qemu-devel/[email protected]/
and
[RFC PATCH 000/134] qom: Make composition-tree parenting mandatory
https://lore.kernel.org/qemu-devel/[email protected]/
It isn't as precise as a QOM path :
IOEXP0_QOM = "/machine/soc/i2c/bus[2]/aspeed.i2c.bus.2/0x20"
but it simplifies the device lookups.
C.
i2c_slave_realize_and_unref(dev, bus, &error_abort);
return dev;
diff --git a/include/hw/i2c/i2c.h b/include/hw/i2c/i2c.h
index dd5930f4b5e..dc557bbf3f2 100644
--- a/include/hw/i2c/i2c.h
+++ b/include/hw/i2c/i2c.h
@@ -166,13 +166,16 @@ bool i2c_scan_bus(I2CBus *bus, uint8_t address, bool
broadcast,
I2CSlave *i2c_slave_new(const char *name, uint8_t addr);
/**
- * Create and realize an I2C slave device on the heap.
+ * Create and realize an I2C slave device on the heap, add the device as a
+ * child of its parent bus.
+ *
* @bus: I2C bus to put it on
* @name: I2C slave device type name
* @addr: I2C address of the slave when put on a bus
*
* Create the device state structure, initialize it, put it on the
- * specified @bus, and drop the reference to it (the device is realized).
+ * specified @bus, parent it, and drop the reference to it (the device is
+ * realized).
*/
I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char *name, uint8_t
addr);