@@ -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");
+ if (ret)
+ return -EINVAL;
+
+ ret = device_property_present(&client->dev,
+ "keypad,num-columns");
+ if (ret)
+ return -EINVAL;
+
+ 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");
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;
+ }
+
error = devm_request_threaded_irq(&client->dev, client->irq,
adp5588_hard_irq, adp5588_thread_irq,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
@@ -800,6 +826,13 @@ static int adp5588_probe(struct i2c_client *client)
return error;
}
+
+ if (kpad->gpio_only) {
+ dev_info(&client->dev, "Rev.%d irq %d, started as GPIO only\n",
+ revid, client->irq);
+ return 0;
+ }
+
dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq);
return 0;
}