mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-08-21 16:31:14 +02:00
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: Nuno Sa <nuno.sa@analog.com> Signed-off-by: Utsav Agarwal <utsav.agarwal@analog.com> Link: https://lore.kernel.org/r/20240826-adp5588_gpio_support-v11-2-3e5ac2bd31b7@analog.com Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
f0da267996
commit
dc748812fc
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user