Lines Matching refs:wacom
42 static void wacom_update_led(struct wacom *wacom, int button_count, int mask,
82 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_notify_battery() local
84 __wacom_notify_battery(&wacom->battery, bat_status, bat_capacity, in wacom_notify_battery()
88 static int wacom_penpartner_irq(struct wacom_wac *wacom) in wacom_penpartner_irq() argument
90 unsigned char *data = wacom->data; in wacom_penpartner_irq()
91 struct input_dev *input = wacom->pen_input; in wacom_penpartner_irq()
96 wacom->tool[0] = (data[5] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; in wacom_penpartner_irq()
97 wacom->id[0] = (data[5] & 0x20) ? ERASER_DEVICE_ID : STYLUS_DEVICE_ID; in wacom_penpartner_irq()
98 input_report_key(input, wacom->tool[0], 1); in wacom_penpartner_irq()
99 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ in wacom_penpartner_irq()
106 input_report_key(input, wacom->tool[0], 0); in wacom_penpartner_irq()
132 static int wacom_pl_irq(struct wacom_wac *wacom) in wacom_pl_irq() argument
134 struct wacom_features *features = &wacom->features; in wacom_pl_irq()
135 unsigned char *data = wacom->data; in wacom_pl_irq()
136 struct input_dev *input = wacom->pen_input; in wacom_pl_irq()
147 if (!wacom->id[0]) { in wacom_pl_irq()
149 wacom->tool[0] = BTN_TOOL_RUBBER; in wacom_pl_irq()
150 wacom->id[0] = ERASER_DEVICE_ID; in wacom_pl_irq()
153 wacom->tool[0] = BTN_TOOL_PEN; in wacom_pl_irq()
154 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_pl_irq()
162 if (wacom->tool[0] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) { in wacom_pl_irq()
166 wacom->tool[0] = BTN_TOOL_PEN; in wacom_pl_irq()
167 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_pl_irq()
183 input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20)); in wacom_pl_irq()
187 wacom->id[0] = 0; in wacom_pl_irq()
188 input_report_key(input, wacom->tool[0], prox); in wacom_pl_irq()
189 input_report_abs(input, ABS_MISC, wacom->id[0]); in wacom_pl_irq()
193 static int wacom_ptu_irq(struct wacom_wac *wacom) in wacom_ptu_irq() argument
195 unsigned char *data = wacom->data; in wacom_ptu_irq()
196 struct input_dev *input = wacom->pen_input; in wacom_ptu_irq()
207 wacom->id[0] = ERASER_DEVICE_ID; in wacom_ptu_irq()
211 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_ptu_irq()
213 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ in wacom_ptu_irq()
222 static int wacom_dtu_irq(struct wacom_wac *wacom) in wacom_dtu_irq() argument
224 unsigned char *data = wacom->data; in wacom_dtu_irq()
225 struct input_dev *input = wacom->pen_input; in wacom_dtu_irq()
233 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; in wacom_dtu_irq()
234 if (wacom->tool[0] == BTN_TOOL_PEN) in wacom_dtu_irq()
235 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_dtu_irq()
237 wacom->id[0] = ERASER_DEVICE_ID; in wacom_dtu_irq()
246 wacom->id[0] = 0; in wacom_dtu_irq()
247 input_report_key(input, wacom->tool[0], prox); in wacom_dtu_irq()
248 input_report_abs(input, ABS_MISC, wacom->id[0]); in wacom_dtu_irq()
252 static int wacom_dtus_irq(struct wacom_wac *wacom) in wacom_dtus_irq() argument
254 unsigned char *data = wacom->data; in wacom_dtus_irq()
255 struct input_dev *input = wacom->pen_input; in wacom_dtus_irq()
263 input = wacom->pad_input; in wacom_dtus_irq()
276 wacom->tool[0] = BTN_TOOL_RUBBER; in wacom_dtus_irq()
277 wacom->id[0] = ERASER_DEVICE_ID; in wacom_dtus_irq()
281 wacom->tool[0] = BTN_TOOL_PEN; in wacom_dtus_irq()
282 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_dtus_irq()
296 wacom->id[0] = 0; in wacom_dtus_irq()
297 input_report_key(input, wacom->tool[0], prox); in wacom_dtus_irq()
298 input_report_abs(input, ABS_MISC, wacom->id[0]); in wacom_dtus_irq()
303 static int wacom_graphire_irq(struct wacom_wac *wacom) in wacom_graphire_irq() argument
305 struct wacom_features *features = &wacom->features; in wacom_graphire_irq()
306 unsigned char *data = wacom->data; in wacom_graphire_irq()
307 struct input_dev *input = wacom->pen_input; in wacom_graphire_irq()
308 struct input_dev *pad_input = wacom->pad_input; in wacom_graphire_irq()
328 if (prox || wacom->id[0]) { in wacom_graphire_irq()
333 wacom->tool[0] = BTN_TOOL_PEN; in wacom_graphire_irq()
334 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_graphire_irq()
338 wacom->tool[0] = BTN_TOOL_RUBBER; in wacom_graphire_irq()
339 wacom->id[0] = ERASER_DEVICE_ID; in wacom_graphire_irq()
347 wacom->tool[0] = BTN_TOOL_MOUSE; in wacom_graphire_irq()
348 wacom->id[0] = CURSOR_DEVICE_ID; in wacom_graphire_irq()
354 if (wacom->tool[0] != BTN_TOOL_MOUSE) { in wacom_graphire_irq()
393 wacom->id[0] = 0; in wacom_graphire_irq()
394 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ in wacom_graphire_irq()
395 input_report_key(input, wacom->tool[0], prox); in wacom_graphire_irq()
403 if (prox || wacom->id[1]) { in wacom_graphire_irq()
404 wacom->id[1] = PAD_DEVICE_ID; in wacom_graphire_irq()
410 wacom->id[1] = 0; in wacom_graphire_irq()
411 input_report_abs(pad_input, ABS_MISC, wacom->id[1]); in wacom_graphire_irq()
418 if (prox || wacom->id[1]) { in wacom_graphire_irq()
419 wacom->id[1] = PAD_DEVICE_ID; in wacom_graphire_irq()
426 wacom->id[1] = 0; in wacom_graphire_irq()
427 input_report_abs(pad_input, ABS_MISC, wacom->id[1]); in wacom_graphire_irq()
433 if (prox || wacom->id[1]) { in wacom_graphire_irq()
434 wacom->id[1] = PAD_DEVICE_ID; in wacom_graphire_irq()
438 wacom->id[1] = 0; in wacom_graphire_irq()
439 input_report_abs(pad_input, ABS_MISC, wacom->id[1]); in wacom_graphire_irq()
450 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_graphire_irq()
460 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_intuos_schedule_prox_event() local
465 re = &(wacom->hdev->report_enum[HID_FEATURE_REPORT]); in wacom_intuos_schedule_prox_event()
471 hid_hw_request(wacom->hdev, r, HID_REQ_GET_REPORT); in wacom_intuos_schedule_prox_event()
475 static int wacom_intuos_pad(struct wacom_wac *wacom) in wacom_intuos_pad() argument
477 struct wacom_features *features = &wacom->features; in wacom_intuos_pad()
478 unsigned char *data = wacom->data; in wacom_intuos_pad()
479 struct input_dev *input = wacom->pad_input; in wacom_intuos_pad()
523 wacom->shared->is_touch_on = in wacom_intuos_pad()
524 !wacom->shared->is_touch_on; in wacom_intuos_pad()
538 wacom->shared->is_touch_on = in wacom_intuos_pad()
539 !wacom->shared->is_touch_on; in wacom_intuos_pad()
615 if (wacom->shared && wacom->shared->touch_input) { in wacom_intuos_pad()
616 input_report_switch(wacom->shared->touch_input, in wacom_intuos_pad()
618 !wacom->shared->is_touch_on); in wacom_intuos_pad()
619 input_sync(wacom->shared->touch_input); in wacom_intuos_pad()
628 input_report_key(input, wacom->tool[1], prox ? 1 : 0); in wacom_intuos_pad()
729 static void wacom_exit_report(struct wacom_wac *wacom) in wacom_exit_report() argument
731 struct input_dev *input = wacom->pen_input; in wacom_exit_report()
732 struct wacom_features *features = &wacom->features; in wacom_exit_report()
733 unsigned char *data = wacom->data; in wacom_exit_report()
745 if (wacom->tool[idx] >= BTN_TOOL_MOUSE) { in wacom_exit_report()
762 input_report_key(input, wacom->tool[idx], 0); in wacom_exit_report()
764 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]); in wacom_exit_report()
765 wacom->id[idx] = 0; in wacom_exit_report()
768 static int wacom_intuos_inout(struct wacom_wac *wacom) in wacom_intuos_inout() argument
770 struct wacom_features *features = &wacom->features; in wacom_intuos_inout()
771 unsigned char *data = wacom->data; in wacom_intuos_inout()
772 struct input_dev *input = wacom->pen_input; in wacom_intuos_inout()
783 wacom->serial[idx] = ((data[3] & 0x0f) << 28) + in wacom_intuos_inout()
787 wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) | in wacom_intuos_inout()
790 wacom->tool[idx] = wacom_intuos_get_tool_type(wacom->id[idx]); in wacom_intuos_inout()
792 wacom->shared->stylus_in_proximity = true; in wacom_intuos_inout()
799 wacom->shared->stylus_in_proximity = true; in wacom_intuos_inout()
802 if (wacom->reporting_data) { in wacom_intuos_inout()
805 input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max); in wacom_intuos_inout()
813 wacom->shared->stylus_in_proximity = false; in wacom_intuos_inout()
814 wacom->reporting_data = false; in wacom_intuos_inout()
817 if (!wacom->id[idx]) in wacom_intuos_inout()
820 wacom_exit_report(wacom); in wacom_intuos_inout()
827 static inline bool report_touch_events(struct wacom_wac *wacom) in report_touch_events() argument
829 return (touch_arbitration ? !wacom->shared->stylus_in_proximity : 1); in report_touch_events()
832 static inline bool delay_pen_events(struct wacom_wac *wacom) in delay_pen_events() argument
834 return (wacom->shared->touch_down && touch_arbitration); in delay_pen_events()
837 static int wacom_intuos_general(struct wacom_wac *wacom) in wacom_intuos_general() argument
839 struct wacom_features *features = &wacom->features; in wacom_intuos_general()
840 unsigned char *data = wacom->data; in wacom_intuos_general()
841 struct input_dev *input = wacom->pen_input; in wacom_intuos_general()
850 if (delay_pen_events(wacom)) in wacom_intuos_general()
854 if (!wacom->id[idx]) { in wacom_intuos_general()
856 wacom_intuos_schedule_prox_event(wacom); in wacom_intuos_general()
864 if ((!((wacom->id[idx] >> 16) & 0x01) && in wacom_intuos_general()
867 (wacom->tool[idx] == BTN_TOOL_LENS && in wacom_intuos_general()
967 if (wacom->tool[idx] == BTN_TOOL_MOUSE) { in wacom_intuos_general()
981 else if (wacom->tool[idx] == BTN_TOOL_LENS) { in wacom_intuos_general()
1003 wacom_intuos_id_mangle(wacom->id[idx])); /* report tool id */ in wacom_intuos_general()
1004 input_report_key(input, wacom->tool[idx], 1); in wacom_intuos_general()
1005 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]); in wacom_intuos_general()
1006 wacom->reporting_data = true; in wacom_intuos_general()
1010 static int wacom_intuos_irq(struct wacom_wac *wacom) in wacom_intuos_irq() argument
1012 unsigned char *data = wacom->data; in wacom_intuos_irq()
1013 struct input_dev *input = wacom->pen_input; in wacom_intuos_irq()
1030 result = wacom_intuos_pad(wacom); in wacom_intuos_irq()
1035 result = wacom_intuos_inout(wacom); in wacom_intuos_irq()
1040 result = wacom_intuos_general(wacom); in wacom_intuos_irq()
1051 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_remote_irq() local
1052 struct wacom_remote *remote = wacom->remote; in wacom_remote_irq()
1059 hid_dbg(wacom->hdev, "%s: received unknown report #%d", in wacom_remote_irq()
1124 wacom->led.groups[i].select = touch_ring_mode; in wacom_remote_irq()
1138 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_remote_status_irq() local
1140 struct wacom_remote *remote = wacom->remote; in wacom_remote_status_irq()
1164 hid_err(wacom->hdev, "Can't queue Remote status event.\n"); in wacom_remote_status_irq()
1181 static void wacom_intuos_bt_process_data(struct wacom_wac *wacom, in wacom_intuos_bt_process_data() argument
1184 memcpy(wacom->data, data, 10); in wacom_intuos_bt_process_data()
1185 wacom_intuos_irq(wacom); in wacom_intuos_bt_process_data()
1187 input_sync(wacom->pen_input); in wacom_intuos_bt_process_data()
1188 if (wacom->pad_input) in wacom_intuos_bt_process_data()
1189 input_sync(wacom->pad_input); in wacom_intuos_bt_process_data()
1192 static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len) in wacom_intuos_bt_irq() argument
1198 memcpy(data, wacom->data, len); in wacom_intuos_bt_irq()
1202 wacom_intuos_bt_process_data(wacom, data + i); in wacom_intuos_bt_irq()
1206 wacom_intuos_bt_process_data(wacom, data + i); in wacom_intuos_bt_irq()
1208 wacom_intuos_bt_process_data(wacom, data + i); in wacom_intuos_bt_irq()
1214 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_intuos_bt_irq()
1220 dev_dbg(wacom->pen_input->dev.parent, in wacom_intuos_bt_irq()
1228 static int wacom_wac_finger_count_touches(struct wacom_wac *wacom) in wacom_wac_finger_count_touches() argument
1230 struct input_dev *input = wacom->touch_input; in wacom_wac_finger_count_touches()
1231 unsigned touch_max = wacom->features.touch_max; in wacom_wac_finger_count_touches()
1240 report_touch_events(wacom); in wacom_wac_finger_count_touches()
1252 static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_pen() argument
1256 struct input_dev *pen_input = wacom->pen_input; in wacom_intuos_pro2_bt_pen()
1257 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_pen()
1260 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_pen()
1261 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_pen()
1262 wacom->serial[0] = get_unaligned_le64(&data[99]); in wacom_intuos_pro2_bt_pen()
1263 wacom->id[0] = get_unaligned_le16(&data[107]); in wacom_intuos_pro2_bt_pen()
1267 wacom->serial[0] = get_unaligned_le64(&data[33]); in wacom_intuos_pro2_bt_pen()
1268 wacom->id[0] = get_unaligned_le16(&data[41]); in wacom_intuos_pro2_bt_pen()
1273 if (wacom->serial[0] >> 52 == 1) { in wacom_intuos_pro2_bt_pen()
1275 wacom->id[0] |= (wacom->serial[0] >> 32) & 0xFFFFF; in wacom_intuos_pro2_bt_pen()
1289 wacom->shared->stylus_in_proximity = false; in wacom_intuos_pro2_bt_pen()
1290 wacom_exit_report(wacom); in wacom_intuos_pro2_bt_pen()
1293 wacom->tool[0] = 0; in wacom_intuos_pro2_bt_pen()
1294 wacom->id[0] = 0; in wacom_intuos_pro2_bt_pen()
1295 wacom->serial[0] = 0; in wacom_intuos_pro2_bt_pen()
1300 if (!wacom->tool[0]) { /* first in range */ in wacom_intuos_pro2_bt_pen()
1303 wacom->tool[0] = BTN_TOOL_RUBBER; in wacom_intuos_pro2_bt_pen()
1304 else if (wacom->id[0]) in wacom_intuos_pro2_bt_pen()
1305 wacom->tool[0] = wacom_intuos_get_tool_type(wacom->id[0]); in wacom_intuos_pro2_bt_pen()
1307 wacom->tool[0] = BTN_TOOL_PEN; in wacom_intuos_pro2_bt_pen()
1313 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_pen()
1314 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_pen()
1332 if (wacom->tool[0]) { in wacom_intuos_pro2_bt_pen()
1334 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_pen()
1335 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_pen()
1337 range ? frame[13] : wacom->features.distance_max); in wacom_intuos_pro2_bt_pen()
1340 range ? frame[7] : wacom->features.distance_max); in wacom_intuos_pro2_bt_pen()
1347 input_report_key(pen_input, wacom->tool[0], prox); in wacom_intuos_pro2_bt_pen()
1348 input_event(pen_input, EV_MSC, MSC_SERIAL, wacom->serial[0]); in wacom_intuos_pro2_bt_pen()
1350 wacom_intuos_id_mangle(wacom->id[0])); /* report tool id */ in wacom_intuos_pro2_bt_pen()
1353 wacom->shared->stylus_in_proximity = prox; in wacom_intuos_pro2_bt_pen()
1359 static void wacom_intuos_pro2_bt_touch(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_touch() argument
1365 struct input_dev *touch_input = wacom->touch_input; in wacom_intuos_pro2_bt_touch()
1366 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_touch()
1383 wacom->num_contacts_left = current_num_contacts; in wacom_intuos_pro2_bt_touch()
1385 contacts_to_send = min(num_contacts_left, wacom->num_contacts_left); in wacom_intuos_pro2_bt_touch()
1409 wacom->num_contacts_left -= contacts_to_send; in wacom_intuos_pro2_bt_touch()
1410 if (wacom->num_contacts_left <= 0) { in wacom_intuos_pro2_bt_touch()
1411 wacom->num_contacts_left = 0; in wacom_intuos_pro2_bt_touch()
1412 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_intuos_pro2_bt_touch()
1417 if (wacom->num_contacts_left == 0) { in wacom_intuos_pro2_bt_touch()
1426 static void wacom_intuos_pro2_bt_pad(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_pad() argument
1428 struct input_dev *pad_input = wacom->pad_input; in wacom_intuos_pro2_bt_pad()
1429 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_pad()
1446 input_report_key(pad_input, wacom->tool[1], prox ? 1 : 0); in wacom_intuos_pro2_bt_pad()
1453 static void wacom_intuos_pro2_bt_battery(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_battery() argument
1455 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_battery()
1460 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_intuos_pro2_bt_battery()
1464 static void wacom_intuos_gen3_bt_pad(struct wacom_wac *wacom) in wacom_intuos_gen3_bt_pad() argument
1466 struct input_dev *pad_input = wacom->pad_input; in wacom_intuos_gen3_bt_pad()
1467 unsigned char *data = wacom->data; in wacom_intuos_gen3_bt_pad()
1473 input_report_key(pad_input, wacom->tool[1], buttons ? 1 : 0); in wacom_intuos_gen3_bt_pad()
1480 static void wacom_intuos_gen3_bt_battery(struct wacom_wac *wacom) in wacom_intuos_gen3_bt_battery() argument
1482 unsigned char *data = wacom->data; in wacom_intuos_gen3_bt_battery()
1487 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_intuos_gen3_bt_battery()
1491 static int wacom_intuos_pro2_bt_irq(struct wacom_wac *wacom, size_t len) in wacom_intuos_pro2_bt_irq() argument
1493 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_irq()
1496 dev_dbg(wacom->pen_input->dev.parent, in wacom_intuos_pro2_bt_irq()
1501 wacom_intuos_pro2_bt_pen(wacom); in wacom_intuos_pro2_bt_irq()
1502 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_irq()
1503 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_irq()
1504 wacom_intuos_pro2_bt_touch(wacom); in wacom_intuos_pro2_bt_irq()
1505 wacom_intuos_pro2_bt_pad(wacom); in wacom_intuos_pro2_bt_irq()
1506 wacom_intuos_pro2_bt_battery(wacom); in wacom_intuos_pro2_bt_irq()
1508 wacom_intuos_gen3_bt_pad(wacom); in wacom_intuos_pro2_bt_irq()
1509 wacom_intuos_gen3_bt_battery(wacom); in wacom_intuos_pro2_bt_irq()
1514 static int wacom_24hdt_irq(struct wacom_wac *wacom) in wacom_24hdt_irq() argument
1516 struct input_dev *input = wacom->touch_input; in wacom_24hdt_irq()
1517 unsigned char *data = wacom->data; in wacom_24hdt_irq()
1525 if (wacom->shared->has_mute_touch_switch && in wacom_24hdt_irq()
1526 !wacom->shared->is_touch_on) { in wacom_24hdt_irq()
1527 if (!wacom->shared->touch_down) in wacom_24hdt_irq()
1531 if (wacom->features.type == WACOM_27QHDT) { in wacom_24hdt_irq()
1543 wacom->num_contacts_left = current_num_contacts; in wacom_24hdt_irq()
1545 contacts_to_send = min(num_contacts_left, wacom->num_contacts_left); in wacom_24hdt_irq()
1549 bool touch = (data[offset] & 0x1) && report_touch_events(wacom); in wacom_24hdt_irq()
1564 if (wacom->features.type != WACOM_27QHDT) { in wacom_24hdt_irq()
1580 wacom->num_contacts_left -= contacts_to_send; in wacom_24hdt_irq()
1581 if (wacom->num_contacts_left <= 0) { in wacom_24hdt_irq()
1582 wacom->num_contacts_left = 0; in wacom_24hdt_irq()
1583 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_24hdt_irq()
1588 static int wacom_mt_touch(struct wacom_wac *wacom) in wacom_mt_touch() argument
1590 struct input_dev *input = wacom->touch_input; in wacom_mt_touch()
1591 unsigned char *data = wacom->data; in wacom_mt_touch()
1598 if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B) in wacom_mt_touch()
1606 wacom->num_contacts_left = current_num_contacts; in wacom_mt_touch()
1609 contacts_to_send = min(5, wacom->num_contacts_left); in wacom_mt_touch()
1613 bool touch = (data[offset] & 0x1) && report_touch_events(wacom); in wacom_mt_touch()
1631 wacom->num_contacts_left -= contacts_to_send; in wacom_mt_touch()
1632 if (wacom->num_contacts_left <= 0) { in wacom_mt_touch()
1633 wacom->num_contacts_left = 0; in wacom_mt_touch()
1634 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_mt_touch()
1639 static int wacom_tpc_mt_touch(struct wacom_wac *wacom) in wacom_tpc_mt_touch() argument
1641 struct input_dev *input = wacom->touch_input; in wacom_tpc_mt_touch()
1642 unsigned char *data = wacom->data; in wacom_tpc_mt_touch()
1647 bool touch = p && report_touch_events(wacom); in wacom_tpc_mt_touch()
1662 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_tpc_mt_touch()
1667 static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) in wacom_tpc_single_touch() argument
1669 unsigned char *data = wacom->data; in wacom_tpc_single_touch()
1670 struct input_dev *input = wacom->touch_input; in wacom_tpc_single_touch()
1671 bool prox = report_touch_events(wacom); in wacom_tpc_single_touch()
1674 if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG) in wacom_tpc_single_touch()
1698 wacom->shared->touch_down = prox; in wacom_tpc_single_touch()
1703 static int wacom_tpc_pen(struct wacom_wac *wacom) in wacom_tpc_pen() argument
1705 unsigned char *data = wacom->data; in wacom_tpc_pen()
1706 struct input_dev *input = wacom->pen_input; in wacom_tpc_pen()
1709 if (!wacom->shared->stylus_in_proximity) /* first in prox */ in wacom_tpc_pen()
1711 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; in wacom_tpc_pen()
1714 wacom->shared->stylus_in_proximity = prox; in wacom_tpc_pen()
1719 if (!delay_pen_events(wacom)) { in wacom_tpc_pen()
1726 input_report_key(input, wacom->tool[0], prox); in wacom_tpc_pen()
1733 static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) in wacom_tpc_irq() argument
1735 unsigned char *data = wacom->data; in wacom_tpc_irq()
1737 if (wacom->pen_input) { in wacom_tpc_irq()
1738 dev_dbg(wacom->pen_input->dev.parent, in wacom_tpc_irq()
1743 return wacom_tpc_pen(wacom); in wacom_tpc_irq()
1745 else if (wacom->touch_input) { in wacom_tpc_irq()
1746 dev_dbg(wacom->touch_input->dev.parent, in wacom_tpc_irq()
1751 return wacom_tpc_single_touch(wacom, len); in wacom_tpc_irq()
1754 return wacom_tpc_mt_touch(wacom); in wacom_tpc_irq()
1762 return wacom_tpc_single_touch(wacom, len); in wacom_tpc_irq()
1766 return wacom_mt_touch(wacom); in wacom_tpc_irq()
1836 struct wacom *wacom = input_get_drvdata(input); in wacom_map_usage() local
1837 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_map_usage()
1883 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_battery_usage_mapping() local
1884 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_battery_usage_mapping()
1900 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_battery_event() local
1901 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_battery_event()
1940 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_battery_report() local
1941 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_battery_report()
1959 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_usage_mapping() local
1960 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_usage_mapping()
2066 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_event() local
2067 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_event()
2140 wacom_schedule_work(&wacom->wacom_wac, WACOM_WORKER_MODE_CHANGE); in wacom_wac_pad_event()
2145 for (i = 0; i < wacom->led.count; i++) in wacom_wac_pad_event()
2146 wacom_update_led(wacom, features->numbered_buttons, in wacom_wac_pad_event()
2164 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_pre_report() local
2165 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_pre_report()
2173 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_report() local
2174 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_report()
2190 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_usage_mapping() local
2191 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_usage_mapping()
2269 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_event() local
2270 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_event()
2397 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_pre_report() local
2398 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_pre_report()
2407 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_report() local
2408 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_report()
2473 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_usage_mapping() local
2474 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_usage_mapping()
2569 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_event() local
2570 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_event()
2572 struct wacom_features *features = &wacom->wacom_wac.features; in wacom_wac_finger_event()
2613 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_pre_report() local
2614 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_pre_report()
2648 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_report() local
2649 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_report()
2675 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_usage_mapping() local
2676 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_usage_mapping()
2696 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_event() local
2698 if (wacom->wacom_wac.features.type != HID_GENERIC) in wacom_wac_event()
2707 else if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input) in wacom_wac_event()
2709 else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) in wacom_wac_event()
2711 else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) in wacom_wac_event()
2747 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_set_num_expected() local
2748 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_set_num_expected()
2803 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_collection() local
2820 if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) in wacom_wac_collection()
2822 else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) in wacom_wac_collection()
2830 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_report() local
2831 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_report()
2856 if (pad_in_hid_field && wacom->wacom_wac.pad_input) in wacom_wac_report()
2858 if (pen_in_hid_field && wacom->wacom_wac.pen_input) in wacom_wac_report()
2860 if (finger_in_hid_field && wacom->wacom_wac.touch_input) in wacom_wac_report()
2876 if (true_pad && wacom->wacom_wac.pad_input) in wacom_wac_report()
2880 static int wacom_bpt_touch(struct wacom_wac *wacom) in wacom_bpt_touch() argument
2882 struct wacom_features *features = &wacom->features; in wacom_bpt_touch()
2883 struct input_dev *input = wacom->touch_input; in wacom_bpt_touch()
2884 struct input_dev *pad_input = wacom->pad_input; in wacom_bpt_touch()
2885 unsigned char *data = wacom->data; in wacom_bpt_touch()
2893 bool touch = report_touch_events(wacom) in wacom_bpt_touch()
2916 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_bpt_touch()
2921 static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) in wacom_bpt3_touch_msg() argument
2923 struct wacom_features *features = &wacom->features; in wacom_bpt3_touch_msg()
2924 struct input_dev *input = wacom->touch_input; in wacom_bpt3_touch_msg()
2931 touch = touch && report_touch_events(wacom); in wacom_bpt3_touch_msg()
2964 static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data) in wacom_bpt3_button_msg() argument
2966 struct input_dev *input = wacom->pad_input; in wacom_bpt3_button_msg()
2967 struct wacom_features *features = &wacom->features; in wacom_bpt3_button_msg()
2980 static int wacom_bpt3_touch(struct wacom_wac *wacom) in wacom_bpt3_touch() argument
2982 unsigned char *data = wacom->data; in wacom_bpt3_touch()
2995 wacom_bpt3_touch_msg(wacom, data + offset); in wacom_bpt3_touch()
2998 wacom_bpt3_button_msg(wacom, data + offset); in wacom_bpt3_touch()
3003 if (wacom->touch_input && touch_changed) { in wacom_bpt3_touch()
3004 input_mt_sync_frame(wacom->touch_input); in wacom_bpt3_touch()
3005 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_bpt3_touch()
3011 static int wacom_bpt_pen(struct wacom_wac *wacom) in wacom_bpt_pen() argument
3013 struct wacom_features *features = &wacom->features; in wacom_bpt_pen()
3014 struct input_dev *input = wacom->pen_input; in wacom_bpt_pen()
3015 unsigned char *data = wacom->data; in wacom_bpt_pen()
3027 wacom->shared->stylus_in_proximity = range; in wacom_bpt_pen()
3028 if (delay_pen_events(wacom)) in wacom_bpt_pen()
3042 wacom->tool[0] = BTN_TOOL_RUBBER; in wacom_bpt_pen()
3043 wacom->id[0] = ERASER_DEVICE_ID; in wacom_bpt_pen()
3045 wacom->tool[0] = BTN_TOOL_PEN; in wacom_bpt_pen()
3046 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_bpt_pen()
3048 wacom->reporting_data = true; in wacom_bpt_pen()
3060 wacom->id[0] = 0; in wacom_bpt_pen()
3063 if (wacom->reporting_data) { in wacom_bpt_pen()
3075 input_report_key(input, wacom->tool[0], range); /* PEN or RUBBER */ in wacom_bpt_pen()
3076 input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */ in wacom_bpt_pen()
3080 wacom->reporting_data = false; in wacom_bpt_pen()
3086 static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) in wacom_bpt_irq() argument
3088 struct wacom_features *features = &wacom->features; in wacom_bpt_irq()
3092 return wacom_intuos_irq(wacom); in wacom_bpt_irq()
3094 return wacom_bpt_touch(wacom); in wacom_bpt_irq()
3096 return wacom_bpt3_touch(wacom); in wacom_bpt_irq()
3098 return wacom_bpt_pen(wacom); in wacom_bpt_irq()
3103 static void wacom_bamboo_pad_pen_event(struct wacom_wac *wacom, in wacom_bamboo_pad_pen_event() argument
3123 hid_input_report(wacom->shared->pen, HID_INPUT_REPORT, data, in wacom_bamboo_pad_pen_event()
3129 static int wacom_bamboo_pad_touch_event(struct wacom_wac *wacom, in wacom_bamboo_pad_touch_event() argument
3132 struct input_dev *input = wacom->touch_input; in wacom_bamboo_pad_touch_event()
3140 for (id = 0; id < wacom->features.touch_max; id++) { in wacom_bamboo_pad_touch_event()
3142 report_touch_events(wacom); in wacom_bamboo_pad_touch_event()
3164 wacom->shared->touch_down = !!prefix && report_touch_events(wacom); in wacom_bamboo_pad_touch_event()
3169 static int wacom_bamboo_pad_irq(struct wacom_wac *wacom, size_t len) in wacom_bamboo_pad_irq() argument
3171 unsigned char *data = wacom->data; in wacom_bamboo_pad_irq()
3179 wacom_bamboo_pad_pen_event(wacom, &data[1]); in wacom_bamboo_pad_irq()
3182 return wacom_bamboo_pad_touch_event(wacom, &data[9]); in wacom_bamboo_pad_irq()
3187 static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len) in wacom_wireless_irq() argument
3189 unsigned char *data = wacom->data; in wacom_wireless_irq()
3199 if ((wacom->shared->type == INTUOSHT || in wacom_wireless_irq()
3200 wacom->shared->type == INTUOSHT2) && in wacom_wireless_irq()
3201 wacom->shared->touch_input && in wacom_wireless_irq()
3202 wacom->shared->touch_max) { in wacom_wireless_irq()
3203 input_report_switch(wacom->shared->touch_input, in wacom_wireless_irq()
3205 input_sync(wacom->shared->touch_input); in wacom_wireless_irq()
3211 if (wacom->pid != pid) { in wacom_wireless_irq()
3212 wacom->pid = pid; in wacom_wireless_irq()
3213 wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS); in wacom_wireless_irq()
3216 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_wireless_irq()
3219 } else if (wacom->pid != 0) { in wacom_wireless_irq()
3221 wacom->pid = 0; in wacom_wireless_irq()
3222 wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS); in wacom_wireless_irq()
3223 wacom_notify_battery(wacom, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0); in wacom_wireless_irq()
3231 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_status_irq() local
3254 if (!wacom->battery.battery && in wacom_status_irq()
3261 wacom->battery.battery) { in wacom_status_irq()
3456 void wacom_setup_device_quirks(struct wacom *wacom) in wacom_setup_device_quirks() argument
3458 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_setup_device_quirks()
3459 struct wacom_features *features = &wacom->wacom_wac.features; in wacom_setup_device_quirks()
3568 if (wacom->hdev->bus == BUS_BLUETOOTH) in wacom_setup_device_quirks()
3593 if (wacom->hdev->product == 0x382 || wacom->hdev->product == 0x37d) { in wacom_setup_device_quirks()
3940 static void wacom_24hd_update_leds(struct wacom *wacom, int mask, int group) in wacom_24hd_update_leds() argument
3955 led = wacom_led_find(wacom, group, i); in wacom_24hd_update_leds()
3957 hid_err(wacom->hdev, "can't find LED %d in group %d\n", in wacom_24hd_update_leds()
3970 static bool wacom_is_led_toggled(struct wacom *wacom, int button_count, in wacom_is_led_toggled() argument
3980 if (wacom->wacom_wac.features.type == WACOM_21UX2) in wacom_is_led_toggled()
3983 group_button = group * (button_count/wacom->led.count); in wacom_is_led_toggled()
3985 if (wacom->wacom_wac.features.type == INTUOSP2_BT) in wacom_is_led_toggled()
3991 static void wacom_update_led(struct wacom *wacom, int button_count, int mask, in wacom_update_led() argument
3998 if (wacom->wacom_wac.features.type == WACOM_24HD) in wacom_update_led()
3999 return wacom_24hd_update_leds(wacom, mask, group); in wacom_update_led()
4001 pressed = wacom_is_led_toggled(wacom, button_count, mask, group); in wacom_update_led()
4002 cur = wacom->led.groups[group].select; in wacom_update_led()
4004 led = wacom_led_find(wacom, group, cur); in wacom_update_led()
4006 hid_err(wacom->hdev, "can't find current LED %d in group %d\n", in wacom_update_led()
4019 next_led = wacom_led_next(wacom, led); in wacom_update_led()
4021 hid_err(wacom->hdev, "can't find next LED in group %d\n", in wacom_update_led()
4036 struct wacom *wacom = input_get_drvdata(input_dev); in wacom_report_numbered_buttons() local
4039 for (i = 0; i < wacom->led.count; i++) in wacom_report_numbered_buttons()
4040 wacom_update_led(wacom, button_count, mask, i); in wacom_report_numbered_buttons()