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()
739 static void wacom_exit_report(struct wacom_wac *wacom) in wacom_exit_report() argument
741 struct input_dev *input = wacom->pen_input; in wacom_exit_report()
742 struct wacom_features *features = &wacom->features; in wacom_exit_report()
743 unsigned char *data = wacom->data; in wacom_exit_report()
755 if (wacom->tool[idx] >= BTN_TOOL_MOUSE) { in wacom_exit_report()
772 input_report_key(input, wacom->tool[idx], 0); in wacom_exit_report()
774 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]); in wacom_exit_report()
775 wacom->id[idx] = 0; in wacom_exit_report()
778 static int wacom_intuos_inout(struct wacom_wac *wacom) in wacom_intuos_inout() argument
780 struct wacom_features *features = &wacom->features; in wacom_intuos_inout()
781 unsigned char *data = wacom->data; in wacom_intuos_inout()
782 struct input_dev *input = wacom->pen_input; in wacom_intuos_inout()
793 wacom->serial[idx] = ((data[3] & 0x0f) << 28) + in wacom_intuos_inout()
797 wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) | in wacom_intuos_inout()
800 wacom->tool[idx] = wacom_intuos_get_tool_type(wacom->id[idx]); in wacom_intuos_inout()
802 wacom->shared->stylus_in_proximity = true; in wacom_intuos_inout()
809 wacom->shared->stylus_in_proximity = true; in wacom_intuos_inout()
812 if (wacom->reporting_data) { in wacom_intuos_inout()
815 input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max); in wacom_intuos_inout()
823 wacom->shared->stylus_in_proximity = false; in wacom_intuos_inout()
824 wacom->reporting_data = false; in wacom_intuos_inout()
827 if (!wacom->id[idx]) in wacom_intuos_inout()
830 wacom_exit_report(wacom); in wacom_intuos_inout()
837 static inline bool report_touch_events(struct wacom_wac *wacom) in report_touch_events() argument
839 return (touch_arbitration ? !wacom->shared->stylus_in_proximity : 1); in report_touch_events()
842 static inline bool delay_pen_events(struct wacom_wac *wacom) in delay_pen_events() argument
844 return (wacom->shared->touch_down && touch_arbitration); in delay_pen_events()
847 static int wacom_intuos_general(struct wacom_wac *wacom) in wacom_intuos_general() argument
849 struct wacom_features *features = &wacom->features; in wacom_intuos_general()
850 unsigned char *data = wacom->data; in wacom_intuos_general()
851 struct input_dev *input = wacom->pen_input; in wacom_intuos_general()
860 if (delay_pen_events(wacom)) in wacom_intuos_general()
864 if (!wacom->id[idx]) { in wacom_intuos_general()
866 wacom_intuos_schedule_prox_event(wacom); in wacom_intuos_general()
874 if ((!((wacom->id[idx] >> 16) & 0x01) && in wacom_intuos_general()
877 (wacom->tool[idx] == BTN_TOOL_LENS && in wacom_intuos_general()
977 if (wacom->tool[idx] == BTN_TOOL_MOUSE) { in wacom_intuos_general()
991 else if (wacom->tool[idx] == BTN_TOOL_LENS) { in wacom_intuos_general()
1013 wacom_intuos_id_mangle(wacom->id[idx])); /* report tool id */ in wacom_intuos_general()
1014 input_report_key(input, wacom->tool[idx], 1); in wacom_intuos_general()
1015 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]); in wacom_intuos_general()
1016 wacom->reporting_data = true; in wacom_intuos_general()
1020 static int wacom_intuos_irq(struct wacom_wac *wacom) in wacom_intuos_irq() argument
1022 unsigned char *data = wacom->data; in wacom_intuos_irq()
1023 struct input_dev *input = wacom->pen_input; in wacom_intuos_irq()
1040 result = wacom_intuos_pad(wacom); in wacom_intuos_irq()
1045 result = wacom_intuos_inout(wacom); in wacom_intuos_irq()
1050 result = wacom_intuos_general(wacom); in wacom_intuos_irq()
1061 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_remote_irq() local
1062 struct wacom_remote *remote = wacom->remote; in wacom_remote_irq()
1069 hid_dbg(wacom->hdev, "%s: received unknown report #%d", in wacom_remote_irq()
1134 wacom->led.groups[i].select = touch_ring_mode; in wacom_remote_irq()
1148 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_remote_status_irq() local
1150 struct wacom_remote *remote = wacom->remote; in wacom_remote_status_irq()
1174 hid_err(wacom->hdev, "Can't queue Remote status event.\n"); in wacom_remote_status_irq()
1191 static void wacom_intuos_bt_process_data(struct wacom_wac *wacom, in wacom_intuos_bt_process_data() argument
1194 memcpy(wacom->data, data, 10); in wacom_intuos_bt_process_data()
1195 wacom_intuos_irq(wacom); in wacom_intuos_bt_process_data()
1197 input_sync(wacom->pen_input); in wacom_intuos_bt_process_data()
1198 if (wacom->pad_input) in wacom_intuos_bt_process_data()
1199 input_sync(wacom->pad_input); in wacom_intuos_bt_process_data()
1202 static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len) in wacom_intuos_bt_irq() argument
1208 memcpy(data, wacom->data, len); in wacom_intuos_bt_irq()
1212 wacom_intuos_bt_process_data(wacom, data + i); in wacom_intuos_bt_irq()
1216 wacom_intuos_bt_process_data(wacom, data + i); in wacom_intuos_bt_irq()
1218 wacom_intuos_bt_process_data(wacom, data + i); in wacom_intuos_bt_irq()
1224 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_intuos_bt_irq()
1230 dev_dbg(wacom->pen_input->dev.parent, in wacom_intuos_bt_irq()
1238 static int wacom_wac_finger_count_touches(struct wacom_wac *wacom) in wacom_wac_finger_count_touches() argument
1240 struct input_dev *input = wacom->touch_input; in wacom_wac_finger_count_touches()
1241 unsigned touch_max = wacom->features.touch_max; in wacom_wac_finger_count_touches()
1250 report_touch_events(wacom); in wacom_wac_finger_count_touches()
1262 static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_pen() argument
1266 struct input_dev *pen_input = wacom->pen_input; in wacom_intuos_pro2_bt_pen()
1267 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_pen()
1270 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_pen()
1271 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_pen()
1272 wacom->serial[0] = get_unaligned_le64(&data[99]); in wacom_intuos_pro2_bt_pen()
1273 wacom->id[0] = get_unaligned_le16(&data[107]); in wacom_intuos_pro2_bt_pen()
1277 wacom->serial[0] = get_unaligned_le64(&data[33]); in wacom_intuos_pro2_bt_pen()
1278 wacom->id[0] = get_unaligned_le16(&data[41]); in wacom_intuos_pro2_bt_pen()
1283 if (wacom->serial[0] >> 52 == 1) { in wacom_intuos_pro2_bt_pen()
1285 wacom->id[0] |= (wacom->serial[0] >> 32) & 0xFFFFF; in wacom_intuos_pro2_bt_pen()
1299 wacom->shared->stylus_in_proximity = false; in wacom_intuos_pro2_bt_pen()
1300 wacom_exit_report(wacom); in wacom_intuos_pro2_bt_pen()
1303 wacom->tool[0] = 0; in wacom_intuos_pro2_bt_pen()
1304 wacom->id[0] = 0; in wacom_intuos_pro2_bt_pen()
1305 wacom->serial[0] = 0; in wacom_intuos_pro2_bt_pen()
1310 if (!wacom->tool[0]) { /* first in range */ in wacom_intuos_pro2_bt_pen()
1313 wacom->tool[0] = BTN_TOOL_RUBBER; in wacom_intuos_pro2_bt_pen()
1314 else if (wacom->id[0]) in wacom_intuos_pro2_bt_pen()
1315 wacom->tool[0] = wacom_intuos_get_tool_type(wacom->id[0]); in wacom_intuos_pro2_bt_pen()
1317 wacom->tool[0] = BTN_TOOL_PEN; in wacom_intuos_pro2_bt_pen()
1323 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_pen()
1324 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_pen()
1342 if (wacom->tool[0]) { in wacom_intuos_pro2_bt_pen()
1344 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_pen()
1345 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_pen()
1347 range ? frame[13] : wacom->features.distance_max); in wacom_intuos_pro2_bt_pen()
1350 range ? frame[7] : wacom->features.distance_max); in wacom_intuos_pro2_bt_pen()
1357 input_report_key(pen_input, wacom->tool[0], prox); in wacom_intuos_pro2_bt_pen()
1358 input_event(pen_input, EV_MSC, MSC_SERIAL, wacom->serial[0]); in wacom_intuos_pro2_bt_pen()
1360 wacom_intuos_id_mangle(wacom->id[0])); /* report tool id */ in wacom_intuos_pro2_bt_pen()
1363 wacom->shared->stylus_in_proximity = prox; in wacom_intuos_pro2_bt_pen()
1369 static void wacom_intuos_pro2_bt_touch(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_touch() argument
1375 struct input_dev *touch_input = wacom->touch_input; in wacom_intuos_pro2_bt_touch()
1376 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_touch()
1393 wacom->num_contacts_left = current_num_contacts; in wacom_intuos_pro2_bt_touch()
1395 contacts_to_send = min(num_contacts_left, wacom->num_contacts_left); in wacom_intuos_pro2_bt_touch()
1419 wacom->num_contacts_left -= contacts_to_send; in wacom_intuos_pro2_bt_touch()
1420 if (wacom->num_contacts_left <= 0) { in wacom_intuos_pro2_bt_touch()
1421 wacom->num_contacts_left = 0; in wacom_intuos_pro2_bt_touch()
1422 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_intuos_pro2_bt_touch()
1427 if (wacom->num_contacts_left == 0) { in wacom_intuos_pro2_bt_touch()
1436 static void wacom_intuos_pro2_bt_pad(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_pad() argument
1438 struct input_dev *pad_input = wacom->pad_input; in wacom_intuos_pro2_bt_pad()
1439 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_pad()
1440 int nbuttons = wacom->features.numbered_buttons; in wacom_intuos_pro2_bt_pad()
1459 input_report_key(pad_input, wacom->tool[1], prox ? 1 : 0); in wacom_intuos_pro2_bt_pad()
1466 static void wacom_intuos_pro2_bt_battery(struct wacom_wac *wacom) in wacom_intuos_pro2_bt_battery() argument
1468 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_battery()
1473 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_intuos_pro2_bt_battery()
1477 static void wacom_intuos_gen3_bt_pad(struct wacom_wac *wacom) in wacom_intuos_gen3_bt_pad() argument
1479 struct input_dev *pad_input = wacom->pad_input; in wacom_intuos_gen3_bt_pad()
1480 unsigned char *data = wacom->data; in wacom_intuos_gen3_bt_pad()
1486 input_report_key(pad_input, wacom->tool[1], buttons ? 1 : 0); in wacom_intuos_gen3_bt_pad()
1493 static void wacom_intuos_gen3_bt_battery(struct wacom_wac *wacom) in wacom_intuos_gen3_bt_battery() argument
1495 unsigned char *data = wacom->data; in wacom_intuos_gen3_bt_battery()
1500 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_intuos_gen3_bt_battery()
1504 static int wacom_intuos_pro2_bt_irq(struct wacom_wac *wacom, size_t len) in wacom_intuos_pro2_bt_irq() argument
1506 unsigned char *data = wacom->data; in wacom_intuos_pro2_bt_irq()
1509 dev_dbg(wacom->pen_input->dev.parent, in wacom_intuos_pro2_bt_irq()
1514 wacom_intuos_pro2_bt_pen(wacom); in wacom_intuos_pro2_bt_irq()
1515 if (wacom->features.type == INTUOSP2_BT || in wacom_intuos_pro2_bt_irq()
1516 wacom->features.type == INTUOSP2S_BT) { in wacom_intuos_pro2_bt_irq()
1517 wacom_intuos_pro2_bt_touch(wacom); in wacom_intuos_pro2_bt_irq()
1518 wacom_intuos_pro2_bt_pad(wacom); in wacom_intuos_pro2_bt_irq()
1519 wacom_intuos_pro2_bt_battery(wacom); in wacom_intuos_pro2_bt_irq()
1521 wacom_intuos_gen3_bt_pad(wacom); in wacom_intuos_pro2_bt_irq()
1522 wacom_intuos_gen3_bt_battery(wacom); in wacom_intuos_pro2_bt_irq()
1527 static int wacom_24hdt_irq(struct wacom_wac *wacom) in wacom_24hdt_irq() argument
1529 struct input_dev *input = wacom->touch_input; in wacom_24hdt_irq()
1530 unsigned char *data = wacom->data; in wacom_24hdt_irq()
1538 if (wacom->shared->has_mute_touch_switch && in wacom_24hdt_irq()
1539 !wacom->shared->is_touch_on) { in wacom_24hdt_irq()
1540 if (!wacom->shared->touch_down) in wacom_24hdt_irq()
1544 if (wacom->features.type == WACOM_27QHDT) { in wacom_24hdt_irq()
1556 wacom->num_contacts_left = current_num_contacts; in wacom_24hdt_irq()
1558 contacts_to_send = min(num_contacts_left, wacom->num_contacts_left); in wacom_24hdt_irq()
1562 bool touch = (data[offset] & 0x1) && report_touch_events(wacom); in wacom_24hdt_irq()
1577 if (wacom->features.type != WACOM_27QHDT) { in wacom_24hdt_irq()
1593 wacom->num_contacts_left -= contacts_to_send; in wacom_24hdt_irq()
1594 if (wacom->num_contacts_left <= 0) { in wacom_24hdt_irq()
1595 wacom->num_contacts_left = 0; in wacom_24hdt_irq()
1596 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_24hdt_irq()
1601 static int wacom_mt_touch(struct wacom_wac *wacom) in wacom_mt_touch() argument
1603 struct input_dev *input = wacom->touch_input; in wacom_mt_touch()
1604 unsigned char *data = wacom->data; in wacom_mt_touch()
1611 if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B) in wacom_mt_touch()
1619 wacom->num_contacts_left = current_num_contacts; in wacom_mt_touch()
1622 contacts_to_send = min(5, wacom->num_contacts_left); in wacom_mt_touch()
1626 bool touch = (data[offset] & 0x1) && report_touch_events(wacom); in wacom_mt_touch()
1644 wacom->num_contacts_left -= contacts_to_send; in wacom_mt_touch()
1645 if (wacom->num_contacts_left <= 0) { in wacom_mt_touch()
1646 wacom->num_contacts_left = 0; in wacom_mt_touch()
1647 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_mt_touch()
1652 static int wacom_tpc_mt_touch(struct wacom_wac *wacom) in wacom_tpc_mt_touch() argument
1654 struct input_dev *input = wacom->touch_input; in wacom_tpc_mt_touch()
1655 unsigned char *data = wacom->data; in wacom_tpc_mt_touch()
1660 bool touch = p && report_touch_events(wacom); in wacom_tpc_mt_touch()
1675 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_tpc_mt_touch()
1680 static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) in wacom_tpc_single_touch() argument
1682 unsigned char *data = wacom->data; in wacom_tpc_single_touch()
1683 struct input_dev *input = wacom->touch_input; in wacom_tpc_single_touch()
1684 bool prox = report_touch_events(wacom); in wacom_tpc_single_touch()
1687 if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG) in wacom_tpc_single_touch()
1711 wacom->shared->touch_down = prox; in wacom_tpc_single_touch()
1716 static int wacom_tpc_pen(struct wacom_wac *wacom) in wacom_tpc_pen() argument
1718 unsigned char *data = wacom->data; in wacom_tpc_pen()
1719 struct input_dev *input = wacom->pen_input; in wacom_tpc_pen()
1722 if (!wacom->shared->stylus_in_proximity) /* first in prox */ in wacom_tpc_pen()
1724 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; in wacom_tpc_pen()
1727 wacom->shared->stylus_in_proximity = prox; in wacom_tpc_pen()
1732 if (!delay_pen_events(wacom)) { in wacom_tpc_pen()
1739 input_report_key(input, wacom->tool[0], prox); in wacom_tpc_pen()
1746 static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) in wacom_tpc_irq() argument
1748 unsigned char *data = wacom->data; in wacom_tpc_irq()
1750 if (wacom->pen_input) { in wacom_tpc_irq()
1751 dev_dbg(wacom->pen_input->dev.parent, in wacom_tpc_irq()
1756 return wacom_tpc_pen(wacom); in wacom_tpc_irq()
1758 else if (wacom->touch_input) { in wacom_tpc_irq()
1759 dev_dbg(wacom->touch_input->dev.parent, in wacom_tpc_irq()
1764 return wacom_tpc_single_touch(wacom, len); in wacom_tpc_irq()
1767 return wacom_tpc_mt_touch(wacom); in wacom_tpc_irq()
1775 return wacom_tpc_single_touch(wacom, len); in wacom_tpc_irq()
1779 return wacom_mt_touch(wacom); in wacom_tpc_irq()
1849 struct wacom *wacom = input_get_drvdata(input); in wacom_map_usage() local
1850 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_map_usage()
1896 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_battery_usage_mapping() local
1897 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_battery_usage_mapping()
1913 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_battery_event() local
1914 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_battery_event()
1953 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_battery_report() local
1954 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_battery_report()
1972 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_usage_mapping() local
1973 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_usage_mapping()
2078 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_event() local
2079 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_event()
2160 wacom_schedule_work(&wacom->wacom_wac, WACOM_WORKER_MODE_CHANGE); in wacom_wac_pad_event()
2165 for (i = 0; i < wacom->led.count; i++) in wacom_wac_pad_event()
2166 wacom_update_led(wacom, features->numbered_buttons, in wacom_wac_pad_event()
2184 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_pre_report() local
2185 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_pre_report()
2193 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pad_report() local
2194 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pad_report()
2210 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_usage_mapping() local
2211 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_usage_mapping()
2289 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_event() local
2290 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_event()
2420 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_pre_report() local
2421 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_pre_report()
2430 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_pen_report() local
2431 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_pen_report()
2496 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_usage_mapping() local
2497 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_usage_mapping()
2610 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_event() local
2611 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_event()
2613 struct wacom_features *features = &wacom->wacom_wac.features; in wacom_wac_finger_event()
2668 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_pre_report() local
2669 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_pre_report()
2728 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_finger_report() local
2729 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_finger_report()
2754 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_usage_mapping() local
2755 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_usage_mapping()
2775 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_event() local
2777 if (wacom->wacom_wac.features.type != HID_GENERIC) in wacom_wac_event()
2788 else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) in wacom_wac_event()
2790 else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) in wacom_wac_event()
2824 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_collection() local
2840 else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) in wacom_wac_collection()
2842 else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) in wacom_wac_collection()
2850 struct wacom *wacom = hid_get_drvdata(hdev); in wacom_wac_report() local
2851 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_wac_report()
2876 if (pad_in_hid_field && wacom->wacom_wac.pad_input) in wacom_wac_report()
2878 if (pen_in_hid_field && wacom->wacom_wac.pen_input) in wacom_wac_report()
2880 if (finger_in_hid_field && wacom->wacom_wac.touch_input) in wacom_wac_report()
2896 if (true_pad && wacom->wacom_wac.pad_input) in wacom_wac_report()
2900 static int wacom_bpt_touch(struct wacom_wac *wacom) in wacom_bpt_touch() argument
2902 struct wacom_features *features = &wacom->features; in wacom_bpt_touch()
2903 struct input_dev *input = wacom->touch_input; in wacom_bpt_touch()
2904 struct input_dev *pad_input = wacom->pad_input; in wacom_bpt_touch()
2905 unsigned char *data = wacom->data; in wacom_bpt_touch()
2913 bool touch = report_touch_events(wacom) in wacom_bpt_touch()
2936 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_bpt_touch()
2941 static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) in wacom_bpt3_touch_msg() argument
2943 struct wacom_features *features = &wacom->features; in wacom_bpt3_touch_msg()
2944 struct input_dev *input = wacom->touch_input; in wacom_bpt3_touch_msg()
2951 touch = touch && report_touch_events(wacom); in wacom_bpt3_touch_msg()
2984 static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data) in wacom_bpt3_button_msg() argument
2986 struct input_dev *input = wacom->pad_input; in wacom_bpt3_button_msg()
2987 struct wacom_features *features = &wacom->features; in wacom_bpt3_button_msg()
3000 static int wacom_bpt3_touch(struct wacom_wac *wacom) in wacom_bpt3_touch() argument
3002 unsigned char *data = wacom->data; in wacom_bpt3_touch()
3015 wacom_bpt3_touch_msg(wacom, data + offset); in wacom_bpt3_touch()
3018 wacom_bpt3_button_msg(wacom, data + offset); in wacom_bpt3_touch()
3023 if (wacom->touch_input && touch_changed) { in wacom_bpt3_touch()
3024 input_mt_sync_frame(wacom->touch_input); in wacom_bpt3_touch()
3025 wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); in wacom_bpt3_touch()
3031 static int wacom_bpt_pen(struct wacom_wac *wacom) in wacom_bpt_pen() argument
3033 struct wacom_features *features = &wacom->features; in wacom_bpt_pen()
3034 struct input_dev *input = wacom->pen_input; in wacom_bpt_pen()
3035 unsigned char *data = wacom->data; in wacom_bpt_pen()
3047 wacom->shared->stylus_in_proximity = range; in wacom_bpt_pen()
3048 if (delay_pen_events(wacom)) in wacom_bpt_pen()
3062 wacom->tool[0] = BTN_TOOL_RUBBER; in wacom_bpt_pen()
3063 wacom->id[0] = ERASER_DEVICE_ID; in wacom_bpt_pen()
3065 wacom->tool[0] = BTN_TOOL_PEN; in wacom_bpt_pen()
3066 wacom->id[0] = STYLUS_DEVICE_ID; in wacom_bpt_pen()
3068 wacom->reporting_data = true; in wacom_bpt_pen()
3080 wacom->id[0] = 0; in wacom_bpt_pen()
3083 if (wacom->reporting_data) { in wacom_bpt_pen()
3095 input_report_key(input, wacom->tool[0], range); /* PEN or RUBBER */ in wacom_bpt_pen()
3096 input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */ in wacom_bpt_pen()
3100 wacom->reporting_data = false; in wacom_bpt_pen()
3106 static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) in wacom_bpt_irq() argument
3108 struct wacom_features *features = &wacom->features; in wacom_bpt_irq()
3112 return wacom_intuos_irq(wacom); in wacom_bpt_irq()
3114 return wacom_bpt_touch(wacom); in wacom_bpt_irq()
3116 return wacom_bpt3_touch(wacom); in wacom_bpt_irq()
3118 return wacom_bpt_pen(wacom); in wacom_bpt_irq()
3123 static void wacom_bamboo_pad_pen_event(struct wacom_wac *wacom, in wacom_bamboo_pad_pen_event() argument
3143 hid_input_report(wacom->shared->pen, HID_INPUT_REPORT, data, in wacom_bamboo_pad_pen_event()
3149 static int wacom_bamboo_pad_touch_event(struct wacom_wac *wacom, in wacom_bamboo_pad_touch_event() argument
3152 struct input_dev *input = wacom->touch_input; in wacom_bamboo_pad_touch_event()
3160 for (id = 0; id < wacom->features.touch_max; id++) { in wacom_bamboo_pad_touch_event()
3162 report_touch_events(wacom); in wacom_bamboo_pad_touch_event()
3184 wacom->shared->touch_down = !!prefix && report_touch_events(wacom); in wacom_bamboo_pad_touch_event()
3189 static int wacom_bamboo_pad_irq(struct wacom_wac *wacom, size_t len) in wacom_bamboo_pad_irq() argument
3191 unsigned char *data = wacom->data; in wacom_bamboo_pad_irq()
3199 wacom_bamboo_pad_pen_event(wacom, &data[1]); in wacom_bamboo_pad_irq()
3202 return wacom_bamboo_pad_touch_event(wacom, &data[9]); in wacom_bamboo_pad_irq()
3207 static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len) in wacom_wireless_irq() argument
3209 unsigned char *data = wacom->data; in wacom_wireless_irq()
3219 if ((wacom->shared->type == INTUOSHT || in wacom_wireless_irq()
3220 wacom->shared->type == INTUOSHT2) && in wacom_wireless_irq()
3221 wacom->shared->touch_input && in wacom_wireless_irq()
3222 wacom->shared->touch_max) { in wacom_wireless_irq()
3223 input_report_switch(wacom->shared->touch_input, in wacom_wireless_irq()
3225 input_sync(wacom->shared->touch_input); in wacom_wireless_irq()
3231 if (wacom->pid != pid) { in wacom_wireless_irq()
3232 wacom->pid = pid; in wacom_wireless_irq()
3233 wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS); in wacom_wireless_irq()
3236 wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO, in wacom_wireless_irq()
3239 } else if (wacom->pid != 0) { in wacom_wireless_irq()
3241 wacom->pid = 0; in wacom_wireless_irq()
3242 wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS); in wacom_wireless_irq()
3243 wacom_notify_battery(wacom, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0); in wacom_wireless_irq()
3251 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); in wacom_status_irq() local
3274 if (!wacom->battery.battery && in wacom_status_irq()
3281 wacom->battery.battery) { in wacom_status_irq()
3476 void wacom_setup_device_quirks(struct wacom *wacom) in wacom_setup_device_quirks() argument
3478 struct wacom_wac *wacom_wac = &wacom->wacom_wac; in wacom_setup_device_quirks()
3479 struct wacom_features *features = &wacom->wacom_wac.features; in wacom_setup_device_quirks()
3588 if (wacom->hdev->bus == BUS_BLUETOOTH) in wacom_setup_device_quirks()
3613 if (wacom->hdev->product == 0x382 || wacom->hdev->product == 0x37d) { in wacom_setup_device_quirks()
3958 static void wacom_24hd_update_leds(struct wacom *wacom, int mask, int group) in wacom_24hd_update_leds() argument
3973 led = wacom_led_find(wacom, group, i); in wacom_24hd_update_leds()
3975 hid_err(wacom->hdev, "can't find LED %d in group %d\n", in wacom_24hd_update_leds()
3988 static bool wacom_is_led_toggled(struct wacom *wacom, int button_count, in wacom_is_led_toggled() argument
3998 if (wacom->wacom_wac.features.type == WACOM_21UX2) in wacom_is_led_toggled()
4001 group_button = group * (button_count/wacom->led.count); in wacom_is_led_toggled()
4003 if (wacom->wacom_wac.features.type == INTUOSP2_BT) in wacom_is_led_toggled()
4009 static void wacom_update_led(struct wacom *wacom, int button_count, int mask, in wacom_update_led() argument
4016 if (wacom->wacom_wac.features.type == WACOM_24HD) in wacom_update_led()
4017 return wacom_24hd_update_leds(wacom, mask, group); in wacom_update_led()
4019 pressed = wacom_is_led_toggled(wacom, button_count, mask, group); in wacom_update_led()
4020 cur = wacom->led.groups[group].select; in wacom_update_led()
4022 led = wacom_led_find(wacom, group, cur); in wacom_update_led()
4024 hid_err(wacom->hdev, "can't find current LED %d in group %d\n", in wacom_update_led()
4037 next_led = wacom_led_next(wacom, led); in wacom_update_led()
4039 hid_err(wacom->hdev, "can't find next LED in group %d\n", in wacom_update_led()
4054 struct wacom *wacom = input_get_drvdata(input_dev); in wacom_report_numbered_buttons() local
4057 for (i = 0; i < wacom->led.count; i++) in wacom_report_numbered_buttons()
4058 wacom_update_led(wacom, button_count, mask, i); in wacom_report_numbered_buttons()