0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/hid.h>
0011 #include <linux/input/mt.h>
0012 #include <linux/leds.h>
0013 #include <linux/module.h>
0014 #include <linux/usb.h>
0015
0016 #include "hid-ids.h"
0017
0018 #define ELAN_MT_I2C 0x5d
0019 #define ELAN_SINGLE_FINGER 0x81
0020 #define ELAN_MT_FIRST_FINGER 0x82
0021 #define ELAN_MT_SECOND_FINGER 0x83
0022 #define ELAN_INPUT_REPORT_SIZE 8
0023 #define ELAN_I2C_REPORT_SIZE 32
0024 #define ELAN_FINGER_DATA_LEN 5
0025 #define ELAN_MAX_FINGERS 5
0026 #define ELAN_MAX_PRESSURE 255
0027 #define ELAN_TP_USB_INTF 1
0028
0029 #define ELAN_FEATURE_REPORT 0x0d
0030 #define ELAN_FEATURE_SIZE 5
0031 #define ELAN_PARAM_MAX_X 6
0032 #define ELAN_PARAM_MAX_Y 7
0033 #define ELAN_PARAM_RES 8
0034
0035 #define ELAN_MUTE_LED_REPORT 0xBC
0036 #define ELAN_LED_REPORT_SIZE 8
0037
0038 #define ELAN_HAS_LED BIT(0)
0039
0040 struct elan_drvdata {
0041 struct input_dev *input;
0042 u8 prev_report[ELAN_INPUT_REPORT_SIZE];
0043 struct led_classdev mute_led;
0044 u8 mute_led_state;
0045 u16 max_x;
0046 u16 max_y;
0047 u16 res_x;
0048 u16 res_y;
0049 };
0050
0051 static int is_not_elan_touchpad(struct hid_device *hdev)
0052 {
0053 if (hid_is_usb(hdev)) {
0054 struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
0055
0056 return (intf->altsetting->desc.bInterfaceNumber !=
0057 ELAN_TP_USB_INTF);
0058 }
0059
0060 return 0;
0061 }
0062
0063 static int elan_input_mapping(struct hid_device *hdev, struct hid_input *hi,
0064 struct hid_field *field, struct hid_usage *usage,
0065 unsigned long **bit, int *max)
0066 {
0067 if (is_not_elan_touchpad(hdev))
0068 return 0;
0069
0070 if (field->report->id == ELAN_SINGLE_FINGER ||
0071 field->report->id == ELAN_MT_FIRST_FINGER ||
0072 field->report->id == ELAN_MT_SECOND_FINGER ||
0073 field->report->id == ELAN_MT_I2C)
0074 return -1;
0075
0076 return 0;
0077 }
0078
0079 static int elan_get_device_param(struct hid_device *hdev,
0080 unsigned char *dmabuf, unsigned char param)
0081 {
0082 int ret;
0083
0084 dmabuf[0] = ELAN_FEATURE_REPORT;
0085 dmabuf[1] = 0x05;
0086 dmabuf[2] = 0x03;
0087 dmabuf[3] = param;
0088 dmabuf[4] = 0x01;
0089
0090 ret = hid_hw_raw_request(hdev, ELAN_FEATURE_REPORT, dmabuf,
0091 ELAN_FEATURE_SIZE, HID_FEATURE_REPORT,
0092 HID_REQ_SET_REPORT);
0093 if (ret != ELAN_FEATURE_SIZE) {
0094 hid_err(hdev, "Set report error for parm %d: %d\n", param, ret);
0095 return ret;
0096 }
0097
0098 ret = hid_hw_raw_request(hdev, ELAN_FEATURE_REPORT, dmabuf,
0099 ELAN_FEATURE_SIZE, HID_FEATURE_REPORT,
0100 HID_REQ_GET_REPORT);
0101 if (ret != ELAN_FEATURE_SIZE) {
0102 hid_err(hdev, "Get report error for parm %d: %d\n", param, ret);
0103 return ret;
0104 }
0105
0106 return 0;
0107 }
0108
0109 static unsigned int elan_convert_res(char val)
0110 {
0111
0112
0113
0114
0115 return (val * 10 + 790) * 10 / 254;
0116 }
0117
0118 static int elan_get_device_params(struct hid_device *hdev)
0119 {
0120 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
0121 unsigned char *dmabuf;
0122 int ret;
0123
0124 dmabuf = kmalloc(ELAN_FEATURE_SIZE, GFP_KERNEL);
0125 if (!dmabuf)
0126 return -ENOMEM;
0127
0128 ret = elan_get_device_param(hdev, dmabuf, ELAN_PARAM_MAX_X);
0129 if (ret)
0130 goto err;
0131
0132 drvdata->max_x = (dmabuf[4] << 8) | dmabuf[3];
0133
0134 ret = elan_get_device_param(hdev, dmabuf, ELAN_PARAM_MAX_Y);
0135 if (ret)
0136 goto err;
0137
0138 drvdata->max_y = (dmabuf[4] << 8) | dmabuf[3];
0139
0140 ret = elan_get_device_param(hdev, dmabuf, ELAN_PARAM_RES);
0141 if (ret)
0142 goto err;
0143
0144 drvdata->res_x = elan_convert_res(dmabuf[3]);
0145 drvdata->res_y = elan_convert_res(dmabuf[4]);
0146
0147 err:
0148 kfree(dmabuf);
0149 return ret;
0150 }
0151
0152 static int elan_input_configured(struct hid_device *hdev, struct hid_input *hi)
0153 {
0154 int ret;
0155 struct input_dev *input;
0156 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
0157
0158 if (is_not_elan_touchpad(hdev))
0159 return 0;
0160
0161 ret = elan_get_device_params(hdev);
0162 if (ret)
0163 return ret;
0164
0165 input = devm_input_allocate_device(&hdev->dev);
0166 if (!input)
0167 return -ENOMEM;
0168
0169 input->name = "Elan Touchpad";
0170 input->phys = hdev->phys;
0171 input->uniq = hdev->uniq;
0172 input->id.bustype = hdev->bus;
0173 input->id.vendor = hdev->vendor;
0174 input->id.product = hdev->product;
0175 input->id.version = hdev->version;
0176 input->dev.parent = &hdev->dev;
0177
0178 input_set_abs_params(input, ABS_MT_POSITION_X, 0, drvdata->max_x,
0179 0, 0);
0180 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, drvdata->max_y,
0181 0, 0);
0182 input_set_abs_params(input, ABS_MT_PRESSURE, 0, ELAN_MAX_PRESSURE,
0183 0, 0);
0184
0185 __set_bit(BTN_LEFT, input->keybit);
0186 __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
0187
0188 ret = input_mt_init_slots(input, ELAN_MAX_FINGERS, INPUT_MT_POINTER);
0189 if (ret) {
0190 hid_err(hdev, "Failed to init elan MT slots: %d\n", ret);
0191 return ret;
0192 }
0193
0194 input_abs_set_res(input, ABS_X, drvdata->res_x);
0195 input_abs_set_res(input, ABS_Y, drvdata->res_y);
0196
0197 ret = input_register_device(input);
0198 if (ret) {
0199 hid_err(hdev, "Failed to register elan input device: %d\n",
0200 ret);
0201 input_mt_destroy_slots(input);
0202 return ret;
0203 }
0204
0205 drvdata->input = input;
0206
0207 return 0;
0208 }
0209
0210 static void elan_report_mt_slot(struct elan_drvdata *drvdata, u8 *data,
0211 unsigned int slot_num)
0212 {
0213 struct input_dev *input = drvdata->input;
0214 int x, y, p;
0215
0216 bool active = !!data;
0217
0218 input_mt_slot(input, slot_num);
0219 input_mt_report_slot_state(input, MT_TOOL_FINGER, active);
0220 if (active) {
0221 x = ((data[0] & 0xF0) << 4) | data[1];
0222 y = drvdata->max_y -
0223 (((data[0] & 0x07) << 8) | data[2]);
0224 p = data[4];
0225
0226 input_report_abs(input, ABS_MT_POSITION_X, x);
0227 input_report_abs(input, ABS_MT_POSITION_Y, y);
0228 input_report_abs(input, ABS_MT_PRESSURE, p);
0229 }
0230 }
0231
0232 static void elan_usb_report_input(struct elan_drvdata *drvdata, u8 *data)
0233 {
0234 int i;
0235 struct input_dev *input = drvdata->input;
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272 if (data[0] == ELAN_SINGLE_FINGER) {
0273 for (i = 0; i < ELAN_MAX_FINGERS; i++) {
0274 if (data[2] & BIT(i + 3))
0275 elan_report_mt_slot(drvdata, data + 3, i);
0276 else
0277 elan_report_mt_slot(drvdata, NULL, i);
0278 }
0279 input_report_key(input, BTN_LEFT, data[2] & 0x01);
0280 }
0281
0282
0283
0284
0285
0286
0287 if (data[0] == ELAN_MT_FIRST_FINGER) {
0288 memcpy(drvdata->prev_report, data,
0289 sizeof(drvdata->prev_report));
0290 return;
0291 }
0292
0293 if (data[0] == ELAN_MT_SECOND_FINGER) {
0294 int first = 0;
0295 u8 *prev_report = drvdata->prev_report;
0296
0297 if (prev_report[0] != ELAN_MT_FIRST_FINGER)
0298 return;
0299
0300 for (i = 0; i < ELAN_MAX_FINGERS; i++) {
0301 if (prev_report[2] & BIT(i + 3)) {
0302 if (!first) {
0303 first = 1;
0304 elan_report_mt_slot(drvdata, prev_report + 3, i);
0305 } else {
0306 elan_report_mt_slot(drvdata, data + 1, i);
0307 }
0308 } else {
0309 elan_report_mt_slot(drvdata, NULL, i);
0310 }
0311 }
0312 input_report_key(input, BTN_LEFT, prev_report[2] & 0x01);
0313 }
0314
0315 input_mt_sync_frame(input);
0316 input_sync(input);
0317 }
0318
0319 static void elan_i2c_report_input(struct elan_drvdata *drvdata, u8 *data)
0320 {
0321 struct input_dev *input = drvdata->input;
0322 u8 *finger_data;
0323 int i;
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344 finger_data = data + 2;
0345 for (i = 0; i < ELAN_MAX_FINGERS; i++) {
0346 if (data[1] & BIT(i + 3)) {
0347 elan_report_mt_slot(drvdata, finger_data, i);
0348 finger_data += ELAN_FINGER_DATA_LEN;
0349 } else {
0350 elan_report_mt_slot(drvdata, NULL, i);
0351 }
0352 }
0353
0354 input_report_key(input, BTN_LEFT, data[1] & 0x01);
0355 input_mt_sync_frame(input);
0356 input_sync(input);
0357 }
0358
0359 static int elan_raw_event(struct hid_device *hdev,
0360 struct hid_report *report, u8 *data, int size)
0361 {
0362 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
0363
0364 if (is_not_elan_touchpad(hdev))
0365 return 0;
0366
0367 if (data[0] == ELAN_SINGLE_FINGER ||
0368 data[0] == ELAN_MT_FIRST_FINGER ||
0369 data[0] == ELAN_MT_SECOND_FINGER) {
0370 if (size == ELAN_INPUT_REPORT_SIZE) {
0371 elan_usb_report_input(drvdata, data);
0372 return 1;
0373 }
0374 }
0375
0376 if (data[0] == ELAN_MT_I2C && size == ELAN_I2C_REPORT_SIZE) {
0377 elan_i2c_report_input(drvdata, data);
0378 return 1;
0379 }
0380
0381 return 0;
0382 }
0383
0384 static int elan_start_multitouch(struct hid_device *hdev)
0385 {
0386 int ret;
0387
0388
0389
0390
0391
0392 static const unsigned char buf[] = { 0x0D, 0x00, 0x03, 0x21, 0x00 };
0393 unsigned char *dmabuf = kmemdup(buf, sizeof(buf), GFP_KERNEL);
0394
0395 if (!dmabuf)
0396 return -ENOMEM;
0397
0398 ret = hid_hw_raw_request(hdev, dmabuf[0], dmabuf, sizeof(buf),
0399 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
0400
0401 kfree(dmabuf);
0402
0403 if (ret != sizeof(buf)) {
0404 hid_err(hdev, "Failed to start multitouch: %d\n", ret);
0405 return ret;
0406 }
0407
0408 return 0;
0409 }
0410
0411 static int elan_mute_led_set_brigtness(struct led_classdev *led_cdev,
0412 enum led_brightness value)
0413 {
0414 int ret;
0415 u8 led_state;
0416 struct device *dev = led_cdev->dev->parent;
0417 struct hid_device *hdev = to_hid_device(dev);
0418 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
0419
0420 unsigned char *dmabuf = kzalloc(ELAN_LED_REPORT_SIZE, GFP_KERNEL);
0421
0422 if (!dmabuf)
0423 return -ENOMEM;
0424
0425 led_state = !!value;
0426
0427 dmabuf[0] = ELAN_MUTE_LED_REPORT;
0428 dmabuf[1] = 0x02;
0429 dmabuf[2] = led_state;
0430
0431 ret = hid_hw_raw_request(hdev, dmabuf[0], dmabuf, ELAN_LED_REPORT_SIZE,
0432 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
0433
0434 kfree(dmabuf);
0435
0436 if (ret != ELAN_LED_REPORT_SIZE) {
0437 if (ret != -ENODEV)
0438 hid_err(hdev, "Failed to set mute led brightness: %d\n", ret);
0439 return ret < 0 ? ret : -EIO;
0440 }
0441
0442 drvdata->mute_led_state = led_state;
0443 return 0;
0444 }
0445
0446 static int elan_init_mute_led(struct hid_device *hdev)
0447 {
0448 struct elan_drvdata *drvdata = hid_get_drvdata(hdev);
0449 struct led_classdev *mute_led = &drvdata->mute_led;
0450
0451 mute_led->name = "elan:red:mute";
0452 mute_led->default_trigger = "audio-mute";
0453 mute_led->brightness_set_blocking = elan_mute_led_set_brigtness;
0454 mute_led->max_brightness = LED_ON;
0455 mute_led->flags = LED_HW_PLUGGABLE;
0456 mute_led->dev = &hdev->dev;
0457
0458 return devm_led_classdev_register(&hdev->dev, mute_led);
0459 }
0460
0461 static int elan_probe(struct hid_device *hdev, const struct hid_device_id *id)
0462 {
0463 int ret;
0464 struct elan_drvdata *drvdata;
0465
0466 drvdata = devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL);
0467
0468 if (!drvdata)
0469 return -ENOMEM;
0470
0471 hid_set_drvdata(hdev, drvdata);
0472
0473 ret = hid_parse(hdev);
0474 if (ret) {
0475 hid_err(hdev, "Hid Parse failed\n");
0476 return ret;
0477 }
0478
0479 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
0480 if (ret) {
0481 hid_err(hdev, "Hid hw start failed\n");
0482 return ret;
0483 }
0484
0485 if (is_not_elan_touchpad(hdev))
0486 return 0;
0487
0488 if (!drvdata->input) {
0489 hid_err(hdev, "Input device is not registered\n");
0490 ret = -ENAVAIL;
0491 goto err;
0492 }
0493
0494 ret = elan_start_multitouch(hdev);
0495 if (ret)
0496 goto err;
0497
0498 if (id->driver_data & ELAN_HAS_LED) {
0499 ret = elan_init_mute_led(hdev);
0500 if (ret)
0501 goto err;
0502 }
0503
0504 return 0;
0505 err:
0506 hid_hw_stop(hdev);
0507 return ret;
0508 }
0509
0510 static void elan_remove(struct hid_device *hdev)
0511 {
0512 hid_hw_stop(hdev);
0513 }
0514
0515 static const struct hid_device_id elan_devices[] = {
0516 { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_HP_X2),
0517 .driver_data = ELAN_HAS_LED },
0518 { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_HP_X2_10_COVER),
0519 .driver_data = ELAN_HAS_LED },
0520 { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_TOSHIBA_CLICK_L9W) },
0521 { }
0522 };
0523 MODULE_DEVICE_TABLE(hid, elan_devices);
0524
0525 static struct hid_driver elan_driver = {
0526 .name = "elan",
0527 .id_table = elan_devices,
0528 .input_mapping = elan_input_mapping,
0529 .input_configured = elan_input_configured,
0530 .raw_event = elan_raw_event,
0531 .probe = elan_probe,
0532 .remove = elan_remove,
0533 };
0534
0535 module_hid_driver(elan_driver);
0536
0537 MODULE_LICENSE("GPL");
0538 MODULE_AUTHOR("Alexandrov Stanislav");
0539 MODULE_DESCRIPTION("Driver for HID ELAN Touchpads");