Create io_expander5 (pca9554@27) with hw-dir=true so its pin%d QOM properties drive the external input level of each pin, matching the pca9555 expanders, instead of the legacy behaviour that forces the pin to an output. This lets external agents, including tests, stimulate the input pins and have the guest read them back.
Signed-off-by: Emmanuel Blot <[email protected]> --- hw/arm/aspeed_ast2600_catalina.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/hw/arm/aspeed_ast2600_catalina.c b/hw/arm/aspeed_ast2600_catalina.c index f714c9d1b3..67b821ccb9 100644 --- a/hw/arm/aspeed_ast2600_catalina.c +++ b/hw/arm/aspeed_ast2600_catalina.c @@ -546,9 +546,16 @@ static void catalina_bmc_i2c_init(AspeedMachineState *bmc) i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 5), TYPE_TMP75, 0x4f); /* i2c1mux0ch6 */ - /* io_expander5 - pca9554@27 */ - i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 6), - TYPE_PCA9554, 0x27); + /* io_expander5 - pca9554@27 (external agents drive its input pins) */ + { + I2CBus *bus = pca954x_i2c_get_bus(i2c_mux, 6); + I2CSlave *ioexp = i2c_slave_new(TYPE_PCA9554, 0x27); + + object_property_add_child(OBJECT(bus), "0x27", OBJECT(ioexp)); + object_property_set_bool(OBJECT(ioexp), "hw-dir", true, + &error_abort); + i2c_slave_realize_and_unref(ioexp, bus, &error_abort); + } /* io_expander6 - pca9555@25 */ i2c_slave_create_simple(pca954x_i2c_get_bus(i2c_mux, 6), TYPE_PCA9555, 0x25); -- 2.50.1
