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;