Lines Matching +full:y +full:- +full:rp

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (c) 2020-2022 Sony Interactive Entertainment
15 #include <linux/led-class-multicolor.h>
20 #include "hid-ids.h"
203 uint8_t x, y; member
211 __le16 gyro[3]; /* x, y, z */
212 __le16 accel[3]; /* x, y, z */
224 static_assert(sizeof(struct dualsense_input_report) == DS_INPUT_REPORT_USB_SIZE - 1);
326 * 0x00 - 1ms
327 * 0x01 - 1ms
328 * 0x02 - 2ms
329 * 0x3E - 62ms
330 * 0x3F - disabled
419 uint8_t x, y; member
427 __le16 gyro[3]; /* x, y, z */
428 __le16 accel[3]; /* x, y, z */
528 static const struct {int x; int y; } ps_gamepad_hat_mapping[] = { member
529 {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
550 if (!memcmp(entry->mac_address, dev->mac_address, sizeof(dev->mac_address))) { in ps_devices_list_add()
551 hid_err(dev->hdev, "Duplicate device found for MAC address %pMR.\n", in ps_devices_list_add()
552 dev->mac_address); in ps_devices_list_add()
554 return -EEXIST; in ps_devices_list_add()
558 list_add_tail(&dev->list, &ps_devices_list); in ps_devices_list_add()
566 list_del(&dev->list); in ps_devices_list_remove()
578 dev->player_id = ret; in ps_device_set_player_id()
584 ida_free(&ps_player_id_allocator, dev->player_id); in ps_device_release_player_id()
586 dev->player_id = U32_MAX; in ps_device_release_player_id()
593 input_dev = devm_input_allocate_device(&hdev->dev); in ps_allocate_input_dev()
595 return ERR_PTR(-ENOMEM); in ps_allocate_input_dev()
597 input_dev->id.bustype = hdev->bus; in ps_allocate_input_dev()
598 input_dev->id.vendor = hdev->vendor; in ps_allocate_input_dev()
599 input_dev->id.product = hdev->product; in ps_allocate_input_dev()
600 input_dev->id.version = hdev->version; in ps_allocate_input_dev()
601 input_dev->uniq = hdev->uniq; in ps_allocate_input_dev()
604 input_dev->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, "%s %s", hdev->name, in ps_allocate_input_dev()
606 if (!input_dev->name) in ps_allocate_input_dev()
607 return ERR_PTR(-ENOMEM); in ps_allocate_input_dev()
609 input_dev->name = hdev->name; in ps_allocate_input_dev()
634 spin_lock_irqsave(&dev->lock, flags); in ps_battery_get_property()
635 battery_capacity = dev->battery_capacity; in ps_battery_get_property()
636 battery_status = dev->battery_status; in ps_battery_get_property()
637 spin_unlock_irqrestore(&dev->lock, flags); in ps_battery_get_property()
641 val->intval = battery_status; in ps_battery_get_property()
644 val->intval = 1; in ps_battery_get_property()
647 val->intval = battery_capacity; in ps_battery_get_property()
650 val->intval = POWER_SUPPLY_SCOPE_DEVICE; in ps_battery_get_property()
653 ret = -EINVAL; in ps_battery_get_property()
666 dev->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in ps_device_register_battery()
667 dev->battery_desc.properties = ps_power_supply_props; in ps_device_register_battery()
668 dev->battery_desc.num_properties = ARRAY_SIZE(ps_power_supply_props); in ps_device_register_battery()
669 dev->battery_desc.get_property = ps_battery_get_property; in ps_device_register_battery()
670 dev->battery_desc.name = devm_kasprintf(&dev->hdev->dev, GFP_KERNEL, in ps_device_register_battery()
671 "ps-controller-battery-%pMR", dev->mac_address); in ps_device_register_battery()
672 if (!dev->battery_desc.name) in ps_device_register_battery()
673 return -ENOMEM; in ps_device_register_battery()
675 battery = devm_power_supply_register(&dev->hdev->dev, &dev->battery_desc, &battery_cfg); in ps_device_register_battery()
678 hid_err(dev->hdev, "Unable to register battery device: %d\n", ret); in ps_device_register_battery()
681 dev->battery = battery; in ps_device_register_battery()
683 ret = power_supply_powers(dev->battery, &dev->hdev->dev); in ps_device_register_battery()
685 hid_err(dev->hdev, "Unable to activate battery device: %d\n", ret); in ps_device_register_battery()
721 input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0); in ps_gamepad_create()
722 input_set_abs_params(gamepad, ABS_HAT0Y, -1, 1, 0, 0); in ps_gamepad_create()
755 return -EINVAL; in ps_get_report()
760 return -EINVAL; in ps_get_report()
763 if (hdev->bus == BUS_BLUETOOTH && check_crc) { in ps_get_report()
765 uint8_t crc_offset = size - 4; in ps_get_report()
770 return -EILSEQ; in ps_get_report()
782 if (led_info->name) { in ps_led_register()
783 led->name = devm_kasprintf(&ps_dev->hdev->dev, GFP_KERNEL, in ps_led_register()
784 "%s:%s:%s", ps_dev->input_dev_name, led_info->color, led_info->name); in ps_led_register()
786 /* Backwards compatible mode for hid-sony, but not compliant with LED class spec. */ in ps_led_register()
787 led->name = devm_kasprintf(&ps_dev->hdev->dev, GFP_KERNEL, in ps_led_register()
788 "%s:%s", ps_dev->input_dev_name, led_info->color); in ps_led_register()
791 if (!led->name) in ps_led_register()
792 return -ENOMEM; in ps_led_register()
794 led->brightness = 0; in ps_led_register()
795 led->max_brightness = led_info->max_brightness; in ps_led_register()
796 led->flags = LED_CORE_SUSPENDRESUME; in ps_led_register()
797 led->brightness_get = led_info->brightness_get; in ps_led_register()
798 led->brightness_set_blocking = led_info->brightness_set; in ps_led_register()
799 led->blink_set = led_info->blink_set; in ps_led_register()
801 ret = devm_led_classdev_register(&ps_dev->hdev->dev, led); in ps_led_register()
803 hid_err(ps_dev->hdev, "Failed to register LED %s: %d\n", led_info->name, ret); in ps_led_register()
814 struct hid_device *hdev = ps_dev->hdev; in ps_lightbar_register()
819 mc_led_info = devm_kmalloc_array(&hdev->dev, 3, sizeof(*mc_led_info), in ps_lightbar_register()
822 return -ENOMEM; in ps_lightbar_register()
828 lightbar_mc_dev->subled_info = mc_led_info; in ps_lightbar_register()
829 lightbar_mc_dev->num_colors = 3; in ps_lightbar_register()
831 led_cdev = &lightbar_mc_dev->led_cdev; in ps_lightbar_register()
832 led_cdev->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, "%s:rgb:indicator", in ps_lightbar_register()
833 ps_dev->input_dev_name); in ps_lightbar_register()
834 if (!led_cdev->name) in ps_lightbar_register()
835 return -ENOMEM; in ps_lightbar_register()
836 led_cdev->brightness = 255; in ps_lightbar_register()
837 led_cdev->max_brightness = 255; in ps_lightbar_register()
838 led_cdev->brightness_set_blocking = brightness_set; in ps_lightbar_register()
840 ret = devm_led_classdev_multicolor_register(&hdev->dev, lightbar_mc_dev); in ps_lightbar_register()
859 __set_bit(INPUT_PROP_ACCELEROMETER, sensors->propbit); in ps_sensors_create()
860 __set_bit(EV_MSC, sensors->evbit); in ps_sensors_create()
861 __set_bit(MSC_TIMESTAMP, sensors->mscbit); in ps_sensors_create()
864 input_set_abs_params(sensors, ABS_X, -accel_range, accel_range, 16, 0); in ps_sensors_create()
865 input_set_abs_params(sensors, ABS_Y, -accel_range, accel_range, 16, 0); in ps_sensors_create()
866 input_set_abs_params(sensors, ABS_Z, -accel_range, accel_range, 16, 0); in ps_sensors_create()
872 input_set_abs_params(sensors, ABS_RX, -gyro_range, gyro_range, 16, 0); in ps_sensors_create()
873 input_set_abs_params(sensors, ABS_RY, -gyro_range, gyro_range, 16, 0); in ps_sensors_create()
874 input_set_abs_params(sensors, ABS_RZ, -gyro_range, gyro_range, 16, 0); in ps_sensors_create()
898 __set_bit(INPUT_PROP_BUTTONPAD, touchpad->propbit); in ps_touchpad_create()
900 input_set_abs_params(touchpad, ABS_MT_POSITION_X, 0, width - 1, 0, 0); in ps_touchpad_create()
901 input_set_abs_params(touchpad, ABS_MT_POSITION_Y, 0, height - 1, 0, 0); in ps_touchpad_create()
921 return sysfs_emit(buf, "0x%08x\n", ps_dev->fw_version); in firmware_version_show()
933 return sysfs_emit(buf, "0x%08x\n", ps_dev->hw_version); in hardware_version_show()
947 struct hid_device *hdev = ds->base.hdev; in dualsense_get_calibration_data()
963 return -ENOMEM; in dualsense_get_calibration_data()
965 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_CALIBRATION, buf, in dualsense_get_calibration_data()
968 hid_err(ds->base.hdev, "Failed to retrieve DualSense calibration info: %d\n", ret); in dualsense_get_calibration_data()
995 ds->gyro_calib_data[0].abs_code = ABS_RX; in dualsense_get_calibration_data()
996 ds->gyro_calib_data[0].bias = 0; in dualsense_get_calibration_data()
997 ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
998 ds->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) + in dualsense_get_calibration_data()
999 abs(gyro_pitch_minus - gyro_pitch_bias); in dualsense_get_calibration_data()
1001 ds->gyro_calib_data[1].abs_code = ABS_RY; in dualsense_get_calibration_data()
1002 ds->gyro_calib_data[1].bias = 0; in dualsense_get_calibration_data()
1003 ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
1004 ds->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) + in dualsense_get_calibration_data()
1005 abs(gyro_yaw_minus - gyro_yaw_bias); in dualsense_get_calibration_data()
1007 ds->gyro_calib_data[2].abs_code = ABS_RZ; in dualsense_get_calibration_data()
1008 ds->gyro_calib_data[2].bias = 0; in dualsense_get_calibration_data()
1009 ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
1010 ds->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) + in dualsense_get_calibration_data()
1011 abs(gyro_roll_minus - gyro_roll_bias); in dualsense_get_calibration_data()
1018 for (i = 0; i < ARRAY_SIZE(ds->gyro_calib_data); i++) { in dualsense_get_calibration_data()
1019 if (ds->gyro_calib_data[i].sens_denom == 0) { in dualsense_get_calibration_data()
1021 ds->gyro_calib_data[i].abs_code); in dualsense_get_calibration_data()
1022 ds->gyro_calib_data[i].bias = 0; in dualsense_get_calibration_data()
1023 ds->gyro_calib_data[i].sens_numer = DS_GYRO_RANGE; in dualsense_get_calibration_data()
1024 ds->gyro_calib_data[i].sens_denom = S16_MAX; in dualsense_get_calibration_data()
1032 range_2g = acc_x_plus - acc_x_minus; in dualsense_get_calibration_data()
1033 ds->accel_calib_data[0].abs_code = ABS_X; in dualsense_get_calibration_data()
1034 ds->accel_calib_data[0].bias = acc_x_plus - range_2g / 2; in dualsense_get_calibration_data()
1035 ds->accel_calib_data[0].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
1036 ds->accel_calib_data[0].sens_denom = range_2g; in dualsense_get_calibration_data()
1038 range_2g = acc_y_plus - acc_y_minus; in dualsense_get_calibration_data()
1039 ds->accel_calib_data[1].abs_code = ABS_Y; in dualsense_get_calibration_data()
1040 ds->accel_calib_data[1].bias = acc_y_plus - range_2g / 2; in dualsense_get_calibration_data()
1041 ds->accel_calib_data[1].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
1042 ds->accel_calib_data[1].sens_denom = range_2g; in dualsense_get_calibration_data()
1044 range_2g = acc_z_plus - acc_z_minus; in dualsense_get_calibration_data()
1045 ds->accel_calib_data[2].abs_code = ABS_Z; in dualsense_get_calibration_data()
1046 ds->accel_calib_data[2].bias = acc_z_plus - range_2g / 2; in dualsense_get_calibration_data()
1047 ds->accel_calib_data[2].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
1048 ds->accel_calib_data[2].sens_denom = range_2g; in dualsense_get_calibration_data()
1055 for (i = 0; i < ARRAY_SIZE(ds->accel_calib_data); i++) { in dualsense_get_calibration_data()
1056 if (ds->accel_calib_data[i].sens_denom == 0) { in dualsense_get_calibration_data()
1058 ds->accel_calib_data[i].abs_code); in dualsense_get_calibration_data()
1059 ds->accel_calib_data[i].bias = 0; in dualsense_get_calibration_data()
1060 ds->accel_calib_data[i].sens_numer = DS_ACC_RANGE; in dualsense_get_calibration_data()
1061 ds->accel_calib_data[i].sens_denom = S16_MAX; in dualsense_get_calibration_data()
1078 return -ENOMEM; in dualsense_get_firmware_info()
1080 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_FIRMWARE_INFO, buf, in dualsense_get_firmware_info()
1083 hid_err(ds->base.hdev, "Failed to retrieve DualSense firmware info: %d\n", ret); in dualsense_get_firmware_info()
1087 ds->base.hw_version = get_unaligned_le32(&buf[24]); in dualsense_get_firmware_info()
1088 ds->base.fw_version = get_unaligned_le32(&buf[28]); in dualsense_get_firmware_info()
1097 ds->update_version = get_unaligned_le16(&buf[44]); in dualsense_get_firmware_info()
1111 return -ENOMEM; in dualsense_get_mac_address()
1113 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_PAIRING_INFO, buf, in dualsense_get_mac_address()
1116 hid_err(ds->base.hdev, "Failed to retrieve DualSense pairing info: %d\n", ret); in dualsense_get_mac_address()
1120 memcpy(ds->base.mac_address, &buf[1], sizeof(ds->base.mac_address)); in dualsense_get_mac_address()
1135 red = mc_cdev->subled_info[0].brightness; in dualsense_lightbar_set_brightness()
1136 green = mc_cdev->subled_info[1].brightness; in dualsense_lightbar_set_brightness()
1137 blue = mc_cdev->subled_info[2].brightness; in dualsense_lightbar_set_brightness()
1145 struct hid_device *hdev = to_hid_device(led->dev->parent); in dualsense_player_led_get_brightness()
1148 return !!(ds->player_leds_state & BIT(led - ds->player_leds)); in dualsense_player_led_get_brightness()
1153 struct hid_device *hdev = to_hid_device(led->dev->parent); in dualsense_player_led_set_brightness()
1158 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_player_led_set_brightness()
1160 led_index = led - ds->player_leds; in dualsense_player_led_set_brightness()
1162 ds->player_leds_state &= ~BIT(led_index); in dualsense_player_led_set_brightness()
1164 ds->player_leds_state |= BIT(led_index); in dualsense_player_led_set_brightness()
1166 ds->update_player_leds = true; in dualsense_player_led_set_brightness()
1167 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_player_led_set_brightness()
1174 static void dualsense_init_output_report(struct dualsense *ds, struct dualsense_output_report *rp, in dualsense_init_output_report() argument
1177 struct hid_device *hdev = ds->base.hdev; in dualsense_init_output_report()
1179 if (hdev->bus == BUS_BLUETOOTH) { in dualsense_init_output_report()
1183 bt->report_id = DS_OUTPUT_REPORT_BT; in dualsense_init_output_report()
1184 bt->tag = DS_OUTPUT_TAG; /* Tag must be set. Exact meaning is unclear. */ in dualsense_init_output_report()
1187 * Highest 4-bit is a sequence number, which needs to be increased in dualsense_init_output_report()
1188 * every report. Lowest 4-bit is tag and can be zero for now. in dualsense_init_output_report()
1190 bt->seq_tag = (ds->output_seq << 4) | 0x0; in dualsense_init_output_report()
1191 if (++ds->output_seq == 16) in dualsense_init_output_report()
1192 ds->output_seq = 0; in dualsense_init_output_report()
1194 rp->data = buf; in dualsense_init_output_report()
1195 rp->len = sizeof(*bt); in dualsense_init_output_report()
1196 rp->bt = bt; in dualsense_init_output_report()
1197 rp->usb = NULL; in dualsense_init_output_report()
1198 rp->common = &bt->common; in dualsense_init_output_report()
1203 usb->report_id = DS_OUTPUT_REPORT_USB; in dualsense_init_output_report()
1205 rp->data = buf; in dualsense_init_output_report()
1206 rp->len = sizeof(*usb); in dualsense_init_output_report()
1207 rp->bt = NULL; in dualsense_init_output_report()
1208 rp->usb = usb; in dualsense_init_output_report()
1209 rp->common = &usb->common; in dualsense_init_output_report()
1217 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_schedule_work()
1218 if (ds->output_worker_initialized) in dualsense_schedule_work()
1219 schedule_work(&ds->output_worker); in dualsense_schedule_work()
1220 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_schedule_work()
1230 struct hid_device *hdev = ds->base.hdev; in dualsense_send_output_report()
1233 if (report->bt) { in dualsense_send_output_report()
1238 crc = ~crc32_le(crc, report->data, report->len - 4); in dualsense_send_output_report()
1240 report->bt->crc32 = cpu_to_le32(crc); in dualsense_send_output_report()
1243 hid_hw_output_report(hdev, report->data, report->len); in dualsense_send_output_report()
1253 dualsense_init_output_report(ds, &report, ds->output_report_dmabuf); in dualsense_output_worker()
1256 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_output_worker()
1258 if (ds->update_rumble) { in dualsense_output_worker()
1260 common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT; in dualsense_output_worker()
1261 if (ds->use_vibration_v2) in dualsense_output_worker()
1262 common->valid_flag2 |= DS_OUTPUT_VALID_FLAG2_COMPATIBLE_VIBRATION2; in dualsense_output_worker()
1264 common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION; in dualsense_output_worker()
1265 common->motor_left = ds->motor_left; in dualsense_output_worker()
1266 common->motor_right = ds->motor_right; in dualsense_output_worker()
1267 ds->update_rumble = false; in dualsense_output_worker()
1270 if (ds->update_lightbar) { in dualsense_output_worker()
1271 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE; in dualsense_output_worker()
1272 common->lightbar_red = ds->lightbar_red; in dualsense_output_worker()
1273 common->lightbar_green = ds->lightbar_green; in dualsense_output_worker()
1274 common->lightbar_blue = ds->lightbar_blue; in dualsense_output_worker()
1276 ds->update_lightbar = false; in dualsense_output_worker()
1279 if (ds->update_player_leds) { in dualsense_output_worker()
1280 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE; in dualsense_output_worker()
1281 common->player_leds = ds->player_leds_state; in dualsense_output_worker()
1283 ds->update_player_leds = false; in dualsense_output_worker()
1286 if (ds->update_mic_mute) { in dualsense_output_worker()
1287 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE; in dualsense_output_worker()
1288 common->mute_button_led = ds->mic_muted; in dualsense_output_worker()
1290 if (ds->mic_muted) { in dualsense_output_worker()
1292 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE; in dualsense_output_worker()
1293 common->power_save_control |= DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE; in dualsense_output_worker()
1296 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE; in dualsense_output_worker()
1297 common->power_save_control &= ~DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE; in dualsense_output_worker()
1300 ds->update_mic_mute = false; in dualsense_output_worker()
1303 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_output_worker()
1311 struct hid_device *hdev = ps_dev->hdev; in dualsense_parse_report()
1326 if (hdev->bus == BUS_USB && report->id == DS_INPUT_REPORT_USB && in dualsense_parse_report()
1329 } else if (hdev->bus == BUS_BLUETOOTH && report->id == DS_INPUT_REPORT_BT && in dualsense_parse_report()
1332 uint32_t report_crc = get_unaligned_le32(&data[size - 4]); in dualsense_parse_report()
1334 if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) { in dualsense_parse_report()
1336 return -EILSEQ; in dualsense_parse_report()
1341 hid_err(hdev, "Unhandled reportID=%d\n", report->id); in dualsense_parse_report()
1342 return -1; in dualsense_parse_report()
1345 input_report_abs(ds->gamepad, ABS_X, ds_report->x); in dualsense_parse_report()
1346 input_report_abs(ds->gamepad, ABS_Y, ds_report->y); in dualsense_parse_report()
1347 input_report_abs(ds->gamepad, ABS_RX, ds_report->rx); in dualsense_parse_report()
1348 input_report_abs(ds->gamepad, ABS_RY, ds_report->ry); in dualsense_parse_report()
1349 input_report_abs(ds->gamepad, ABS_Z, ds_report->z); in dualsense_parse_report()
1350 input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz); in dualsense_parse_report()
1352 value = ds_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH; in dualsense_parse_report()
1355 input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x); in dualsense_parse_report()
1356 input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y); in dualsense_parse_report()
1358 input_report_key(ds->gamepad, BTN_WEST, ds_report->buttons[0] & DS_BUTTONS0_SQUARE); in dualsense_parse_report()
1359 input_report_key(ds->gamepad, BTN_SOUTH, ds_report->buttons[0] & DS_BUTTONS0_CROSS); in dualsense_parse_report()
1360 input_report_key(ds->gamepad, BTN_EAST, ds_report->buttons[0] & DS_BUTTONS0_CIRCLE); in dualsense_parse_report()
1361 input_report_key(ds->gamepad, BTN_NORTH, ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE); in dualsense_parse_report()
1362 input_report_key(ds->gamepad, BTN_TL, ds_report->buttons[1] & DS_BUTTONS1_L1); in dualsense_parse_report()
1363 input_report_key(ds->gamepad, BTN_TR, ds_report->buttons[1] & DS_BUTTONS1_R1); in dualsense_parse_report()
1364 input_report_key(ds->gamepad, BTN_TL2, ds_report->buttons[1] & DS_BUTTONS1_L2); in dualsense_parse_report()
1365 input_report_key(ds->gamepad, BTN_TR2, ds_report->buttons[1] & DS_BUTTONS1_R2); in dualsense_parse_report()
1366 input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE); in dualsense_parse_report()
1367 input_report_key(ds->gamepad, BTN_START, ds_report->buttons[1] & DS_BUTTONS1_OPTIONS); in dualsense_parse_report()
1368 input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3); in dualsense_parse_report()
1369 input_report_key(ds->gamepad, BTN_THUMBR, ds_report->buttons[1] & DS_BUTTONS1_R3); in dualsense_parse_report()
1370 input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); in dualsense_parse_report()
1371 input_sync(ds->gamepad); in dualsense_parse_report()
1378 btn_mic_state = !!(ds_report->buttons[2] & DS_BUTTONS2_MIC_MUTE); in dualsense_parse_report()
1379 if (btn_mic_state && !ds->last_btn_mic_state) { in dualsense_parse_report()
1380 spin_lock_irqsave(&ps_dev->lock, flags); in dualsense_parse_report()
1381 ds->update_mic_mute = true; in dualsense_parse_report()
1382 ds->mic_muted = !ds->mic_muted; /* toggle */ in dualsense_parse_report()
1383 spin_unlock_irqrestore(&ps_dev->lock, flags); in dualsense_parse_report()
1388 ds->last_btn_mic_state = btn_mic_state; in dualsense_parse_report()
1391 for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) { in dualsense_parse_report()
1392 int raw_data = (short)le16_to_cpu(ds_report->gyro[i]); in dualsense_parse_report()
1393 int calib_data = mult_frac(ds->gyro_calib_data[i].sens_numer, in dualsense_parse_report()
1394 raw_data, ds->gyro_calib_data[i].sens_denom); in dualsense_parse_report()
1396 input_report_abs(ds->sensors, ds->gyro_calib_data[i].abs_code, calib_data); in dualsense_parse_report()
1400 for (i = 0; i < ARRAY_SIZE(ds_report->accel); i++) { in dualsense_parse_report()
1401 int raw_data = (short)le16_to_cpu(ds_report->accel[i]); in dualsense_parse_report()
1402 int calib_data = mult_frac(ds->accel_calib_data[i].sens_numer, in dualsense_parse_report()
1403 raw_data - ds->accel_calib_data[i].bias, in dualsense_parse_report()
1404 ds->accel_calib_data[i].sens_denom); in dualsense_parse_report()
1406 input_report_abs(ds->sensors, ds->accel_calib_data[i].abs_code, calib_data); in dualsense_parse_report()
1410 sensor_timestamp = le32_to_cpu(ds_report->sensor_timestamp); in dualsense_parse_report()
1411 if (!ds->sensor_timestamp_initialized) { in dualsense_parse_report()
1412 ds->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp, 3); in dualsense_parse_report()
1413 ds->sensor_timestamp_initialized = true; in dualsense_parse_report()
1417 if (ds->prev_sensor_timestamp > sensor_timestamp) in dualsense_parse_report()
1418 delta = (U32_MAX - ds->prev_sensor_timestamp + sensor_timestamp + 1); in dualsense_parse_report()
1420 delta = sensor_timestamp - ds->prev_sensor_timestamp; in dualsense_parse_report()
1421 ds->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta, 3); in dualsense_parse_report()
1423 ds->prev_sensor_timestamp = sensor_timestamp; in dualsense_parse_report()
1424 input_event(ds->sensors, EV_MSC, MSC_TIMESTAMP, ds->sensor_timestamp_us); in dualsense_parse_report()
1425 input_sync(ds->sensors); in dualsense_parse_report()
1427 for (i = 0; i < ARRAY_SIZE(ds_report->points); i++) { in dualsense_parse_report()
1428 struct dualsense_touch_point *point = &ds_report->points[i]; in dualsense_parse_report()
1429 bool active = (point->contact & DS_TOUCH_POINT_INACTIVE) ? false : true; in dualsense_parse_report()
1431 input_mt_slot(ds->touchpad, i); in dualsense_parse_report()
1432 input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active); in dualsense_parse_report()
1435 int x = (point->x_hi << 8) | point->x_lo; in dualsense_parse_report()
1436 int y = (point->y_hi << 4) | point->y_lo; in dualsense_parse_report() local
1438 input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x); in dualsense_parse_report()
1439 input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y); in dualsense_parse_report()
1442 input_mt_sync_frame(ds->touchpad); in dualsense_parse_report()
1443 input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD); in dualsense_parse_report()
1444 input_sync(ds->touchpad); in dualsense_parse_report()
1446 battery_data = ds_report->status & DS_STATUS_BATTERY_CAPACITY; in dualsense_parse_report()
1447 charging_status = (ds_report->status & DS_STATUS_CHARGING) >> DS_STATUS_CHARGING_SHIFT; in dualsense_parse_report()
1453 * 0 = 0-9%, 1 = 10-19%, .. and 10 = 100% in dualsense_parse_report()
1477 spin_lock_irqsave(&ps_dev->lock, flags); in dualsense_parse_report()
1478 ps_dev->battery_capacity = battery_capacity; in dualsense_parse_report()
1479 ps_dev->battery_status = battery_status; in dualsense_parse_report()
1480 spin_unlock_irqrestore(&ps_dev->lock, flags); in dualsense_parse_report()
1491 if (effect->type != FF_RUMBLE) in dualsense_play_effect()
1494 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_play_effect()
1495 ds->update_rumble = true; in dualsense_play_effect()
1496 ds->motor_left = effect->u.rumble.strong_magnitude / 256; in dualsense_play_effect()
1497 ds->motor_right = effect->u.rumble.weak_magnitude / 256; in dualsense_play_effect()
1498 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_play_effect()
1509 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_remove()
1510 ds->output_worker_initialized = false; in dualsense_remove()
1511 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_remove()
1513 cancel_work_sync(&ds->output_worker); in dualsense_remove()
1523 return -ENOMEM; in dualsense_reset_leds()
1533 report.common->valid_flag2 = DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE; in dualsense_reset_leds()
1534 report.common->lightbar_setup = DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT; /* Fade light out. */ in dualsense_reset_leds()
1545 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_set_lightbar()
1546 ds->update_lightbar = true; in dualsense_set_lightbar()
1547 ds->lightbar_red = red; in dualsense_set_lightbar()
1548 ds->lightbar_green = green; in dualsense_set_lightbar()
1549 ds->lightbar_blue = blue; in dualsense_set_lightbar()
1550 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_set_lightbar()
1560 * across the LEDs, so e.g. player 1 would be "--x--" with x being 'on'. in dualsense_set_player_leds()
1571 uint8_t player_id = ds->base.player_id % ARRAY_SIZE(player_ids); in dualsense_set_player_leds()
1573 ds->update_player_leds = true; in dualsense_set_player_leds()
1574 ds->player_leds_state = player_ids[player_id]; in dualsense_set_player_leds()
1598 ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL); in dualsense_create()
1600 return ERR_PTR(-ENOMEM); in dualsense_create()
1604 * hid-generic vs hid-playstation axis and button mapping. in dualsense_create()
1606 hdev->version |= HID_PLAYSTATION_VERSION_PATCH; in dualsense_create()
1608 ps_dev = &ds->base; in dualsense_create()
1609 ps_dev->hdev = hdev; in dualsense_create()
1610 spin_lock_init(&ps_dev->lock); in dualsense_create()
1611 ps_dev->battery_capacity = 100; /* initial value until parse_report. */ in dualsense_create()
1612 ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN; in dualsense_create()
1613 ps_dev->parse_report = dualsense_parse_report; in dualsense_create()
1614 ps_dev->remove = dualsense_remove; in dualsense_create()
1615 INIT_WORK(&ds->output_worker, dualsense_output_worker); in dualsense_create()
1616 ds->output_worker_initialized = true; in dualsense_create()
1620 ds->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL); in dualsense_create()
1621 if (!ds->output_report_dmabuf) in dualsense_create()
1622 return ERR_PTR(-ENOMEM); in dualsense_create()
1629 snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address); in dualsense_create()
1645 if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER) { in dualsense_create()
1647 ds->use_vibration_v2 = ds->update_version >= DS_FEATURE_VERSION(2, 21); in dualsense_create()
1648 } else if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER_2) { in dualsense_create()
1649 ds->use_vibration_v2 = true; in dualsense_create()
1662 ds->gamepad = ps_gamepad_create(hdev, dualsense_play_effect); in dualsense_create()
1663 if (IS_ERR(ds->gamepad)) { in dualsense_create()
1664 ret = PTR_ERR(ds->gamepad); in dualsense_create()
1668 ps_dev->input_dev_name = dev_name(&ds->gamepad->dev); in dualsense_create()
1670 ds->sensors = ps_sensors_create(hdev, DS_ACC_RANGE, DS_ACC_RES_PER_G, in dualsense_create()
1672 if (IS_ERR(ds->sensors)) { in dualsense_create()
1673 ret = PTR_ERR(ds->sensors); in dualsense_create()
1677 ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2); in dualsense_create()
1678 if (IS_ERR(ds->touchpad)) { in dualsense_create()
1679 ret = PTR_ERR(ds->touchpad); in dualsense_create()
1696 ret = ps_lightbar_register(ps_dev, &ds->lightbar, dualsense_lightbar_set_brightness); in dualsense_create()
1706 ret = ps_led_register(ps_dev, &ds->player_leds[i], led_info); in dualsense_create()
1725 ds->base.hw_version, ds->base.fw_version); in dualsense_create()
1727 return &ds->base; in dualsense_create()
1745 * dongle as disabled. We will re-enable the dongle if a new in dualshock4_dongle_calibration_work()
1749 hid_err(ds4->base.hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n"); in dualshock4_dongle_calibration_work()
1752 hid_info(ds4->base.hdev, "DualShock 4 USB dongle: calibration completed\n"); in dualshock4_dongle_calibration_work()
1756 spin_lock_irqsave(&ds4->base.lock, flags); in dualshock4_dongle_calibration_work()
1757 ds4->dongle_state = dongle_state; in dualshock4_dongle_calibration_work()
1758 spin_unlock_irqrestore(&ds4->base.lock, flags); in dualshock4_dongle_calibration_work()
1763 struct hid_device *hdev = ds4->base.hdev; in dualshock4_get_calibration_data()
1777 if (ds4->base.hdev->bus == BUS_USB) { in dualshock4_get_calibration_data()
1782 return -ENOMEM; in dualshock4_get_calibration_data()
1800 ret = -EILSEQ; in dualshock4_get_calibration_data()
1809 return -ENOMEM; in dualshock4_get_calibration_data()
1822 if (ds4->base.hdev->bus == BUS_USB) { in dualshock4_get_calibration_data()
1852 ds4->gyro_calib_data[0].abs_code = ABS_RX; in dualshock4_get_calibration_data()
1853 ds4->gyro_calib_data[0].bias = 0; in dualshock4_get_calibration_data()
1854 ds4->gyro_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1855 ds4->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) + in dualshock4_get_calibration_data()
1856 abs(gyro_pitch_minus - gyro_pitch_bias); in dualshock4_get_calibration_data()
1858 ds4->gyro_calib_data[1].abs_code = ABS_RY; in dualshock4_get_calibration_data()
1859 ds4->gyro_calib_data[1].bias = 0; in dualshock4_get_calibration_data()
1860 ds4->gyro_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1861 ds4->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) + in dualshock4_get_calibration_data()
1862 abs(gyro_yaw_minus - gyro_yaw_bias); in dualshock4_get_calibration_data()
1864 ds4->gyro_calib_data[2].abs_code = ABS_RZ; in dualshock4_get_calibration_data()
1865 ds4->gyro_calib_data[2].bias = 0; in dualshock4_get_calibration_data()
1866 ds4->gyro_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1867 ds4->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) + in dualshock4_get_calibration_data()
1868 abs(gyro_roll_minus - gyro_roll_bias); in dualshock4_get_calibration_data()
1875 for (i = 0; i < ARRAY_SIZE(ds4->gyro_calib_data); i++) { in dualshock4_get_calibration_data()
1876 if (ds4->gyro_calib_data[i].sens_denom == 0) { in dualshock4_get_calibration_data()
1878 ds4->gyro_calib_data[i].abs_code); in dualshock4_get_calibration_data()
1879 ds4->gyro_calib_data[i].bias = 0; in dualshock4_get_calibration_data()
1880 ds4->gyro_calib_data[i].sens_numer = DS4_GYRO_RANGE; in dualshock4_get_calibration_data()
1881 ds4->gyro_calib_data[i].sens_denom = S16_MAX; in dualshock4_get_calibration_data()
1889 range_2g = acc_x_plus - acc_x_minus; in dualshock4_get_calibration_data()
1890 ds4->accel_calib_data[0].abs_code = ABS_X; in dualshock4_get_calibration_data()
1891 ds4->accel_calib_data[0].bias = acc_x_plus - range_2g / 2; in dualshock4_get_calibration_data()
1892 ds4->accel_calib_data[0].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1893 ds4->accel_calib_data[0].sens_denom = range_2g; in dualshock4_get_calibration_data()
1895 range_2g = acc_y_plus - acc_y_minus; in dualshock4_get_calibration_data()
1896 ds4->accel_calib_data[1].abs_code = ABS_Y; in dualshock4_get_calibration_data()
1897 ds4->accel_calib_data[1].bias = acc_y_plus - range_2g / 2; in dualshock4_get_calibration_data()
1898 ds4->accel_calib_data[1].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1899 ds4->accel_calib_data[1].sens_denom = range_2g; in dualshock4_get_calibration_data()
1901 range_2g = acc_z_plus - acc_z_minus; in dualshock4_get_calibration_data()
1902 ds4->accel_calib_data[2].abs_code = ABS_Z; in dualshock4_get_calibration_data()
1903 ds4->accel_calib_data[2].bias = acc_z_plus - range_2g / 2; in dualshock4_get_calibration_data()
1904 ds4->accel_calib_data[2].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1905 ds4->accel_calib_data[2].sens_denom = range_2g; in dualshock4_get_calibration_data()
1912 for (i = 0; i < ARRAY_SIZE(ds4->accel_calib_data); i++) { in dualshock4_get_calibration_data()
1913 if (ds4->accel_calib_data[i].sens_denom == 0) { in dualshock4_get_calibration_data()
1915 ds4->accel_calib_data[i].abs_code); in dualshock4_get_calibration_data()
1916 ds4->accel_calib_data[i].bias = 0; in dualshock4_get_calibration_data()
1917 ds4->accel_calib_data[i].sens_numer = DS4_ACC_RANGE; in dualshock4_get_calibration_data()
1918 ds4->accel_calib_data[i].sens_denom = S16_MAX; in dualshock4_get_calibration_data()
1934 return -ENOMEM; in dualshock4_get_firmware_info()
1939 ret = ps_get_report(ds4->base.hdev, DS4_FEATURE_REPORT_FIRMWARE_INFO, buf, in dualshock4_get_firmware_info()
1942 hid_err(ds4->base.hdev, "Failed to retrieve DualShock4 firmware info: %d\n", ret); in dualshock4_get_firmware_info()
1946 ds4->base.hw_version = get_unaligned_le16(&buf[35]); in dualshock4_get_firmware_info()
1947 ds4->base.fw_version = get_unaligned_le16(&buf[41]); in dualshock4_get_firmware_info()
1956 struct hid_device *hdev = ds4->base.hdev; in dualshock4_get_mac_address()
1960 if (hdev->bus == BUS_USB) { in dualshock4_get_mac_address()
1963 return -ENOMEM; in dualshock4_get_mac_address()
1972 memcpy(ds4->base.mac_address, &buf[1], sizeof(ds4->base.mac_address)); in dualshock4_get_mac_address()
1975 if (strlen(hdev->uniq) != 17) in dualshock4_get_mac_address()
1976 return -EINVAL; in dualshock4_get_mac_address()
1978 ret = sscanf(hdev->uniq, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", in dualshock4_get_mac_address()
1979 &ds4->base.mac_address[5], &ds4->base.mac_address[4], in dualshock4_get_mac_address()
1980 &ds4->base.mac_address[3], &ds4->base.mac_address[2], in dualshock4_get_mac_address()
1981 &ds4->base.mac_address[1], &ds4->base.mac_address[0]); in dualshock4_get_mac_address()
1983 if (ret != sizeof(ds4->base.mac_address)) in dualshock4_get_mac_address()
1984 return -EINVAL; in dualshock4_get_mac_address()
1996 struct hid_device *hdev = to_hid_device(led->dev->parent); in dualshock4_led_get_brightness()
2000 led_index = led - ds4->lightbar_leds; in dualshock4_led_get_brightness()
2003 return ds4->lightbar_red; in dualshock4_led_get_brightness()
2005 return ds4->lightbar_green; in dualshock4_led_get_brightness()
2007 return ds4->lightbar_blue; in dualshock4_led_get_brightness()
2009 return ds4->lightbar_enabled; in dualshock4_led_get_brightness()
2012 return -1; in dualshock4_led_get_brightness()
2018 struct hid_device *hdev = to_hid_device(led->dev->parent); in dualshock4_led_set_blink()
2022 spin_lock_irqsave(&ds4->base.lock, flags); in dualshock4_led_set_blink()
2026 ds4->lightbar_blink_on = 50; in dualshock4_led_set_blink()
2027 ds4->lightbar_blink_off = 50; in dualshock4_led_set_blink()
2030 ds4->lightbar_blink_on = min_t(unsigned long, *delay_on/10, DS4_LIGHTBAR_MAX_BLINK); in dualshock4_led_set_blink()
2031 ds4->lightbar_blink_off = min_t(unsigned long, *delay_off/10, DS4_LIGHTBAR_MAX_BLINK); in dualshock4_led_set_blink()
2034 ds4->update_lightbar_blink = true; in dualshock4_led_set_blink()
2036 spin_unlock_irqrestore(&ds4->base.lock, flags); in dualshock4_led_set_blink()
2040 *delay_on = ds4->lightbar_blink_on; in dualshock4_led_set_blink()
2041 *delay_off = ds4->lightbar_blink_off; in dualshock4_led_set_blink()
2048 struct hid_device *hdev = to_hid_device(led->dev->parent); in dualshock4_led_set_brightness()
2053 spin_lock_irqsave(&ds4->base.lock, flags); in dualshock4_led_set_brightness()
2055 led_index = led - ds4->lightbar_leds; in dualshock4_led_set_brightness()
2058 ds4->lightbar_red = value; in dualshock4_led_set_brightness()
2061 ds4->lightbar_green = value; in dualshock4_led_set_brightness()
2064 ds4->lightbar_blue = value; in dualshock4_led_set_brightness()
2067 ds4->lightbar_enabled = !!value; in dualshock4_led_set_brightness()
2070 ds4->update_lightbar = true; in dualshock4_led_set_brightness()
2072 spin_unlock_irqrestore(&ds4->base.lock, flags); in dualshock4_led_set_brightness()
2080 struct dualshock4_output_report *rp, void *buf) in dualshock4_init_output_report() argument
2082 struct hid_device *hdev = ds4->base.hdev; in dualshock4_init_output_report()
2084 if (hdev->bus == BUS_BLUETOOTH) { in dualshock4_init_output_report()
2088 bt->report_id = DS4_OUTPUT_REPORT_BT; in dualshock4_init_output_report()
2090 rp->data = buf; in dualshock4_init_output_report()
2091 rp->len = sizeof(*bt); in dualshock4_init_output_report()
2092 rp->bt = bt; in dualshock4_init_output_report()
2093 rp->usb = NULL; in dualshock4_init_output_report()
2094 rp->common = &bt->common; in dualshock4_init_output_report()
2099 usb->report_id = DS4_OUTPUT_REPORT_USB; in dualshock4_init_output_report()
2101 rp->data = buf; in dualshock4_init_output_report()
2102 rp->len = sizeof(*usb); in dualshock4_init_output_report()
2103 rp->bt = NULL; in dualshock4_init_output_report()
2104 rp->usb = usb; in dualshock4_init_output_report()
2105 rp->common = &usb->common; in dualshock4_init_output_report()
2116 dualshock4_init_output_report(ds4, &report, ds4->output_report_dmabuf); in dualshock4_output_worker()
2119 spin_lock_irqsave(&ds4->base.lock, flags); in dualshock4_output_worker()
2121 if (ds4->update_rumble) { in dualshock4_output_worker()
2123 common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_MOTOR; in dualshock4_output_worker()
2124 common->motor_left = ds4->motor_left; in dualshock4_output_worker()
2125 common->motor_right = ds4->motor_right; in dualshock4_output_worker()
2126 ds4->update_rumble = false; in dualshock4_output_worker()
2129 if (ds4->update_lightbar) { in dualshock4_output_worker()
2130 common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_LED; in dualshock4_output_worker()
2131 /* Comptabile behavior with hid-sony, which used a dummy global LED to in dualshock4_output_worker()
2135 common->lightbar_red = ds4->lightbar_enabled ? ds4->lightbar_red : 0; in dualshock4_output_worker()
2136 common->lightbar_green = ds4->lightbar_enabled ? ds4->lightbar_green : 0; in dualshock4_output_worker()
2137 common->lightbar_blue = ds4->lightbar_enabled ? ds4->lightbar_blue : 0; in dualshock4_output_worker()
2138 ds4->update_lightbar = false; in dualshock4_output_worker()
2141 if (ds4->update_lightbar_blink) { in dualshock4_output_worker()
2142 common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_LED_BLINK; in dualshock4_output_worker()
2143 common->lightbar_blink_on = ds4->lightbar_blink_on; in dualshock4_output_worker()
2144 common->lightbar_blink_off = ds4->lightbar_blink_off; in dualshock4_output_worker()
2145 ds4->update_lightbar_blink = false; in dualshock4_output_worker()
2148 spin_unlock_irqrestore(&ds4->base.lock, flags); in dualshock4_output_worker()
2158 report.bt->hw_control = DS4_OUTPUT_HWCTL_HID | DS4_OUTPUT_HWCTL_CRC32; in dualshock4_output_worker()
2160 if (ds4->update_bt_poll_interval) { in dualshock4_output_worker()
2161 report.bt->hw_control |= ds4->bt_poll_interval; in dualshock4_output_worker()
2162 ds4->update_bt_poll_interval = false; in dualshock4_output_worker()
2166 crc = ~crc32_le(crc, report.data, report.len - 4); in dualshock4_output_worker()
2168 report.bt->crc32 = cpu_to_le32(crc); in dualshock4_output_worker()
2171 hid_hw_output_report(ds4->base.hdev, report.data, report.len); in dualshock4_output_worker()
2177 struct hid_device *hdev = ps_dev->hdev; in dualshock4_parse_report()
2191 if (hdev->bus == BUS_USB && report->id == DS4_INPUT_REPORT_USB && in dualshock4_parse_report()
2195 ds4_report = &usb->common; in dualshock4_parse_report()
2196 num_touch_reports = usb->num_touch_reports; in dualshock4_parse_report()
2197 touch_reports = usb->touch_reports; in dualshock4_parse_report()
2198 } else if (hdev->bus == BUS_BLUETOOTH && report->id == DS4_INPUT_REPORT_BT && in dualshock4_parse_report()
2201 uint32_t report_crc = get_unaligned_le32(&bt->crc32); in dualshock4_parse_report()
2204 if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) { in dualshock4_parse_report()
2206 return -EILSEQ; in dualshock4_parse_report()
2209 ds4_report = &bt->common; in dualshock4_parse_report()
2210 num_touch_reports = bt->num_touch_reports; in dualshock4_parse_report()
2211 touch_reports = bt->touch_reports; in dualshock4_parse_report()
2213 hid_err(hdev, "Unhandled reportID=%d\n", report->id); in dualshock4_parse_report()
2214 return -1; in dualshock4_parse_report()
2217 input_report_abs(ds4->gamepad, ABS_X, ds4_report->x); in dualshock4_parse_report()
2218 input_report_abs(ds4->gamepad, ABS_Y, ds4_report->y); in dualshock4_parse_report()
2219 input_report_abs(ds4->gamepad, ABS_RX, ds4_report->rx); in dualshock4_parse_report()
2220 input_report_abs(ds4->gamepad, ABS_RY, ds4_report->ry); in dualshock4_parse_report()
2221 input_report_abs(ds4->gamepad, ABS_Z, ds4_report->z); in dualshock4_parse_report()
2222 input_report_abs(ds4->gamepad, ABS_RZ, ds4_report->rz); in dualshock4_parse_report()
2224 value = ds4_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH; in dualshock4_parse_report()
2227 input_report_abs(ds4->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x); in dualshock4_parse_report()
2228 input_report_abs(ds4->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y); in dualshock4_parse_report()
2230 input_report_key(ds4->gamepad, BTN_WEST, ds4_report->buttons[0] & DS_BUTTONS0_SQUARE); in dualshock4_parse_report()
2231 input_report_key(ds4->gamepad, BTN_SOUTH, ds4_report->buttons[0] & DS_BUTTONS0_CROSS); in dualshock4_parse_report()
2232 input_report_key(ds4->gamepad, BTN_EAST, ds4_report->buttons[0] & DS_BUTTONS0_CIRCLE); in dualshock4_parse_report()
2233 input_report_key(ds4->gamepad, BTN_NORTH, ds4_report->buttons[0] & DS_BUTTONS0_TRIANGLE); in dualshock4_parse_report()
2234 input_report_key(ds4->gamepad, BTN_TL, ds4_report->buttons[1] & DS_BUTTONS1_L1); in dualshock4_parse_report()
2235 input_report_key(ds4->gamepad, BTN_TR, ds4_report->buttons[1] & DS_BUTTONS1_R1); in dualshock4_parse_report()
2236 input_report_key(ds4->gamepad, BTN_TL2, ds4_report->buttons[1] & DS_BUTTONS1_L2); in dualshock4_parse_report()
2237 input_report_key(ds4->gamepad, BTN_TR2, ds4_report->buttons[1] & DS_BUTTONS1_R2); in dualshock4_parse_report()
2238 input_report_key(ds4->gamepad, BTN_SELECT, ds4_report->buttons[1] & DS_BUTTONS1_CREATE); in dualshock4_parse_report()
2239 input_report_key(ds4->gamepad, BTN_START, ds4_report->buttons[1] & DS_BUTTONS1_OPTIONS); in dualshock4_parse_report()
2240 input_report_key(ds4->gamepad, BTN_THUMBL, ds4_report->buttons[1] & DS_BUTTONS1_L3); in dualshock4_parse_report()
2241 input_report_key(ds4->gamepad, BTN_THUMBR, ds4_report->buttons[1] & DS_BUTTONS1_R3); in dualshock4_parse_report()
2242 input_report_key(ds4->gamepad, BTN_MODE, ds4_report->buttons[2] & DS_BUTTONS2_PS_HOME); in dualshock4_parse_report()
2243 input_sync(ds4->gamepad); in dualshock4_parse_report()
2246 for (i = 0; i < ARRAY_SIZE(ds4_report->gyro); i++) { in dualshock4_parse_report()
2247 int raw_data = (short)le16_to_cpu(ds4_report->gyro[i]); in dualshock4_parse_report()
2248 int calib_data = mult_frac(ds4->gyro_calib_data[i].sens_numer, in dualshock4_parse_report()
2249 raw_data, ds4->gyro_calib_data[i].sens_denom); in dualshock4_parse_report()
2251 input_report_abs(ds4->sensors, ds4->gyro_calib_data[i].abs_code, calib_data); in dualshock4_parse_report()
2255 for (i = 0; i < ARRAY_SIZE(ds4_report->accel); i++) { in dualshock4_parse_report()
2256 int raw_data = (short)le16_to_cpu(ds4_report->accel[i]); in dualshock4_parse_report()
2257 int calib_data = mult_frac(ds4->accel_calib_data[i].sens_numer, in dualshock4_parse_report()
2258 raw_data - ds4->accel_calib_data[i].bias, in dualshock4_parse_report()
2259 ds4->accel_calib_data[i].sens_denom); in dualshock4_parse_report()
2261 input_report_abs(ds4->sensors, ds4->accel_calib_data[i].abs_code, calib_data); in dualshock4_parse_report()
2265 sensor_timestamp = le16_to_cpu(ds4_report->sensor_timestamp); in dualshock4_parse_report()
2266 if (!ds4->sensor_timestamp_initialized) { in dualshock4_parse_report()
2267 ds4->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp*16, 3); in dualshock4_parse_report()
2268 ds4->sensor_timestamp_initialized = true; in dualshock4_parse_report()
2272 if (ds4->prev_sensor_timestamp > sensor_timestamp) in dualshock4_parse_report()
2273 delta = (U16_MAX - ds4->prev_sensor_timestamp + sensor_timestamp + 1); in dualshock4_parse_report()
2275 delta = sensor_timestamp - ds4->prev_sensor_timestamp; in dualshock4_parse_report()
2276 ds4->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta*16, 3); in dualshock4_parse_report()
2278 ds4->prev_sensor_timestamp = sensor_timestamp; in dualshock4_parse_report()
2279 input_event(ds4->sensors, EV_MSC, MSC_TIMESTAMP, ds4->sensor_timestamp_us); in dualshock4_parse_report()
2280 input_sync(ds4->sensors); in dualshock4_parse_report()
2285 for (j = 0; j < ARRAY_SIZE(touch_report->points); j++) { in dualshock4_parse_report()
2286 struct dualshock4_touch_point *point = &touch_report->points[j]; in dualshock4_parse_report()
2287 bool active = (point->contact & DS4_TOUCH_POINT_INACTIVE) ? false : true; in dualshock4_parse_report()
2289 input_mt_slot(ds4->touchpad, j); in dualshock4_parse_report()
2290 input_mt_report_slot_state(ds4->touchpad, MT_TOOL_FINGER, active); in dualshock4_parse_report()
2293 int x = (point->x_hi << 8) | point->x_lo; in dualshock4_parse_report()
2294 int y = (point->y_hi << 4) | point->y_lo; in dualshock4_parse_report() local
2296 input_report_abs(ds4->touchpad, ABS_MT_POSITION_X, x); in dualshock4_parse_report()
2297 input_report_abs(ds4->touchpad, ABS_MT_POSITION_Y, y); in dualshock4_parse_report()
2300 input_mt_sync_frame(ds4->touchpad); in dualshock4_parse_report()
2301 input_sync(ds4->touchpad); in dualshock4_parse_report()
2303 input_report_key(ds4->touchpad, BTN_LEFT, ds4_report->buttons[2] & DS_BUTTONS2_TOUCHPAD); in dualshock4_parse_report()
2308 * - 0:10: percentage in units of 10%. in dualshock4_parse_report()
2310 * - 0-10: percentage in units of 10%. in dualshock4_parse_report()
2311 * - 11: battery is full in dualshock4_parse_report()
2312 * - 14: not charging due to Voltage or temperature error in dualshock4_parse_report()
2313 * - 15: charge error in dualshock4_parse_report()
2315 if (ds4_report->status[0] & DS4_STATUS0_CABLE_STATE) { in dualshock4_parse_report()
2316 uint8_t battery_data = ds4_report->status[0] & DS4_STATUS0_BATTERY_CAPACITY; in dualshock4_parse_report()
2319 /* Take the mid-point for each battery capacity value, in dualshock4_parse_report()
2320 * because on the hardware side 0 = 0-9%, 1=10-19%, etc. in dualshock4_parse_report()
2337 uint8_t battery_data = ds4_report->status[0] & DS4_STATUS0_BATTERY_CAPACITY; in dualshock4_parse_report()
2347 spin_lock_irqsave(&ps_dev->lock, flags); in dualshock4_parse_report()
2348 ps_dev->battery_capacity = battery_capacity; in dualshock4_parse_report()
2349 ps_dev->battery_status = battery_status; in dualshock4_parse_report()
2350 spin_unlock_irqrestore(&ps_dev->lock, flags); in dualshock4_parse_report()
2370 connected = ds4_report->status[1] & DS4_STATUS1_DONGLE_STATE ? false : true; in dualshock4_dongle_parse_report()
2372 if (ds4->dongle_state == DONGLE_DISCONNECTED && connected) { in dualshock4_dongle_parse_report()
2373 hid_info(ps_dev->hdev, "DualShock 4 USB dongle: controller connected\n"); in dualshock4_dongle_parse_report()
2377 spin_lock_irqsave(&ps_dev->lock, flags); in dualshock4_dongle_parse_report()
2378 ds4->dongle_state = DONGLE_CALIBRATING; in dualshock4_dongle_parse_report()
2379 spin_unlock_irqrestore(&ps_dev->lock, flags); in dualshock4_dongle_parse_report()
2381 schedule_work(&ds4->dongle_hotplug_worker); in dualshock4_dongle_parse_report()
2387 } else if ((ds4->dongle_state == DONGLE_CONNECTED || in dualshock4_dongle_parse_report()
2388 ds4->dongle_state == DONGLE_DISABLED) && !connected) { in dualshock4_dongle_parse_report()
2389 hid_info(ps_dev->hdev, "DualShock 4 USB dongle: controller disconnected\n"); in dualshock4_dongle_parse_report()
2391 spin_lock_irqsave(&ps_dev->lock, flags); in dualshock4_dongle_parse_report()
2392 ds4->dongle_state = DONGLE_DISCONNECTED; in dualshock4_dongle_parse_report()
2393 spin_unlock_irqrestore(&ps_dev->lock, flags); in dualshock4_dongle_parse_report()
2397 } else if (ds4->dongle_state == DONGLE_CALIBRATING || in dualshock4_dongle_parse_report()
2398 ds4->dongle_state == DONGLE_DISABLED || in dualshock4_dongle_parse_report()
2399 ds4->dongle_state == DONGLE_DISCONNECTED) { in dualshock4_dongle_parse_report()
2417 if (effect->type != FF_RUMBLE) in dualshock4_play_effect()
2420 spin_lock_irqsave(&ds4->base.lock, flags); in dualshock4_play_effect()
2421 ds4->update_rumble = true; in dualshock4_play_effect()
2422 ds4->motor_left = effect->u.rumble.strong_magnitude / 256; in dualshock4_play_effect()
2423 ds4->motor_right = effect->u.rumble.weak_magnitude / 256; in dualshock4_play_effect()
2424 spin_unlock_irqrestore(&ds4->base.lock, flags); in dualshock4_play_effect()
2435 spin_lock_irqsave(&ds4->base.lock, flags); in dualshock4_remove()
2436 ds4->output_worker_initialized = false; in dualshock4_remove()
2437 spin_unlock_irqrestore(&ds4->base.lock, flags); in dualshock4_remove()
2439 cancel_work_sync(&ds4->output_worker); in dualshock4_remove()
2441 if (ps_dev->hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) in dualshock4_remove()
2442 cancel_work_sync(&ds4->dongle_hotplug_worker); in dualshock4_remove()
2449 spin_lock_irqsave(&ds4->base.lock, flags); in dualshock4_schedule_work()
2450 if (ds4->output_worker_initialized) in dualshock4_schedule_work()
2451 schedule_work(&ds4->output_worker); in dualshock4_schedule_work()
2452 spin_unlock_irqrestore(&ds4->base.lock, flags); in dualshock4_schedule_work()
2457 ds4->bt_poll_interval = interval; in dualshock4_set_bt_poll_interval()
2458 ds4->update_bt_poll_interval = true; in dualshock4_set_bt_poll_interval()
2475 uint8_t player_id = ds4->base.player_id % ARRAY_SIZE(player_colors); in dualshock4_set_default_lightbar_colors()
2477 ds4->lightbar_enabled = true; in dualshock4_set_default_lightbar_colors()
2478 ds4->lightbar_red = player_colors[player_id][0]; in dualshock4_set_default_lightbar_colors()
2479 ds4->lightbar_green = player_colors[player_id][1]; in dualshock4_set_default_lightbar_colors()
2480 ds4->lightbar_blue = player_colors[player_id][2]; in dualshock4_set_default_lightbar_colors()
2482 ds4->update_lightbar = true; in dualshock4_set_default_lightbar_colors()
2493 /* The DualShock4 has an RGB lightbar, which the original hid-sony driver in dualshock4_create()
2495 * Ideally this should have used the multi-color LED class, which didn't exist in dualshock4_create()
2510 ds4 = devm_kzalloc(&hdev->dev, sizeof(*ds4), GFP_KERNEL); in dualshock4_create()
2512 return ERR_PTR(-ENOMEM); in dualshock4_create()
2516 * hid-generic vs hid-playstation axis and button mapping. in dualshock4_create()
2518 hdev->version |= HID_PLAYSTATION_VERSION_PATCH; in dualshock4_create()
2520 ps_dev = &ds4->base; in dualshock4_create()
2521 ps_dev->hdev = hdev; in dualshock4_create()
2522 spin_lock_init(&ps_dev->lock); in dualshock4_create()
2523 ps_dev->battery_capacity = 100; /* initial value until parse_report. */ in dualshock4_create()
2524 ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN; in dualshock4_create()
2525 ps_dev->parse_report = dualshock4_parse_report; in dualshock4_create()
2526 ps_dev->remove = dualshock4_remove; in dualshock4_create()
2527 INIT_WORK(&ds4->output_worker, dualshock4_output_worker); in dualshock4_create()
2528 ds4->output_worker_initialized = true; in dualshock4_create()
2532 ds4->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL); in dualshock4_create()
2533 if (!ds4->output_report_dmabuf) in dualshock4_create()
2534 return ERR_PTR(-ENOMEM); in dualshock4_create()
2536 if (hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) { in dualshock4_create()
2537 ds4->dongle_state = DONGLE_DISCONNECTED; in dualshock4_create()
2538 INIT_WORK(&ds4->dongle_hotplug_worker, dualshock4_dongle_calibration_work); in dualshock4_create()
2541 ps_dev->parse_report = dualshock4_dongle_parse_report; in dualshock4_create()
2549 snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds4->base.mac_address); in dualshock4_create()
2567 ds4->gamepad = ps_gamepad_create(hdev, dualshock4_play_effect); in dualshock4_create()
2568 if (IS_ERR(ds4->gamepad)) { in dualshock4_create()
2569 ret = PTR_ERR(ds4->gamepad); in dualshock4_create()
2574 ps_dev->input_dev_name = dev_name(&ds4->gamepad->dev); in dualshock4_create()
2576 ds4->sensors = ps_sensors_create(hdev, DS4_ACC_RANGE, DS4_ACC_RES_PER_G, in dualshock4_create()
2578 if (IS_ERR(ds4->sensors)) { in dualshock4_create()
2579 ret = PTR_ERR(ds4->sensors); in dualshock4_create()
2583 ds4->touchpad = ps_touchpad_create(hdev, DS4_TOUCHPAD_WIDTH, DS4_TOUCHPAD_HEIGHT, 2); in dualshock4_create()
2584 if (IS_ERR(ds4->touchpad)) { in dualshock4_create()
2585 ret = PTR_ERR(ds4->touchpad); in dualshock4_create()
2596 ret = ps_led_register(ps_dev, &ds4->lightbar_leds[i], led_info); in dualshock4_create()
2616 ds4->base.hw_version, ds4->base.fw_version); in dualshock4_create()
2617 return &ds4->base; in dualshock4_create()
2629 if (dev && dev->parse_report) in ps_raw_event()
2630 return dev->parse_report(dev, report, data, size); in ps_raw_event()
2658 if (hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER || in ps_probe()
2659 hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_2 || in ps_probe()
2660 hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) { in ps_probe()
2667 } else if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER || in ps_probe()
2668 hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER_2) { in ps_probe()
2693 if (dev->remove) in ps_remove()
2694 dev->remove(dev); in ps_remove()