Reviewed-by: Glenn Miles <[email protected]>

Thanks,

Glenn

On Thu, 2026-07-09 at 17:23 +0200, Emmanuel Blot wrote:
> The PCA9554 selects one of its four registers with a single command byte
> and does not auto-increment the register pointer, so a multi-byte I2C
> transfer keeps addressing the register chosen by the command byte instead
> of walking through the register map.
> 
> Add a test covering this: a two-byte read returns the addressed register
> twice, and a two-byte write updates only that register, leaving its
> neighbour untouched.
> 
> Signed-off-by: Emmanuel Blot <[email protected]>
> ---
>  tests/qtest/pca9554-test.c | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
> 
> diff --git a/tests/qtest/pca9554-test.c b/tests/qtest/pca9554-test.c
> index 74237df611..0da1f3304b 100644
> --- a/tests/qtest/pca9554-test.c
> +++ b/tests/qtest/pca9554-test.c
> @@ -102,6 +102,33 @@ static void test_polarity_with_output(void *obj, void 
> *data,
>      g_assert_cmphex(i2c_get8(dev, PCA9554_OUTPUT), ==, 0xA5);
>  }
>  
> +/*
> + * The PCA9554 has no auto-increment: the command pointer never advances, so
> + * multi-byte reads and writes all target the addressed register.
> + */
> +static void test_no_autoincrement(void *obj, void *data,
> +                                  QGuestAllocator *alloc)
> +{
> +    QI2CDevice *dev = (QI2CDevice *)obj;
> +    uint8_t buf[2];
> +
> +    /* Distinct values in adjacent registers. */
> +    i2c_set8(dev, PCA9554_OUTPUT, 0xAA);
> +    i2c_set8(dev, PCA9554_POLARITY, 0x33);
> +
> +    /* Two reads from OUTPUT return OUTPUT twice, not OUTPUT then POLARITY. 
> */
> +    i2c_read_block(dev, PCA9554_OUTPUT, buf, 2);
> +    g_assert_cmphex(buf[0], ==, 0xAA);
> +    g_assert_cmphex(buf[1], ==, 0xAA);
> +
> +    /* The second written byte overwrites OUTPUT; POLARITY is untouched. */
> +    buf[0] = 0x12;
> +    buf[1] = 0x34;
> +    i2c_write_block(dev, PCA9554_OUTPUT, buf, 2);
> +    g_assert_cmphex(i2c_get8(dev, PCA9554_OUTPUT), ==, 0x34);
> +    g_assert_cmphex(i2c_get8(dev, PCA9554_POLARITY), ==, 0x33);
> +}
> +
>  static void pca9554_register_nodes(void)
>  {
>      QOSGraphEdgeOptions opts = {
> @@ -120,6 +147,7 @@ static void pca9554_register_nodes(void)
>                   NULL);
>      qos_add_test("polarity-with-output", "pca9554", 
> test_polarity_with_output,
>                   NULL);
> +    qos_add_test("no-autoincrement", "pca9554", test_no_autoincrement, NULL);
>  }
>  
>  libqos_init(pca9554_register_nodes);
> 


Reply via email to