Hi Nuno, Thank you for the feedback. > -----Original Message----- > From: Nuno Sá <noname.nuno@xxxxxxxxx> > Sent: Friday, June 28, 2024 2:16 PM > To: Agarwal, Utsav <Utsav.Agarwal@xxxxxxxxxx>; Hennerich, Michael > <Michael.Hennerich@xxxxxxxxxx>; dmitry.torokhov@xxxxxxxxx; linux- > input@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx > Cc: Artamonovs, Arturs <Arturs.Artamonovs@xxxxxxxxxx>; Bimpikas, > Vasileios <Vasileios.Bimpikas@xxxxxxxxxx>; Gaskell, Oliver > <Oliver.Gaskell@xxxxxxxxxx> > Subject: Re: [PATCH v2] adp5588-keys: Support for dedicated gpio operation > > [External] > > 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... I will add an error message in the next version. > > > + 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. Yes, I agree, on revaluation it makes sense to do so. > > > 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://urldefense.com/v3/__https://elixir.bootlin.com/linux/v6.10- > rc5/source/drivers/input/keyboard/adp5588- > keys.c*L449__;Iw!!A3Ni8CS0y2Y!5V_cLrmVT4t1wmVNsUbaGelR4BAMJDj3l35C > IIOfGIXDiCVEY7qu8Zc5u_r7322sJQsUTRNWzehxZ8q9fsJGo6Hz$ > > Understood, I'll make the revisions accordingly. > - Nuno Sá >