On 7/9/26 17:23, Emmanuel Blot wrote:
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);
Reviewed-by: Cédric Le Goater <[email protected]>
Thanks,
C.