Input: tm2-touchkey - allow specifying custom keycodes
Not all devices use the same keycodes in the same order, so add possibility to define keycodes for buttons present on actual hardware. If keycodes property is not present, we assume that device has at least MENU and BACK keys. Signed-off-by: Jonathan Bakker <xc-racer2@live.ca> Signed-off-by: Paweł Chmiel <pawel.mikolaj.chmiel@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
d5a158cec4
commit
07df1c5527
|
@ -12,6 +12,9 @@ Required properties:
|
|||
- vcc-supply : internal regulator output. 1.8V
|
||||
- vdd-supply : power supply for IC 3.3V
|
||||
|
||||
Optional properties:
|
||||
- linux,keycodes: array of keycodes (max 4), default KEY_PHONE and KEY_BACK
|
||||
|
||||
[0]: Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
|
||||
|
||||
Example:
|
||||
|
@ -25,5 +28,6 @@ Example:
|
|||
interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
|
||||
vcc-supply=<&ldo32_reg>;
|
||||
vdd-supply=<&ldo33_reg>;
|
||||
linux,keycodes = <KEY_PHONE KEY_BACK>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -35,11 +35,6 @@
|
|||
#define TM2_TOUCHKEY_LED_VOLTAGE_MIN 2500000
|
||||
#define TM2_TOUCHKEY_LED_VOLTAGE_MAX 3300000
|
||||
|
||||
enum {
|
||||
TM2_TOUCHKEY_KEY_MENU = 0x1,
|
||||
TM2_TOUCHKEY_KEY_BACK,
|
||||
};
|
||||
|
||||
struct touchkey_variant {
|
||||
u8 keycode_reg;
|
||||
u8 base_reg;
|
||||
|
@ -52,6 +47,8 @@ struct tm2_touchkey_data {
|
|||
struct regulator *vdd;
|
||||
struct regulator_bulk_data regulators[2];
|
||||
const struct touchkey_variant *variant;
|
||||
u32 keycodes[4];
|
||||
int num_keycodes;
|
||||
};
|
||||
|
||||
static const struct touchkey_variant tm2_touchkey_variant = {
|
||||
|
@ -112,7 +109,8 @@ static irqreturn_t tm2_touchkey_irq_handler(int irq, void *devid)
|
|||
{
|
||||
struct tm2_touchkey_data *touchkey = devid;
|
||||
int data;
|
||||
int key;
|
||||
int index;
|
||||
int i;
|
||||
|
||||
data = i2c_smbus_read_byte_data(touchkey->client,
|
||||
touchkey->variant->keycode_reg);
|
||||
|
@ -122,26 +120,20 @@ static irqreturn_t tm2_touchkey_irq_handler(int irq, void *devid)
|
|||
goto out;
|
||||
}
|
||||
|
||||
switch (data & TM2_TOUCHKEY_BIT_KEYCODE) {
|
||||
case TM2_TOUCHKEY_KEY_MENU:
|
||||
key = KEY_PHONE;
|
||||
break;
|
||||
|
||||
case TM2_TOUCHKEY_KEY_BACK:
|
||||
key = KEY_BACK;
|
||||
break;
|
||||
|
||||
default:
|
||||
index = (data & TM2_TOUCHKEY_BIT_KEYCODE) - 1;
|
||||
if (index < 0 || index >= touchkey->num_keycodes) {
|
||||
dev_warn(&touchkey->client->dev,
|
||||
"unhandled keycode, data %#02x\n", data);
|
||||
"invalid keycode index %d\n", index);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (data & TM2_TOUCHKEY_BIT_PRESS_EV) {
|
||||
input_report_key(touchkey->input_dev, KEY_PHONE, 0);
|
||||
input_report_key(touchkey->input_dev, KEY_BACK, 0);
|
||||
for (i = 0; i < touchkey->num_keycodes; i++)
|
||||
input_report_key(touchkey->input_dev,
|
||||
touchkey->keycodes[i], 0);
|
||||
} else {
|
||||
input_report_key(touchkey->input_dev, key, 1);
|
||||
input_report_key(touchkey->input_dev,
|
||||
touchkey->keycodes[index], 1);
|
||||
}
|
||||
|
||||
input_sync(touchkey->input_dev);
|
||||
|
@ -153,8 +145,10 @@ out:
|
|||
static int tm2_touchkey_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct device_node *np = client->dev.of_node;
|
||||
struct tm2_touchkey_data *touchkey;
|
||||
int error;
|
||||
int i;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
|
@ -184,6 +178,16 @@ static int tm2_touchkey_probe(struct i2c_client *client,
|
|||
/* Save VDD for easy access */
|
||||
touchkey->vdd = touchkey->regulators[1].consumer;
|
||||
|
||||
touchkey->num_keycodes = of_property_read_variable_u32_array(np,
|
||||
"linux,keycodes", touchkey->keycodes, 0,
|
||||
ARRAY_SIZE(touchkey->keycodes));
|
||||
if (touchkey->num_keycodes <= 0) {
|
||||
/* default keycodes */
|
||||
touchkey->keycodes[0] = KEY_PHONE;
|
||||
touchkey->keycodes[1] = KEY_BACK;
|
||||
touchkey->num_keycodes = 2;
|
||||
}
|
||||
|
||||
error = tm2_touchkey_power_enable(touchkey);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "failed to power up device: %d\n", error);
|
||||
|
@ -208,8 +212,9 @@ static int tm2_touchkey_probe(struct i2c_client *client,
|
|||
touchkey->input_dev->name = TM2_TOUCHKEY_DEV_NAME;
|
||||
touchkey->input_dev->id.bustype = BUS_I2C;
|
||||
|
||||
input_set_capability(touchkey->input_dev, EV_KEY, KEY_PHONE);
|
||||
input_set_capability(touchkey->input_dev, EV_KEY, KEY_BACK);
|
||||
for (i = 0; i < touchkey->num_keycodes; i++)
|
||||
input_set_capability(touchkey->input_dev, EV_KEY,
|
||||
touchkey->keycodes[i]);
|
||||
|
||||
error = input_register_device(touchkey->input_dev);
|
||||
if (error) {
|
||||
|
|
Loading…
Reference in New Issue