|
@@ -96,13 +96,29 @@ struct gpio_keys_drvdata {
|
|
|
* 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
|
|
@@ -213,6 +229,7 @@ static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata,
|
|
|
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;
|
|
@@ -226,6 +243,11 @@ static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata,
|
|
|
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];
|
|
|
|
|
@@ -239,11 +261,6 @@ 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++) {
|