Merge tag 'v3.10.107' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / input / keyboard / mpr121_touchkey.c
index f7f3e9a9fd3f5c4b63234fd63b750f10b327afb0..e13713b7658c52482368d077bc421394e7d1e0f7 100644 (file)
@@ -88,7 +88,8 @@ static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id)
        struct mpr121_touchkey *mpr121 = dev_id;
        struct i2c_client *client = mpr121->client;
        struct input_dev *input = mpr121->input_dev;
        struct mpr121_touchkey *mpr121 = dev_id;
        struct i2c_client *client = mpr121->client;
        struct input_dev *input = mpr121->input_dev;
-       unsigned int key_num, key_val, pressed;
+       unsigned long bit_changed;
+       unsigned int key_num;
        int reg;
 
        reg = i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_1_ADDR);
        int reg;
 
        reg = i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_1_ADDR);
@@ -106,18 +107,22 @@ static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id)
 
        reg &= TOUCH_STATUS_MASK;
        /* use old press bit to figure out which bit changed */
 
        reg &= TOUCH_STATUS_MASK;
        /* use old press bit to figure out which bit changed */
-       key_num = ffs(reg ^ mpr121->statusbits) - 1;
-       pressed = reg & (1 << key_num);
+       bit_changed = reg ^ mpr121->statusbits;
        mpr121->statusbits = reg;
        mpr121->statusbits = reg;
+       for_each_set_bit(key_num, &bit_changed, mpr121->keycount) {
+               unsigned int key_val, pressed;
 
 
-       key_val = mpr121->keycodes[key_num];
+               pressed = reg & BIT(key_num);
+               key_val = mpr121->keycodes[key_num];
 
 
-       input_event(input, EV_MSC, MSC_SCAN, key_num);
-       input_report_key(input, key_val, pressed);
-       input_sync(input);
+               input_event(input, EV_MSC, MSC_SCAN, key_num);
+               input_report_key(input, key_val, pressed);
+
+               dev_dbg(&client->dev, "key %d %d %s\n", key_num, key_val,
+                       pressed ? "pressed" : "released");
 
 
-       dev_dbg(&client->dev, "key %d %d %s\n", key_num, key_val,
-               pressed ? "pressed" : "released");
+       }
+       input_sync(input);
 
 out:
        return IRQ_HANDLED;
 
 out:
        return IRQ_HANDLED;
@@ -230,6 +235,7 @@ static int mpr_touchkey_probe(struct i2c_client *client,
        input_dev->id.bustype = BUS_I2C;
        input_dev->dev.parent = &client->dev;
        input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
        input_dev->id.bustype = BUS_I2C;
        input_dev->dev.parent = &client->dev;
        input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
+       input_set_capability(input_dev, EV_MSC, MSC_SCAN);
 
        input_dev->keycode = mpr121->keycodes;
        input_dev->keycodesize = sizeof(mpr121->keycodes[0]);
 
        input_dev->keycode = mpr121->keycodes;
        input_dev->keycodesize = sizeof(mpr121->keycodes[0]);