Hey Glenn, Yes sorry, I’ve been fighting my ISP SMTP server that considers that sending more than a couple of patches to 10 different addresses is some kind of SPAM, and I ended up pushing twice the same email…
Emmanuel. On 16 Jul 2026, at 15:58, Miles Glenn wrote: > Not sure why patch 11 was sent twice (once from two different emails), > but... > > Reviewed-by: Glenn Miles <[email protected]> > > Thanks, > > Glenn > > On Thu, 2026-07-09 at 17:23 +0200, Emmanuel Blot wrote: >> Add tests covering the pin I/O semantics of the expander: output-driven >> pins reflected in the input register, the pull-up seen on input-configured >> pins, and the independence of the two 8-bit ports. >> >> Signed-off-by: Emmanuel Blot <[email protected]> >> --- >> tests/qtest/pca9555-test.c | 75 >> ++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 75 insertions(+) >> >> diff --git a/tests/qtest/pca9555-test.c b/tests/qtest/pca9555-test.c >> index 5945c3441e..6b085702c3 100644 >> --- a/tests/qtest/pca9555-test.c >> +++ b/tests/qtest/pca9555-test.c >> @@ -28,6 +28,77 @@ static void test_reset_defaults(void *obj, void *data, >> QGuestAllocator *alloc) >> g_assert_cmphex(i2c_get8(dev, PCA9535_CONFIG1), ==, 0xFF); >> } >> >> +/* >> + * When a pin is configured as output and driven low (output=0, config=0), >> + * the input register should reflect 0 for that pin. >> + * When driven high (output=1, config=0), input should reflect 1. >> + * When configured as input (config=1), PCA5555 pull-up makes it read 1. >> + */ >> +static void test_output_drives_input(void *obj, void *data, >> + QGuestAllocator *alloc) >> +{ >> + QI2CDevice *dev = (QI2CDevice *)obj; >> + >> + i2c_set8(dev, PCA9535_CONFIG0, 0xF0); >> + i2c_set8(dev, PCA9535_OUTPUT0, 0xFA); >> + >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0xFA); >> + >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT1), ==, 0xFF); >> + >> + i2c_set8(dev, PCA9535_CONFIG0, 0x00); >> + i2c_set8(dev, PCA9535_OUTPUT0, 0x00); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0x00); >> + >> + i2c_set8(dev, PCA9535_OUTPUT0, 0xFF); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0xFF); >> +} >> + >> +/* >> + * When all pins are inputs (config=0xFF) and no external driver, >> + * PCA9555 pull-ups should make the input register read all ones. >> + * Switching a pin to output mode with output=0 should drive it low. >> + */ >> +static void test_input_pullup(void *obj, void *data, QGuestAllocator *alloc) >> +{ >> + QI2CDevice *dev = (QI2CDevice *)obj; >> + >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0xFF); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT1), ==, 0xFF); >> + >> + i2c_set8(dev, PCA9535_OUTPUT0, 0x00); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0xFF); >> + >> + i2c_set8(dev, PCA9535_CONFIG0, 0x00); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0x00); >> +} >> + >> +/* >> + * Test that both ports are independent: changing port 0 registers >> + * should not affect port 1 and vice versa. >> + */ >> +static void test_port_independence(void *obj, void *data, >> + QGuestAllocator *alloc) >> +{ >> + QI2CDevice *dev = (QI2CDevice *)obj; >> + >> + i2c_set8(dev, PCA9535_CONFIG0, 0x00); >> + i2c_set8(dev, PCA9535_OUTPUT0, 0x00); >> + >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0x00); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT1), ==, 0xFF); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_CONFIG1), ==, 0xFF); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_OUTPUT1), ==, 0xFF); >> + >> + i2c_set8(dev, PCA9535_CONFIG1, 0x00); >> + i2c_set8(dev, PCA9535_OUTPUT1, 0xAA); >> + >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT0), ==, 0x00); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_INPUT1), ==, 0xAA); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_OUTPUT0), ==, 0x00); >> + g_assert_cmphex(i2c_get8(dev, PCA9535_OUTPUT1), ==, 0xAA); >> +} >> + >> static void pca9555_register_nodes(void) >> { >> QOSGraphEdgeOptions opts = { >> @@ -39,6 +110,10 @@ static void pca9555_register_nodes(void) >> qos_node_consumes("pca9555", "i2c-bus", &opts); >> >> qos_add_test("reset-defaults", "pca9555", test_reset_defaults, NULL); >> + qos_add_test("output-drives-input", "pca9555", test_output_drives_input, >> + NULL); >> + qos_add_test("input-pullup", "pca9555", test_input_pullup, NULL); >> + qos_add_test("port-independence", "pca9555", test_port_independence, >> NULL); >> } >> >> libqos_init(pca9555_register_nodes); >>
