goto out;
}
- if (button->irq) {
- dev_err(dev, "skipping button %s (only gpio buttons supported)\n",
- button->desc);
- bdata->b = &pdata->buttons[i];
- continue;
- }
-
if (gpio_is_valid(button->gpio)) {
/* legacy platform data... but is it the lookup table? */
bdata->gpiod = devm_gpiod_get_index(dev, desc, i,
if (IS_ERR_OR_NULL(bdata->gpiod)) {
error = IS_ERR(bdata->gpiod) ? PTR_ERR(bdata->gpiod) :
-EINVAL;
+
+ if (button->irq && error == -ENOENT) {
+ dev_err(dev, "skipping button %s (only gpio buttons supported)\n",
+ button->desc);
+ continue;
+ }
+
goto out;
}
struct gpio_keys_button_data *bdata = &bdev->data[i];
unsigned long irqflags = IRQF_ONESHOT;
+ if (!bdata->gpiod)
+ continue;
+
INIT_DELAYED_WORK(&bdata->work, gpio_keys_irq_work_func);
if (!button->irq) {
for (i = 0; i < pdata->nbuttons; i++) {
struct gpio_keys_button_data *bdata = &bdev->data[i];
- disable_irq(bdata->irq);
- cancel_delayed_work_sync(&bdata->work);
+ if (bdata->irq) {
+ disable_irq(bdata->irq);
+ cancel_delayed_work_sync(&bdata->work);
+ }
}
}