brintos

brintos / linux-shallow public Read only

0
0
Text · 86.7 KiB · 1468fb1 Raw
2812 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 *  HID driver for Sony DualSense(TM) controller.4 *5 *  Copyright (c) 2020-2022 Sony Interactive Entertainment6 */7 8#include <linux/bits.h>9#include <linux/crc32.h>10#include <linux/device.h>11#include <linux/hid.h>12#include <linux/idr.h>13#include <linux/input/mt.h>14#include <linux/leds.h>15#include <linux/led-class-multicolor.h>16#include <linux/module.h>17 18#include <linux/unaligned.h>19 20#include "hid-ids.h"21 22/* List of connected playstation devices. */23static DEFINE_MUTEX(ps_devices_lock);24static LIST_HEAD(ps_devices_list);25 26static DEFINE_IDA(ps_player_id_allocator);27 28#define HID_PLAYSTATION_VERSION_PATCH 0x800029 30enum PS_TYPE {31	PS_TYPE_PS4_DUALSHOCK4,32	PS_TYPE_PS5_DUALSENSE,33};34 35/* Base class for playstation devices. */36struct ps_device {37	struct list_head list;38	struct hid_device *hdev;39	spinlock_t lock;40 41	uint32_t player_id;42 43	struct power_supply_desc battery_desc;44	struct power_supply *battery;45	uint8_t battery_capacity;46	int battery_status;47 48	const char *input_dev_name; /* Name of primary input device. */49	uint8_t mac_address[6]; /* Note: stored in little endian order. */50	uint32_t hw_version;51	uint32_t fw_version;52 53	int (*parse_report)(struct ps_device *dev, struct hid_report *report, u8 *data, int size);54	void (*remove)(struct ps_device *dev);55};56 57/* Calibration data for playstation motion sensors. */58struct ps_calibration_data {59	int abs_code;60	short bias;61	int sens_numer;62	int sens_denom;63};64 65struct ps_led_info {66	const char *name;67	const char *color;68	int max_brightness;69	enum led_brightness (*brightness_get)(struct led_classdev *cdev);70	int (*brightness_set)(struct led_classdev *cdev, enum led_brightness);71	int (*blink_set)(struct led_classdev *led, unsigned long *on, unsigned long *off);72};73 74/* Seed values for DualShock4 / DualSense CRC32 for different report types. */75#define PS_INPUT_CRC32_SEED	0xA176#define PS_OUTPUT_CRC32_SEED	0xA277#define PS_FEATURE_CRC32_SEED	0xA378 79#define DS_INPUT_REPORT_USB			0x0180#define DS_INPUT_REPORT_USB_SIZE		6481#define DS_INPUT_REPORT_BT			0x3182#define DS_INPUT_REPORT_BT_SIZE			7883#define DS_OUTPUT_REPORT_USB			0x0284#define DS_OUTPUT_REPORT_USB_SIZE		6385#define DS_OUTPUT_REPORT_BT			0x3186#define DS_OUTPUT_REPORT_BT_SIZE		7887 88#define DS_FEATURE_REPORT_CALIBRATION		0x0589#define DS_FEATURE_REPORT_CALIBRATION_SIZE	4190#define DS_FEATURE_REPORT_PAIRING_INFO		0x0991#define DS_FEATURE_REPORT_PAIRING_INFO_SIZE	2092#define DS_FEATURE_REPORT_FIRMWARE_INFO		0x2093#define DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE	6494 95/* Button masks for DualSense input report. */96#define DS_BUTTONS0_HAT_SWITCH	GENMASK(3, 0)97#define DS_BUTTONS0_SQUARE	BIT(4)98#define DS_BUTTONS0_CROSS	BIT(5)99#define DS_BUTTONS0_CIRCLE	BIT(6)100#define DS_BUTTONS0_TRIANGLE	BIT(7)101#define DS_BUTTONS1_L1		BIT(0)102#define DS_BUTTONS1_R1		BIT(1)103#define DS_BUTTONS1_L2		BIT(2)104#define DS_BUTTONS1_R2		BIT(3)105#define DS_BUTTONS1_CREATE	BIT(4)106#define DS_BUTTONS1_OPTIONS	BIT(5)107#define DS_BUTTONS1_L3		BIT(6)108#define DS_BUTTONS1_R3		BIT(7)109#define DS_BUTTONS2_PS_HOME	BIT(0)110#define DS_BUTTONS2_TOUCHPAD	BIT(1)111#define DS_BUTTONS2_MIC_MUTE	BIT(2)112 113/* Status field of DualSense input report. */114#define DS_STATUS_BATTERY_CAPACITY	GENMASK(3, 0)115#define DS_STATUS_CHARGING		GENMASK(7, 4)116#define DS_STATUS_CHARGING_SHIFT	4117 118/* Feature version from DualSense Firmware Info report. */119#define DS_FEATURE_VERSION(major, minor) ((major & 0xff) << 8 | (minor & 0xff))120 121/*122 * Status of a DualSense touch point contact.123 * Contact IDs, with highest bit set are 'inactive'124 * and any associated data is then invalid.125 */126#define DS_TOUCH_POINT_INACTIVE BIT(7)127 128 /* Magic value required in tag field of Bluetooth output report. */129#define DS_OUTPUT_TAG 0x10130/* Flags for DualSense output report. */131#define DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION BIT(0)132#define DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT BIT(1)133#define DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE BIT(0)134#define DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE BIT(1)135#define DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE BIT(2)136#define DS_OUTPUT_VALID_FLAG1_RELEASE_LEDS BIT(3)137#define DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE BIT(4)138#define DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE BIT(1)139#define DS_OUTPUT_VALID_FLAG2_COMPATIBLE_VIBRATION2 BIT(2)140#define DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE BIT(4)141#define DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT BIT(1)142 143/* DualSense hardware limits */144#define DS_ACC_RES_PER_G	8192145#define DS_ACC_RANGE		(4*DS_ACC_RES_PER_G)146#define DS_GYRO_RES_PER_DEG_S	1024147#define DS_GYRO_RANGE		(2048*DS_GYRO_RES_PER_DEG_S)148#define DS_TOUCHPAD_WIDTH	1920149#define DS_TOUCHPAD_HEIGHT	1080150 151struct dualsense {152	struct ps_device base;153	struct input_dev *gamepad;154	struct input_dev *sensors;155	struct input_dev *touchpad;156 157	/* Update version is used as a feature/capability version. */158	uint16_t update_version;159 160	/* Calibration data for accelerometer and gyroscope. */161	struct ps_calibration_data accel_calib_data[3];162	struct ps_calibration_data gyro_calib_data[3];163 164	/* Timestamp for sensor data */165	bool sensor_timestamp_initialized;166	uint32_t prev_sensor_timestamp;167	uint32_t sensor_timestamp_us;168 169	/* Compatible rumble state */170	bool use_vibration_v2;171	bool update_rumble;172	uint8_t motor_left;173	uint8_t motor_right;174 175	/* RGB lightbar */176	struct led_classdev_mc lightbar;177	bool update_lightbar;178	uint8_t lightbar_red;179	uint8_t lightbar_green;180	uint8_t lightbar_blue;181 182	/* Microphone */183	bool update_mic_mute;184	bool mic_muted;185	bool last_btn_mic_state;186 187	/* Player leds */188	bool update_player_leds;189	uint8_t player_leds_state;190	struct led_classdev player_leds[5];191 192	struct work_struct output_worker;193	bool output_worker_initialized;194	void *output_report_dmabuf;195	uint8_t output_seq; /* Sequence number for output report. */196};197 198struct dualsense_touch_point {199	uint8_t contact;200	uint8_t x_lo;201	uint8_t x_hi:4, y_lo:4;202	uint8_t y_hi;203} __packed;204static_assert(sizeof(struct dualsense_touch_point) == 4);205 206/* Main DualSense input report excluding any BT/USB specific headers. */207struct dualsense_input_report {208	uint8_t x, y;209	uint8_t rx, ry;210	uint8_t z, rz;211	uint8_t seq_number;212	uint8_t buttons[4];213	uint8_t reserved[4];214 215	/* Motion sensors */216	__le16 gyro[3]; /* x, y, z */217	__le16 accel[3]; /* x, y, z */218	__le32 sensor_timestamp;219	uint8_t reserved2;220 221	/* Touchpad */222	struct dualsense_touch_point points[2];223 224	uint8_t reserved3[12];225	uint8_t status;226	uint8_t reserved4[10];227} __packed;228/* Common input report size shared equals the size of the USB report minus 1 byte for ReportID. */229static_assert(sizeof(struct dualsense_input_report) == DS_INPUT_REPORT_USB_SIZE - 1);230 231/* Common data between DualSense BT/USB main output report. */232struct dualsense_output_report_common {233	uint8_t valid_flag0;234	uint8_t valid_flag1;235 236	/* For DualShock 4 compatibility mode. */237	uint8_t motor_right;238	uint8_t motor_left;239 240	/* Audio controls */241	uint8_t reserved[4];242	uint8_t mute_button_led;243 244	uint8_t power_save_control;245	uint8_t reserved2[28];246 247	/* LEDs and lightbar */248	uint8_t valid_flag2;249	uint8_t reserved3[2];250	uint8_t lightbar_setup;251	uint8_t led_brightness;252	uint8_t player_leds;253	uint8_t lightbar_red;254	uint8_t lightbar_green;255	uint8_t lightbar_blue;256} __packed;257static_assert(sizeof(struct dualsense_output_report_common) == 47);258 259struct dualsense_output_report_bt {260	uint8_t report_id; /* 0x31 */261	uint8_t seq_tag;262	uint8_t tag;263	struct dualsense_output_report_common common;264	uint8_t reserved[24];265	__le32 crc32;266} __packed;267static_assert(sizeof(struct dualsense_output_report_bt) == DS_OUTPUT_REPORT_BT_SIZE);268 269struct dualsense_output_report_usb {270	uint8_t report_id; /* 0x02 */271	struct dualsense_output_report_common common;272	uint8_t reserved[15];273} __packed;274static_assert(sizeof(struct dualsense_output_report_usb) == DS_OUTPUT_REPORT_USB_SIZE);275 276/*277 * The DualSense has a main output report used to control most features. It is278 * largely the same between Bluetooth and USB except for different headers and CRC.279 * This structure hide the differences between the two to simplify sending output reports.280 */281struct dualsense_output_report {282	uint8_t *data; /* Start of data */283	uint8_t len; /* Size of output report */284 285	/* Points to Bluetooth data payload in case for a Bluetooth report else NULL. */286	struct dualsense_output_report_bt *bt;287	/* Points to USB data payload in case for a USB report else NULL. */288	struct dualsense_output_report_usb *usb;289	/* Points to common section of report, so past any headers. */290	struct dualsense_output_report_common *common;291};292 293#define DS4_INPUT_REPORT_USB			0x01294#define DS4_INPUT_REPORT_USB_SIZE		64295#define DS4_INPUT_REPORT_BT_MINIMAL		0x01296#define DS4_INPUT_REPORT_BT_MINIMAL_SIZE	10297#define DS4_INPUT_REPORT_BT			0x11298#define DS4_INPUT_REPORT_BT_SIZE		78299#define DS4_OUTPUT_REPORT_USB			0x05300#define DS4_OUTPUT_REPORT_USB_SIZE		32301#define DS4_OUTPUT_REPORT_BT			0x11302#define DS4_OUTPUT_REPORT_BT_SIZE		78303 304#define DS4_FEATURE_REPORT_CALIBRATION		0x02305#define DS4_FEATURE_REPORT_CALIBRATION_SIZE	37306#define DS4_FEATURE_REPORT_CALIBRATION_BT	0x05307#define DS4_FEATURE_REPORT_CALIBRATION_BT_SIZE	41308#define DS4_FEATURE_REPORT_FIRMWARE_INFO	0xa3309#define DS4_FEATURE_REPORT_FIRMWARE_INFO_SIZE	49310#define DS4_FEATURE_REPORT_PAIRING_INFO		0x12311#define DS4_FEATURE_REPORT_PAIRING_INFO_SIZE	16312 313/*314 * Status of a DualShock4 touch point contact.315 * Contact IDs, with highest bit set are 'inactive'316 * and any associated data is then invalid.317 */318#define DS4_TOUCH_POINT_INACTIVE BIT(7)319 320/* Status field of DualShock4 input report. */321#define DS4_STATUS0_BATTERY_CAPACITY	GENMASK(3, 0)322#define DS4_STATUS0_CABLE_STATE		BIT(4)323/* Battery status within batery_status field. */324#define DS4_BATTERY_STATUS_FULL		11325/* Status1 bit2 contains dongle connection state:326 * 0 = connectd327 * 1 = disconnected328 */329#define DS4_STATUS1_DONGLE_STATE	BIT(2)330 331/* The lower 6 bits of hw_control of the Bluetooth main output report332 * control the interval at which Dualshock 4 reports data:333 * 0x00 - 1ms334 * 0x01 - 1ms335 * 0x02 - 2ms336 * 0x3E - 62ms337 * 0x3F - disabled338 */339#define DS4_OUTPUT_HWCTL_BT_POLL_MASK	0x3F340/* Default to 4ms poll interval, which is same as USB (not adjustable). */341#define DS4_BT_DEFAULT_POLL_INTERVAL_MS	4342#define DS4_OUTPUT_HWCTL_CRC32		0x40343#define DS4_OUTPUT_HWCTL_HID		0x80344 345/* Flags for DualShock4 output report. */346#define DS4_OUTPUT_VALID_FLAG0_MOTOR		0x01347#define DS4_OUTPUT_VALID_FLAG0_LED		0x02348#define DS4_OUTPUT_VALID_FLAG0_LED_BLINK	0x04349 350/* DualShock4 hardware limits */351#define DS4_ACC_RES_PER_G	8192352#define DS4_ACC_RANGE		(4*DS_ACC_RES_PER_G)353#define DS4_GYRO_RES_PER_DEG_S	1024354#define DS4_GYRO_RANGE		(2048*DS_GYRO_RES_PER_DEG_S)355#define DS4_LIGHTBAR_MAX_BLINK	255 /* 255 centiseconds */356#define DS4_TOUCHPAD_WIDTH	1920357#define DS4_TOUCHPAD_HEIGHT	942358 359enum dualshock4_dongle_state {360	DONGLE_DISCONNECTED,361	DONGLE_CALIBRATING,362	DONGLE_CONNECTED,363	DONGLE_DISABLED364};365 366struct dualshock4 {367	struct ps_device base;368	struct input_dev *gamepad;369	struct input_dev *sensors;370	struct input_dev *touchpad;371 372	/* Calibration data for accelerometer and gyroscope. */373	struct ps_calibration_data accel_calib_data[3];374	struct ps_calibration_data gyro_calib_data[3];375 376	/* Only used on dongle to track state transitions. */377	enum dualshock4_dongle_state dongle_state;378	/* Used during calibration. */379	struct work_struct dongle_hotplug_worker;380 381	/* Timestamp for sensor data */382	bool sensor_timestamp_initialized;383	uint32_t prev_sensor_timestamp;384	uint32_t sensor_timestamp_us;385 386	/* Bluetooth poll interval */387	bool update_bt_poll_interval;388	uint8_t bt_poll_interval;389 390	bool update_rumble;391	uint8_t motor_left;392	uint8_t motor_right;393 394	/* Lightbar leds */395	bool update_lightbar;396	bool update_lightbar_blink;397	bool lightbar_enabled; /* For use by global LED control. */398	uint8_t lightbar_red;399	uint8_t lightbar_green;400	uint8_t lightbar_blue;401	uint8_t lightbar_blink_on; /* In increments of 10ms. */402	uint8_t lightbar_blink_off; /* In increments of 10ms. */403	struct led_classdev lightbar_leds[4];404 405	struct work_struct output_worker;406	bool output_worker_initialized;407	void *output_report_dmabuf;408};409 410struct dualshock4_touch_point {411	uint8_t contact;412	uint8_t x_lo;413	uint8_t x_hi:4, y_lo:4;414	uint8_t y_hi;415} __packed;416static_assert(sizeof(struct dualshock4_touch_point) == 4);417 418struct dualshock4_touch_report {419	uint8_t timestamp;420	struct dualshock4_touch_point points[2];421} __packed;422static_assert(sizeof(struct dualshock4_touch_report) == 9);423 424/* Main DualShock4 input report excluding any BT/USB specific headers. */425struct dualshock4_input_report_common {426	uint8_t x, y;427	uint8_t rx, ry;428	uint8_t buttons[3];429	uint8_t z, rz;430 431	/* Motion sensors */432	__le16 sensor_timestamp;433	uint8_t sensor_temperature;434	__le16 gyro[3]; /* x, y, z */435	__le16 accel[3]; /* x, y, z */436	uint8_t reserved2[5];437 438	uint8_t status[2];439	uint8_t reserved3;440} __packed;441static_assert(sizeof(struct dualshock4_input_report_common) == 32);442 443struct dualshock4_input_report_usb {444	uint8_t report_id; /* 0x01 */445	struct dualshock4_input_report_common common;446	uint8_t num_touch_reports;447	struct dualshock4_touch_report touch_reports[3];448	uint8_t reserved[3];449} __packed;450static_assert(sizeof(struct dualshock4_input_report_usb) == DS4_INPUT_REPORT_USB_SIZE);451 452struct dualshock4_input_report_bt {453	uint8_t report_id; /* 0x11 */454	uint8_t reserved[2];455	struct dualshock4_input_report_common common;456	uint8_t num_touch_reports;457	struct dualshock4_touch_report touch_reports[4]; /* BT has 4 compared to 3 for USB */458	uint8_t reserved2[2];459	__le32 crc32;460} __packed;461static_assert(sizeof(struct dualshock4_input_report_bt) == DS4_INPUT_REPORT_BT_SIZE);462 463/* Common data between Bluetooth and USB DualShock4 output reports. */464struct dualshock4_output_report_common {465	uint8_t valid_flag0;466	uint8_t valid_flag1;467 468	uint8_t reserved;469 470	uint8_t motor_right;471	uint8_t motor_left;472 473	uint8_t lightbar_red;474	uint8_t lightbar_green;475	uint8_t lightbar_blue;476	uint8_t lightbar_blink_on;477	uint8_t lightbar_blink_off;478} __packed;479 480struct dualshock4_output_report_usb {481	uint8_t report_id; /* 0x5 */482	struct dualshock4_output_report_common common;483	uint8_t reserved[21];484} __packed;485static_assert(sizeof(struct dualshock4_output_report_usb) == DS4_OUTPUT_REPORT_USB_SIZE);486 487struct dualshock4_output_report_bt {488	uint8_t report_id; /* 0x11 */489	uint8_t hw_control;490	uint8_t audio_control;491	struct dualshock4_output_report_common common;492	uint8_t reserved[61];493	__le32 crc32;494} __packed;495static_assert(sizeof(struct dualshock4_output_report_bt) == DS4_OUTPUT_REPORT_BT_SIZE);496 497/*498 * The DualShock4 has a main output report used to control most features. It is499 * largely the same between Bluetooth and USB except for different headers and CRC.500 * This structure hide the differences between the two to simplify sending output reports.501 */502struct dualshock4_output_report {503	uint8_t *data; /* Start of data */504	uint8_t len; /* Size of output report */505 506	/* Points to Bluetooth data payload in case for a Bluetooth report else NULL. */507	struct dualshock4_output_report_bt *bt;508	/* Points to USB data payload in case for a USB report else NULL. */509	struct dualshock4_output_report_usb *usb;510	/* Points to common section of report, so past any headers. */511	struct dualshock4_output_report_common *common;512};513 514/*515 * Common gamepad buttons across DualShock 3 / 4 and DualSense.516 * Note: for device with a touchpad, touchpad button is not included517 *        as it will be part of the touchpad device.518 */519static const int ps_gamepad_buttons[] = {520	BTN_WEST, /* Square */521	BTN_NORTH, /* Triangle */522	BTN_EAST, /* Circle */523	BTN_SOUTH, /* Cross */524	BTN_TL, /* L1 */525	BTN_TR, /* R1 */526	BTN_TL2, /* L2 */527	BTN_TR2, /* R2 */528	BTN_SELECT, /* Create (PS5) / Share (PS4) */529	BTN_START, /* Option */530	BTN_THUMBL, /* L3 */531	BTN_THUMBR, /* R3 */532	BTN_MODE, /* PS Home */533};534 535static const struct {int x; int y; } ps_gamepad_hat_mapping[] = {536	{0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},537	{0, 0},538};539 540static int dualshock4_get_calibration_data(struct dualshock4 *ds4);541static inline void dualsense_schedule_work(struct dualsense *ds);542static inline void dualshock4_schedule_work(struct dualshock4 *ds4);543static void dualsense_set_lightbar(struct dualsense *ds, uint8_t red, uint8_t green, uint8_t blue);544static void dualshock4_set_default_lightbar_colors(struct dualshock4 *ds4);545 546/*547 * Add a new ps_device to ps_devices if it doesn't exist.548 * Return error on duplicate device, which can happen if the same549 * device is connected using both Bluetooth and USB.550 */551static int ps_devices_list_add(struct ps_device *dev)552{553	struct ps_device *entry;554 555	mutex_lock(&ps_devices_lock);556	list_for_each_entry(entry, &ps_devices_list, list) {557		if (!memcmp(entry->mac_address, dev->mac_address, sizeof(dev->mac_address))) {558			hid_err(dev->hdev, "Duplicate device found for MAC address %pMR.\n",559					dev->mac_address);560			mutex_unlock(&ps_devices_lock);561			return -EEXIST;562		}563	}564 565	list_add_tail(&dev->list, &ps_devices_list);566	mutex_unlock(&ps_devices_lock);567	return 0;568}569 570static int ps_devices_list_remove(struct ps_device *dev)571{572	mutex_lock(&ps_devices_lock);573	list_del(&dev->list);574	mutex_unlock(&ps_devices_lock);575	return 0;576}577 578static int ps_device_set_player_id(struct ps_device *dev)579{580	int ret = ida_alloc(&ps_player_id_allocator, GFP_KERNEL);581 582	if (ret < 0)583		return ret;584 585	dev->player_id = ret;586	return 0;587}588 589static void ps_device_release_player_id(struct ps_device *dev)590{591	ida_free(&ps_player_id_allocator, dev->player_id);592 593	dev->player_id = U32_MAX;594}595 596static struct input_dev *ps_allocate_input_dev(struct hid_device *hdev, const char *name_suffix)597{598	struct input_dev *input_dev;599 600	input_dev = devm_input_allocate_device(&hdev->dev);601	if (!input_dev)602		return ERR_PTR(-ENOMEM);603 604	input_dev->id.bustype = hdev->bus;605	input_dev->id.vendor = hdev->vendor;606	input_dev->id.product = hdev->product;607	input_dev->id.version = hdev->version;608	input_dev->uniq = hdev->uniq;609 610	if (name_suffix) {611		input_dev->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, "%s %s", hdev->name,612				name_suffix);613		if (!input_dev->name)614			return ERR_PTR(-ENOMEM);615	} else {616		input_dev->name = hdev->name;617	}618 619	input_set_drvdata(input_dev, hdev);620 621	return input_dev;622}623 624static enum power_supply_property ps_power_supply_props[] = {625	POWER_SUPPLY_PROP_STATUS,626	POWER_SUPPLY_PROP_PRESENT,627	POWER_SUPPLY_PROP_CAPACITY,628	POWER_SUPPLY_PROP_SCOPE,629};630 631static int ps_battery_get_property(struct power_supply *psy,632		enum power_supply_property psp,633		union power_supply_propval *val)634{635	struct ps_device *dev = power_supply_get_drvdata(psy);636	uint8_t battery_capacity;637	int battery_status;638	unsigned long flags;639	int ret = 0;640 641	spin_lock_irqsave(&dev->lock, flags);642	battery_capacity = dev->battery_capacity;643	battery_status = dev->battery_status;644	spin_unlock_irqrestore(&dev->lock, flags);645 646	switch (psp) {647	case POWER_SUPPLY_PROP_STATUS:648		val->intval = battery_status;649		break;650	case POWER_SUPPLY_PROP_PRESENT:651		val->intval = 1;652		break;653	case POWER_SUPPLY_PROP_CAPACITY:654		val->intval = battery_capacity;655		break;656	case POWER_SUPPLY_PROP_SCOPE:657		val->intval = POWER_SUPPLY_SCOPE_DEVICE;658		break;659	default:660		ret = -EINVAL;661		break;662	}663 664	return ret;665}666 667static int ps_device_register_battery(struct ps_device *dev)668{669	struct power_supply *battery;670	struct power_supply_config battery_cfg = { .drv_data = dev };671	int ret;672 673	dev->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY;674	dev->battery_desc.properties = ps_power_supply_props;675	dev->battery_desc.num_properties = ARRAY_SIZE(ps_power_supply_props);676	dev->battery_desc.get_property = ps_battery_get_property;677	dev->battery_desc.name = devm_kasprintf(&dev->hdev->dev, GFP_KERNEL,678			"ps-controller-battery-%pMR", dev->mac_address);679	if (!dev->battery_desc.name)680		return -ENOMEM;681 682	battery = devm_power_supply_register(&dev->hdev->dev, &dev->battery_desc, &battery_cfg);683	if (IS_ERR(battery)) {684		ret = PTR_ERR(battery);685		hid_err(dev->hdev, "Unable to register battery device: %d\n", ret);686		return ret;687	}688	dev->battery = battery;689 690	ret = power_supply_powers(dev->battery, &dev->hdev->dev);691	if (ret) {692		hid_err(dev->hdev, "Unable to activate battery device: %d\n", ret);693		return ret;694	}695 696	return 0;697}698 699/* Compute crc32 of HID data and compare against expected CRC. */700static bool ps_check_crc32(uint8_t seed, uint8_t *data, size_t len, uint32_t report_crc)701{702	uint32_t crc;703 704	crc = crc32_le(0xFFFFFFFF, &seed, 1);705	crc = ~crc32_le(crc, data, len);706 707	return crc == report_crc;708}709 710static struct input_dev *ps_gamepad_create(struct hid_device *hdev,711		int (*play_effect)(struct input_dev *, void *, struct ff_effect *))712{713	struct input_dev *gamepad;714	unsigned int i;715	int ret;716 717	gamepad = ps_allocate_input_dev(hdev, NULL);718	if (IS_ERR(gamepad))719		return ERR_CAST(gamepad);720 721	input_set_abs_params(gamepad, ABS_X, 0, 255, 0, 0);722	input_set_abs_params(gamepad, ABS_Y, 0, 255, 0, 0);723	input_set_abs_params(gamepad, ABS_Z, 0, 255, 0, 0);724	input_set_abs_params(gamepad, ABS_RX, 0, 255, 0, 0);725	input_set_abs_params(gamepad, ABS_RY, 0, 255, 0, 0);726	input_set_abs_params(gamepad, ABS_RZ, 0, 255, 0, 0);727 728	input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0);729	input_set_abs_params(gamepad, ABS_HAT0Y, -1, 1, 0, 0);730 731	for (i = 0; i < ARRAY_SIZE(ps_gamepad_buttons); i++)732		input_set_capability(gamepad, EV_KEY, ps_gamepad_buttons[i]);733 734#if IS_ENABLED(CONFIG_PLAYSTATION_FF)735	if (play_effect) {736		input_set_capability(gamepad, EV_FF, FF_RUMBLE);737		input_ff_create_memless(gamepad, NULL, play_effect);738	}739#endif740 741	ret = input_register_device(gamepad);742	if (ret)743		return ERR_PTR(ret);744 745	return gamepad;746}747 748static int ps_get_report(struct hid_device *hdev, uint8_t report_id, uint8_t *buf, size_t size,749		bool check_crc)750{751	int ret;752 753	ret = hid_hw_raw_request(hdev, report_id, buf, size, HID_FEATURE_REPORT,754				 HID_REQ_GET_REPORT);755	if (ret < 0) {756		hid_err(hdev, "Failed to retrieve feature with reportID %d: %d\n", report_id, ret);757		return ret;758	}759 760	if (ret != size) {761		hid_err(hdev, "Invalid byte count transferred, expected %zu got %d\n", size, ret);762		return -EINVAL;763	}764 765	if (buf[0] != report_id) {766		hid_err(hdev, "Invalid reportID received, expected %d got %d\n", report_id, buf[0]);767		return -EINVAL;768	}769 770	if (hdev->bus == BUS_BLUETOOTH && check_crc) {771		/* Last 4 bytes contains crc32. */772		uint8_t crc_offset = size - 4;773		uint32_t report_crc = get_unaligned_le32(&buf[crc_offset]);774 775		if (!ps_check_crc32(PS_FEATURE_CRC32_SEED, buf, crc_offset, report_crc)) {776			hid_err(hdev, "CRC check failed for reportID=%d\n", report_id);777			return -EILSEQ;778		}779	}780 781	return 0;782}783 784static int ps_led_register(struct ps_device *ps_dev, struct led_classdev *led,785		const struct ps_led_info *led_info)786{787	int ret;788 789	if (led_info->name) {790		led->name = devm_kasprintf(&ps_dev->hdev->dev, GFP_KERNEL,791				"%s:%s:%s", ps_dev->input_dev_name, led_info->color, led_info->name);792	} else {793		/* Backwards compatible mode for hid-sony, but not compliant with LED class spec. */794		led->name = devm_kasprintf(&ps_dev->hdev->dev, GFP_KERNEL,795				"%s:%s", ps_dev->input_dev_name, led_info->color);796	}797 798	if (!led->name)799		return -ENOMEM;800 801	led->brightness = 0;802	led->max_brightness = led_info->max_brightness;803	led->flags = LED_CORE_SUSPENDRESUME;804	led->brightness_get = led_info->brightness_get;805	led->brightness_set_blocking = led_info->brightness_set;806	led->blink_set = led_info->blink_set;807 808	ret = devm_led_classdev_register(&ps_dev->hdev->dev, led);809	if (ret) {810		hid_err(ps_dev->hdev, "Failed to register LED %s: %d\n", led_info->name, ret);811		return ret;812	}813 814	return 0;815}816 817/* Register a DualSense/DualShock4 RGB lightbar represented by a multicolor LED. */818static int ps_lightbar_register(struct ps_device *ps_dev, struct led_classdev_mc *lightbar_mc_dev,819	int (*brightness_set)(struct led_classdev *, enum led_brightness))820{821	struct hid_device *hdev = ps_dev->hdev;822	struct mc_subled *mc_led_info;823	struct led_classdev *led_cdev;824	int ret;825 826	mc_led_info = devm_kmalloc_array(&hdev->dev, 3, sizeof(*mc_led_info),827					 GFP_KERNEL | __GFP_ZERO);828	if (!mc_led_info)829		return -ENOMEM;830 831	mc_led_info[0].color_index = LED_COLOR_ID_RED;832	mc_led_info[1].color_index = LED_COLOR_ID_GREEN;833	mc_led_info[2].color_index = LED_COLOR_ID_BLUE;834 835	lightbar_mc_dev->subled_info = mc_led_info;836	lightbar_mc_dev->num_colors = 3;837 838	led_cdev = &lightbar_mc_dev->led_cdev;839	led_cdev->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, "%s:rgb:indicator",840			ps_dev->input_dev_name);841	if (!led_cdev->name)842		return -ENOMEM;843	led_cdev->brightness = 255;844	led_cdev->max_brightness = 255;845	led_cdev->brightness_set_blocking = brightness_set;846 847	ret = devm_led_classdev_multicolor_register(&hdev->dev, lightbar_mc_dev);848	if (ret < 0) {849		hid_err(hdev, "Cannot register multicolor LED device\n");850		return ret;851	}852 853	return 0;854}855 856static struct input_dev *ps_sensors_create(struct hid_device *hdev, int accel_range, int accel_res,857		int gyro_range, int gyro_res)858{859	struct input_dev *sensors;860	int ret;861 862	sensors = ps_allocate_input_dev(hdev, "Motion Sensors");863	if (IS_ERR(sensors))864		return ERR_CAST(sensors);865 866	__set_bit(INPUT_PROP_ACCELEROMETER, sensors->propbit);867	__set_bit(EV_MSC, sensors->evbit);868	__set_bit(MSC_TIMESTAMP, sensors->mscbit);869 870	/* Accelerometer */871	input_set_abs_params(sensors, ABS_X, -accel_range, accel_range, 16, 0);872	input_set_abs_params(sensors, ABS_Y, -accel_range, accel_range, 16, 0);873	input_set_abs_params(sensors, ABS_Z, -accel_range, accel_range, 16, 0);874	input_abs_set_res(sensors, ABS_X, accel_res);875	input_abs_set_res(sensors, ABS_Y, accel_res);876	input_abs_set_res(sensors, ABS_Z, accel_res);877 878	/* Gyroscope */879	input_set_abs_params(sensors, ABS_RX, -gyro_range, gyro_range, 16, 0);880	input_set_abs_params(sensors, ABS_RY, -gyro_range, gyro_range, 16, 0);881	input_set_abs_params(sensors, ABS_RZ, -gyro_range, gyro_range, 16, 0);882	input_abs_set_res(sensors, ABS_RX, gyro_res);883	input_abs_set_res(sensors, ABS_RY, gyro_res);884	input_abs_set_res(sensors, ABS_RZ, gyro_res);885 886	ret = input_register_device(sensors);887	if (ret)888		return ERR_PTR(ret);889 890	return sensors;891}892 893static struct input_dev *ps_touchpad_create(struct hid_device *hdev, int width, int height,894		unsigned int num_contacts)895{896	struct input_dev *touchpad;897	int ret;898 899	touchpad = ps_allocate_input_dev(hdev, "Touchpad");900	if (IS_ERR(touchpad))901		return ERR_CAST(touchpad);902 903	/* Map button underneath touchpad to BTN_LEFT. */904	input_set_capability(touchpad, EV_KEY, BTN_LEFT);905	__set_bit(INPUT_PROP_BUTTONPAD, touchpad->propbit);906 907	input_set_abs_params(touchpad, ABS_MT_POSITION_X, 0, width - 1, 0, 0);908	input_set_abs_params(touchpad, ABS_MT_POSITION_Y, 0, height - 1, 0, 0);909 910	ret = input_mt_init_slots(touchpad, num_contacts, INPUT_MT_POINTER);911	if (ret)912		return ERR_PTR(ret);913 914	ret = input_register_device(touchpad);915	if (ret)916		return ERR_PTR(ret);917 918	return touchpad;919}920 921static ssize_t firmware_version_show(struct device *dev,922				struct device_attribute923				*attr, char *buf)924{925	struct hid_device *hdev = to_hid_device(dev);926	struct ps_device *ps_dev = hid_get_drvdata(hdev);927 928	return sysfs_emit(buf, "0x%08x\n", ps_dev->fw_version);929}930 931static DEVICE_ATTR_RO(firmware_version);932 933static ssize_t hardware_version_show(struct device *dev,934				struct device_attribute935				*attr, char *buf)936{937	struct hid_device *hdev = to_hid_device(dev);938	struct ps_device *ps_dev = hid_get_drvdata(hdev);939 940	return sysfs_emit(buf, "0x%08x\n", ps_dev->hw_version);941}942 943static DEVICE_ATTR_RO(hardware_version);944 945static struct attribute *ps_device_attrs[] = {946	&dev_attr_firmware_version.attr,947	&dev_attr_hardware_version.attr,948	NULL949};950ATTRIBUTE_GROUPS(ps_device);951 952static int dualsense_get_calibration_data(struct dualsense *ds)953{954	struct hid_device *hdev = ds->base.hdev;955	short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus;956	short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus;957	short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus;958	short gyro_speed_plus, gyro_speed_minus;959	short acc_x_plus, acc_x_minus;960	short acc_y_plus, acc_y_minus;961	short acc_z_plus, acc_z_minus;962	int speed_2x;963	int range_2g;964	int ret = 0;965	int i;966	uint8_t *buf;967 968	buf = kzalloc(DS_FEATURE_REPORT_CALIBRATION_SIZE, GFP_KERNEL);969	if (!buf)970		return -ENOMEM;971 972	ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_CALIBRATION, buf,973			DS_FEATURE_REPORT_CALIBRATION_SIZE, true);974	if (ret) {975		hid_err(ds->base.hdev, "Failed to retrieve DualSense calibration info: %d\n", ret);976		goto err_free;977	}978 979	gyro_pitch_bias  = get_unaligned_le16(&buf[1]);980	gyro_yaw_bias    = get_unaligned_le16(&buf[3]);981	gyro_roll_bias   = get_unaligned_le16(&buf[5]);982	gyro_pitch_plus  = get_unaligned_le16(&buf[7]);983	gyro_pitch_minus = get_unaligned_le16(&buf[9]);984	gyro_yaw_plus    = get_unaligned_le16(&buf[11]);985	gyro_yaw_minus   = get_unaligned_le16(&buf[13]);986	gyro_roll_plus   = get_unaligned_le16(&buf[15]);987	gyro_roll_minus  = get_unaligned_le16(&buf[17]);988	gyro_speed_plus  = get_unaligned_le16(&buf[19]);989	gyro_speed_minus = get_unaligned_le16(&buf[21]);990	acc_x_plus       = get_unaligned_le16(&buf[23]);991	acc_x_minus      = get_unaligned_le16(&buf[25]);992	acc_y_plus       = get_unaligned_le16(&buf[27]);993	acc_y_minus      = get_unaligned_le16(&buf[29]);994	acc_z_plus       = get_unaligned_le16(&buf[31]);995	acc_z_minus      = get_unaligned_le16(&buf[33]);996 997	/*998	 * Set gyroscope calibration and normalization parameters.999	 * Data values will be normalized to 1/DS_GYRO_RES_PER_DEG_S degree/s.1000	 */1001	speed_2x = (gyro_speed_plus + gyro_speed_minus);1002	ds->gyro_calib_data[0].abs_code = ABS_RX;1003	ds->gyro_calib_data[0].bias = 0;1004	ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;1005	ds->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) +1006			abs(gyro_pitch_minus - gyro_pitch_bias);1007 1008	ds->gyro_calib_data[1].abs_code = ABS_RY;1009	ds->gyro_calib_data[1].bias = 0;1010	ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;1011	ds->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) +1012			abs(gyro_yaw_minus - gyro_yaw_bias);1013 1014	ds->gyro_calib_data[2].abs_code = ABS_RZ;1015	ds->gyro_calib_data[2].bias = 0;1016	ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;1017	ds->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) +1018			abs(gyro_roll_minus - gyro_roll_bias);1019 1020	/*1021	 * Sanity check gyro calibration data. This is needed to prevent crashes1022	 * during report handling of virtual, clone or broken devices not implementing1023	 * calibration data properly.1024	 */1025	for (i = 0; i < ARRAY_SIZE(ds->gyro_calib_data); i++) {1026		if (ds->gyro_calib_data[i].sens_denom == 0) {1027			hid_warn(hdev, "Invalid gyro calibration data for axis (%d), disabling calibration.",1028					ds->gyro_calib_data[i].abs_code);1029			ds->gyro_calib_data[i].bias = 0;1030			ds->gyro_calib_data[i].sens_numer = DS_GYRO_RANGE;1031			ds->gyro_calib_data[i].sens_denom = S16_MAX;1032		}1033	}1034 1035	/*1036	 * Set accelerometer calibration and normalization parameters.1037	 * Data values will be normalized to 1/DS_ACC_RES_PER_G g.1038	 */1039	range_2g = acc_x_plus - acc_x_minus;1040	ds->accel_calib_data[0].abs_code = ABS_X;1041	ds->accel_calib_data[0].bias = acc_x_plus - range_2g / 2;1042	ds->accel_calib_data[0].sens_numer = 2*DS_ACC_RES_PER_G;1043	ds->accel_calib_data[0].sens_denom = range_2g;1044 1045	range_2g = acc_y_plus - acc_y_minus;1046	ds->accel_calib_data[1].abs_code = ABS_Y;1047	ds->accel_calib_data[1].bias = acc_y_plus - range_2g / 2;1048	ds->accel_calib_data[1].sens_numer = 2*DS_ACC_RES_PER_G;1049	ds->accel_calib_data[1].sens_denom = range_2g;1050 1051	range_2g = acc_z_plus - acc_z_minus;1052	ds->accel_calib_data[2].abs_code = ABS_Z;1053	ds->accel_calib_data[2].bias = acc_z_plus - range_2g / 2;1054	ds->accel_calib_data[2].sens_numer = 2*DS_ACC_RES_PER_G;1055	ds->accel_calib_data[2].sens_denom = range_2g;1056 1057	/*1058	 * Sanity check accelerometer calibration data. This is needed to prevent crashes1059	 * during report handling of virtual, clone or broken devices not implementing calibration1060	 * data properly.1061	 */1062	for (i = 0; i < ARRAY_SIZE(ds->accel_calib_data); i++) {1063		if (ds->accel_calib_data[i].sens_denom == 0) {1064			hid_warn(hdev, "Invalid accelerometer calibration data for axis (%d), disabling calibration.",1065					ds->accel_calib_data[i].abs_code);1066			ds->accel_calib_data[i].bias = 0;1067			ds->accel_calib_data[i].sens_numer = DS_ACC_RANGE;1068			ds->accel_calib_data[i].sens_denom = S16_MAX;1069		}1070	}1071 1072err_free:1073	kfree(buf);1074	return ret;1075}1076 1077 1078static int dualsense_get_firmware_info(struct dualsense *ds)1079{1080	uint8_t *buf;1081	int ret;1082 1083	buf = kzalloc(DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE, GFP_KERNEL);1084	if (!buf)1085		return -ENOMEM;1086 1087	ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_FIRMWARE_INFO, buf,1088			DS_FEATURE_REPORT_FIRMWARE_INFO_SIZE, true);1089	if (ret) {1090		hid_err(ds->base.hdev, "Failed to retrieve DualSense firmware info: %d\n", ret);1091		goto err_free;1092	}1093 1094	ds->base.hw_version = get_unaligned_le32(&buf[24]);1095	ds->base.fw_version = get_unaligned_le32(&buf[28]);1096 1097	/* Update version is some kind of feature version. It is distinct from1098	 * the firmware version as there can be many different variations of a1099	 * controller over time with the same physical shell, but with different1100	 * PCBs and other internal changes. The update version (internal name) is1101	 * used as a means to detect what features are available and change behavior.1102	 * Note: the version is different between DualSense and DualSense Edge.1103	 */1104	ds->update_version = get_unaligned_le16(&buf[44]);1105 1106err_free:1107	kfree(buf);1108	return ret;1109}1110 1111static int dualsense_get_mac_address(struct dualsense *ds)1112{1113	uint8_t *buf;1114	int ret = 0;1115 1116	buf = kzalloc(DS_FEATURE_REPORT_PAIRING_INFO_SIZE, GFP_KERNEL);1117	if (!buf)1118		return -ENOMEM;1119 1120	ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_PAIRING_INFO, buf,1121			DS_FEATURE_REPORT_PAIRING_INFO_SIZE, true);1122	if (ret) {1123		hid_err(ds->base.hdev, "Failed to retrieve DualSense pairing info: %d\n", ret);1124		goto err_free;1125	}1126 1127	memcpy(ds->base.mac_address, &buf[1], sizeof(ds->base.mac_address));1128 1129err_free:1130	kfree(buf);1131	return ret;1132}1133 1134static int dualsense_lightbar_set_brightness(struct led_classdev *cdev,1135	enum led_brightness brightness)1136{1137	struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev);1138	struct dualsense *ds = container_of(mc_cdev, struct dualsense, lightbar);1139	uint8_t red, green, blue;1140 1141	led_mc_calc_color_components(mc_cdev, brightness);1142	red = mc_cdev->subled_info[0].brightness;1143	green = mc_cdev->subled_info[1].brightness;1144	blue = mc_cdev->subled_info[2].brightness;1145 1146	dualsense_set_lightbar(ds, red, green, blue);1147	return 0;1148}1149 1150static enum led_brightness dualsense_player_led_get_brightness(struct led_classdev *led)1151{1152	struct hid_device *hdev = to_hid_device(led->dev->parent);1153	struct dualsense *ds = hid_get_drvdata(hdev);1154 1155	return !!(ds->player_leds_state & BIT(led - ds->player_leds));1156}1157 1158static int dualsense_player_led_set_brightness(struct led_classdev *led, enum led_brightness value)1159{1160	struct hid_device *hdev = to_hid_device(led->dev->parent);1161	struct dualsense *ds = hid_get_drvdata(hdev);1162	unsigned long flags;1163	unsigned int led_index;1164 1165	spin_lock_irqsave(&ds->base.lock, flags);1166 1167	led_index = led - ds->player_leds;1168	if (value == LED_OFF)1169		ds->player_leds_state &= ~BIT(led_index);1170	else1171		ds->player_leds_state |= BIT(led_index);1172 1173	ds->update_player_leds = true;1174	spin_unlock_irqrestore(&ds->base.lock, flags);1175 1176	dualsense_schedule_work(ds);1177 1178	return 0;1179}1180 1181static void dualsense_init_output_report(struct dualsense *ds, struct dualsense_output_report *rp,1182		void *buf)1183{1184	struct hid_device *hdev = ds->base.hdev;1185 1186	if (hdev->bus == BUS_BLUETOOTH) {1187		struct dualsense_output_report_bt *bt = buf;1188 1189		memset(bt, 0, sizeof(*bt));1190		bt->report_id = DS_OUTPUT_REPORT_BT;1191		bt->tag = DS_OUTPUT_TAG; /* Tag must be set. Exact meaning is unclear. */1192 1193		/*1194		 * Highest 4-bit is a sequence number, which needs to be increased1195		 * every report. Lowest 4-bit is tag and can be zero for now.1196		 */1197		bt->seq_tag = (ds->output_seq << 4) | 0x0;1198		if (++ds->output_seq == 16)1199			ds->output_seq = 0;1200 1201		rp->data = buf;1202		rp->len = sizeof(*bt);1203		rp->bt = bt;1204		rp->usb = NULL;1205		rp->common = &bt->common;1206	} else { /* USB */1207		struct dualsense_output_report_usb *usb = buf;1208 1209		memset(usb, 0, sizeof(*usb));1210		usb->report_id = DS_OUTPUT_REPORT_USB;1211 1212		rp->data = buf;1213		rp->len = sizeof(*usb);1214		rp->bt = NULL;1215		rp->usb = usb;1216		rp->common = &usb->common;1217	}1218}1219 1220static inline void dualsense_schedule_work(struct dualsense *ds)1221{1222	unsigned long flags;1223 1224	spin_lock_irqsave(&ds->base.lock, flags);1225	if (ds->output_worker_initialized)1226		schedule_work(&ds->output_worker);1227	spin_unlock_irqrestore(&ds->base.lock, flags);1228}1229 1230/*1231 * Helper function to send DualSense output reports. Applies a CRC at the end of a report1232 * for Bluetooth reports.1233 */1234static void dualsense_send_output_report(struct dualsense *ds,1235		struct dualsense_output_report *report)1236{1237	struct hid_device *hdev = ds->base.hdev;1238 1239	/* Bluetooth packets need to be signed with a CRC in the last 4 bytes. */1240	if (report->bt) {1241		uint32_t crc;1242		uint8_t seed = PS_OUTPUT_CRC32_SEED;1243 1244		crc = crc32_le(0xFFFFFFFF, &seed, 1);1245		crc = ~crc32_le(crc, report->data, report->len - 4);1246 1247		report->bt->crc32 = cpu_to_le32(crc);1248	}1249 1250	hid_hw_output_report(hdev, report->data, report->len);1251}1252 1253static void dualsense_output_worker(struct work_struct *work)1254{1255	struct dualsense *ds = container_of(work, struct dualsense, output_worker);1256	struct dualsense_output_report report;1257	struct dualsense_output_report_common *common;1258	unsigned long flags;1259 1260	dualsense_init_output_report(ds, &report, ds->output_report_dmabuf);1261	common = report.common;1262 1263	spin_lock_irqsave(&ds->base.lock, flags);1264 1265	if (ds->update_rumble) {1266		/* Select classic rumble style haptics and enable it. */1267		common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_HAPTICS_SELECT;1268		if (ds->use_vibration_v2)1269			common->valid_flag2 |= DS_OUTPUT_VALID_FLAG2_COMPATIBLE_VIBRATION2;1270		else1271			common->valid_flag0 |= DS_OUTPUT_VALID_FLAG0_COMPATIBLE_VIBRATION;1272		common->motor_left = ds->motor_left;1273		common->motor_right = ds->motor_right;1274		ds->update_rumble = false;1275	}1276 1277	if (ds->update_lightbar) {1278		common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_LIGHTBAR_CONTROL_ENABLE;1279		common->lightbar_red = ds->lightbar_red;1280		common->lightbar_green = ds->lightbar_green;1281		common->lightbar_blue = ds->lightbar_blue;1282 1283		ds->update_lightbar = false;1284	}1285 1286	if (ds->update_player_leds) {1287		common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_PLAYER_INDICATOR_CONTROL_ENABLE;1288		common->player_leds = ds->player_leds_state;1289 1290		ds->update_player_leds = false;1291	}1292 1293	if (ds->update_mic_mute) {1294		common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_MIC_MUTE_LED_CONTROL_ENABLE;1295		common->mute_button_led = ds->mic_muted;1296 1297		if (ds->mic_muted) {1298			/* Disable microphone */1299			common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE;1300			common->power_save_control |= DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE;1301		} else {1302			/* Enable microphone */1303			common->valid_flag1 |= DS_OUTPUT_VALID_FLAG1_POWER_SAVE_CONTROL_ENABLE;1304			common->power_save_control &= ~DS_OUTPUT_POWER_SAVE_CONTROL_MIC_MUTE;1305		}1306 1307		ds->update_mic_mute = false;1308	}1309 1310	spin_unlock_irqrestore(&ds->base.lock, flags);1311 1312	dualsense_send_output_report(ds, &report);1313}1314 1315static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *report,1316		u8 *data, int size)1317{1318	struct hid_device *hdev = ps_dev->hdev;1319	struct dualsense *ds = container_of(ps_dev, struct dualsense, base);1320	struct dualsense_input_report *ds_report;1321	uint8_t battery_data, battery_capacity, charging_status, value;1322	int battery_status;1323	uint32_t sensor_timestamp;1324	bool btn_mic_state;1325	unsigned long flags;1326	int i;1327 1328	/*1329	 * DualSense in USB uses the full HID report for reportID 1, but1330	 * Bluetooth uses a minimal HID report for reportID 1 and reports1331	 * the full report using reportID 49.1332	 */1333	if (hdev->bus == BUS_USB && report->id == DS_INPUT_REPORT_USB &&1334			size == DS_INPUT_REPORT_USB_SIZE) {1335		ds_report = (struct dualsense_input_report *)&data[1];1336	} else if (hdev->bus == BUS_BLUETOOTH && report->id == DS_INPUT_REPORT_BT &&1337			size == DS_INPUT_REPORT_BT_SIZE) {1338		/* Last 4 bytes of input report contain crc32 */1339		uint32_t report_crc = get_unaligned_le32(&data[size - 4]);1340 1341		if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) {1342			hid_err(hdev, "DualSense input CRC's check failed\n");1343			return -EILSEQ;1344		}1345 1346		ds_report = (struct dualsense_input_report *)&data[2];1347	} else {1348		hid_err(hdev, "Unhandled reportID=%d\n", report->id);1349		return -1;1350	}1351 1352	input_report_abs(ds->gamepad, ABS_X,  ds_report->x);1353	input_report_abs(ds->gamepad, ABS_Y,  ds_report->y);1354	input_report_abs(ds->gamepad, ABS_RX, ds_report->rx);1355	input_report_abs(ds->gamepad, ABS_RY, ds_report->ry);1356	input_report_abs(ds->gamepad, ABS_Z,  ds_report->z);1357	input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz);1358 1359	value = ds_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH;1360	if (value >= ARRAY_SIZE(ps_gamepad_hat_mapping))1361		value = 8; /* center */1362	input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x);1363	input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y);1364 1365	input_report_key(ds->gamepad, BTN_WEST,   ds_report->buttons[0] & DS_BUTTONS0_SQUARE);1366	input_report_key(ds->gamepad, BTN_SOUTH,  ds_report->buttons[0] & DS_BUTTONS0_CROSS);1367	input_report_key(ds->gamepad, BTN_EAST,   ds_report->buttons[0] & DS_BUTTONS0_CIRCLE);1368	input_report_key(ds->gamepad, BTN_NORTH,  ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE);1369	input_report_key(ds->gamepad, BTN_TL,     ds_report->buttons[1] & DS_BUTTONS1_L1);1370	input_report_key(ds->gamepad, BTN_TR,     ds_report->buttons[1] & DS_BUTTONS1_R1);1371	input_report_key(ds->gamepad, BTN_TL2,    ds_report->buttons[1] & DS_BUTTONS1_L2);1372	input_report_key(ds->gamepad, BTN_TR2,    ds_report->buttons[1] & DS_BUTTONS1_R2);1373	input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE);1374	input_report_key(ds->gamepad, BTN_START,  ds_report->buttons[1] & DS_BUTTONS1_OPTIONS);1375	input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3);1376	input_report_key(ds->gamepad, BTN_THUMBR, ds_report->buttons[1] & DS_BUTTONS1_R3);1377	input_report_key(ds->gamepad, BTN_MODE,   ds_report->buttons[2] & DS_BUTTONS2_PS_HOME);1378	input_sync(ds->gamepad);1379 1380	/*1381	 * The DualSense has an internal microphone, which can be muted through a mute button1382	 * on the device. The driver is expected to read the button state and program the device1383	 * to mute/unmute audio at the hardware level.1384	 */1385	btn_mic_state = !!(ds_report->buttons[2] & DS_BUTTONS2_MIC_MUTE);1386	if (btn_mic_state && !ds->last_btn_mic_state) {1387		spin_lock_irqsave(&ps_dev->lock, flags);1388		ds->update_mic_mute = true;1389		ds->mic_muted = !ds->mic_muted; /* toggle */1390		spin_unlock_irqrestore(&ps_dev->lock, flags);1391 1392		/* Schedule updating of microphone state at hardware level. */1393		dualsense_schedule_work(ds);1394	}1395	ds->last_btn_mic_state = btn_mic_state;1396 1397	/* Parse and calibrate gyroscope data. */1398	for (i = 0; i < ARRAY_SIZE(ds_report->gyro); i++) {1399		int raw_data = (short)le16_to_cpu(ds_report->gyro[i]);1400		int calib_data = mult_frac(ds->gyro_calib_data[i].sens_numer,1401					   raw_data, ds->gyro_calib_data[i].sens_denom);1402 1403		input_report_abs(ds->sensors, ds->gyro_calib_data[i].abs_code, calib_data);1404	}1405 1406	/* Parse and calibrate accelerometer data. */1407	for (i = 0; i < ARRAY_SIZE(ds_report->accel); i++) {1408		int raw_data = (short)le16_to_cpu(ds_report->accel[i]);1409		int calib_data = mult_frac(ds->accel_calib_data[i].sens_numer,1410					   raw_data - ds->accel_calib_data[i].bias,1411					   ds->accel_calib_data[i].sens_denom);1412 1413		input_report_abs(ds->sensors, ds->accel_calib_data[i].abs_code, calib_data);1414	}1415 1416	/* Convert timestamp (in 0.33us unit) to timestamp_us */1417	sensor_timestamp = le32_to_cpu(ds_report->sensor_timestamp);1418	if (!ds->sensor_timestamp_initialized) {1419		ds->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp, 3);1420		ds->sensor_timestamp_initialized = true;1421	} else {1422		uint32_t delta;1423 1424		if (ds->prev_sensor_timestamp > sensor_timestamp)1425			delta = (U32_MAX - ds->prev_sensor_timestamp + sensor_timestamp + 1);1426		else1427			delta = sensor_timestamp - ds->prev_sensor_timestamp;1428		ds->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta, 3);1429	}1430	ds->prev_sensor_timestamp = sensor_timestamp;1431	input_event(ds->sensors, EV_MSC, MSC_TIMESTAMP, ds->sensor_timestamp_us);1432	input_sync(ds->sensors);1433 1434	for (i = 0; i < ARRAY_SIZE(ds_report->points); i++) {1435		struct dualsense_touch_point *point = &ds_report->points[i];1436		bool active = (point->contact & DS_TOUCH_POINT_INACTIVE) ? false : true;1437 1438		input_mt_slot(ds->touchpad, i);1439		input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active);1440 1441		if (active) {1442			int x = (point->x_hi << 8) | point->x_lo;1443			int y = (point->y_hi << 4) | point->y_lo;1444 1445			input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x);1446			input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y);1447		}1448	}1449	input_mt_sync_frame(ds->touchpad);1450	input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD);1451	input_sync(ds->touchpad);1452 1453	battery_data = ds_report->status & DS_STATUS_BATTERY_CAPACITY;1454	charging_status = (ds_report->status & DS_STATUS_CHARGING) >> DS_STATUS_CHARGING_SHIFT;1455 1456	switch (charging_status) {1457	case 0x0:1458		/*1459		 * Each unit of battery data corresponds to 10%1460		 * 0 = 0-9%, 1 = 10-19%, .. and 10 = 100%1461		 */1462		battery_capacity = min(battery_data * 10 + 5, 100);1463		battery_status = POWER_SUPPLY_STATUS_DISCHARGING;1464		break;1465	case 0x1:1466		battery_capacity = min(battery_data * 10 + 5, 100);1467		battery_status = POWER_SUPPLY_STATUS_CHARGING;1468		break;1469	case 0x2:1470		battery_capacity = 100;1471		battery_status = POWER_SUPPLY_STATUS_FULL;1472		break;1473	case 0xa: /* voltage or temperature out of range */1474	case 0xb: /* temperature error */1475		battery_capacity = 0;1476		battery_status = POWER_SUPPLY_STATUS_NOT_CHARGING;1477		break;1478	case 0xf: /* charging error */1479	default:1480		battery_capacity = 0;1481		battery_status = POWER_SUPPLY_STATUS_UNKNOWN;1482	}1483 1484	spin_lock_irqsave(&ps_dev->lock, flags);1485	ps_dev->battery_capacity = battery_capacity;1486	ps_dev->battery_status = battery_status;1487	spin_unlock_irqrestore(&ps_dev->lock, flags);1488 1489	return 0;1490}1491 1492static int dualsense_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect)1493{1494	struct hid_device *hdev = input_get_drvdata(dev);1495	struct dualsense *ds = hid_get_drvdata(hdev);1496	unsigned long flags;1497 1498	if (effect->type != FF_RUMBLE)1499		return 0;1500 1501	spin_lock_irqsave(&ds->base.lock, flags);1502	ds->update_rumble = true;1503	ds->motor_left = effect->u.rumble.strong_magnitude / 256;1504	ds->motor_right = effect->u.rumble.weak_magnitude / 256;1505	spin_unlock_irqrestore(&ds->base.lock, flags);1506 1507	dualsense_schedule_work(ds);1508	return 0;1509}1510 1511static void dualsense_remove(struct ps_device *ps_dev)1512{1513	struct dualsense *ds = container_of(ps_dev, struct dualsense, base);1514	unsigned long flags;1515 1516	spin_lock_irqsave(&ds->base.lock, flags);1517	ds->output_worker_initialized = false;1518	spin_unlock_irqrestore(&ds->base.lock, flags);1519 1520	cancel_work_sync(&ds->output_worker);1521}1522 1523static int dualsense_reset_leds(struct dualsense *ds)1524{1525	struct dualsense_output_report report;1526	uint8_t *buf;1527 1528	buf = kzalloc(sizeof(struct dualsense_output_report_bt), GFP_KERNEL);1529	if (!buf)1530		return -ENOMEM;1531 1532	dualsense_init_output_report(ds, &report, buf);1533	/*1534	 * On Bluetooth the DualSense outputs an animation on the lightbar1535	 * during startup and maintains a color afterwards. We need to explicitly1536	 * reconfigure the lightbar before we can do any programming later on.1537	 * In USB the lightbar is not on by default, but redoing the setup there1538	 * doesn't hurt.1539	 */1540	report.common->valid_flag2 = DS_OUTPUT_VALID_FLAG2_LIGHTBAR_SETUP_CONTROL_ENABLE;1541	report.common->lightbar_setup = DS_OUTPUT_LIGHTBAR_SETUP_LIGHT_OUT; /* Fade light out. */1542	dualsense_send_output_report(ds, &report);1543 1544	kfree(buf);1545	return 0;1546}1547 1548static void dualsense_set_lightbar(struct dualsense *ds, uint8_t red, uint8_t green, uint8_t blue)1549{1550	unsigned long flags;1551 1552	spin_lock_irqsave(&ds->base.lock, flags);1553	ds->update_lightbar = true;1554	ds->lightbar_red = red;1555	ds->lightbar_green = green;1556	ds->lightbar_blue = blue;1557	spin_unlock_irqrestore(&ds->base.lock, flags);1558 1559	dualsense_schedule_work(ds);1560}1561 1562static void dualsense_set_player_leds(struct dualsense *ds)1563{1564	/*1565	 * The DualSense controller has a row of 5 LEDs used for player ids.1566	 * Behavior on the PlayStation 5 console is to center the player id1567	 * across the LEDs, so e.g. player 1 would be "--x--" with x being 'on'.1568	 * Follow a similar mapping here.1569	 */1570	static const int player_ids[5] = {1571		BIT(2),1572		BIT(3) | BIT(1),1573		BIT(4) | BIT(2) | BIT(0),1574		BIT(4) | BIT(3) | BIT(1) | BIT(0),1575		BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)1576	};1577 1578	uint8_t player_id = ds->base.player_id % ARRAY_SIZE(player_ids);1579 1580	ds->update_player_leds = true;1581	ds->player_leds_state = player_ids[player_id];1582	dualsense_schedule_work(ds);1583}1584 1585static struct ps_device *dualsense_create(struct hid_device *hdev)1586{1587	struct dualsense *ds;1588	struct ps_device *ps_dev;1589	uint8_t max_output_report_size;1590	int i, ret;1591 1592	static const struct ps_led_info player_leds_info[] = {1593		{ LED_FUNCTION_PLAYER1, "white", 1, dualsense_player_led_get_brightness,1594				dualsense_player_led_set_brightness },1595		{ LED_FUNCTION_PLAYER2, "white", 1, dualsense_player_led_get_brightness,1596				dualsense_player_led_set_brightness },1597		{ LED_FUNCTION_PLAYER3, "white", 1, dualsense_player_led_get_brightness,1598				dualsense_player_led_set_brightness },1599		{ LED_FUNCTION_PLAYER4, "white", 1, dualsense_player_led_get_brightness,1600				dualsense_player_led_set_brightness },1601		{ LED_FUNCTION_PLAYER5, "white", 1, dualsense_player_led_get_brightness,1602				dualsense_player_led_set_brightness }1603	};1604 1605	ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL);1606	if (!ds)1607		return ERR_PTR(-ENOMEM);1608 1609	/*1610	 * Patch version to allow userspace to distinguish between1611	 * hid-generic vs hid-playstation axis and button mapping.1612	 */1613	hdev->version |= HID_PLAYSTATION_VERSION_PATCH;1614 1615	ps_dev = &ds->base;1616	ps_dev->hdev = hdev;1617	spin_lock_init(&ps_dev->lock);1618	ps_dev->battery_capacity = 100; /* initial value until parse_report. */1619	ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN;1620	ps_dev->parse_report = dualsense_parse_report;1621	ps_dev->remove = dualsense_remove;1622	INIT_WORK(&ds->output_worker, dualsense_output_worker);1623	ds->output_worker_initialized = true;1624	hid_set_drvdata(hdev, ds);1625 1626	max_output_report_size = sizeof(struct dualsense_output_report_bt);1627	ds->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL);1628	if (!ds->output_report_dmabuf)1629		return ERR_PTR(-ENOMEM);1630 1631	ret = dualsense_get_mac_address(ds);1632	if (ret) {1633		hid_err(hdev, "Failed to get MAC address from DualSense\n");1634		return ERR_PTR(ret);1635	}1636	snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address);1637 1638	ret = dualsense_get_firmware_info(ds);1639	if (ret) {1640		hid_err(hdev, "Failed to get firmware info from DualSense\n");1641		return ERR_PTR(ret);1642	}1643 1644	/* Original DualSense firmware simulated classic controller rumble through1645	 * its new haptics hardware. It felt different from classic rumble users1646	 * were used to. Since then new firmwares were introduced to change behavior1647	 * and make this new 'v2' behavior default on PlayStation and other platforms.1648	 * The original DualSense requires a new enough firmware as bundled with PS51649	 * software released in 2021. DualSense edge supports it out of the box.1650	 * Both devices also support the old mode, but it is not really used.1651	 */1652	if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER) {1653		/* Feature version 2.21 introduced new vibration method. */1654		ds->use_vibration_v2 = ds->update_version >= DS_FEATURE_VERSION(2, 21);1655	} else if (hdev->product == USB_DEVICE_ID_SONY_PS5_CONTROLLER_2) {1656		ds->use_vibration_v2 = true;1657	}1658 1659	ret = ps_devices_list_add(ps_dev);1660	if (ret)1661		return ERR_PTR(ret);1662 1663	ret = dualsense_get_calibration_data(ds);1664	if (ret) {1665		hid_err(hdev, "Failed to get calibration data from DualSense\n");1666		goto err;1667	}1668 1669	ds->gamepad = ps_gamepad_create(hdev, dualsense_play_effect);1670	if (IS_ERR(ds->gamepad)) {1671		ret = PTR_ERR(ds->gamepad);1672		goto err;1673	}1674	/* Use gamepad input device name as primary device name for e.g. LEDs */1675	ps_dev->input_dev_name = dev_name(&ds->gamepad->dev);1676 1677	ds->sensors = ps_sensors_create(hdev, DS_ACC_RANGE, DS_ACC_RES_PER_G,1678			DS_GYRO_RANGE, DS_GYRO_RES_PER_DEG_S);1679	if (IS_ERR(ds->sensors)) {1680		ret = PTR_ERR(ds->sensors);1681		goto err;1682	}1683 1684	ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2);1685	if (IS_ERR(ds->touchpad)) {1686		ret = PTR_ERR(ds->touchpad);1687		goto err;1688	}1689 1690	ret = ps_device_register_battery(ps_dev);1691	if (ret)1692		goto err;1693 1694	/*1695	 * The hardware may have control over the LEDs (e.g. in Bluetooth on startup).1696	 * Reset the LEDs (lightbar, mute, player leds), so we can control them1697	 * from software.1698	 */1699	ret = dualsense_reset_leds(ds);1700	if (ret)1701		goto err;1702 1703	ret = ps_lightbar_register(ps_dev, &ds->lightbar, dualsense_lightbar_set_brightness);1704	if (ret)1705		goto err;1706 1707	/* Set default lightbar color. */1708	dualsense_set_lightbar(ds, 0, 0, 128); /* blue */1709 1710	for (i = 0; i < ARRAY_SIZE(player_leds_info); i++) {1711		const struct ps_led_info *led_info = &player_leds_info[i];1712 1713		ret = ps_led_register(ps_dev, &ds->player_leds[i], led_info);1714		if (ret < 0)1715			goto err;1716	}1717 1718	ret = ps_device_set_player_id(ps_dev);1719	if (ret) {1720		hid_err(hdev, "Failed to assign player id for DualSense: %d\n", ret);1721		goto err;1722	}1723 1724	/* Set player LEDs to our player id. */1725	dualsense_set_player_leds(ds);1726 1727	/*1728	 * Reporting hardware and firmware is important as there are frequent updates, which1729	 * can change behavior.1730	 */1731	hid_info(hdev, "Registered DualSense controller hw_version=0x%08x fw_version=0x%08x\n",1732			ds->base.hw_version, ds->base.fw_version);1733 1734	return &ds->base;1735 1736err:1737	ps_devices_list_remove(ps_dev);1738	return ERR_PTR(ret);1739}1740 1741static void dualshock4_dongle_calibration_work(struct work_struct *work)1742{1743	struct dualshock4 *ds4 = container_of(work, struct dualshock4, dongle_hotplug_worker);1744	unsigned long flags;1745	enum dualshock4_dongle_state dongle_state;1746	int ret;1747 1748	ret = dualshock4_get_calibration_data(ds4);1749	if (ret < 0) {1750		/* This call is very unlikely to fail for the dongle. When it1751		 * fails we are probably in a very bad state, so mark the1752		 * dongle as disabled. We will re-enable the dongle if a new1753		 * DS4 hotplug is detect from sony_raw_event as any issues1754		 * are likely resolved then (the dongle is quite stupid).1755		 */1756		hid_err(ds4->base.hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n");1757		dongle_state = DONGLE_DISABLED;1758	} else {1759		hid_info(ds4->base.hdev, "DualShock 4 USB dongle: calibration completed\n");1760		dongle_state = DONGLE_CONNECTED;1761	}1762 1763	spin_lock_irqsave(&ds4->base.lock, flags);1764	ds4->dongle_state = dongle_state;1765	spin_unlock_irqrestore(&ds4->base.lock, flags);1766}1767 1768static int dualshock4_get_calibration_data(struct dualshock4 *ds4)1769{1770	struct hid_device *hdev = ds4->base.hdev;1771	short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus;1772	short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus;1773	short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus;1774	short gyro_speed_plus, gyro_speed_minus;1775	short acc_x_plus, acc_x_minus;1776	short acc_y_plus, acc_y_minus;1777	short acc_z_plus, acc_z_minus;1778	int speed_2x;1779	int range_2g;1780	int ret = 0;1781	int i;1782	uint8_t *buf;1783 1784	if (ds4->base.hdev->bus == BUS_USB) {1785		int retries;1786 1787		buf = kzalloc(DS4_FEATURE_REPORT_CALIBRATION_SIZE, GFP_KERNEL);1788		if (!buf) {1789			ret = -ENOMEM;1790			goto transfer_failed;1791		}1792 1793		/* We should normally receive the feature report data we asked1794		 * for, but hidraw applications such as Steam can issue feature1795		 * reports as well. In particular for Dongle reconnects, Steam1796		 * and this function are competing resulting in often receiving1797		 * data for a different HID report, so retry a few times.1798		 */1799		for (retries = 0; retries < 3; retries++) {1800			ret = ps_get_report(hdev, DS4_FEATURE_REPORT_CALIBRATION, buf,1801					DS4_FEATURE_REPORT_CALIBRATION_SIZE, true);1802			if (ret) {1803				if (retries < 2) {1804					hid_warn(hdev, "Retrying DualShock 4 get calibration report (0x02) request\n");1805					continue;1806				}1807 1808				hid_warn(hdev, "Failed to retrieve DualShock4 calibration info: %d\n", ret);1809				ret = -EILSEQ;1810				goto transfer_failed;1811			} else {1812				break;1813			}1814		}1815	} else { /* Bluetooth */1816		buf = kzalloc(DS4_FEATURE_REPORT_CALIBRATION_BT_SIZE, GFP_KERNEL);1817		if (!buf) {1818			ret = -ENOMEM;1819			goto transfer_failed;1820		}1821 1822		ret = ps_get_report(hdev, DS4_FEATURE_REPORT_CALIBRATION_BT, buf,1823				DS4_FEATURE_REPORT_CALIBRATION_BT_SIZE, true);1824 1825		if (ret) {1826			hid_warn(hdev, "Failed to retrieve DualShock4 calibration info: %d\n", ret);1827			goto transfer_failed;1828		}1829	}1830 1831	/* Transfer succeeded - parse the calibration data received. */1832	gyro_pitch_bias  = get_unaligned_le16(&buf[1]);1833	gyro_yaw_bias    = get_unaligned_le16(&buf[3]);1834	gyro_roll_bias   = get_unaligned_le16(&buf[5]);1835	if (ds4->base.hdev->bus == BUS_USB) {1836		gyro_pitch_plus  = get_unaligned_le16(&buf[7]);1837		gyro_pitch_minus = get_unaligned_le16(&buf[9]);1838		gyro_yaw_plus    = get_unaligned_le16(&buf[11]);1839		gyro_yaw_minus   = get_unaligned_le16(&buf[13]);1840		gyro_roll_plus   = get_unaligned_le16(&buf[15]);1841		gyro_roll_minus  = get_unaligned_le16(&buf[17]);1842	} else {1843		/* BT + Dongle */1844		gyro_pitch_plus  = get_unaligned_le16(&buf[7]);1845		gyro_yaw_plus    = get_unaligned_le16(&buf[9]);1846		gyro_roll_plus   = get_unaligned_le16(&buf[11]);1847		gyro_pitch_minus = get_unaligned_le16(&buf[13]);1848		gyro_yaw_minus   = get_unaligned_le16(&buf[15]);1849		gyro_roll_minus  = get_unaligned_le16(&buf[17]);1850	}1851	gyro_speed_plus  = get_unaligned_le16(&buf[19]);1852	gyro_speed_minus = get_unaligned_le16(&buf[21]);1853	acc_x_plus       = get_unaligned_le16(&buf[23]);1854	acc_x_minus      = get_unaligned_le16(&buf[25]);1855	acc_y_plus       = get_unaligned_le16(&buf[27]);1856	acc_y_minus      = get_unaligned_le16(&buf[29]);1857	acc_z_plus       = get_unaligned_le16(&buf[31]);1858	acc_z_minus      = get_unaligned_le16(&buf[33]);1859 1860	/* Done parsing the buffer, so let's free it. */1861	kfree(buf);1862 1863	/*1864	 * Set gyroscope calibration and normalization parameters.1865	 * Data values will be normalized to 1/DS4_GYRO_RES_PER_DEG_S degree/s.1866	 */1867	speed_2x = (gyro_speed_plus + gyro_speed_minus);1868	ds4->gyro_calib_data[0].abs_code = ABS_RX;1869	ds4->gyro_calib_data[0].bias = 0;1870	ds4->gyro_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;1871	ds4->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) +1872			abs(gyro_pitch_minus - gyro_pitch_bias);1873 1874	ds4->gyro_calib_data[1].abs_code = ABS_RY;1875	ds4->gyro_calib_data[1].bias = 0;1876	ds4->gyro_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;1877	ds4->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) +1878			abs(gyro_yaw_minus - gyro_yaw_bias);1879 1880	ds4->gyro_calib_data[2].abs_code = ABS_RZ;1881	ds4->gyro_calib_data[2].bias = 0;1882	ds4->gyro_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;1883	ds4->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) +1884			abs(gyro_roll_minus - gyro_roll_bias);1885 1886	/*1887	 * Set accelerometer calibration and normalization parameters.1888	 * Data values will be normalized to 1/DS4_ACC_RES_PER_G g.1889	 */1890	range_2g = acc_x_plus - acc_x_minus;1891	ds4->accel_calib_data[0].abs_code = ABS_X;1892	ds4->accel_calib_data[0].bias = acc_x_plus - range_2g / 2;1893	ds4->accel_calib_data[0].sens_numer = 2*DS4_ACC_RES_PER_G;1894	ds4->accel_calib_data[0].sens_denom = range_2g;1895 1896	range_2g = acc_y_plus - acc_y_minus;1897	ds4->accel_calib_data[1].abs_code = ABS_Y;1898	ds4->accel_calib_data[1].bias = acc_y_plus - range_2g / 2;1899	ds4->accel_calib_data[1].sens_numer = 2*DS4_ACC_RES_PER_G;1900	ds4->accel_calib_data[1].sens_denom = range_2g;1901 1902	range_2g = acc_z_plus - acc_z_minus;1903	ds4->accel_calib_data[2].abs_code = ABS_Z;1904	ds4->accel_calib_data[2].bias = acc_z_plus - range_2g / 2;1905	ds4->accel_calib_data[2].sens_numer = 2*DS4_ACC_RES_PER_G;1906	ds4->accel_calib_data[2].sens_denom = range_2g;1907 1908transfer_failed:1909	/*1910	 * Sanity check gyro calibration data. This is needed to prevent crashes1911	 * during report handling of virtual, clone or broken devices not implementing1912	 * calibration data properly.1913	 */1914	for (i = 0; i < ARRAY_SIZE(ds4->gyro_calib_data); i++) {1915		if (ds4->gyro_calib_data[i].sens_denom == 0) {1916			ds4->gyro_calib_data[i].abs_code = ABS_RX + i;1917			hid_warn(hdev, "Invalid gyro calibration data for axis (%d), disabling calibration.",1918					ds4->gyro_calib_data[i].abs_code);1919			ds4->gyro_calib_data[i].bias = 0;1920			ds4->gyro_calib_data[i].sens_numer = DS4_GYRO_RANGE;1921			ds4->gyro_calib_data[i].sens_denom = S16_MAX;1922		}1923	}1924 1925	/*1926	 * Sanity check accelerometer calibration data. This is needed to prevent crashes1927	 * during report handling of virtual, clone or broken devices not implementing calibration1928	 * data properly.1929	 */1930	for (i = 0; i < ARRAY_SIZE(ds4->accel_calib_data); i++) {1931		if (ds4->accel_calib_data[i].sens_denom == 0) {1932			ds4->accel_calib_data[i].abs_code = ABS_X + i;1933			hid_warn(hdev, "Invalid accelerometer calibration data for axis (%d), disabling calibration.",1934					ds4->accel_calib_data[i].abs_code);1935			ds4->accel_calib_data[i].bias = 0;1936			ds4->accel_calib_data[i].sens_numer = DS4_ACC_RANGE;1937			ds4->accel_calib_data[i].sens_denom = S16_MAX;1938		}1939	}1940 1941	return ret;1942}1943 1944static int dualshock4_get_firmware_info(struct dualshock4 *ds4)1945{1946	uint8_t *buf;1947	int ret;1948 1949	buf = kzalloc(DS4_FEATURE_REPORT_FIRMWARE_INFO_SIZE, GFP_KERNEL);1950	if (!buf)1951		return -ENOMEM;1952 1953	/* Note USB and BT support the same feature report, but this report1954	 * lacks CRC support, so must be disabled in ps_get_report.1955	 */1956	ret = ps_get_report(ds4->base.hdev, DS4_FEATURE_REPORT_FIRMWARE_INFO, buf,1957			DS4_FEATURE_REPORT_FIRMWARE_INFO_SIZE, false);1958	if (ret) {1959		hid_err(ds4->base.hdev, "Failed to retrieve DualShock4 firmware info: %d\n", ret);1960		goto err_free;1961	}1962 1963	ds4->base.hw_version = get_unaligned_le16(&buf[35]);1964	ds4->base.fw_version = get_unaligned_le16(&buf[41]);1965 1966err_free:1967	kfree(buf);1968	return ret;1969}1970 1971static int dualshock4_get_mac_address(struct dualshock4 *ds4)1972{1973	struct hid_device *hdev = ds4->base.hdev;1974	uint8_t *buf;1975	int ret = 0;1976 1977	if (hdev->bus == BUS_USB) {1978		buf = kzalloc(DS4_FEATURE_REPORT_PAIRING_INFO_SIZE, GFP_KERNEL);1979		if (!buf)1980			return -ENOMEM;1981 1982		ret = ps_get_report(hdev, DS4_FEATURE_REPORT_PAIRING_INFO, buf,1983				DS4_FEATURE_REPORT_PAIRING_INFO_SIZE, false);1984		if (ret) {1985			hid_err(hdev, "Failed to retrieve DualShock4 pairing info: %d\n", ret);1986			goto err_free;1987		}1988 1989		memcpy(ds4->base.mac_address, &buf[1], sizeof(ds4->base.mac_address));1990	} else {1991		/* Rely on HIDP for Bluetooth */1992		if (strlen(hdev->uniq) != 17)1993			return -EINVAL;1994 1995		ret = sscanf(hdev->uniq, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",1996				&ds4->base.mac_address[5], &ds4->base.mac_address[4],1997				&ds4->base.mac_address[3], &ds4->base.mac_address[2],1998				&ds4->base.mac_address[1], &ds4->base.mac_address[0]);1999 2000		if (ret != sizeof(ds4->base.mac_address))2001			return -EINVAL;2002 2003		return 0;2004	}2005 2006err_free:2007	kfree(buf);2008	return ret;2009}2010 2011static enum led_brightness dualshock4_led_get_brightness(struct led_classdev *led)2012{2013	struct hid_device *hdev = to_hid_device(led->dev->parent);2014	struct dualshock4 *ds4 = hid_get_drvdata(hdev);2015	unsigned int led_index;2016 2017	led_index = led - ds4->lightbar_leds;2018	switch (led_index) {2019	case 0:2020		return ds4->lightbar_red;2021	case 1:2022		return ds4->lightbar_green;2023	case 2:2024		return ds4->lightbar_blue;2025	case 3:2026		return ds4->lightbar_enabled;2027	}2028 2029	return -1;2030}2031 2032static int dualshock4_led_set_blink(struct led_classdev *led, unsigned long *delay_on,2033		unsigned long *delay_off)2034{2035	struct hid_device *hdev = to_hid_device(led->dev->parent);2036	struct dualshock4 *ds4 = hid_get_drvdata(hdev);2037	unsigned long flags;2038 2039	spin_lock_irqsave(&ds4->base.lock, flags);2040 2041	if (!*delay_on && !*delay_off) {2042		/* Default to 1 Hz (50 centiseconds on, 50 centiseconds off). */2043		ds4->lightbar_blink_on = 50;2044		ds4->lightbar_blink_off = 50;2045	} else {2046		/* Blink delays in centiseconds. */2047		ds4->lightbar_blink_on = min_t(unsigned long, *delay_on/10, DS4_LIGHTBAR_MAX_BLINK);2048		ds4->lightbar_blink_off = min_t(unsigned long, *delay_off/10, DS4_LIGHTBAR_MAX_BLINK);2049	}2050 2051	ds4->update_lightbar_blink = true;2052 2053	spin_unlock_irqrestore(&ds4->base.lock, flags);2054 2055	dualshock4_schedule_work(ds4);2056 2057	/* Report scaled values back to LED subsystem */2058	*delay_on = ds4->lightbar_blink_on * 10;2059	*delay_off = ds4->lightbar_blink_off * 10;2060 2061	return 0;2062}2063 2064static int dualshock4_led_set_brightness(struct led_classdev *led, enum led_brightness value)2065{2066	struct hid_device *hdev = to_hid_device(led->dev->parent);2067	struct dualshock4 *ds4 = hid_get_drvdata(hdev);2068	unsigned long flags;2069	unsigned int led_index;2070 2071	spin_lock_irqsave(&ds4->base.lock, flags);2072 2073	led_index = led - ds4->lightbar_leds;2074	switch (led_index) {2075	case 0:2076		ds4->lightbar_red = value;2077		break;2078	case 1:2079		ds4->lightbar_green = value;2080		break;2081	case 2:2082		ds4->lightbar_blue = value;2083		break;2084	case 3:2085		ds4->lightbar_enabled = !!value;2086 2087		/* brightness = 0 also cancels blinking in Linux. */2088		if (!ds4->lightbar_enabled) {2089			ds4->lightbar_blink_off = 0;2090			ds4->lightbar_blink_on = 0;2091			ds4->update_lightbar_blink = true;2092		}2093	}2094 2095	ds4->update_lightbar = true;2096 2097	spin_unlock_irqrestore(&ds4->base.lock, flags);2098 2099	dualshock4_schedule_work(ds4);2100 2101	return 0;2102}2103 2104static void dualshock4_init_output_report(struct dualshock4 *ds4,2105		struct dualshock4_output_report *rp, void *buf)2106{2107	struct hid_device *hdev = ds4->base.hdev;2108 2109	if (hdev->bus == BUS_BLUETOOTH) {2110		struct dualshock4_output_report_bt *bt = buf;2111 2112		memset(bt, 0, sizeof(*bt));2113		bt->report_id = DS4_OUTPUT_REPORT_BT;2114 2115		rp->data = buf;2116		rp->len = sizeof(*bt);2117		rp->bt = bt;2118		rp->usb = NULL;2119		rp->common = &bt->common;2120	} else { /* USB */2121		struct dualshock4_output_report_usb *usb = buf;2122 2123		memset(usb, 0, sizeof(*usb));2124		usb->report_id = DS4_OUTPUT_REPORT_USB;2125 2126		rp->data = buf;2127		rp->len = sizeof(*usb);2128		rp->bt = NULL;2129		rp->usb = usb;2130		rp->common = &usb->common;2131	}2132}2133 2134static void dualshock4_output_worker(struct work_struct *work)2135{2136	struct dualshock4 *ds4 = container_of(work, struct dualshock4, output_worker);2137	struct dualshock4_output_report report;2138	struct dualshock4_output_report_common *common;2139	unsigned long flags;2140 2141	dualshock4_init_output_report(ds4, &report, ds4->output_report_dmabuf);2142	common = report.common;2143 2144	spin_lock_irqsave(&ds4->base.lock, flags);2145 2146	/*2147	 * Some 3rd party gamepads expect updates to rumble and lightbar2148	 * together, and setting one may cancel the other.2149	 *2150	 * Let's maximise compatibility by always sending rumble and lightbar2151	 * updates together, even when only one has been scheduled, resulting2152	 * in:2153	 *2154	 *   ds4->valid_flag0 >= 0x032155	 *2156	 * Hopefully this will maximise compatibility with third-party pads.2157	 *2158	 * Any further update bits, such as 0x04 for lightbar blinking, will2159	 * be or'd on top of this like before.2160	 */2161	if (ds4->update_rumble || ds4->update_lightbar) {2162		ds4->update_rumble = true; /* 0x01 */2163		ds4->update_lightbar = true; /* 0x02 */2164	}2165 2166	if (ds4->update_rumble) {2167		/* Select classic rumble style haptics and enable it. */2168		common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_MOTOR;2169		common->motor_left = ds4->motor_left;2170		common->motor_right = ds4->motor_right;2171		ds4->update_rumble = false;2172	}2173 2174	if (ds4->update_lightbar) {2175		common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_LED;2176		/* Comptabile behavior with hid-sony, which used a dummy global LED to2177		 * allow enabling/disabling the lightbar. The global LED maps to2178		 * lightbar_enabled.2179		 */2180		common->lightbar_red = ds4->lightbar_enabled ? ds4->lightbar_red : 0;2181		common->lightbar_green = ds4->lightbar_enabled ? ds4->lightbar_green : 0;2182		common->lightbar_blue = ds4->lightbar_enabled ? ds4->lightbar_blue : 0;2183		ds4->update_lightbar = false;2184	}2185 2186	if (ds4->update_lightbar_blink) {2187		common->valid_flag0 |= DS4_OUTPUT_VALID_FLAG0_LED_BLINK;2188		common->lightbar_blink_on = ds4->lightbar_blink_on;2189		common->lightbar_blink_off = ds4->lightbar_blink_off;2190		ds4->update_lightbar_blink = false;2191	}2192 2193	spin_unlock_irqrestore(&ds4->base.lock, flags);2194 2195	/* Bluetooth packets need additional flags as well as a CRC in the last 4 bytes. */2196	if (report.bt) {2197		uint32_t crc;2198		uint8_t seed = PS_OUTPUT_CRC32_SEED;2199 2200		/* Hardware control flags need to set to let the device know2201		 * there is HID data as well as CRC.2202		 */2203		report.bt->hw_control = DS4_OUTPUT_HWCTL_HID | DS4_OUTPUT_HWCTL_CRC32;2204 2205		if (ds4->update_bt_poll_interval) {2206			report.bt->hw_control |= ds4->bt_poll_interval;2207			ds4->update_bt_poll_interval = false;2208		}2209 2210		crc = crc32_le(0xFFFFFFFF, &seed, 1);2211		crc = ~crc32_le(crc, report.data, report.len - 4);2212 2213		report.bt->crc32 = cpu_to_le32(crc);2214	}2215 2216	hid_hw_output_report(ds4->base.hdev, report.data, report.len);2217}2218 2219static int dualshock4_parse_report(struct ps_device *ps_dev, struct hid_report *report,2220		u8 *data, int size)2221{2222	struct hid_device *hdev = ps_dev->hdev;2223	struct dualshock4 *ds4 = container_of(ps_dev, struct dualshock4, base);2224	struct dualshock4_input_report_common *ds4_report;2225	struct dualshock4_touch_report *touch_reports;2226	uint8_t battery_capacity, num_touch_reports, value;2227	int battery_status, i, j;2228	uint16_t sensor_timestamp;2229	unsigned long flags;2230	bool is_minimal = false;2231 2232	/*2233	 * DualShock4 in USB uses the full HID report for reportID 1, but2234	 * Bluetooth uses a minimal HID report for reportID 1 and reports2235	 * the full report using reportID 17.2236	 */2237	if (hdev->bus == BUS_USB && report->id == DS4_INPUT_REPORT_USB &&2238			size == DS4_INPUT_REPORT_USB_SIZE) {2239		struct dualshock4_input_report_usb *usb = (struct dualshock4_input_report_usb *)data;2240 2241		ds4_report = &usb->common;2242		num_touch_reports = usb->num_touch_reports;2243		touch_reports = usb->touch_reports;2244	} else if (hdev->bus == BUS_BLUETOOTH && report->id == DS4_INPUT_REPORT_BT &&2245			size == DS4_INPUT_REPORT_BT_SIZE) {2246		struct dualshock4_input_report_bt *bt = (struct dualshock4_input_report_bt *)data;2247		uint32_t report_crc = get_unaligned_le32(&bt->crc32);2248 2249		/* Last 4 bytes of input report contains CRC. */2250		if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) {2251			hid_err(hdev, "DualShock4 input CRC's check failed\n");2252			return -EILSEQ;2253		}2254 2255		ds4_report = &bt->common;2256		num_touch_reports = bt->num_touch_reports;2257		touch_reports = bt->touch_reports;2258	} else if (hdev->bus == BUS_BLUETOOTH &&2259		   report->id == DS4_INPUT_REPORT_BT_MINIMAL &&2260			 size == DS4_INPUT_REPORT_BT_MINIMAL_SIZE) {2261		/* Some third-party pads never switch to the full 0x11 report.2262		 * The short 0x01 report is 10 bytes long:2263		 *   u8 report_id == 0x012264		 *   u8 first_bytes_of_full_report[9]2265		 * So let's reuse the full report parser, and stop it after2266		 * parsing the buttons.2267		 */2268		ds4_report = (struct dualshock4_input_report_common *)&data[1];2269		is_minimal = true;2270	} else {2271		hid_err(hdev, "Unhandled reportID=%d\n", report->id);2272		return -1;2273	}2274 2275	input_report_abs(ds4->gamepad, ABS_X,  ds4_report->x);2276	input_report_abs(ds4->gamepad, ABS_Y,  ds4_report->y);2277	input_report_abs(ds4->gamepad, ABS_RX, ds4_report->rx);2278	input_report_abs(ds4->gamepad, ABS_RY, ds4_report->ry);2279	input_report_abs(ds4->gamepad, ABS_Z,  ds4_report->z);2280	input_report_abs(ds4->gamepad, ABS_RZ, ds4_report->rz);2281 2282	value = ds4_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH;2283	if (value >= ARRAY_SIZE(ps_gamepad_hat_mapping))2284		value = 8; /* center */2285	input_report_abs(ds4->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x);2286	input_report_abs(ds4->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y);2287 2288	input_report_key(ds4->gamepad, BTN_WEST,   ds4_report->buttons[0] & DS_BUTTONS0_SQUARE);2289	input_report_key(ds4->gamepad, BTN_SOUTH,  ds4_report->buttons[0] & DS_BUTTONS0_CROSS);2290	input_report_key(ds4->gamepad, BTN_EAST,   ds4_report->buttons[0] & DS_BUTTONS0_CIRCLE);2291	input_report_key(ds4->gamepad, BTN_NORTH,  ds4_report->buttons[0] & DS_BUTTONS0_TRIANGLE);2292	input_report_key(ds4->gamepad, BTN_TL,     ds4_report->buttons[1] & DS_BUTTONS1_L1);2293	input_report_key(ds4->gamepad, BTN_TR,     ds4_report->buttons[1] & DS_BUTTONS1_R1);2294	input_report_key(ds4->gamepad, BTN_TL2,    ds4_report->buttons[1] & DS_BUTTONS1_L2);2295	input_report_key(ds4->gamepad, BTN_TR2,    ds4_report->buttons[1] & DS_BUTTONS1_R2);2296	input_report_key(ds4->gamepad, BTN_SELECT, ds4_report->buttons[1] & DS_BUTTONS1_CREATE);2297	input_report_key(ds4->gamepad, BTN_START,  ds4_report->buttons[1] & DS_BUTTONS1_OPTIONS);2298	input_report_key(ds4->gamepad, BTN_THUMBL, ds4_report->buttons[1] & DS_BUTTONS1_L3);2299	input_report_key(ds4->gamepad, BTN_THUMBR, ds4_report->buttons[1] & DS_BUTTONS1_R3);2300	input_report_key(ds4->gamepad, BTN_MODE,   ds4_report->buttons[2] & DS_BUTTONS2_PS_HOME);2301	input_sync(ds4->gamepad);2302 2303	if (is_minimal)2304		return 0;2305 2306	/* Parse and calibrate gyroscope data. */2307	for (i = 0; i < ARRAY_SIZE(ds4_report->gyro); i++) {2308		int raw_data = (short)le16_to_cpu(ds4_report->gyro[i]);2309		int calib_data = mult_frac(ds4->gyro_calib_data[i].sens_numer,2310					   raw_data, ds4->gyro_calib_data[i].sens_denom);2311 2312		input_report_abs(ds4->sensors, ds4->gyro_calib_data[i].abs_code, calib_data);2313	}2314 2315	/* Parse and calibrate accelerometer data. */2316	for (i = 0; i < ARRAY_SIZE(ds4_report->accel); i++) {2317		int raw_data = (short)le16_to_cpu(ds4_report->accel[i]);2318		int calib_data = mult_frac(ds4->accel_calib_data[i].sens_numer,2319					   raw_data - ds4->accel_calib_data[i].bias,2320					   ds4->accel_calib_data[i].sens_denom);2321 2322		input_report_abs(ds4->sensors, ds4->accel_calib_data[i].abs_code, calib_data);2323	}2324 2325	/* Convert timestamp (in 5.33us unit) to timestamp_us */2326	sensor_timestamp = le16_to_cpu(ds4_report->sensor_timestamp);2327	if (!ds4->sensor_timestamp_initialized) {2328		ds4->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp*16, 3);2329		ds4->sensor_timestamp_initialized = true;2330	} else {2331		uint16_t delta;2332 2333		if (ds4->prev_sensor_timestamp > sensor_timestamp)2334			delta = (U16_MAX - ds4->prev_sensor_timestamp + sensor_timestamp + 1);2335		else2336			delta = sensor_timestamp - ds4->prev_sensor_timestamp;2337		ds4->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta*16, 3);2338	}2339	ds4->prev_sensor_timestamp = sensor_timestamp;2340	input_event(ds4->sensors, EV_MSC, MSC_TIMESTAMP, ds4->sensor_timestamp_us);2341	input_sync(ds4->sensors);2342 2343	for (i = 0; i < num_touch_reports; i++) {2344		struct dualshock4_touch_report *touch_report = &touch_reports[i];2345 2346		for (j = 0; j < ARRAY_SIZE(touch_report->points); j++) {2347			struct dualshock4_touch_point *point = &touch_report->points[j];2348			bool active = (point->contact & DS4_TOUCH_POINT_INACTIVE) ? false : true;2349 2350			input_mt_slot(ds4->touchpad, j);2351			input_mt_report_slot_state(ds4->touchpad, MT_TOOL_FINGER, active);2352 2353			if (active) {2354				int x = (point->x_hi << 8) | point->x_lo;2355				int y = (point->y_hi << 4) | point->y_lo;2356 2357				input_report_abs(ds4->touchpad, ABS_MT_POSITION_X, x);2358				input_report_abs(ds4->touchpad, ABS_MT_POSITION_Y, y);2359			}2360		}2361		input_mt_sync_frame(ds4->touchpad);2362		input_sync(ds4->touchpad);2363	}2364	input_report_key(ds4->touchpad, BTN_LEFT, ds4_report->buttons[2] & DS_BUTTONS2_TOUCHPAD);2365 2366	/*2367	 * Interpretation of the battery_capacity data depends on the cable state.2368	 * When no cable is connected (bit4 is 0):2369	 * - 0:10: percentage in units of 10%.2370	 * When a cable is plugged in:2371	 * - 0-10: percentage in units of 10%.2372	 * - 11: battery is full2373	 * - 14: not charging due to Voltage or temperature error2374	 * - 15: charge error2375	 */2376	if (ds4_report->status[0] & DS4_STATUS0_CABLE_STATE) {2377		uint8_t battery_data = ds4_report->status[0] & DS4_STATUS0_BATTERY_CAPACITY;2378 2379		if (battery_data < 10) {2380			/* Take the mid-point for each battery capacity value,2381			 * because on the hardware side 0 = 0-9%, 1=10-19%, etc.2382			 * This matches official platform behavior, which does2383			 * the same.2384			 */2385			battery_capacity = battery_data * 10 + 5;2386			battery_status = POWER_SUPPLY_STATUS_CHARGING;2387		} else if (battery_data == 10) {2388			battery_capacity = 100;2389			battery_status = POWER_SUPPLY_STATUS_CHARGING;2390		} else if (battery_data == DS4_BATTERY_STATUS_FULL) {2391			battery_capacity = 100;2392			battery_status = POWER_SUPPLY_STATUS_FULL;2393		} else { /* 14, 15 and undefined values */2394			battery_capacity = 0;2395			battery_status = POWER_SUPPLY_STATUS_UNKNOWN;2396		}2397	} else {2398		uint8_t battery_data = ds4_report->status[0] & DS4_STATUS0_BATTERY_CAPACITY;2399 2400		if (battery_data < 10)2401			battery_capacity = battery_data * 10 + 5;2402		else /* 10 */2403			battery_capacity = 100;2404 2405		battery_status = POWER_SUPPLY_STATUS_DISCHARGING;2406	}2407 2408	spin_lock_irqsave(&ps_dev->lock, flags);2409	ps_dev->battery_capacity = battery_capacity;2410	ps_dev->battery_status = battery_status;2411	spin_unlock_irqrestore(&ps_dev->lock, flags);2412 2413	return 0;2414}2415 2416static int dualshock4_dongle_parse_report(struct ps_device *ps_dev, struct hid_report *report,2417		u8 *data, int size)2418{2419	struct dualshock4 *ds4 = container_of(ps_dev, struct dualshock4, base);2420	bool connected = false;2421 2422	/* The dongle reports data using the main USB report (0x1) no matter whether a controller2423	 * is connected with mostly zeros. The report does contain dongle status, which we use to2424	 * determine if a controller is connected and if so we forward to the regular DualShock42425	 * parsing code.2426	 */2427	if (data[0] == DS4_INPUT_REPORT_USB && size == DS4_INPUT_REPORT_USB_SIZE) {2428		struct dualshock4_input_report_common *ds4_report = (struct dualshock4_input_report_common *)&data[1];2429		unsigned long flags;2430 2431		connected = ds4_report->status[1] & DS4_STATUS1_DONGLE_STATE ? false : true;2432 2433		if (ds4->dongle_state == DONGLE_DISCONNECTED && connected) {2434			hid_info(ps_dev->hdev, "DualShock 4 USB dongle: controller connected\n");2435 2436			dualshock4_set_default_lightbar_colors(ds4);2437 2438			spin_lock_irqsave(&ps_dev->lock, flags);2439			ds4->dongle_state = DONGLE_CALIBRATING;2440			spin_unlock_irqrestore(&ps_dev->lock, flags);2441 2442			schedule_work(&ds4->dongle_hotplug_worker);2443 2444			/* Don't process the report since we don't have2445			 * calibration data, but let hidraw have it anyway.2446			 */2447			return 0;2448		} else if ((ds4->dongle_state == DONGLE_CONNECTED ||2449			    ds4->dongle_state == DONGLE_DISABLED) && !connected) {2450			hid_info(ps_dev->hdev, "DualShock 4 USB dongle: controller disconnected\n");2451 2452			spin_lock_irqsave(&ps_dev->lock, flags);2453			ds4->dongle_state = DONGLE_DISCONNECTED;2454			spin_unlock_irqrestore(&ps_dev->lock, flags);2455 2456			/* Return 0, so hidraw can get the report. */2457			return 0;2458		} else if (ds4->dongle_state == DONGLE_CALIBRATING ||2459			   ds4->dongle_state == DONGLE_DISABLED ||2460			   ds4->dongle_state == DONGLE_DISCONNECTED) {2461			/* Return 0, so hidraw can get the report. */2462			return 0;2463		}2464	}2465 2466	if (connected)2467		return dualshock4_parse_report(ps_dev, report, data, size);2468 2469	return 0;2470}2471 2472static int dualshock4_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect)2473{2474	struct hid_device *hdev = input_get_drvdata(dev);2475	struct dualshock4 *ds4 = hid_get_drvdata(hdev);2476	unsigned long flags;2477 2478	if (effect->type != FF_RUMBLE)2479		return 0;2480 2481	spin_lock_irqsave(&ds4->base.lock, flags);2482	ds4->update_rumble = true;2483	ds4->motor_left = effect->u.rumble.strong_magnitude / 256;2484	ds4->motor_right = effect->u.rumble.weak_magnitude / 256;2485	spin_unlock_irqrestore(&ds4->base.lock, flags);2486 2487	dualshock4_schedule_work(ds4);2488	return 0;2489}2490 2491static void dualshock4_remove(struct ps_device *ps_dev)2492{2493	struct dualshock4 *ds4 = container_of(ps_dev, struct dualshock4, base);2494	unsigned long flags;2495 2496	spin_lock_irqsave(&ds4->base.lock, flags);2497	ds4->output_worker_initialized = false;2498	spin_unlock_irqrestore(&ds4->base.lock, flags);2499 2500	cancel_work_sync(&ds4->output_worker);2501 2502	if (ps_dev->hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE)2503		cancel_work_sync(&ds4->dongle_hotplug_worker);2504}2505 2506static inline void dualshock4_schedule_work(struct dualshock4 *ds4)2507{2508	unsigned long flags;2509 2510	spin_lock_irqsave(&ds4->base.lock, flags);2511	if (ds4->output_worker_initialized)2512		schedule_work(&ds4->output_worker);2513	spin_unlock_irqrestore(&ds4->base.lock, flags);2514}2515 2516static void dualshock4_set_bt_poll_interval(struct dualshock4 *ds4, uint8_t interval)2517{2518	ds4->bt_poll_interval = interval;2519	ds4->update_bt_poll_interval = true;2520	dualshock4_schedule_work(ds4);2521}2522 2523/* Set default lightbar color based on player. */2524static void dualshock4_set_default_lightbar_colors(struct dualshock4 *ds4)2525{2526	/* Use same player colors as PlayStation 4.2527	 * Array of colors is in RGB.2528	 */2529	static const int player_colors[4][3] = {2530		{ 0x00, 0x00, 0x40 }, /* Blue */2531		{ 0x40, 0x00, 0x00 }, /* Red */2532		{ 0x00, 0x40, 0x00 }, /* Green */2533		{ 0x20, 0x00, 0x20 }  /* Pink */2534	};2535 2536	uint8_t player_id = ds4->base.player_id % ARRAY_SIZE(player_colors);2537 2538	ds4->lightbar_enabled = true;2539	ds4->lightbar_red = player_colors[player_id][0];2540	ds4->lightbar_green = player_colors[player_id][1];2541	ds4->lightbar_blue = player_colors[player_id][2];2542 2543	ds4->update_lightbar = true;2544	dualshock4_schedule_work(ds4);2545}2546 2547static struct ps_device *dualshock4_create(struct hid_device *hdev)2548{2549	struct dualshock4 *ds4;2550	struct ps_device *ps_dev;2551	uint8_t max_output_report_size;2552	int i, ret;2553 2554	/* The DualShock4 has an RGB lightbar, which the original hid-sony driver2555	 * exposed as a set of 4 LEDs for the 3 color channels and a global control.2556	 * Ideally this should have used the multi-color LED class, which didn't exist2557	 * yet. In addition the driver used a naming scheme not compliant with the LED2558	 * naming spec by using "<mac_address>:<color>", which contained many colons.2559	 * We use a more compliant by using "<device_name>:<color>" name now. Ideally2560	 * would have been "<device_name>:<color>:indicator", but that would break2561	 * existing applications (e.g. Android). Nothing matches against MAC address.2562	 */2563	static const struct ps_led_info lightbar_leds_info[] = {2564		{ NULL, "red", 255, dualshock4_led_get_brightness, dualshock4_led_set_brightness },2565		{ NULL, "green", 255, dualshock4_led_get_brightness, dualshock4_led_set_brightness },2566		{ NULL, "blue", 255, dualshock4_led_get_brightness, dualshock4_led_set_brightness },2567		{ NULL, "global", 1, dualshock4_led_get_brightness, dualshock4_led_set_brightness,2568				dualshock4_led_set_blink },2569	};2570 2571	ds4 = devm_kzalloc(&hdev->dev, sizeof(*ds4), GFP_KERNEL);2572	if (!ds4)2573		return ERR_PTR(-ENOMEM);2574 2575	/*2576	 * Patch version to allow userspace to distinguish between2577	 * hid-generic vs hid-playstation axis and button mapping.2578	 */2579	hdev->version |= HID_PLAYSTATION_VERSION_PATCH;2580 2581	ps_dev = &ds4->base;2582	ps_dev->hdev = hdev;2583	spin_lock_init(&ps_dev->lock);2584	ps_dev->battery_capacity = 100; /* initial value until parse_report. */2585	ps_dev->battery_status = POWER_SUPPLY_STATUS_UNKNOWN;2586	ps_dev->parse_report = dualshock4_parse_report;2587	ps_dev->remove = dualshock4_remove;2588	INIT_WORK(&ds4->output_worker, dualshock4_output_worker);2589	ds4->output_worker_initialized = true;2590	hid_set_drvdata(hdev, ds4);2591 2592	max_output_report_size = sizeof(struct dualshock4_output_report_bt);2593	ds4->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL);2594	if (!ds4->output_report_dmabuf)2595		return ERR_PTR(-ENOMEM);2596 2597	if (hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) {2598		ds4->dongle_state = DONGLE_DISCONNECTED;2599		INIT_WORK(&ds4->dongle_hotplug_worker, dualshock4_dongle_calibration_work);2600 2601		/* Override parse report for dongle specific hotplug handling. */2602		ps_dev->parse_report = dualshock4_dongle_parse_report;2603	}2604 2605	ret = dualshock4_get_mac_address(ds4);2606	if (ret) {2607		hid_err(hdev, "Failed to get MAC address from DualShock4\n");2608		return ERR_PTR(ret);2609	}2610	snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds4->base.mac_address);2611 2612	ret = dualshock4_get_firmware_info(ds4);2613	if (ret) {2614		hid_warn(hdev, "Failed to get firmware info from DualShock4\n");2615		hid_warn(hdev, "HW/FW version data in sysfs will be invalid.\n");2616	}2617 2618	ret = ps_devices_list_add(ps_dev);2619	if (ret)2620		return ERR_PTR(ret);2621 2622	ret = dualshock4_get_calibration_data(ds4);2623	if (ret) {2624		hid_warn(hdev, "Failed to get calibration data from DualShock4\n");2625		hid_warn(hdev, "Gyroscope and accelerometer will be inaccurate.\n");2626	}2627 2628	ds4->gamepad = ps_gamepad_create(hdev, dualshock4_play_effect);2629	if (IS_ERR(ds4->gamepad)) {2630		ret = PTR_ERR(ds4->gamepad);2631		goto err;2632	}2633 2634	/* Use gamepad input device name as primary device name for e.g. LEDs */2635	ps_dev->input_dev_name = dev_name(&ds4->gamepad->dev);2636 2637	ds4->sensors = ps_sensors_create(hdev, DS4_ACC_RANGE, DS4_ACC_RES_PER_G,2638			DS4_GYRO_RANGE, DS4_GYRO_RES_PER_DEG_S);2639	if (IS_ERR(ds4->sensors)) {2640		ret = PTR_ERR(ds4->sensors);2641		goto err;2642	}2643 2644	ds4->touchpad = ps_touchpad_create(hdev, DS4_TOUCHPAD_WIDTH, DS4_TOUCHPAD_HEIGHT, 2);2645	if (IS_ERR(ds4->touchpad)) {2646		ret = PTR_ERR(ds4->touchpad);2647		goto err;2648	}2649 2650	ret = ps_device_register_battery(ps_dev);2651	if (ret)2652		goto err;2653 2654	for (i = 0; i < ARRAY_SIZE(lightbar_leds_info); i++) {2655		const struct ps_led_info *led_info = &lightbar_leds_info[i];2656 2657		ret = ps_led_register(ps_dev, &ds4->lightbar_leds[i], led_info);2658		if (ret < 0)2659			goto err;2660	}2661 2662	dualshock4_set_bt_poll_interval(ds4, DS4_BT_DEFAULT_POLL_INTERVAL_MS);2663 2664	ret = ps_device_set_player_id(ps_dev);2665	if (ret) {2666		hid_err(hdev, "Failed to assign player id for DualShock4: %d\n", ret);2667		goto err;2668	}2669 2670	dualshock4_set_default_lightbar_colors(ds4);2671 2672	/*2673	 * Reporting hardware and firmware is important as there are frequent updates, which2674	 * can change behavior.2675	 */2676	hid_info(hdev, "Registered DualShock4 controller hw_version=0x%08x fw_version=0x%08x\n",2677			ds4->base.hw_version, ds4->base.fw_version);2678	return &ds4->base;2679 2680err:2681	ps_devices_list_remove(ps_dev);2682	return ERR_PTR(ret);2683}2684 2685static int ps_raw_event(struct hid_device *hdev, struct hid_report *report,2686		u8 *data, int size)2687{2688	struct ps_device *dev = hid_get_drvdata(hdev);2689 2690	if (dev && dev->parse_report)2691		return dev->parse_report(dev, report, data, size);2692 2693	return 0;2694}2695 2696static int ps_probe(struct hid_device *hdev, const struct hid_device_id *id)2697{2698	struct ps_device *dev;2699	int ret;2700 2701	ret = hid_parse(hdev);2702	if (ret) {2703		hid_err(hdev, "Parse failed\n");2704		return ret;2705	}2706 2707	ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);2708	if (ret) {2709		hid_err(hdev, "Failed to start HID device\n");2710		return ret;2711	}2712 2713	ret = hid_hw_open(hdev);2714	if (ret) {2715		hid_err(hdev, "Failed to open HID device\n");2716		goto err_stop;2717	}2718 2719	if (id->driver_data == PS_TYPE_PS4_DUALSHOCK4) {2720		dev = dualshock4_create(hdev);2721		if (IS_ERR(dev)) {2722			hid_err(hdev, "Failed to create dualshock4.\n");2723			ret = PTR_ERR(dev);2724			goto err_close;2725		}2726	} else if (id->driver_data == PS_TYPE_PS5_DUALSENSE) {2727		dev = dualsense_create(hdev);2728		if (IS_ERR(dev)) {2729			hid_err(hdev, "Failed to create dualsense.\n");2730			ret = PTR_ERR(dev);2731			goto err_close;2732		}2733	}2734 2735	return ret;2736 2737err_close:2738	hid_hw_close(hdev);2739err_stop:2740	hid_hw_stop(hdev);2741	return ret;2742}2743 2744static void ps_remove(struct hid_device *hdev)2745{2746	struct ps_device *dev = hid_get_drvdata(hdev);2747 2748	ps_devices_list_remove(dev);2749	ps_device_release_player_id(dev);2750 2751	if (dev->remove)2752		dev->remove(dev);2753 2754	hid_hw_close(hdev);2755	hid_hw_stop(hdev);2756}2757 2758static const struct hid_device_id ps_devices[] = {2759	/* Sony DualShock 4 controllers for PS4 */2760	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),2761		.driver_data = PS_TYPE_PS4_DUALSHOCK4 },2762	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),2763		.driver_data = PS_TYPE_PS4_DUALSHOCK4 },2764	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),2765		.driver_data = PS_TYPE_PS4_DUALSHOCK4 },2766	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),2767		.driver_data = PS_TYPE_PS4_DUALSHOCK4 },2768	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE),2769		.driver_data = PS_TYPE_PS4_DUALSHOCK4 },2770 2771	/* Sony DualSense controllers for PS5 */2772	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER),2773		.driver_data = PS_TYPE_PS5_DUALSENSE },2774	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER),2775		.driver_data = PS_TYPE_PS5_DUALSENSE },2776	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER_2),2777		.driver_data = PS_TYPE_PS5_DUALSENSE },2778	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER_2),2779		.driver_data = PS_TYPE_PS5_DUALSENSE },2780	{ }2781};2782MODULE_DEVICE_TABLE(hid, ps_devices);2783 2784static struct hid_driver ps_driver = {2785	.name		= "playstation",2786	.id_table	= ps_devices,2787	.probe		= ps_probe,2788	.remove		= ps_remove,2789	.raw_event	= ps_raw_event,2790	.driver = {2791		.dev_groups = ps_device_groups,2792	},2793};2794 2795static int __init ps_init(void)2796{2797	return hid_register_driver(&ps_driver);2798}2799 2800static void __exit ps_exit(void)2801{2802	hid_unregister_driver(&ps_driver);2803	ida_destroy(&ps_player_id_allocator);2804}2805 2806module_init(ps_init);2807module_exit(ps_exit);2808 2809MODULE_AUTHOR("Sony Interactive Entertainment");2810MODULE_DESCRIPTION("HID Driver for PlayStation peripherals.");2811MODULE_LICENSE("GPL");2812