bool key_pressed;
bool key_state;
u32 key_pressed_cnt;
+ unsigned short *code;
};
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;
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);
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;
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);
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);
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,
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;
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. */