Ah, no worries!  Also, it seems that I never recieved patch 12 of 29. 
Can you resend it to me or maybe someone else can review that one?

Thanks,

Glenn

On Thu, 2026-07-16 at 16:05 +0200, [email protected] wrote:
> 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);
> > > 


Reply via email to