* Return value of this function can be used to allocate bitmap
  * large enough to hold all bits for given type.
  */
-static inline int get_n_events_by_type(int type)
+static int get_n_events_by_type(int type)
 {
        BUG_ON(type != EV_SW && type != EV_KEY);
 
        return (type == EV_KEY) ? KEY_CNT : SW_CNT;
 }
 
+/**
+ * get_bm_events_by_type() - returns bitmap of supported events per @type
+ * @input: input device from which bitmap is retrieved
+ * @type: type of button (%EV_KEY, %EV_SW)
+ *
+ * Return value of this function can be used to allocate bitmap
+ * large enough to hold all bits for given type.
+ */
+static const unsigned long *get_bm_events_by_type(struct input_dev *dev,
+                                                 int type)
+{
+       BUG_ON(type != EV_SW && type != EV_KEY);
+
+       return (type == EV_KEY) ? dev->keybit : dev->swbit;
+}
+
 /**
  * gpio_keys_disable_button() - disables given GPIO button
  * @bdata: button data for button to be disabled
                                           const char *buf, unsigned int type)
 {
        int n_events = get_n_events_by_type(type);
+       const unsigned long *bitmap = get_bm_events_by_type(ddata->input, type);
        unsigned long *bits;
        ssize_t error;
        int i;
                goto out;
 
        /* First validate */
+       if (!bitmap_subset(bits, bitmap, n_events)) {
+               error = -EINVAL;
+               goto out;
+       }
+
        for (i = 0; i < ddata->pdata->nbuttons; i++) {
                struct gpio_button_data *bdata = &ddata->data[i];
 
                }
        }
 
-       if (i == ddata->pdata->nbuttons) {
-               error = -EINVAL;
-               goto out;
-       }
-
        mutex_lock(&ddata->disable_lock);
 
        for (i = 0; i < ddata->pdata->nbuttons; i++) {