From 49f7c3f3114c1a636199fbbb37b6163481ca8ff9 Mon Sep 17 00:00:00 2001
From: hmz007 <hmz007@gmail.com>
Date: Wed, 20 Dec 2023 20:39:15 +0800
Subject: [PATCH] [kernel] merge commit '36912bf8a9..9e14601fd4'

Signed-off-by: hmz007 <hmz007@gmail.com>
Change-Id: I52280b3dc666469ad2a47f256c69b4ac62f14668
---
 .../arm64/configs/nanopi5_android_defconfig   |  1 +
 .../arm64/configs/nanopi5_linux_defconfig     |  2 ++
 .../arm64/configs/nanopi6_android_defconfig   |  1 +
 .../arm64/configs/nanopi6_linux_defconfig     |  2 ++
 kernel-5.10/drivers/hid/hid-playstation.c     | 32 +++++++++++++++++++
 5 files changed, 38 insertions(+)

diff --git a/kernel-5.10/arch/arm64/configs/nanopi5_android_defconfig b/kernel-5.10/arch/arm64/configs/nanopi5_android_defconfig
index 9a4bd59cc7a..7c0b1dbd365 100644
--- a/kernel-5.10/arch/arm64/configs/nanopi5_android_defconfig
+++ b/kernel-5.10/arch/arm64/configs/nanopi5_android_defconfig
@@ -753,6 +753,7 @@ CONFIG_MMC_SDHCI_OF_DWCMSHC=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_LEDS_CLASS_FLASH=y
+CONFIG_LEDS_CLASS_MULTICOLOR=y
 CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_TRIGGER_TIMER=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
diff --git a/kernel-5.10/arch/arm64/configs/nanopi5_linux_defconfig b/kernel-5.10/arch/arm64/configs/nanopi5_linux_defconfig
index 01de1ccc36f..6a21e4a7ff5 100644
--- a/kernel-5.10/arch/arm64/configs/nanopi5_linux_defconfig
+++ b/kernel-5.10/arch/arm64/configs/nanopi5_linux_defconfig
@@ -1434,6 +1434,7 @@ CONFIG_USB_CONFIGFS_F_FS=y
 CONFIG_USB_CONFIGFS_F_ACC=y
 CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
 CONFIG_USB_CONFIGFS_F_MIDI=y
+CONFIG_USB_CONFIGFS_F_HID=y
 CONFIG_USB_CONFIGFS_F_UVC=y
 CONFIG_TYPEC_TCPM=y
 CONFIG_TYPEC_TCPCI=y
@@ -1451,6 +1452,7 @@ CONFIG_MMC_SDHCI_OF_DWCMSHC=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_LEDS_CLASS_FLASH=m
+CONFIG_LEDS_CLASS_MULTICOLOR=y
 CONFIG_LEDS_PCA9532=m
 CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_PCA955X=m
diff --git a/kernel-5.10/arch/arm64/configs/nanopi6_android_defconfig b/kernel-5.10/arch/arm64/configs/nanopi6_android_defconfig
index 1def89f5189..afe2723f810 100644
--- a/kernel-5.10/arch/arm64/configs/nanopi6_android_defconfig
+++ b/kernel-5.10/arch/arm64/configs/nanopi6_android_defconfig
@@ -758,6 +758,7 @@ CONFIG_MMC_SDHCI_OF_DWCMSHC=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_LEDS_CLASS_FLASH=y
+CONFIG_LEDS_CLASS_MULTICOLOR=y
 CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_TRIGGER_TIMER=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
diff --git a/kernel-5.10/arch/arm64/configs/nanopi6_linux_defconfig b/kernel-5.10/arch/arm64/configs/nanopi6_linux_defconfig
index cb11848eab8..8c11bc88473 100644
--- a/kernel-5.10/arch/arm64/configs/nanopi6_linux_defconfig
+++ b/kernel-5.10/arch/arm64/configs/nanopi6_linux_defconfig
@@ -1436,6 +1436,7 @@ CONFIG_USB_CONFIGFS_F_FS=y
 CONFIG_USB_CONFIGFS_F_ACC=y
 CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
 CONFIG_USB_CONFIGFS_F_MIDI=y
+CONFIG_USB_CONFIGFS_F_HID=y
 CONFIG_USB_CONFIGFS_F_UVC=y
 CONFIG_TYPEC_TCPM=y
 CONFIG_TYPEC_TCPCI=y
@@ -1453,6 +1454,7 @@ CONFIG_MMC_SDHCI_OF_DWCMSHC=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_LEDS_CLASS_FLASH=m
+CONFIG_LEDS_CLASS_MULTICOLOR=y
 CONFIG_LEDS_PCA9532=m
 CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_PCA955X=m
diff --git a/kernel-5.10/drivers/hid/hid-playstation.c b/kernel-5.10/drivers/hid/hid-playstation.c
index 0b58763bfd3..2228f6e4ba2 100644
--- a/kernel-5.10/drivers/hid/hid-playstation.c
+++ b/kernel-5.10/drivers/hid/hid-playstation.c
@@ -712,6 +712,7 @@ ATTRIBUTE_GROUPS(ps_device);
 
 static int dualsense_get_calibration_data(struct dualsense *ds)
 {
+	struct hid_device *hdev = ds->base.hdev;
 	short gyro_pitch_bias, gyro_pitch_plus, gyro_pitch_minus;
 	short gyro_yaw_bias, gyro_yaw_plus, gyro_yaw_minus;
 	short gyro_roll_bias, gyro_roll_plus, gyro_roll_minus;
@@ -722,6 +723,7 @@ static int dualsense_get_calibration_data(struct dualsense *ds)
 	int speed_2x;
 	int range_2g;
 	int ret = 0;
+	int i;
 	uint8_t *buf;
 
 	buf = kzalloc(DS_FEATURE_REPORT_CALIBRATION_SIZE, GFP_KERNEL);
@@ -773,6 +775,21 @@ static int dualsense_get_calibration_data(struct dualsense *ds)
 	ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
 	ds->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
 
+	/*
+	 * Sanity check gyro calibration data. This is needed to prevent crashes
+	 * during report handling of virtual, clone or broken devices not implementing
+	 * calibration data properly.
+	 */
+	for (i = 0; i < ARRAY_SIZE(ds->gyro_calib_data); i++) {
+		if (ds->gyro_calib_data[i].sens_denom == 0) {
+			hid_warn(hdev, "Invalid gyro calibration data for axis (%d), disabling calibration.",
+					ds->gyro_calib_data[i].abs_code);
+			ds->gyro_calib_data[i].bias = 0;
+			ds->gyro_calib_data[i].sens_numer = DS_GYRO_RANGE;
+			ds->gyro_calib_data[i].sens_denom = S16_MAX;
+		}
+	}
+
 	/*
 	 * Set accelerometer calibration and normalization parameters.
 	 * Data values will be normalized to 1/DS_ACC_RES_PER_G g.
@@ -795,6 +812,21 @@ static int dualsense_get_calibration_data(struct dualsense *ds)
 	ds->accel_calib_data[2].sens_numer = 2*DS_ACC_RES_PER_G;
 	ds->accel_calib_data[2].sens_denom = range_2g;
 
+	/*
+	 * Sanity check accelerometer calibration data. This is needed to prevent crashes
+	 * during report handling of virtual, clone or broken devices not implementing calibration
+	 * data properly.
+	 */
+	for (i = 0; i < ARRAY_SIZE(ds->accel_calib_data); i++) {
+		if (ds->accel_calib_data[i].sens_denom == 0) {
+			hid_warn(hdev, "Invalid accelerometer calibration data for axis (%d), disabling calibration.",
+					ds->accel_calib_data[i].abs_code);
+			ds->accel_calib_data[i].bias = 0;
+			ds->accel_calib_data[i].sens_numer = DS_ACC_RANGE;
+			ds->accel_calib_data[i].sens_denom = S16_MAX;
+		}
+	}
+
 err_free:
 	kfree(buf);
 	return ret;