Hi Utsav, On Fri, 2024-06-28 at 12:57 +0000, Agarwal, Utsav wrote: > From: Utsav Agarwal <utsav.agarwal@xxxxxxxxxx> > > Current state of the driver for the ADP5588/87 only allows partial > I/O to be used as GPIO. This support was previously present as a > separate gpio driver, which was dropped with the commit > 5ddc896088b0 ("gpio: gpio-adp5588: drop the driver") since the > functionality was deemed to have been merged with adp5588-keys. > > To restore this, keypad specific checks in the probe > function are relaxed if the following conditions are met: > 1) "gpio-only" property has been specified for the node > 2) No keypad rows/columns are specified > > The "gpio-only" property is introduced to simplify usage since it > serves as a clear indication of the user's intention as opposed to being > inferred from the number of rows and columns specified. This > also adds simplicity for the accompanying dt binding update as well > as interpretation of the same. > > In such a case, additional checks are also introduced to make sure > that keypad and pure GPIO operation are mutually exclusive by > checking for keypad specific properties (keypad,num-rows and > keypad,num-columns). > > Signed-off-by: Utsav Agarwal <utsav.agarwal@xxxxxxxxxx> > --- > drivers/input/keyboard/adp5588-keys.c | 33 +++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/drivers/input/keyboard/adp5588-keys.c > b/drivers/input/keyboard/adp5588-keys.c > index 1b0279393df4..6bfe748797df 100644 > --- a/drivers/input/keyboard/adp5588-keys.c > +++ b/drivers/input/keyboard/adp5588-keys.c > @@ -188,6 +188,7 @@ struct adp5588_kpad { > u32 cols; > u32 unlock_keys[2]; > int nkeys_unlock; > + bool gpio_only; > unsigned short keycode[ADP5588_KEYMAPSIZE]; > unsigned char gpiomap[ADP5588_MAXGPIO]; > struct gpio_chip gc; > @@ -647,6 +648,25 @@ static int adp5588_fw_parse(struct adp5588_kpad *kpad) > struct i2c_client *client = kpad->client; > int ret, i; > > + /* > + * Check if the device is to be operated purely in GPIO mode. If > + * so, confirm that no keypad rows or columns have been specified, > since > + * all GPINS should be configured as GPIO. > + */ > + if (kpad->gpio_only) { > + ret = device_property_present(&client->dev, > + "keypad,num-rows"); Should align with open parenthesis... > + if (ret) > + return -EINVAL; > + dev_err_probe() with a message should be helpful... > + ret = device_property_present(&client->dev, > + "keypad,num-columns"); > + if (ret) > + return -EINVAL; Alternatively, you could just: if (kpad->gpio_only) return 0; And ignore the other properties... > + > + return 0; > + } > + > ret = matrix_keypad_parse_properties(&client->dev, &kpad->rows, > &kpad->cols); > if (ret) > @@ -739,6 +759,7 @@ static int adp5588_probe(struct i2c_client *client) > kpad->client = client; > kpad->input = input; > > + kpad->gpio_only = device_property_present(&client->dev, "gpio-only"); Since the above is also FW properties it could go inside adp5588_fw_parse(). It's also missing the bindings patch. > error = adp5588_fw_parse(kpad); > if (error) > return error; > @@ -790,6 +811,11 @@ static int adp5588_probe(struct i2c_client *client) > if (error) > return error; > > + if (!client->irq && kpad->gpio_only) { > + dev_info(&client->dev, "Rev.%d, started as GPIO only\n", > revid); > + return 0; > + } > + Note that in case there are no IRQ, you should not make the gpiochip an irqchip capable: https://elixir.bootlin.com/linux/v6.10-rc5/source/drivers/input/keyboard/adp5588-keys.c#L449 - Nuno Sá