Commit dc748812 authored by Utsav Agarwal's avatar Utsav Agarwal Committed by Dmitry Torokhov

Input: adp5588-keys - add support for pure gpio

Keypad specific setup is relaxed if no keypad rows/columns are specified,
enabling a purely gpio operation.
Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Signed-off-by: default avatarUtsav Agarwal <utsav.agarwal@analog.com>
Link: https://lore.kernel.org/r/20240826-adp5588_gpio_support-v11-2-3e5ac2bd31b7@analog.comSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent f0da2679
......@@ -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;
......@@ -431,10 +432,17 @@ static int adp5588_gpio_add(struct adp5588_kpad *kpad)
kpad->gc.label = kpad->client->name;
kpad->gc.owner = THIS_MODULE;
girq = &kpad->gc.irq;
gpio_irq_chip_set_chip(girq, &adp5588_irq_chip);
girq->handler = handle_bad_irq;
girq->threaded = true;
if (device_property_present(dev, "interrupt-controller")) {
if (!kpad->client->irq) {
dev_err(dev, "Unable to serve as interrupt controller without interrupt");
return -EINVAL;
}
girq = &kpad->gc.irq;
gpio_irq_chip_set_chip(girq, &adp5588_irq_chip);
girq->handler = handle_bad_irq;
girq->threaded = true;
}
mutex_init(&kpad->gpio_lock);
......@@ -632,6 +640,18 @@ 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. To do
* so, check that no keypad rows or columns have been specified,
* since all GPINS should be configured as GPIO.
*/
if (!device_property_present(&client->dev, "keypad,num-rows") &&
!device_property_present(&client->dev, "keypad,num-columns")) {
/* If purely GPIO, skip keypad setup */
kpad->gpio_only = true;
return 0;
}
ret = matrix_keypad_parse_properties(&client->dev, &kpad->rows,
&kpad->cols);
if (ret)
......@@ -775,17 +795,19 @@ static int adp5588_probe(struct i2c_client *client)
if (error)
return error;
error = devm_request_threaded_irq(&client->dev, client->irq,
adp5588_hard_irq, adp5588_thread_irq,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
client->dev.driver->name, kpad);
if (error) {
dev_err(&client->dev, "failed to request irq %d: %d\n",
client->irq, error);
return error;
if (client->irq) {
error = devm_request_threaded_irq(&client->dev, client->irq,
adp5588_hard_irq, adp5588_thread_irq,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
client->dev.driver->name, kpad);
if (error) {
dev_err(&client->dev, "failed to request irq %d: %d\n",
client->irq, error);
return error;
}
}
dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq);
dev_info(&client->dev, "Rev.%d controller\n", revid);
return 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment