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 { ...@@ -188,6 +188,7 @@ struct adp5588_kpad {
u32 cols; u32 cols;
u32 unlock_keys[2]; u32 unlock_keys[2];
int nkeys_unlock; int nkeys_unlock;
bool gpio_only;
unsigned short keycode[ADP5588_KEYMAPSIZE]; unsigned short keycode[ADP5588_KEYMAPSIZE];
unsigned char gpiomap[ADP5588_MAXGPIO]; unsigned char gpiomap[ADP5588_MAXGPIO];
struct gpio_chip gc; struct gpio_chip gc;
...@@ -431,10 +432,17 @@ static int adp5588_gpio_add(struct adp5588_kpad *kpad) ...@@ -431,10 +432,17 @@ static int adp5588_gpio_add(struct adp5588_kpad *kpad)
kpad->gc.label = kpad->client->name; kpad->gc.label = kpad->client->name;
kpad->gc.owner = THIS_MODULE; kpad->gc.owner = THIS_MODULE;
girq = &kpad->gc.irq; if (device_property_present(dev, "interrupt-controller")) {
gpio_irq_chip_set_chip(girq, &adp5588_irq_chip); if (!kpad->client->irq) {
girq->handler = handle_bad_irq; dev_err(dev, "Unable to serve as interrupt controller without interrupt");
girq->threaded = true; 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); mutex_init(&kpad->gpio_lock);
...@@ -632,6 +640,18 @@ static int adp5588_fw_parse(struct adp5588_kpad *kpad) ...@@ -632,6 +640,18 @@ static int adp5588_fw_parse(struct adp5588_kpad *kpad)
struct i2c_client *client = kpad->client; struct i2c_client *client = kpad->client;
int ret, i; 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, ret = matrix_keypad_parse_properties(&client->dev, &kpad->rows,
&kpad->cols); &kpad->cols);
if (ret) if (ret)
...@@ -775,17 +795,19 @@ static int adp5588_probe(struct i2c_client *client) ...@@ -775,17 +795,19 @@ static int adp5588_probe(struct i2c_client *client)
if (error) if (error)
return error; return error;
error = devm_request_threaded_irq(&client->dev, client->irq, if (client->irq) {
adp5588_hard_irq, adp5588_thread_irq, error = devm_request_threaded_irq(&client->dev, client->irq,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT, adp5588_hard_irq, adp5588_thread_irq,
client->dev.driver->name, kpad); IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
if (error) { client->dev.driver->name, kpad);
dev_err(&client->dev, "failed to request irq %d: %d\n", if (error) {
client->irq, error); dev_err(&client->dev, "failed to request irq %d: %d\n",
return error; 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; 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