[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] hw/i2c: flatten pca954x mux device
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [PATCH] hw/i2c: flatten pca954x mux device |
Date: |
Wed, 2 Feb 2022 17:20:13 +0100 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 |
On 1/2/22 21:54, Patrick Venture wrote:
On Tue, Feb 1, 2022 at 11:02 AM Philippe Mathieu-Daudé <f4bug@amsat.org
<mailto:f4bug@amsat.org>> wrote:
On 1/2/22 17:30, Patrick Venture wrote:
> Previously this device created N subdevices which each owned an
i2c bus.
> Now this device simply owns the N i2c busses directly.
>
> Tested: Verified devices behind mux are still accessible via qmp
and i2c
> from within an arm32 SoC.
>
> Reviewed-by: Hao Wu <wuhaotsh@google.com
<mailto:wuhaotsh@google.com>>
> Signed-off-by: Patrick Venture <venture@google.com
<mailto:venture@google.com>>
> ---
> hw/i2c/i2c_mux_pca954x.c | 75
++++++----------------------------------
> 1 file changed, 11 insertions(+), 64 deletions(-)
> static void pca954x_init(Object *obj)
> {
> Pca954xState *s = PCA954X(obj);
> Pca954xClass *c = PCA954X_GET_CLASS(obj);
> int i;
>
> - /* Only initialize the children we expect. */
> + /* SMBus modules. Cannot fail. */
> for (i = 0; i < c->nchans; i++) {
> - object_initialize_child(obj, "channel[*]", &s->channel[i],
> - TYPE_PCA954X_CHANNEL);
> + /* start all channels as disabled. */
> + s->enabled[i] = false;
> + s->bus[i] = i2c_init_bus(DEVICE(s), "channel[*]");
This is not a QOM property, so you need to initialize manually:
that was my suspicion but this is the output I'm seeing:
{'execute': 'qom-list', 'arguments': { 'path':
'/machine/soc/smbus[0]/i2c-bus/child[0]' }}
{"return": [
{"name": "type", "type": "string"},
{"name": "parent_bus", "type": "link<bus>"},
{"name": "realized", "type": "bool"},
{"name": "hotplugged", "type": "bool"},
{"name": "hotpluggable", "type": "bool"},
{"name": "address", "type": "uint8"},
{"name": "channel[3]", "type": "child<i2c-bus>"},
{"name": "channel[0]", "type": "child<i2c-bus>"},
{"name": "channel[1]", "type": "child<i2c-bus>"},
{"name": "channel[2]", "type": "child<i2c-bus>"}
]}
It seems to be naming them via the order they're created.
Is this not behaving how you expect?
On the monitor:
(qemu) info qtree
bus: main-system-bus
type System
...
dev: npcm7xx-smbus, id ""
gpio-out "sysbus-irq" 1
mmio 00000000f008d000/0000000000001000
bus: i2c-bus
type i2c-bus
dev: pca9548, id ""
address = 119 (0x77)
bus: channel[*]
type i2c-bus
bus: channel[*]
type i2c-bus
bus: channel[*]
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 73 (0x49)
bus: channel[*]
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 72 (0x48)
bus: channel[*]
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 73 (0x49)
bus: channel[*]
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 72 (0x48)
bus: channel[*]
type i2c-bus
bus: channel[*]
type i2c-bus
-- >8 --
diff --git a/hw/i2c/i2c_mux_pca954x.c b/hw/i2c/i2c_mux_pca954x.c
index f9ce633b3a..a9517b612a 100644
--- a/hw/i2c/i2c_mux_pca954x.c
+++ b/hw/i2c/i2c_mux_pca954x.c
@@ -189,9 +189,11 @@ static void pca954x_init(Object *obj)
/* SMBus modules. Cannot fail. */
for (i = 0; i < c->nchans; i++) {
+ g_autofree gchar *bus_name = g_strdup_printf("i2c.%d", i);
+
/* start all channels as disabled. */
s->enabled[i] = false;
- s->bus[i] = i2c_init_bus(DEVICE(s), "channel[*]");
+ s->bus[i] = i2c_init_bus(DEVICE(s), bus_name);
}
}
---
(look at HMP 'info qtree' output).
With this snippet:
(qemu) info qtree
bus: main-system-bus
type System
...
dev: npcm7xx-smbus, id ""
gpio-out "sysbus-irq" 1
mmio 00000000f008d000/0000000000001000
bus: i2c-bus
type i2c-bus
dev: pca9548, id ""
address = 119 (0x77)
bus: i2c.7
type i2c-bus
bus: i2c.6
type i2c-bus
bus: i2c.5
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 73 (0x49)
bus: i2c.4
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 72 (0x48)
bus: i2c.3
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 73 (0x49)
bus: i2c.2
type i2c-bus
dev: tmp105, id ""
gpio-out "" 1
address = 72 (0x48)
bus: i2c.1
type i2c-bus
bus: i2c.0
type i2c-bus
Regards,
Phil.