@@ -1236,7 +1236,12 @@ static void aspeed_i2c_bus_realize(DeviceState *dev, Error **errp)
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
- s->bus = i2c_init_bus(dev, name);
+ /*
+ * If a bus hasn't been provided to the controller, create one from scratch.
+ */
+ if (!s->bus) {
+ s->bus = i2c_init_bus(dev, name);
+ }
s->slave = i2c_slave_create_simple(s->bus, TYPE_ASPEED_I2C_BUS_SLAVE,
0xff);
@@ -1420,3 +1425,12 @@ I2CBus *aspeed_i2c_get_bus(AspeedI2CState *s, int busnr)
return bus;
}
+
+void aspeed_i2c_set_bus(AspeedI2CState *s, int busnr, I2CBus *bus)
+{
+ AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(s);
+
+ if (busnr >= 0 && busnr < aic->num_busses) {
+ s->busses[busnr].bus = bus;
+ }
+}
@@ -376,5 +376,6 @@ static inline bool aspeed_i2c_bus_is_enabled(AspeedI2CBus *bus)
}
I2CBus *aspeed_i2c_get_bus(AspeedI2CState *s, int busnr);
+void aspeed_i2c_set_bus(AspeedI2CState *s, int busnr, I2CBus *bus);
#endif /* ASPEED_I2C_H */
In a multi-SoC board, we want to allow machines to construct shared I2CBus's, so that we can have two SoC I2C controllers attached to a single I2CBus. We already expose read-only access, this just adds a method for setting and using an external I2CBus in the Aspeed I2C bus controller. One issue is that in order to use these methods, the machine needs to reach into the SoC and call these methods on the I2C controller, and we would prefer to keep the abstraction at the SoC level. If we create a set of "aspeed_soc_i2c_get_bus/set_bus" methods though, they will just be one-liners that don't do anything interesting. I would prefer to avoid that if possible, because that doesn't seem scalable if we need to do the same thing for all of the peripherals later. In addition, we are already reaching into the Aspeed SoC to access the flash controller to determine the boot rom size, so there is a precedent that we need to reach into SoC peripherals for data sometimes. Signed-off-by: Peter Delevoryas <peter@pjd.dev> --- hw/i2c/aspeed_i2c.c | 16 +++++++++++++++- include/hw/i2c/aspeed_i2c.h | 1 + 2 files changed, 16 insertions(+), 1 deletion(-)