On Fri, Mar 30, 2018 at 9:47 AM, Boris Brezillon <boris.brezillon@xxxxxxxxxxx> wrote: > Add a driver for Cadence I3C GPIO expander. > > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxx> This is pretty much OK, and I don't want to raise the bar even higher for you to get this code into the kernel, so: Acked-by: Linus Walleij <linus.walleij@xxxxxxxxxx> The following is an observation for future improvement: > +static int cdns_i3c_gpio_read_reg(struct cdns_i3c_gpio *gpioc, u8 reg, > + u8 *val) > +{ > + struct i3c_priv_xfer xfers[] = { > + { > + .len = sizeof(reg), > + .data.out = ®, > + }, > + { > + .rnw = true, > + .len = sizeof(*val), > + .data.in = val, > + }, > + }; > + > + return i3c_device_do_priv_xfers(gpioc->i3cdev, xfers, > + ARRAY_SIZE(xfers)); > +} > + > +static int cdns_i3c_gpio_write_reg(struct cdns_i3c_gpio *gpioc, u8 reg, > + u8 val) > +{ > + struct i3c_priv_xfer xfers[] = { > + { > + .len = sizeof(reg), > + .data.out = ®, > + }, > + { > + .len = sizeof(val), > + .data.out = &val, > + }, > + }; > + > + return i3c_device_do_priv_xfers(gpioc->i3cdev, xfers, > + ARRAY_SIZE(xfers)); > +} This is starting to resemble drivers/base/regmap/regmap-i2c.c Maybe we should very quickly add regmap-i3c.c as this infrastructre has had a great positive effect on may kernel subsystems. > +static int cdns_i3c_gpio_get_direction(struct gpio_chip *g, unsigned offset) > +{ > + struct cdns_i3c_gpio *gpioc = gpioc_to_cdns_gpioc(g); > + > + return gpioc->dir & BIT(offset); I would: return !!(gpioc->dir & BIT(offset)); So you clamp it to bit 0. Yours, Linus Walleij