Lines Matching +full:abs +full:- +full:range
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
9 * Copyright (c) 2006-2013 Jiri Kosina
11 * Copyright (c) 2014-2016 Frank Praznik <frank.praznik@gmail.com>
43 #include "hid-ids.h"
196 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
209 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
232 0x81, 0x01, /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
241 0x81, 0x02, /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
312 * -------------------
431 {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
463 struct sixaxis_led led[4]; /* LEDx at (4 - x) */
594 spin_lock_irqsave(&sc->lock, flags); in sony_schedule_work()
595 if (!sc->defer_initialization && sc->state_worker_initialized) in sony_schedule_work()
596 schedule_work(&sc->state_worker); in sony_schedule_work()
597 spin_unlock_irqrestore(&sc->lock, flags); in sony_schedule_work()
600 if (sc->hotplug_worker_initialized) in sony_schedule_work()
601 schedule_work(&sc->hotplug_worker); in sony_schedule_work()
613 return snprintf(buf, PAGE_SIZE, "%i\n", sc->ds4_bt_poll_interval); in ds4_show_poll_interval()
626 return -EINVAL; in ds4_store_poll_interval()
629 return -EINVAL; in ds4_store_poll_interval()
631 spin_lock_irqsave(&sc->lock, flags); in ds4_store_poll_interval()
632 sc->ds4_bt_poll_interval = interval; in ds4_store_poll_interval()
633 spin_unlock_irqrestore(&sc->lock, flags); in ds4_store_poll_interval()
650 return snprintf(buf, PAGE_SIZE, "0x%04x\n", sc->fw_version); in sony_show_firmware_version()
662 return snprintf(buf, PAGE_SIZE, "0x%04x\n", sc->hw_version); in sony_show_hardware_version()
685 unsigned int key = usage->hid & HID_USAGE; in ps3remote_mapping()
687 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON) in ps3remote_mapping()
688 return -1; in ps3remote_mapping()
690 switch (usage->collection_index) { in ps3remote_mapping()
693 return -1; in ps3remote_mapping()
697 return -1; in ps3remote_mapping()
701 return -1; in ps3remote_mapping()
705 return -1; in ps3remote_mapping()
708 return -1; in ps3remote_mapping()
719 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { in navigation_mapping()
720 unsigned int key = usage->hid & HID_USAGE; in navigation_mapping()
723 return -1; in navigation_mapping()
727 return -1; in navigation_mapping()
731 } else if (usage->hid == HID_GD_POINTER) { in navigation_mapping()
737 switch (usage->usage_index) { in navigation_mapping()
739 usage->hid = HID_GD_Z; in navigation_mapping()
742 return -1; in navigation_mapping()
745 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf); in navigation_mapping()
747 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) { in navigation_mapping()
748 unsigned int abs = usage->hid & HID_USAGE; in navigation_mapping() local
750 if (abs >= ARRAY_SIZE(navigation_absmap)) in navigation_mapping()
751 return -1; in navigation_mapping()
753 abs = navigation_absmap[abs]; in navigation_mapping()
755 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); in navigation_mapping()
759 return -1; in navigation_mapping()
767 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { in sixaxis_mapping()
768 unsigned int key = usage->hid & HID_USAGE; in sixaxis_mapping()
771 return -1; in sixaxis_mapping()
776 } else if (usage->hid == HID_GD_POINTER) { in sixaxis_mapping()
783 switch (usage->usage_index) { in sixaxis_mapping()
785 usage->hid = HID_GD_Z; in sixaxis_mapping()
788 usage->hid = HID_GD_RZ; in sixaxis_mapping()
791 return -1; in sixaxis_mapping()
794 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, usage->hid & 0xf); in sixaxis_mapping()
796 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) { in sixaxis_mapping()
797 unsigned int abs = usage->hid & HID_USAGE; in sixaxis_mapping() local
799 if (abs >= ARRAY_SIZE(sixaxis_absmap)) in sixaxis_mapping()
800 return -1; in sixaxis_mapping()
802 abs = sixaxis_absmap[abs]; in sixaxis_mapping()
804 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); in sixaxis_mapping()
808 return -1; in sixaxis_mapping()
815 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { in ds4_mapping()
816 unsigned int key = usage->hid & HID_USAGE; in ds4_mapping()
819 return -1; in ds4_mapping()
824 } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) { in ds4_mapping()
825 unsigned int abs = usage->hid & HID_USAGE; in ds4_mapping() local
828 if (usage->hid == HID_GD_HATSWITCH) in ds4_mapping()
831 if (abs >= ARRAY_SIZE(ds4_absmap)) in ds4_mapping()
832 return -1; in ds4_mapping()
834 abs = ds4_absmap[abs]; in ds4_mapping()
835 hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); in ds4_mapping()
847 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT)) in sony_report_fixup()
852 * a constant non-data variable. in sony_report_fixup()
854 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 && in sony_report_fixup()
866 if (sc->quirks & MOTION_CONTROLLER) in sony_report_fixup()
869 if (sc->quirks & PS3REMOTE) in sony_report_fixup()
873 * Some knock-off USB dongles incorrectly report their button count in sony_report_fixup()
874 * as 13 instead of 16 causing three non-functional buttons. in sony_report_fixup()
876 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize >= 45 && in sony_report_fixup()
905 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30; in sixaxis_parse_report()
918 spin_lock_irqsave(&sc->lock, flags); in sixaxis_parse_report()
919 sc->cable_state = cable_state; in sixaxis_parse_report()
920 sc->battery_capacity = battery_capacity; in sixaxis_parse_report()
921 sc->battery_charging = battery_charging; in sixaxis_parse_report()
922 spin_unlock_irqrestore(&sc->lock, flags); in sixaxis_parse_report()
924 if (sc->quirks & SIXAXIS_CONTROLLER) { in sixaxis_parse_report()
928 val = ((rd[offset+1] << 8) | rd[offset]) - 511; in sixaxis_parse_report()
929 input_report_abs(sc->sensor_dev, ABS_X, val); in sixaxis_parse_report()
932 val = 511 - ((rd[offset+5] << 8) | rd[offset+4]); in sixaxis_parse_report()
933 input_report_abs(sc->sensor_dev, ABS_Y, val); in sixaxis_parse_report()
935 val = 511 - ((rd[offset+3] << 8) | rd[offset+2]); in sixaxis_parse_report()
936 input_report_abs(sc->sensor_dev, ABS_Z, val); in sixaxis_parse_report()
938 input_sync(sc->sensor_dev); in sixaxis_parse_report()
944 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, in dualshock4_parse_report()
946 struct input_dev *input_dev = hidinput->input; in dualshock4_parse_report()
953 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 2 : 0; in dualshock4_parse_report()
957 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2); in dualshock4_parse_report()
1013 if (!sc->timestamp_initialized) { in dualshock4_parse_report()
1014 sc->timestamp_us = ((unsigned int)timestamp * 16) / 3; in dualshock4_parse_report()
1015 sc->timestamp_initialized = true; in dualshock4_parse_report()
1019 if (sc->prev_timestamp > timestamp) in dualshock4_parse_report()
1020 delta = (U16_MAX - sc->prev_timestamp + timestamp + 1); in dualshock4_parse_report()
1022 delta = timestamp - sc->prev_timestamp; in dualshock4_parse_report()
1023 sc->timestamp_us += (delta * 16) / 3; in dualshock4_parse_report()
1025 sc->prev_timestamp = timestamp; in dualshock4_parse_report()
1026 input_event(sc->sensor_dev, EV_MSC, MSC_TIMESTAMP, sc->timestamp_us); in dualshock4_parse_report()
1032 struct ds4_calibration_data *calib = &sc->ds4_calib_data[n]; in dualshock4_parse_report()
1035 * calibrated values are within 32-bit. in dualshock4_parse_report()
1037 * precision reasons so we don't need 64-bit. in dualshock4_parse_report()
1039 int calib_data = mult_frac(calib->sens_numer, in dualshock4_parse_report()
1040 raw_data - calib->bias, in dualshock4_parse_report()
1041 calib->sens_denom); in dualshock4_parse_report()
1043 input_report_abs(sc->sensor_dev, calib->abs_code, calib_data); in dualshock4_parse_report()
1046 input_sync(sc->sensor_dev); in dualshock4_parse_report()
1073 spin_lock_irqsave(&sc->lock, flags); in dualshock4_parse_report()
1074 sc->cable_state = cable_state; in dualshock4_parse_report()
1075 sc->battery_capacity = battery_capacity; in dualshock4_parse_report()
1076 sc->battery_charging = battery_charging; in dualshock4_parse_report()
1077 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_parse_report()
1080 * The Dualshock 4 multi-touch trackpad data starts at offset 33 on USB in dualshock4_parse_report()
1086 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 4 : 3; in dualshock4_parse_report()
1113 input_mt_slot(sc->touchpad, n); in dualshock4_parse_report()
1114 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active); in dualshock4_parse_report()
1117 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x); in dualshock4_parse_report()
1118 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y); in dualshock4_parse_report()
1123 input_mt_sync_frame(sc->touchpad); in dualshock4_parse_report()
1124 input_sync(sc->touchpad); in dualshock4_parse_report()
1134 * The NSG-MRxU multi-touch trackpad data starts at offset 1 and in nsg_mrxu_parse_report()
1135 * the touch-related data starts at offset 2. in nsg_mrxu_parse_report()
1145 * Bits 0-4=X (width), bits 5-7=Y (length). in nsg_mrxu_parse_report()
1147 * The bytes at offset 7-9 are the second touch X/Y coordinates. in nsg_mrxu_parse_report()
1153 input_report_key(sc->touchpad, BTN_LEFT, rd[offset] & 0x0F); in nsg_mrxu_parse_report()
1156 rely = ((s8) rd[offset+10]) * -1; in nsg_mrxu_parse_report()
1167 input_mt_slot(sc->touchpad, n); in nsg_mrxu_parse_report()
1168 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active & 0x03); in nsg_mrxu_parse_report()
1173 input_report_abs(sc->touchpad, ABS_MT_TOUCH_MAJOR, in nsg_mrxu_parse_report()
1175 input_report_abs(sc->touchpad, ABS_MT_TOUCH_MINOR, in nsg_mrxu_parse_report()
1177 input_report_abs(sc->touchpad, ABS_MT_ORIENTATION, in nsg_mrxu_parse_report()
1179 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x); in nsg_mrxu_parse_report()
1180 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, in nsg_mrxu_parse_report()
1181 NSG_MRXU_MAX_Y - y); in nsg_mrxu_parse_report()
1188 input_report_rel(sc->touchpad, REL_X, relx); in nsg_mrxu_parse_report()
1189 input_report_rel(sc->touchpad, REL_Y, rely); in nsg_mrxu_parse_report()
1197 input_mt_sync_frame(sc->touchpad); in nsg_mrxu_parse_report()
1199 input_sync(sc->touchpad); in nsg_mrxu_parse_report()
1211 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1221 return -EINVAL; in sony_raw_event()
1229 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1231 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 && in sony_raw_event()
1234 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 && in sony_raw_event()
1237 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && rd[0] == 0x11 && in sony_raw_event()
1245 crc = ~crc32_le(crc, rd, DS4_INPUT_REPORT_0x11_SIZE-4); in sony_raw_event()
1246 report_crc = get_unaligned_le32(&rd[DS4_INPUT_REPORT_0x11_SIZE-4]); in sony_raw_event()
1248 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n", in sony_raw_event()
1250 return -EILSEQ; in sony_raw_event()
1254 } else if ((sc->quirks & DUALSHOCK4_DONGLE) && rd[0] == 0x01 && in sony_raw_event()
1262 * For non-dongle, this bit is always 0 (connected). in sony_raw_event()
1266 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1267 dongle_state = sc->ds4_dongle_state; in sony_raw_event()
1268 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1279 hid_info(sc->hdev, "DualShock 4 USB dongle: controller connected\n"); in sony_raw_event()
1282 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1283 sc->ds4_dongle_state = DONGLE_CALIBRATING; in sony_raw_event()
1284 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1294 hid_info(sc->hdev, "DualShock 4 USB dongle: controller disconnected\n"); in sony_raw_event()
1296 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1297 sc->ds4_dongle_state = DONGLE_DISCONNECTED; in sony_raw_event()
1298 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1311 } else if ((sc->quirks & NSG_MRXU_REMOTE) && rd[0] == 0x02) { in sony_raw_event()
1316 if (sc->defer_initialization) { in sony_raw_event()
1317 sc->defer_initialization = 0; in sony_raw_event()
1330 if (sc->quirks & BUZZ_CONTROLLER) { in sony_mapping()
1331 unsigned int key = usage->hid & HID_USAGE; in sony_mapping()
1333 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON) in sony_mapping()
1334 return -1; in sony_mapping()
1336 switch (usage->collection_index) { in sony_mapping()
1339 return -1; in sony_mapping()
1343 return -1; in sony_mapping()
1346 return -1; in sony_mapping()
1353 if (sc->quirks & PS3REMOTE) in sony_mapping()
1356 if (sc->quirks & NAVIGATION_CONTROLLER) in sony_mapping()
1359 if (sc->quirks & SIXAXIS_CONTROLLER) in sony_mapping()
1362 if (sc->quirks & DUALSHOCK4_CONTROLLER) in sony_mapping()
1366 /* Let hid-core decide for the others */ in sony_mapping()
1377 sc->touchpad = devm_input_allocate_device(&sc->hdev->dev); in sony_register_touchpad()
1378 if (!sc->touchpad) in sony_register_touchpad()
1379 return -ENOMEM; in sony_register_touchpad()
1381 input_set_drvdata(sc->touchpad, sc); in sony_register_touchpad()
1382 sc->touchpad->dev.parent = &sc->hdev->dev; in sony_register_touchpad()
1383 sc->touchpad->phys = sc->hdev->phys; in sony_register_touchpad()
1384 sc->touchpad->uniq = sc->hdev->uniq; in sony_register_touchpad()
1385 sc->touchpad->id.bustype = sc->hdev->bus; in sony_register_touchpad()
1386 sc->touchpad->id.vendor = sc->hdev->vendor; in sony_register_touchpad()
1387 sc->touchpad->id.product = sc->hdev->product; in sony_register_touchpad()
1388 sc->touchpad->id.version = sc->hdev->version; in sony_register_touchpad()
1391 * DS4 compatible non-Sony devices with different names. in sony_register_touchpad()
1393 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX); in sony_register_touchpad()
1394 name = devm_kzalloc(&sc->hdev->dev, name_sz, GFP_KERNEL); in sony_register_touchpad()
1396 return -ENOMEM; in sony_register_touchpad()
1397 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name); in sony_register_touchpad()
1398 sc->touchpad->name = name; in sony_register_touchpad()
1401 __set_bit(EV_KEY, sc->touchpad->evbit); in sony_register_touchpad()
1402 __set_bit(BTN_LEFT, sc->touchpad->keybit); in sony_register_touchpad()
1403 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit); in sony_register_touchpad()
1405 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0); in sony_register_touchpad()
1406 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0); in sony_register_touchpad()
1409 input_set_abs_params(sc->touchpad, ABS_MT_TOUCH_MAJOR, in sony_register_touchpad()
1412 input_set_abs_params(sc->touchpad, ABS_MT_TOUCH_MINOR, in sony_register_touchpad()
1415 input_set_abs_params(sc->touchpad, ABS_MT_ORIENTATION, in sony_register_touchpad()
1419 if (sc->quirks & NSG_MRXU_REMOTE) { in sony_register_touchpad()
1420 __set_bit(EV_REL, sc->touchpad->evbit); in sony_register_touchpad()
1423 ret = input_mt_init_slots(sc->touchpad, touch_count, INPUT_MT_POINTER); in sony_register_touchpad()
1427 ret = input_register_device(sc->touchpad); in sony_register_touchpad()
1439 int range; in sony_register_sensors() local
1441 sc->sensor_dev = devm_input_allocate_device(&sc->hdev->dev); in sony_register_sensors()
1442 if (!sc->sensor_dev) in sony_register_sensors()
1443 return -ENOMEM; in sony_register_sensors()
1445 input_set_drvdata(sc->sensor_dev, sc); in sony_register_sensors()
1446 sc->sensor_dev->dev.parent = &sc->hdev->dev; in sony_register_sensors()
1447 sc->sensor_dev->phys = sc->hdev->phys; in sony_register_sensors()
1448 sc->sensor_dev->uniq = sc->hdev->uniq; in sony_register_sensors()
1449 sc->sensor_dev->id.bustype = sc->hdev->bus; in sony_register_sensors()
1450 sc->sensor_dev->id.vendor = sc->hdev->vendor; in sony_register_sensors()
1451 sc->sensor_dev->id.product = sc->hdev->product; in sony_register_sensors()
1452 sc->sensor_dev->id.version = sc->hdev->version; in sony_register_sensors()
1455 * DS4 compatible non-Sony devices with different names. in sony_register_sensors()
1457 name_sz = strlen(sc->hdev->name) + sizeof(SENSOR_SUFFIX); in sony_register_sensors()
1458 name = devm_kzalloc(&sc->hdev->dev, name_sz, GFP_KERNEL); in sony_register_sensors()
1460 return -ENOMEM; in sony_register_sensors()
1461 snprintf(name, name_sz, "%s" SENSOR_SUFFIX, sc->hdev->name); in sony_register_sensors()
1462 sc->sensor_dev->name = name; in sony_register_sensors()
1464 if (sc->quirks & SIXAXIS_CONTROLLER) { in sony_register_sensors()
1467 * a 1-axis gyro, but it is very difficult to manage from within in sony_register_sensors()
1471 input_set_abs_params(sc->sensor_dev, ABS_X, -512, 511, 4, 0); in sony_register_sensors()
1472 input_set_abs_params(sc->sensor_dev, ABS_Y, -512, 511, 4, 0); in sony_register_sensors()
1473 input_set_abs_params(sc->sensor_dev, ABS_Z, -512, 511, 4, 0); in sony_register_sensors()
1474 input_abs_set_res(sc->sensor_dev, ABS_X, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1475 input_abs_set_res(sc->sensor_dev, ABS_Y, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1476 input_abs_set_res(sc->sensor_dev, ABS_Z, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1477 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_register_sensors()
1478 range = DS4_ACC_RES_PER_G*4; in sony_register_sensors()
1479 input_set_abs_params(sc->sensor_dev, ABS_X, -range, range, 16, 0); in sony_register_sensors()
1480 input_set_abs_params(sc->sensor_dev, ABS_Y, -range, range, 16, 0); in sony_register_sensors()
1481 input_set_abs_params(sc->sensor_dev, ABS_Z, -range, range, 16, 0); in sony_register_sensors()
1482 input_abs_set_res(sc->sensor_dev, ABS_X, DS4_ACC_RES_PER_G); in sony_register_sensors()
1483 input_abs_set_res(sc->sensor_dev, ABS_Y, DS4_ACC_RES_PER_G); in sony_register_sensors()
1484 input_abs_set_res(sc->sensor_dev, ABS_Z, DS4_ACC_RES_PER_G); in sony_register_sensors()
1486 range = DS4_GYRO_RES_PER_DEG_S*2048; in sony_register_sensors()
1487 input_set_abs_params(sc->sensor_dev, ABS_RX, -range, range, 16, 0); in sony_register_sensors()
1488 input_set_abs_params(sc->sensor_dev, ABS_RY, -range, range, 16, 0); in sony_register_sensors()
1489 input_set_abs_params(sc->sensor_dev, ABS_RZ, -range, range, 16, 0); in sony_register_sensors()
1490 input_abs_set_res(sc->sensor_dev, ABS_RX, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1491 input_abs_set_res(sc->sensor_dev, ABS_RY, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1492 input_abs_set_res(sc->sensor_dev, ABS_RZ, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1494 __set_bit(EV_MSC, sc->sensor_dev->evbit); in sony_register_sensors()
1495 __set_bit(MSC_TIMESTAMP, sc->sensor_dev->mscbit); in sony_register_sensors()
1498 __set_bit(INPUT_PROP_ACCELEROMETER, sc->sensor_dev->propbit); in sony_register_sensors()
1500 ret = input_register_device(sc->sensor_dev); in sony_register_sensors()
1521 return -ENOMEM; in sixaxis_set_operational_usb()
1543 * start rumbling non-stop. in sixaxis_set_operational_usb()
1545 if (strcmp(hdev->name, "SHANWAN PS3 GamePad")) { in sixaxis_set_operational_usb()
1567 return -ENOMEM; in sixaxis_set_operational_bt()
1599 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in dualshock4_get_calibration_data()
1602 return -ENOMEM; in dualshock4_get_calibration_data()
1604 ret = hid_hw_raw_request(sc->hdev, 0x02, buf, in dualshock4_get_calibration_data()
1618 return -ENOMEM; in dualshock4_get_calibration_data()
1621 ret = hid_hw_raw_request(sc->hdev, 0x05, buf, in dualshock4_get_calibration_data()
1630 crc = ~crc32_le(crc, buf, DS4_FEATURE_REPORT_0x05_SIZE-4); in dualshock4_get_calibration_data()
1631 report_crc = get_unaligned_le32(&buf[DS4_FEATURE_REPORT_0x05_SIZE-4]); in dualshock4_get_calibration_data()
1633 …hid_warn(sc->hdev, "DualShock 4 calibration report's CRC check failed, received crc 0x%0x != 0x%0x… in dualshock4_get_calibration_data()
1636 hid_warn(sc->hdev, "Retrying DualShock 4 get calibration report request\n"); in dualshock4_get_calibration_data()
1639 ret = -EILSEQ; in dualshock4_get_calibration_data()
1651 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { in dualshock4_get_calibration_data()
1680 sc->ds4_calib_data[0].abs_code = ABS_RX; in dualshock4_get_calibration_data()
1681 sc->ds4_calib_data[0].bias = gyro_pitch_bias; in dualshock4_get_calibration_data()
1682 sc->ds4_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1683 sc->ds4_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus; in dualshock4_get_calibration_data()
1685 sc->ds4_calib_data[1].abs_code = ABS_RY; in dualshock4_get_calibration_data()
1686 sc->ds4_calib_data[1].bias = gyro_yaw_bias; in dualshock4_get_calibration_data()
1687 sc->ds4_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1688 sc->ds4_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus; in dualshock4_get_calibration_data()
1690 sc->ds4_calib_data[2].abs_code = ABS_RZ; in dualshock4_get_calibration_data()
1691 sc->ds4_calib_data[2].bias = gyro_roll_bias; in dualshock4_get_calibration_data()
1692 sc->ds4_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1693 sc->ds4_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus; in dualshock4_get_calibration_data()
1698 range_2g = acc_x_plus - acc_x_minus; in dualshock4_get_calibration_data()
1699 sc->ds4_calib_data[3].abs_code = ABS_X; in dualshock4_get_calibration_data()
1700 sc->ds4_calib_data[3].bias = acc_x_plus - range_2g / 2; in dualshock4_get_calibration_data()
1701 sc->ds4_calib_data[3].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1702 sc->ds4_calib_data[3].sens_denom = range_2g; in dualshock4_get_calibration_data()
1704 range_2g = acc_y_plus - acc_y_minus; in dualshock4_get_calibration_data()
1705 sc->ds4_calib_data[4].abs_code = ABS_Y; in dualshock4_get_calibration_data()
1706 sc->ds4_calib_data[4].bias = acc_y_plus - range_2g / 2; in dualshock4_get_calibration_data()
1707 sc->ds4_calib_data[4].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1708 sc->ds4_calib_data[4].sens_denom = range_2g; in dualshock4_get_calibration_data()
1710 range_2g = acc_z_plus - acc_z_minus; in dualshock4_get_calibration_data()
1711 sc->ds4_calib_data[5].abs_code = ABS_Z; in dualshock4_get_calibration_data()
1712 sc->ds4_calib_data[5].bias = acc_z_plus - range_2g / 2; in dualshock4_get_calibration_data()
1713 sc->ds4_calib_data[5].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1714 sc->ds4_calib_data[5].sens_denom = range_2g; in dualshock4_get_calibration_data()
1732 * dongle as disabled. We will re-enable the dongle if a new in dualshock4_calibration_work()
1736 hid_err(sc->hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n"); in dualshock4_calibration_work()
1739 hid_info(sc->hdev, "DualShock 4 USB dongle: calibration completed\n"); in dualshock4_calibration_work()
1743 spin_lock_irqsave(&sc->lock, flags); in dualshock4_calibration_work()
1744 sc->ds4_dongle_state = dongle_state; in dualshock4_calibration_work()
1745 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_calibration_work()
1755 return -ENOMEM; in dualshock4_get_version_info()
1757 ret = hid_hw_raw_request(sc->hdev, 0xA3, buf, in dualshock4_get_version_info()
1766 sc->hw_version = get_unaligned_le16(&buf[35]); in dualshock4_get_version_info()
1767 sc->fw_version = get_unaligned_le16(&buf[41]); in dualshock4_get_version_info()
1788 int id = sc->device_id; in sixaxis_set_leds_from_id()
1796 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id])); in sixaxis_set_leds_from_id()
1812 int id = sc->device_id; in dualshock4_set_leds_from_id()
1820 memcpy(sc->led_state, color_code[id], sizeof(color_code[id])); in dualshock4_set_leds_from_id()
1825 struct hid_device *hdev = sc->hdev; in buzz_set_leds()
1827 &hdev->report_enum[HID_OUTPUT_REPORT].report_list; in buzz_set_leds()
1828 struct hid_report *report = list_entry(report_list->next, in buzz_set_leds()
1830 s32 *value = report->field[0]->value; in buzz_set_leds()
1835 value[1] = sc->led_state[0] ? 0xff : 0x00; in buzz_set_leds()
1836 value[2] = sc->led_state[1] ? 0xff : 0x00; in buzz_set_leds()
1837 value[3] = sc->led_state[2] ? 0xff : 0x00; in buzz_set_leds()
1838 value[4] = sc->led_state[3] ? 0xff : 0x00; in buzz_set_leds()
1846 if (!(sc->quirks & BUZZ_CONTROLLER)) in sony_set_leds()
1855 struct device *dev = led->dev->parent; in sony_led_set_brightness()
1875 force_update = !!(drv_data->quirks & SIXAXIS_CONTROLLER_USB); in sony_led_set_brightness()
1877 for (n = 0; n < drv_data->led_count; n++) { in sony_led_set_brightness()
1878 if (led == drv_data->leds[n] && (force_update || in sony_led_set_brightness()
1879 (value != drv_data->led_state[n] || in sony_led_set_brightness()
1880 drv_data->led_delay_on[n] || in sony_led_set_brightness()
1881 drv_data->led_delay_off[n]))) { in sony_led_set_brightness()
1883 drv_data->led_state[n] = value; in sony_led_set_brightness()
1886 drv_data->led_delay_on[n] = 0; in sony_led_set_brightness()
1887 drv_data->led_delay_off[n] = 0; in sony_led_set_brightness()
1897 struct device *dev = led->dev->parent; in sony_led_get_brightness()
1909 for (n = 0; n < drv_data->led_count; n++) { in sony_led_get_brightness()
1910 if (led == drv_data->leds[n]) in sony_led_get_brightness()
1911 return drv_data->led_state[n]; in sony_led_get_brightness()
1920 struct device *dev = led->dev->parent; in sony_led_blink_set()
1928 return -EINVAL; in sony_led_blink_set()
1944 for (n = 0; n < drv_data->led_count; n++) { in sony_led_blink_set()
1945 if (led == drv_data->leds[n]) in sony_led_blink_set()
1950 if (n >= drv_data->led_count) in sony_led_blink_set()
1951 return -EINVAL; in sony_led_blink_set()
1954 if (new_on != drv_data->led_delay_on[n] || in sony_led_blink_set()
1955 new_off != drv_data->led_delay_off[n]) { in sony_led_blink_set()
1956 drv_data->led_delay_on[n] = new_on; in sony_led_blink_set()
1957 drv_data->led_delay_off[n] = new_off; in sony_led_blink_set()
1966 struct hid_device *hdev = sc->hdev; in sony_leds_init()
1976 u8 max_brightness[MAX_LEDS] = { [0 ... (MAX_LEDS - 1)] = 1 }; in sony_leds_init()
1979 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_init()
1981 if (sc->quirks & BUZZ_CONTROLLER) { in sony_leds_init()
1982 sc->led_count = 4; in sony_leds_init()
1988 return -ENODEV; in sony_leds_init()
1989 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_leds_init()
1991 sc->led_state[3] = 1; in sony_leds_init()
1992 sc->led_count = 4; in sony_leds_init()
1998 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_leds_init()
1999 sc->led_count = 3; in sony_leds_init()
2004 } else if (sc->quirks & NAVIGATION_CONTROLLER) { in sony_leds_init()
2007 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds)); in sony_leds_init()
2008 sc->led_count = 1; in sony_leds_init()
2015 sc->led_count = 4; in sony_leds_init()
2029 name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1; in sony_leds_init()
2031 for (n = 0; n < sc->led_count; n++) { in sony_leds_init()
2034 name_sz = strlen(dev_name(&hdev->dev)) + strlen(ds4_name_str[n]) + 2; in sony_leds_init()
2036 led = devm_kzalloc(&hdev->dev, sizeof(struct led_classdev) + name_sz, GFP_KERNEL); in sony_leds_init()
2039 return -ENOMEM; in sony_leds_init()
2044 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), in sony_leds_init()
2047 snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1); in sony_leds_init()
2048 led->name = name; in sony_leds_init()
2049 led->brightness = sc->led_state[n]; in sony_leds_init()
2050 led->max_brightness = max_brightness[n]; in sony_leds_init()
2051 led->flags = LED_CORE_SUSPENDRESUME; in sony_leds_init()
2052 led->brightness_get = sony_led_get_brightness; in sony_leds_init()
2053 led->brightness_set = sony_led_set_brightness; in sony_leds_init()
2056 led->blink_set = sony_led_blink_set; in sony_leds_init()
2058 sc->leds[n] = led; in sony_leds_init()
2060 ret = devm_led_classdev_register(&hdev->dev, led); in sony_leds_init()
2085 (struct sixaxis_output_report *)sc->output_report_dmabuf; in sixaxis_send_output_report()
2092 report->rumble.right_motor_on = sc->right ? 1 : 0; in sixaxis_send_output_report()
2093 report->rumble.left_motor_force = sc->left; in sixaxis_send_output_report()
2096 report->leds_bitmap |= sc->led_state[0] << 1; in sixaxis_send_output_report()
2097 report->leds_bitmap |= sc->led_state[1] << 2; in sixaxis_send_output_report()
2098 report->leds_bitmap |= sc->led_state[2] << 3; in sixaxis_send_output_report()
2099 report->leds_bitmap |= sc->led_state[3] << 4; in sixaxis_send_output_report()
2102 if ((report->leds_bitmap & 0x1E) == 0) in sixaxis_send_output_report()
2103 report->leds_bitmap |= 0x20; in sixaxis_send_output_report()
2115 if (sc->led_delay_on[n] || sc->led_delay_off[n]) { in sixaxis_send_output_report()
2116 report->led[3 - n].duty_off = sc->led_delay_off[n]; in sixaxis_send_output_report()
2117 report->led[3 - n].duty_on = sc->led_delay_on[n]; in sixaxis_send_output_report()
2121 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report, in sixaxis_send_output_report()
2128 struct hid_device *hdev = sc->hdev; in dualshock4_send_output_report()
2129 u8 *buf = sc->output_report_dmabuf; in dualshock4_send_output_report()
2135 * 0x00 - 1ms in dualshock4_send_output_report()
2136 * 0x01 - 1ms in dualshock4_send_output_report()
2137 * 0x02 - 2ms in dualshock4_send_output_report()
2138 * 0x3E - 62ms in dualshock4_send_output_report()
2139 * 0x3F - disabled in dualshock4_send_output_report()
2141 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in dualshock4_send_output_report()
2149 buf[1] = 0xC0 /* HID + CRC */ | sc->ds4_bt_poll_interval; in dualshock4_send_output_report()
2155 buf[offset++] = sc->right; in dualshock4_send_output_report()
2156 buf[offset++] = sc->left; in dualshock4_send_output_report()
2162 if (sc->led_state[3]) { in dualshock4_send_output_report()
2163 buf[offset++] = sc->led_state[0]; in dualshock4_send_output_report()
2164 buf[offset++] = sc->led_state[1]; in dualshock4_send_output_report()
2165 buf[offset++] = sc->led_state[2]; in dualshock4_send_output_report()
2171 buf[offset++] = sc->led_delay_on[3]; in dualshock4_send_output_report()
2172 buf[offset++] = sc->led_delay_off[3]; in dualshock4_send_output_report()
2174 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) in dualshock4_send_output_report()
2182 crc = ~crc32_le(crc, buf, DS4_OUTPUT_REPORT_0x11_SIZE-4); in dualshock4_send_output_report()
2190 struct hid_device *hdev = sc->hdev; in motion_send_output_report()
2192 (struct motion_output_report_02 *)sc->output_report_dmabuf; in motion_send_output_report()
2196 report->type = 0x02; /* set leds */ in motion_send_output_report()
2197 report->r = sc->led_state[0]; in motion_send_output_report()
2198 report->g = sc->led_state[1]; in motion_send_output_report()
2199 report->b = sc->led_state[2]; in motion_send_output_report()
2202 report->rumble = max(sc->right, sc->left); in motion_send_output_report()
2210 if (sc->send_output_report) in sony_send_output_report()
2211 sc->send_output_report(sc); in sony_send_output_report()
2218 sc->send_output_report(sc); in sony_state_worker()
2223 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_allocate_output_report()
2224 (sc->quirks & NAVIGATION_CONTROLLER)) in sony_allocate_output_report()
2225 sc->output_report_dmabuf = in sony_allocate_output_report()
2226 devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2229 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_allocate_output_report()
2230 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2233 else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) in sony_allocate_output_report()
2234 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2237 else if (sc->quirks & MOTION_CONTROLLER) in sony_allocate_output_report()
2238 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2244 if (!sc->output_report_dmabuf) in sony_allocate_output_report()
2245 return -ENOMEM; in sony_allocate_output_report()
2257 if (effect->type != FF_RUMBLE) in sony_play_effect()
2260 sc->left = effect->u.rumble.strong_magnitude / 256; in sony_play_effect()
2261 sc->right = effect->u.rumble.weak_magnitude / 256; in sony_play_effect()
2272 if (list_empty(&sc->hdev->inputs)) { in sony_init_ff()
2273 hid_err(sc->hdev, "no inputs found\n"); in sony_init_ff()
2274 return -ENODEV; in sony_init_ff()
2276 hidinput = list_entry(sc->hdev->inputs.next, struct hid_input, list); in sony_init_ff()
2277 input_dev = hidinput->input; in sony_init_ff()
2300 spin_lock_irqsave(&sc->lock, flags); in sony_battery_get_property()
2301 battery_charging = sc->battery_charging; in sony_battery_get_property()
2302 battery_capacity = sc->battery_capacity; in sony_battery_get_property()
2303 cable_state = sc->cable_state; in sony_battery_get_property()
2304 spin_unlock_irqrestore(&sc->lock, flags); in sony_battery_get_property()
2308 val->intval = 1; in sony_battery_get_property()
2311 val->intval = POWER_SUPPLY_SCOPE_DEVICE; in sony_battery_get_property()
2314 val->intval = battery_capacity; in sony_battery_get_property()
2318 val->intval = POWER_SUPPLY_STATUS_CHARGING; in sony_battery_get_property()
2321 val->intval = POWER_SUPPLY_STATUS_FULL; in sony_battery_get_property()
2323 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in sony_battery_get_property()
2326 ret = -EINVAL; in sony_battery_get_property()
2338 struct hid_device *hdev = sc->hdev; in sony_battery_probe()
2345 sc->battery_capacity = 100; in sony_battery_probe()
2347 sc->battery_desc.properties = sony_battery_props; in sony_battery_probe()
2348 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props); in sony_battery_probe()
2349 sc->battery_desc.get_property = sony_battery_get_property; in sony_battery_probe()
2350 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in sony_battery_probe()
2351 sc->battery_desc.use_for_apm = 0; in sony_battery_probe()
2352 sc->battery_desc.name = devm_kasprintf(&hdev->dev, GFP_KERNEL, in sony_battery_probe()
2353 battery_str_fmt, sc->mac_address, sc->device_id); in sony_battery_probe()
2354 if (!sc->battery_desc.name) in sony_battery_probe()
2355 return -ENOMEM; in sony_battery_probe()
2357 sc->battery = devm_power_supply_register(&hdev->dev, &sc->battery_desc, in sony_battery_probe()
2359 if (IS_ERR(sc->battery)) { in sony_battery_probe()
2360 ret = PTR_ERR(sc->battery); in sony_battery_probe()
2365 power_supply_powers(sc->battery, &hdev->dev); in sony_battery_probe()
2375 * Some USB-only devices masquerade as Sixaxis controllers and all have the
2383 const int sc0_not_bt = !(sc0->quirks & SONY_BT_DEVICE); in sony_compare_connection_type()
2384 const int sc1_not_bt = !(sc1->quirks & SONY_BT_DEVICE); in sony_compare_connection_type()
2398 ret = memcmp(sc->mac_address, entry->mac_address, in sony_check_add_dev_list()
2399 sizeof(sc->mac_address)); in sony_check_add_dev_list()
2404 ret = -EEXIST; in sony_check_add_dev_list()
2405 hid_info(sc->hdev, in sony_check_add_dev_list()
2407 sc->mac_address); in sony_check_add_dev_list()
2414 list_add(&(sc->list_node), &sony_device_list); in sony_check_add_dev_list()
2425 if (sc->list_node.next) { in sony_remove_dev_list()
2427 list_del(&(sc->list_node)); in sony_remove_dev_list()
2437 ret = strlen(sc->hdev->uniq); in sony_get_bt_devaddr()
2439 return -EINVAL; in sony_get_bt_devaddr()
2441 ret = sscanf(sc->hdev->uniq, in sony_get_bt_devaddr()
2443 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3], in sony_get_bt_devaddr()
2444 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]); in sony_get_bt_devaddr()
2447 return -EINVAL; in sony_get_bt_devaddr()
2457 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) || in sony_check_add()
2458 (sc->quirks & MOTION_CONTROLLER_BT) || in sony_check_add()
2459 (sc->quirks & NAVIGATION_CONTROLLER_BT) || in sony_check_add()
2460 (sc->quirks & SIXAXIS_CONTROLLER_BT)) { in sony_check_add()
2468 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n"); in sony_check_add()
2471 } else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in sony_check_add()
2474 return -ENOMEM; in sony_check_add()
2481 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, in sony_check_add()
2486 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n"); in sony_check_add()
2487 ret = ret < 0 ? ret : -EINVAL; in sony_check_add()
2491 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); in sony_check_add()
2493 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq), in sony_check_add()
2494 "%pMR", sc->mac_address); in sony_check_add()
2495 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_check_add()
2496 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_check_add()
2499 return -ENOMEM; in sony_check_add()
2506 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, in sony_check_add()
2511 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n"); in sony_check_add()
2512 ret = ret < 0 ? ret : -EINVAL; in sony_check_add()
2517 * The Sixaxis device MAC in the report is big-endian and must in sony_check_add()
2518 * be byte-swapped. in sony_check_add()
2521 sc->mac_address[5-n] = buf[4+n]; in sony_check_add()
2523 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq), in sony_check_add()
2524 "%pMR", sc->mac_address); in sony_check_add()
2544 * All others are set to -1. in sony_set_device_id()
2546 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_set_device_id()
2547 (sc->quirks & DUALSHOCK4_CONTROLLER)) { in sony_set_device_id()
2551 sc->device_id = -1; in sony_set_device_id()
2554 sc->device_id = ret; in sony_set_device_id()
2556 sc->device_id = -1; in sony_set_device_id()
2564 if (sc->device_id >= 0) { in sony_release_device_id()
2565 ida_simple_remove(&sony_device_id_allocator, sc->device_id); in sony_release_device_id()
2566 sc->device_id = -1; in sony_release_device_id()
2573 sc->send_output_report = send_output_report; in sony_init_output_report()
2575 if (!sc->state_worker_initialized) in sony_init_output_report()
2576 INIT_WORK(&sc->state_worker, sony_state_worker); in sony_init_output_report()
2578 sc->state_worker_initialized = 1; in sony_init_output_report()
2585 if (sc->hotplug_worker_initialized) in sony_cancel_work_sync()
2586 cancel_work_sync(&sc->hotplug_worker); in sony_cancel_work_sync()
2587 if (sc->state_worker_initialized) { in sony_cancel_work_sync()
2588 spin_lock_irqsave(&sc->lock, flags); in sony_cancel_work_sync()
2589 sc->state_worker_initialized = 0; in sony_cancel_work_sync()
2590 spin_unlock_irqrestore(&sc->lock, flags); in sony_cancel_work_sync()
2591 cancel_work_sync(&sc->state_worker); in sony_cancel_work_sync()
2618 if (sc->quirks & NAVIGATION_CONTROLLER_USB) { in sony_input_configured()
2635 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; in sony_input_configured()
2636 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID; in sony_input_configured()
2637 sc->defer_initialization = 1; in sony_input_configured()
2646 } else if (sc->quirks & NAVIGATION_CONTROLLER_BT) { in sony_input_configured()
2651 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; in sony_input_configured()
2660 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) { in sony_input_configured()
2667 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; in sony_input_configured()
2668 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID; in sony_input_configured()
2669 sc->defer_initialization = 1; in sony_input_configured()
2679 hid_err(sc->hdev, in sony_input_configured()
2685 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) { in sony_input_configured()
2690 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; in sony_input_configured()
2700 hid_err(sc->hdev, in sony_input_configured()
2706 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_input_configured()
2715 hid_err(sc->hdev, "Failed to get version data from Dualshock 4\n"); in sony_input_configured()
2719 ret = device_create_file(&sc->hdev->dev, &dev_attr_firmware_version); in sony_input_configured()
2722 sc->fw_version = 0; in sony_input_configured()
2723 sc->hw_version = 0; in sony_input_configured()
2724 hid_err(sc->hdev, "can't create sysfs firmware_version attribute err: %d\n", ret); in sony_input_configured()
2728 ret = device_create_file(&sc->hdev->dev, &dev_attr_hardware_version); in sony_input_configured()
2730 sc->hw_version = 0; in sony_input_configured()
2731 hid_err(sc->hdev, "can't create sysfs hardware_version attribute err: %d\n", ret); in sony_input_configured()
2741 hid_err(sc->hdev, in sony_input_configured()
2742 "Unable to initialize multi-touch slots: %d\n", in sony_input_configured()
2749 hid_err(sc->hdev, in sony_input_configured()
2754 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { in sony_input_configured()
2755 sc->ds4_bt_poll_interval = DS4_BT_DEFAULT_POLL_INTERVAL_MS; in sony_input_configured()
2756 ret = device_create_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_input_configured()
2758 hid_warn(sc->hdev, in sony_input_configured()
2763 if (sc->quirks & DUALSHOCK4_DONGLE) { in sony_input_configured()
2764 INIT_WORK(&sc->hotplug_worker, dualshock4_calibration_work); in sony_input_configured()
2765 sc->hotplug_worker_initialized = 1; in sony_input_configured()
2766 sc->ds4_dongle_state = DONGLE_DISCONNECTED; in sony_input_configured()
2770 } else if (sc->quirks & NSG_MRXU_REMOTE) { in sony_input_configured()
2772 * The NSG-MRxU touchpad supports 2 touches and has a in sony_input_configured()
2778 hid_err(sc->hdev, in sony_input_configured()
2779 "Unable to initialize multi-touch slots: %d\n", in sony_input_configured()
2784 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_input_configured()
2790 if (sc->quirks & SONY_LED_SUPPORT) { in sony_input_configured()
2796 if (sc->quirks & SONY_BATTERY_SUPPORT) { in sony_input_configured()
2809 if (sc->quirks & SONY_FF_SUPPORT) { in sony_input_configured()
2823 if (sc->ds4_bt_poll_interval) in sony_input_configured()
2824 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_input_configured()
2825 if (sc->fw_version) in sony_input_configured()
2826 device_remove_file(&sc->hdev->dev, &dev_attr_firmware_version); in sony_input_configured()
2827 if (sc->hw_version) in sony_input_configured()
2828 device_remove_file(&sc->hdev->dev, &dev_attr_hardware_version); in sony_input_configured()
2838 unsigned long quirks = id->driver_data; in sony_probe()
2842 if (!strcmp(hdev->name, "FutureMax Dance Mat")) in sony_probe()
2845 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL); in sony_probe()
2848 return -ENOMEM; in sony_probe()
2851 spin_lock_init(&sc->lock); in sony_probe()
2853 sc->quirks = quirks; in sony_probe()
2855 sc->hdev = hdev; in sony_probe()
2863 if (sc->quirks & VAIO_RDESC_CONSTANT) in sony_probe()
2865 else if (sc->quirks & SIXAXIS_CONTROLLER) in sony_probe()
2874 if (sc->quirks & (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)) in sony_probe()
2875 hdev->version |= 0x8000; in sony_probe()
2891 if (!(hdev->claimed & HID_CLAIMED_INPUT)) { in sony_probe()
2894 return -ENODEV; in sony_probe()
2906 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_remove()
2907 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_remove()
2909 if (sc->fw_version) in sony_remove()
2910 device_remove_file(&sc->hdev->dev, &dev_attr_firmware_version); in sony_remove()
2912 if (sc->hw_version) in sony_remove()
2913 device_remove_file(&sc->hdev->dev, &dev_attr_hardware_version); in sony_remove()
2930 /* On suspend stop any running force-feedback events */ in sony_suspend()
2934 sc->left = sc->right = 0; in sony_suspend()
2950 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_resume()
2951 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_resume()
2952 sixaxis_set_operational_usb(sc->hdev); in sony_resume()
2953 sc->defer_initialization = 1; in sony_resume()
2992 /* SMK-Link PS3 BD Remote Control */
3009 /* SMK-Link NSG-MR5U Remote Control */
3012 /* SMK-Link NSG-MR7U Remote Control */