Input: s2mpw02-power-key: support setkeycode 14/216714/1
authorSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 31 Oct 2019 01:39:31 +0000 (10:39 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 31 Oct 2019 02:33:38 +0000 (11:33 +0900)
Add support for input_setkeycode to the s2mpw02-power-key driver
for using the udev hwdb mechanism to change keymap.

Change-Id: I581c12ae32595b04b90c4685d9fa0a6aed501f2f
Reference: 4b17f91b1677 ("Input: gpio-keys - add support for setkeycode")
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
drivers/input/keyboard/s2mpw02_key.c

index 9f85bb28b19228763116e523c259654c6b6e19be..2e63bb8be4f698210b070387cb3a065e8ef5631d 100644 (file)
@@ -67,6 +67,7 @@ struct power_button_data {
        bool key_pressed;
        bool key_state;
        u32 key_pressed_cnt;
+       unsigned short *code;
 };
 
 struct power_keys_drvdata {
@@ -76,6 +77,7 @@ struct power_keys_drvdata {
        struct input_dev *input;
        struct mutex    disable_lock;
        struct wake_lock         key_wake_lock;
+       unsigned short *keymap;
 
        struct i2c_client *pmm_i2c;
        int             irq_pwronr;
@@ -218,7 +220,7 @@ static ssize_t power_keys_attr_show_helper(struct power_keys_drvdata *ddata,
                if (only_disabled && !bdata->disabled)
                        continue;
 
-               __set_bit(bdata->button->code, bits);
+               __set_bit(*bdata->code, bits);
        }
 
        ret = scnprintf(buf, PAGE_SIZE - 1, "%*pbl", n_events, bits);
@@ -263,7 +265,7 @@ static ssize_t power_keys_attr_store_helper(struct power_keys_drvdata *ddata,
                if (bdata->button->type != type)
                        continue;
 
-               if (test_bit(bdata->button->code, bits) &&
+               if (test_bit(*bdata->code, bits) &&
                    !bdata->button->can_disable) {
                        error = -EINVAL;
                        goto out;
@@ -278,7 +280,7 @@ static ssize_t power_keys_attr_store_helper(struct power_keys_drvdata *ddata,
                if (bdata->button->type != type)
                        continue;
 
-               if (test_bit(bdata->button->code, bits))
+               if (test_bit(*bdata->code, bits))
                        power_keys_disable_button(bdata);
                else
                        power_keys_enable_button(bdata);
@@ -536,7 +538,7 @@ static void power_keys_power_report_event(struct power_button_data *bdata)
                        input_event(input, type, button->code, button->value);
        } else {
                bdata->key_state = !!state;
-               input_event(input, type, button->code, !!state);
+               input_event(input, type, *bdata->code, !!state);
        }
        input_sync(input);
 
@@ -797,6 +799,18 @@ static int power_keys_probe(struct platform_device *pdev)
        ddata->input    = input;
        ddata->pmm_i2c  = s2mpw02->pmic;
 
+       ddata->keymap = devm_kcalloc(dev,
+                                    pdata->nbuttons, sizeof(ddata->keymap[0]),
+                                    GFP_KERNEL);
+       if (!ddata->keymap) {
+               ret = -ENOMEM;
+               goto fail0;
+       }
+
+       input->keycode = ddata->keymap;
+       input->keycodesize = sizeof(ddata->keymap[0]);
+       input->keycodemax = pdata->nbuttons;
+
        mutex_init(&ddata->disable_lock);
 
        wake_lock_init(&ddata->key_wake_lock,
@@ -819,7 +833,9 @@ static int power_keys_probe(struct platform_device *pdev)
                if (button->wakeup)
                        wakeup = 1;
 
-               input_set_capability(input, button->type ?: EV_KEY, button->code);
+               bdata->code = &ddata->keymap[i];
+               *bdata->code = button->code;
+               input_set_capability(input, button->type ?: EV_KEY, *bdata->code);
        }
 
        ddata->irq_pwronr = mpdata->irq_base + S2MPW02_PMIC_IRQ_PWRONR_INT1;
@@ -900,6 +916,7 @@ ret = input_register_device(input);
        platform_set_drvdata(pdev, NULL);
  fail1:
        wake_lock_destroy(&ddata->key_wake_lock);
+ fail0:
        input_free_device(input);
        kfree(ddata);
        /* If we have no platform data, we allocated pdata dynamically. */