On 6/19/22 6:43 AM, Andy Shevchenko wrote: > On Sat, Jun 18, 2022 at 7:10 PM Samuel Holland <samuel@xxxxxxxxxxxx> wrote: >> >> The official Pine64 PinePhone keyboard case contains a matrix keypad and >> a MCU which runs a libre firmware. Add support for its I2C interface. > > ... > >> +#include <linux/crc8.h> >> +#include <linux/i2c.h> >> +#include <linux/input/matrix_keypad.h> >> +#include <linux/interrupt.h> >> +#include <linux/module.h> >> +#include <linux/regulator/consumer.h> > > Missed > types.h > > ... > >> +#define PPKB_ROWS 6 >> +#define PPKB_COLS 12 > > ... > >> + for (col = 0; col < PPKB_COLS; ++col) { >> + u8 old = old_buf[1 + col]; >> + u8 new = new_buf[1 + col]; >> + u8 changed = old ^ new; >> + >> + if (!changed) >> + continue; >> + >> + for (row = 0; row < PPKB_ROWS; ++row) { >> + u8 mask = BIT(row); >> + u8 value = new & mask; >> + unsigned short code; >> + bool fn_state; >> + >> + if (!(changed & mask)) >> + continue; >> + >> + /* >> + * Save off the FN key state when the key was pressed, >> + * and use that to determine the code during a release. >> + */ >> + fn_state = value ? ppkb->fn_pressed : ppkb->fn_state[col] & mask; >> + if (fn_state) >> + ppkb->fn_state[col] ^= mask; > > Can't it be converted to use bitmap APIs? This is a 2D matrix, with one byte per column, and one bit per row. There are only 6 rows, so two bits per byte are unused. Converting this to the bitmap API would unnecessarily complicate things. >> + } >> + } > > ... > >> +static int ppkb_set_scan(struct i2c_client *client, bool enable) >> +{ >> + struct device *dev = &client->dev; >> + int ret, val; >> + >> + ret = i2c_smbus_read_byte_data(client, PPKB_SYS_CONFIG); >> + if (ret < 0) { >> + dev_err(dev, "Failed to read config: %d\n", ret); >> + return ret; >> + } >> + >> + if (enable) >> + val = ret & ~PPKB_SYS_CONFIG_DISABLE_SCAN; >> + else >> + val = ret | PPKB_SYS_CONFIG_DISABLE_SCAN; >> + ret = i2c_smbus_write_byte_data(client, PPKB_SYS_CONFIG, val); >> + if (ret) { >> + dev_err(dev, "Failed to write config: %d\n", ret); > >> + return ret; >> + } >> + >> + return 0; > > return ret; The "return 0" pattern is idiomatic, and more diff-friendly when adding error handling or more operations. But I don't have that strong of an opinion on it. Regards, Samuel