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

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.com


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent f0da2679
Loading
Loading
Loading
Loading
+35 −13
Original line number Diff line number Diff line
@@ -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;

	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,6 +795,7 @@ static int adp5588_probe(struct i2c_client *client)
	if (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,
@@ -784,8 +805,9 @@ static int adp5588_probe(struct i2c_client *client)
				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;
}