Lines Matching +full:y +full:- +full:rp
1 // SPDX-License-Identifier: GPL-2.0-or-later
18 #include "hid-ids.h"
180 uint8_t x, y; member
188 __le16 gyro[3]; /* x, y, z */
189 __le16 accel[3]; /* x, y, z */
201 static_assert(sizeof(struct dualsense_input_report) == DS_INPUT_REPORT_USB_SIZE - 1);
286 static const struct {int x; int y; } ps_gamepad_hat_mapping[] = { member
287 {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
302 if (!memcmp(entry->mac_address, dev->mac_address, sizeof(dev->mac_address))) { in ps_devices_list_add()
303 hid_err(dev->hdev, "Duplicate device found for MAC address %pMR.\n", in ps_devices_list_add()
304 dev->mac_address); in ps_devices_list_add()
306 return -EEXIST; in ps_devices_list_add()
310 list_add_tail(&dev->list, &ps_devices_list); in ps_devices_list_add()
318 list_del(&dev->list); in ps_devices_list_remove()
330 dev->player_id = ret; in ps_device_set_player_id()
336 ida_free(&ps_player_id_allocator, dev->player_id); in ps_device_release_player_id()
338 dev->player_id = U32_MAX; in ps_device_release_player_id()
345 input_dev = devm_input_allocate_device(&hdev->dev); in ps_allocate_input_dev()
347 return ERR_PTR(-ENOMEM); in ps_allocate_input_dev()
349 input_dev->id.bustype = hdev->bus; in ps_allocate_input_dev()
350 input_dev->id.vendor = hdev->vendor; in ps_allocate_input_dev()
351 input_dev->id.product = hdev->product; in ps_allocate_input_dev()
352 input_dev->id.version = hdev->version; in ps_allocate_input_dev()
353 input_dev->uniq = hdev->uniq; in ps_allocate_input_dev()
356 input_dev->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, "%s %s", hdev->name, in ps_allocate_input_dev()
358 if (!input_dev->name) in ps_allocate_input_dev()
359 return ERR_PTR(-ENOMEM); in ps_allocate_input_dev()
361 input_dev->name = hdev->name; in ps_allocate_input_dev()
386 spin_lock_irqsave(&dev->lock, flags); in ps_battery_get_property()
387 battery_capacity = dev->battery_capacity; in ps_battery_get_property()
388 battery_status = dev->battery_status; in ps_battery_get_property()
389 spin_unlock_irqrestore(&dev->lock, flags); in ps_battery_get_property()
393 val->intval = battery_status; in ps_battery_get_property()
396 val->intval = 1; in ps_battery_get_property()
399 val->intval = battery_capacity; in ps_battery_get_property()
402 val->intval = POWER_SUPPLY_SCOPE_DEVICE; in ps_battery_get_property()
405 ret = -EINVAL; in ps_battery_get_property()
418 dev->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in ps_device_register_battery()
419 dev->battery_desc.properties = ps_power_supply_props; in ps_device_register_battery()
420 dev->battery_desc.num_properties = ARRAY_SIZE(ps_power_supply_props); in ps_device_register_battery()
421 dev->battery_desc.get_property = ps_battery_get_property; in ps_device_register_battery()
422 dev->battery_desc.name = devm_kasprintf(&dev->hdev->dev, GFP_KERNEL, in ps_device_register_battery()
423 "ps-controller-battery-%pMR", dev->mac_address); in ps_device_register_battery()
424 if (!dev->battery_desc.name) in ps_device_register_battery()
425 return -ENOMEM; in ps_device_register_battery()
427 battery = devm_power_supply_register(&dev->hdev->dev, &dev->battery_desc, &battery_cfg); in ps_device_register_battery()
430 hid_err(dev->hdev, "Unable to register battery device: %d\n", ret); in ps_device_register_battery()
433 dev->battery = battery; in ps_device_register_battery()
435 ret = power_supply_powers(dev->battery, &dev->hdev->dev); in ps_device_register_battery()
437 hid_err(dev->hdev, "Unable to activate battery device: %d\n", ret); in ps_device_register_battery()
473 input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0); in ps_gamepad_create()
474 input_set_abs_params(gamepad, ABS_HAT0Y, -1, 1, 0, 0); in ps_gamepad_create()
506 return -EINVAL; in ps_get_report()
511 return -EINVAL; in ps_get_report()
514 if (hdev->bus == BUS_BLUETOOTH) { in ps_get_report()
516 uint8_t crc_offset = size - 4; in ps_get_report()
521 return -EILSEQ; in ps_get_report()
538 __set_bit(INPUT_PROP_ACCELEROMETER, sensors->propbit); in ps_sensors_create()
539 __set_bit(EV_MSC, sensors->evbit); in ps_sensors_create()
540 __set_bit(MSC_TIMESTAMP, sensors->mscbit); in ps_sensors_create()
543 input_set_abs_params(sensors, ABS_X, -accel_range, accel_range, 16, 0); in ps_sensors_create()
544 input_set_abs_params(sensors, ABS_Y, -accel_range, accel_range, 16, 0); in ps_sensors_create()
545 input_set_abs_params(sensors, ABS_Z, -accel_range, accel_range, 16, 0); in ps_sensors_create()
551 input_set_abs_params(sensors, ABS_RX, -gyro_range, gyro_range, 16, 0); in ps_sensors_create()
552 input_set_abs_params(sensors, ABS_RY, -gyro_range, gyro_range, 16, 0); in ps_sensors_create()
553 input_set_abs_params(sensors, ABS_RZ, -gyro_range, gyro_range, 16, 0); in ps_sensors_create()
577 __set_bit(INPUT_PROP_BUTTONPAD, touchpad->propbit); in ps_touchpad_create()
579 input_set_abs_params(touchpad, ABS_MT_POSITION_X, 0, width - 1, 0, 0); in ps_touchpad_create()
580 input_set_abs_params(touchpad, ABS_MT_POSITION_Y, 0, height - 1, 0, 0); in ps_touchpad_create()
600 return sysfs_emit(buf, "0x%08x\n", ps_dev->fw_version); in firmware_version_show()
612 return sysfs_emit(buf, "0x%08x\n", ps_dev->hw_version); in hardware_version_show()
643 return -ENOMEM; in dualsense_get_calibration_data()
645 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_CALIBRATION, buf, in dualsense_get_calibration_data()
648 hid_err(ds->base.hdev, "Failed to retrieve DualSense calibration info: %d\n", ret); in dualsense_get_calibration_data()
675 ds->gyro_calib_data[0].abs_code = ABS_RX; in dualsense_get_calibration_data()
676 ds->gyro_calib_data[0].bias = gyro_pitch_bias; in dualsense_get_calibration_data()
677 ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
678 ds->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus; in dualsense_get_calibration_data()
680 ds->gyro_calib_data[1].abs_code = ABS_RY; in dualsense_get_calibration_data()
681 ds->gyro_calib_data[1].bias = gyro_yaw_bias; in dualsense_get_calibration_data()
682 ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
683 ds->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus; in dualsense_get_calibration_data()
685 ds->gyro_calib_data[2].abs_code = ABS_RZ; in dualsense_get_calibration_data()
686 ds->gyro_calib_data[2].bias = gyro_roll_bias; in dualsense_get_calibration_data()
687 ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
688 ds->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus; in dualsense_get_calibration_data()
694 range_2g = acc_x_plus - acc_x_minus; in dualsense_get_calibration_data()
695 ds->accel_calib_data[0].abs_code = ABS_X; in dualsense_get_calibration_data()
696 ds->accel_calib_data[0].bias = acc_x_plus - range_2g / 2; in dualsense_get_calibration_data()
697 ds->accel_calib_data[0].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
698 ds->accel_calib_data[0].sens_denom = range_2g; in dualsense_get_calibration_data()
700 range_2g = acc_y_plus - acc_y_minus; in dualsense_get_calibration_data()
701 ds->accel_calib_data[1].abs_code = ABS_Y; in dualsense_get_calibration_data()
702 ds->accel_calib_data[1].bias = acc_y_plus - range_2g / 2; in dualsense_get_calibration_data()
703 ds->accel_calib_data[1].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
704 ds->accel_calib_data[1].sens_denom = range_2g; in dualsense_get_calibration_data()
706 range_2g = acc_z_plus - acc_z_minus; in dualsense_get_calibration_data()
707 ds->accel_calib_data[2].abs_code = ABS_Z; in dualsense_get_calibration_data()
708 ds->accel_calib_data[2].bias = acc_z_plus - range_2g / 2; in dualsense_get_calibration_data()
709 ds->accel_calib_data[2].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
710 ds->accel_calib_data[2].sens_denom = range_2g; in dualsense_get_calibration_data()
724 return -ENOMEM; in dualsense_get_firmware_info()
726 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_FIRMWARE_INFO, buf, in dualsense_get_firmware_info()
729 hid_err(ds->base.hdev, "Failed to retrieve DualSense firmware info: %d\n", ret); in dualsense_get_firmware_info()
733 ds->base.hw_version = get_unaligned_le32(&buf[24]); in dualsense_get_firmware_info()
734 ds->base.fw_version = get_unaligned_le32(&buf[28]); in dualsense_get_firmware_info()
748 return -ENOMEM; in dualsense_get_mac_address()
750 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_PAIRING_INFO, buf, in dualsense_get_mac_address()
753 hid_err(ds->base.hdev, "Failed to retrieve DualSense pairing info: %d\n", ret); in dualsense_get_mac_address()
757 memcpy(ds->base.mac_address, &buf[1], sizeof(ds->base.mac_address)); in dualsense_get_mac_address()
764 static void dualsense_init_output_report(struct dualsense *ds, struct dualsense_output_report *rp, in dualsense_init_output_report() argument
767 struct hid_device *hdev = ds->base.hdev; in dualsense_init_output_report()
769 if (hdev->bus == BUS_BLUETOOTH) { in dualsense_init_output_report()
773 bt->report_id = DS_OUTPUT_REPORT_BT; in dualsense_init_output_report()
774 bt->tag = DS_OUTPUT_TAG; /* Tag must be set. Exact meaning is unclear. */ in dualsense_init_output_report()
777 * Highest 4-bit is a sequence number, which needs to be increased in dualsense_init_output_report()
778 * every report. Lowest 4-bit is tag and can be zero for now. in dualsense_init_output_report()
780 bt->seq_tag = (ds->output_seq << 4) | 0x0; in dualsense_init_output_report()
781 if (++ds->output_seq == 16) in dualsense_init_output_report()
782 ds->output_seq = 0; in dualsense_init_output_report()
784 rp->data = buf; in dualsense_init_output_report()
785 rp->len = sizeof(*bt); in dualsense_init_output_report()
786 rp->bt = bt; in dualsense_init_output_report()
787 rp->usb = NULL; in dualsense_init_output_report()
788 rp->common = &bt->common; in dualsense_init_output_report()
793 usb->report_id = DS_OUTPUT_REPORT_USB; in dualsense_init_output_report()
795 rp->data = buf; in dualsense_init_output_report()
796 rp->len = sizeof(*usb); in dualsense_init_output_report()
797 rp->bt = NULL; in dualsense_init_output_report()
798 rp->usb = usb; in dualsense_init_output_report()
799 rp->common = &usb->common; in dualsense_init_output_report()
810 struct hid_device *hdev = ds->base.hdev; in dualsense_send_output_report()
813 if (report->bt) { in dualsense_send_output_report()
818 crc = ~crc32_le(crc, report->data, report->len - 4); in dualsense_send_output_report()
820 report->bt->crc32 = cpu_to_le32(crc); in dualsense_send_output_report()
823 hid_hw_output_report(hdev, report->data, report->len); in dualsense_send_output_report()
833 dualsense_init_output_report(ds, &report, ds->output_report_dmabuf); in dualsense_output_worker()
836 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_output_worker()
838 if (ds->update_rumble) { in dualsense_output_worker()
840 common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT; in dualsense_output_worker()
841 common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION; in dualsense_output_worker()
842 common->motor_left = ds->motor_left; in dualsense_output_worker()
843 common->motor_right = ds->motor_right; in dualsense_output_worker()
844 ds->update_rumble = false; in dualsense_output_worker()
847 if (ds->update_lightbar) { in dualsense_output_worker()
848 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE; in dualsense_output_worker()
849 common->lightbar_red = ds->lightbar_red; in dualsense_output_worker()
850 common->lightbar_green = ds->lightbar_green; in dualsense_output_worker()
851 common->lightbar_blue = ds->lightbar_blue; in dualsense_output_worker()
853 ds->update_lightbar = false; in dualsense_output_worker()
856 if (ds->update_player_leds) { in dualsense_output_worker()
857 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE; in dualsense_output_worker()
858 common->player_leds = ds->player_leds_state; in dualsense_output_worker()
860 ds->update_player_leds = false; in dualsense_output_worker()
863 if (ds->update_mic_mute) { in dualsense_output_worker()
864 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE; in dualsense_output_worker()
865 common->mute_button_led = ds->mic_muted; in dualsense_output_worker()
867 if (ds->mic_muted) { in dualsense_output_worker()
869 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE; in dualsense_output_worker()
870 common->power_save_control |= DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE; in dualsense_output_worker()
873 common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE; in dualsense_output_worker()
874 common->power_save_control &= ~DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE; in dualsense_output_worker()
877 ds->update_mic_mute = false; in dualsense_output_worker()
880 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_output_worker()
888 struct hid_device *hdev = ps_dev->hdev; in dualsense_parse_report()
903 if (hdev->bus == BUS_USB && report->id == DS_INPUT_REPORT_USB && in dualsense_parse_report()
906 } else if (hdev->bus == BUS_BLUETOOTH && report->id == DS_INPUT_REPORT_BT && in dualsense_parse_report()
909 uint32_t report_crc = get_unaligned_le32(&data[size - 4]); in dualsense_parse_report()
911 if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) { in dualsense_parse_report()
913 return -EILSEQ; in dualsense_parse_report()
918 hid_err(hdev, "Unhandled reportID=%d\n", report->id); in dualsense_parse_report()
919 return -1; in dualsense_parse_report()
922 input_report_abs(ds->gamepad, ABS_X, ds_report->x); in dualsense_parse_report()
923 input_report_abs(ds->gamepad, ABS_Y, ds_report->y); in dualsense_parse_report()
924 input_report_abs(ds->gamepad, ABS_RX, ds_report->rx); in dualsense_parse_report()
925 input_report_abs(ds->gamepad, ABS_RY, ds_report->ry); in dualsense_parse_report()
926 input_report_abs(ds->gamepad, ABS_Z, ds_report->z); in dualsense_parse_report()
927 input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz); in dualsense_parse_report()
929 value = ds_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH; in dualsense_parse_report()
932 input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x); in dualsense_parse_report()
933 input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y); in dualsense_parse_report()
935 input_report_key(ds->gamepad, BTN_WEST, ds_report->buttons[0] & DS_BUTTONS0_SQUARE); in dualsense_parse_report()
936 input_report_key(ds->gamepad, BTN_SOUTH, ds_report->buttons[0] & DS_BUTTONS0_CROSS); in dualsense_parse_report()
937 input_report_key(ds->gamepad, BTN_EAST, ds_report->buttons[0] & DS_BUTTONS0_CIRCLE); in dualsense_parse_report()
938 input_report_key(ds->gamepad, BTN_NORTH, ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE); in dualsense_parse_report()
939 input_report_key(ds->gamepad, BTN_TL, ds_report->buttons[1] & DS_BUTTONS1_L1); in dualsense_parse_report()
940 input_report_key(ds->gamepad, BTN_TR, ds_report->buttons[1] & DS_BUTTONS1_R1); in dualsense_parse_report()
941 input_report_key(ds->gamepad, BTN_TL2, ds_report->buttons[1] & DS_BUTTONS1_L2); in dualsense_parse_report()
942 input_report_key(ds->gamepad, BTN_TR2, ds_report->buttons[1] & DS_BUTTONS1_R2); in dualsense_parse_report()
943 input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE); in dualsense_parse_report()
944 input_report_key(ds->gamepad, BTN_START, ds_report->buttons[1] & DS_BUTTONS1_OPTIONS); in dualsense_parse_report()
945 input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3); in dualsense_parse_report()
946 input_report_key(ds->gamepad, BTN_THUMBR, ds_report->buttons[1] & DS_BUTTONS1_R3); in dualsense_parse_report()
947 input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); in dualsense_parse_report()
948 input_sync(ds->gamepad); in dualsense_parse_report()
955 btn_mic_state = !!(ds_report->buttons[2] & DS_BUTTONS2_MIC_MUTE); in dualsense_parse_report()
956 if (btn_mic_state && !ds->last_btn_mic_state) { in dualsense_parse_report()
957 spin_lock_irqsave(&ps_dev->lock, flags); in dualsense_parse_report()
958 ds->update_mic_mute = true; in dualsense_parse_report()
959 ds->mic_muted = !ds->mic_muted; /* toggle */ in dualsense_parse_report()
960 spin_unlock_irqrestore(&ps_dev->lock, flags); in dualsense_parse_report()
963 schedule_work(&ds->output_worker); in dualsense_parse_report()
965 ds->last_btn_mic_state = btn_mic_state; in dualsense_parse_report()
968 for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) { in dualsense_parse_report()
969 int raw_data = (short)le16_to_cpu(ds_report->gyro[i]); in dualsense_parse_report()
970 int calib_data = mult_frac(ds->gyro_calib_data[i].sens_numer, in dualsense_parse_report()
971 raw_data - ds->gyro_calib_data[i].bias, in dualsense_parse_report()
972 ds->gyro_calib_data[i].sens_denom); in dualsense_parse_report()
974 input_report_abs(ds->sensors, ds->gyro_calib_data[i].abs_code, calib_data); in dualsense_parse_report()
978 for (i = 0; i < ARRAY_SIZE(ds_report->accel); i++) { in dualsense_parse_report()
979 int raw_data = (short)le16_to_cpu(ds_report->accel[i]); in dualsense_parse_report()
980 int calib_data = mult_frac(ds->accel_calib_data[i].sens_numer, in dualsense_parse_report()
981 raw_data - ds->accel_calib_data[i].bias, in dualsense_parse_report()
982 ds->accel_calib_data[i].sens_denom); in dualsense_parse_report()
984 input_report_abs(ds->sensors, ds->accel_calib_data[i].abs_code, calib_data); in dualsense_parse_report()
988 sensor_timestamp = le32_to_cpu(ds_report->sensor_timestamp); in dualsense_parse_report()
989 if (!ds->sensor_timestamp_initialized) { in dualsense_parse_report()
990 ds->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp, 3); in dualsense_parse_report()
991 ds->sensor_timestamp_initialized = true; in dualsense_parse_report()
995 if (ds->prev_sensor_timestamp > sensor_timestamp) in dualsense_parse_report()
996 delta = (U32_MAX - ds->prev_sensor_timestamp + sensor_timestamp + 1); in dualsense_parse_report()
998 delta = sensor_timestamp - ds->prev_sensor_timestamp; in dualsense_parse_report()
999 ds->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta, 3); in dualsense_parse_report()
1001 ds->prev_sensor_timestamp = sensor_timestamp; in dualsense_parse_report()
1002 input_event(ds->sensors, EV_MSC, MSC_TIMESTAMP, ds->sensor_timestamp_us); in dualsense_parse_report()
1003 input_sync(ds->sensors); in dualsense_parse_report()
1005 for (i = 0; i < ARRAY_SIZE(ds_report->points); i++) { in dualsense_parse_report()
1006 struct dualsense_touch_point *point = &ds_report->points[i]; in dualsense_parse_report()
1007 bool active = (point->contact & DS_TOUCH_POINT_INACTIVE) ? false : true; in dualsense_parse_report()
1009 input_mt_slot(ds->touchpad, i); in dualsense_parse_report()
1010 input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active); in dualsense_parse_report()
1013 int x = (point->x_hi << 8) | point->x_lo; in dualsense_parse_report()
1014 int y = (point->y_hi << 4) | point->y_lo; in dualsense_parse_report() local
1016 input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x); in dualsense_parse_report()
1017 input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y); in dualsense_parse_report()
1020 input_mt_sync_frame(ds->touchpad); in dualsense_parse_report()
1021 input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD); in dualsense_parse_report()
1022 input_sync(ds->touchpad); in dualsense_parse_report()
1024 battery_data = ds_report->status & DS_STATUS_BATTERY_CAPACITY; in dualsense_parse_report()
1025 charging_status = (ds_report->status & DS_STATUS_CHARGING) >> DS_STATUS_CHARGING_SHIFT; in dualsense_parse_report()
1031 * 0 = 0-9%, 1 = 10-19%, .. and 10 = 100% in dualsense_parse_report()
1055 spin_lock_irqsave(&ps_dev->lock, flags); in dualsense_parse_report()
1056 ps_dev->battery_capacity = battery_capacity; in dualsense_parse_report()
1057 ps_dev->battery_status = battery_status; in dualsense_parse_report()
1058 spin_unlock_irqrestore(&ps_dev->lock, flags); in dualsense_parse_report()
1069 if (effect->type != FF_RUMBLE) in dualsense_play_effect()
1072 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_play_effect()
1073 ds->update_rumble = true; in dualsense_play_effect()
1074 ds->motor_left = effect->u.rumble.strong_magnitude / 256; in dualsense_play_effect()
1075 ds->motor_right = effect->u.rumble.weak_magnitude / 256; in dualsense_play_effect()
1076 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_play_effect()
1078 schedule_work(&ds->output_worker); in dualsense_play_effect()
1089 return -ENOMEM; in dualsense_reset_leds()
1099 report.common->valid_flag2 = DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE; in dualsense_reset_leds()
1100 report.common->lightbar_setup = DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT; /* Fade light out. */ in dualsense_reset_leds()
1109 ds->update_lightbar = true; in dualsense_set_lightbar()
1110 ds->lightbar_red = red; in dualsense_set_lightbar()
1111 ds->lightbar_green = green; in dualsense_set_lightbar()
1112 ds->lightbar_blue = blue; in dualsense_set_lightbar()
1114 schedule_work(&ds->output_worker); in dualsense_set_lightbar()
1122 * across the LEDs, so e.g. player 1 would be "--x--" with x being 'on'. in dualsense_set_player_leds()
1133 uint8_t player_id = ds->base.player_id % ARRAY_SIZE(player_ids); in dualsense_set_player_leds()
1135 ds->update_player_leds = true; in dualsense_set_player_leds()
1136 ds->player_leds_state = player_ids[player_id]; in dualsense_set_player_leds()
1137 schedule_work(&ds->output_worker); in dualsense_set_player_leds()
1147 ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL); in dualsense_create()
1149 return ERR_PTR(-ENOMEM); in dualsense_create()
1153 * hid-generic vs hid-playstation axis and button mapping. in dualsense_create()
1155 hdev->version |= HID_PLAYSTATION_VERSION_PATCH; in dualsense_create()
1157 ps_dev = &ds->base; in dualsense_create()
1158 ps_dev->hdev = hdev; in dualsense_create()
1159 spin_lock_init(&ps_dev->lock); in dualsense_create()
1160 ps_dev->battery_capacity = 100; /* initial value until parse_report. */ in dualsense_create()
1161 ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN; in dualsense_create()
1162 ps_dev->parse_report = dualsense_parse_report; in dualsense_create()
1163 INIT_WORK(&ds->output_worker, dualsense_output_worker); in dualsense_create()
1167 ds->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL); in dualsense_create()
1168 if (!ds->output_report_dmabuf) in dualsense_create()
1169 return ERR_PTR(-ENOMEM); in dualsense_create()
1176 snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address); in dualsense_create()
1194 ds->gamepad = ps_gamepad_create(hdev, dualsense_play_effect); in dualsense_create()
1195 if (IS_ERR(ds->gamepad)) { in dualsense_create()
1196 ret = PTR_ERR(ds->gamepad); in dualsense_create()
1200 ds->sensors = ps_sensors_create(hdev, DS_ACC_RANGE, DS_ACC_RES_PER_G, in dualsense_create()
1202 if (IS_ERR(ds->sensors)) { in dualsense_create()
1203 ret = PTR_ERR(ds->sensors); in dualsense_create()
1207 ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2); in dualsense_create()
1208 if (IS_ERR(ds->touchpad)) { in dualsense_create()
1209 ret = PTR_ERR(ds->touchpad); in dualsense_create()
1242 ds->base.hw_version, ds->base.fw_version); in dualsense_create()
1244 return &ds->base; in dualsense_create()
1256 if (dev && dev->parse_report) in ps_raw_event()
1257 return dev->parse_report(dev, report, data, size); in ps_raw_event()
1285 if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER) { in ps_probe()
1294 ret = devm_device_add_group(&hdev->dev, &ps_device_attribute_group); in ps_probe()