These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / input / keyboard / gpio_keys.c
index ddf4045..bef317f 100644 (file)
@@ -239,6 +239,11 @@ static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata,
                }
        }
 
+       if (i == ddata->pdata->nbuttons) {
+               error = -EINVAL;
+               goto out;
+       }
+
        mutex_lock(&ddata->disable_lock);
 
        for (i = 0; i < ddata->pdata->nbuttons; i++) {
@@ -336,8 +341,14 @@ static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata)
        const struct gpio_keys_button *button = bdata->button;
        struct input_dev *input = bdata->input;
        unsigned int type = button->type ?: EV_KEY;
-       int state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low;
+       int state = gpio_get_value_cansleep(button->gpio);
+
+       if (state < 0) {
+               dev_err(input->dev.parent, "failed to get gpio state\n");
+               return;
+       }
 
+       state = (state ? 1 : 0) ^ button->active_low;
        if (type == EV_ABS) {
                if (state)
                        input_event(input, type, button->code, button->value);
@@ -655,7 +666,9 @@ gpio_keys_get_devtree_pdata(struct device *dev)
                if (of_property_read_u32(pp, "linux,input-type", &button->type))
                        button->type = EV_KEY;
 
-               button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL);
+               button->wakeup = of_property_read_bool(pp, "wakeup-source") ||
+                                /* legacy name */
+                                of_property_read_bool(pp, "gpio-key,wakeup");
 
                button->can_disable = !!of_get_property(pp, "linux,can-disable", NULL);