Merge branch 'for-6.3/sony' into for-linus
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Wed, 22 Feb 2023 09:40:03 +0000 (10:40 +0100)
committerBenjamin Tissoires <benjamin.tissoires@redhat.com>
Wed, 22 Feb 2023 09:40:03 +0000 (10:40 +0100)
- enforce DS4 controllers to use hid-playstation (Roderick Colenbrander)
- various hid-playstation gyro fixes (Roderick Colenbrander)

1  2 
drivers/hid/hid-playstation.c

index 27c40894acab40252da8f917b27902791ec6d176,873090f484c545339f49ad32bc6130180e886610..8ac8f7b8e317302c940f2d1a9f9953599a7dfadb
@@@ -993,35 -991,23 +993,38 @@@ static int dualsense_get_calibration_da
         */
        speed_2x = (gyro_speed_plus + gyro_speed_minus);
        ds->gyro_calib_data[0].abs_code = ABS_RX;
-       ds->gyro_calib_data[0].bias = gyro_pitch_bias;
+       ds->gyro_calib_data[0].bias = 0;
        ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
-       ds->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
+       ds->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) +
+                       abs(gyro_pitch_minus - gyro_pitch_bias);
  
        ds->gyro_calib_data[1].abs_code = ABS_RY;
-       ds->gyro_calib_data[1].bias = gyro_yaw_bias;
+       ds->gyro_calib_data[1].bias = 0;
        ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S;
-       ds->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
+       ds->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) +
+                       abs(gyro_yaw_minus - gyro_yaw_bias);
  
        ds->gyro_calib_data[2].abs_code = ABS_RZ;
-       ds->gyro_calib_data[2].bias = gyro_roll_bias;
+       ds->gyro_calib_data[2].bias = 0;
        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;
+       ds->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) +
+                       abs(gyro_roll_minus - gyro_roll_bias);
  
 +      /*
 +       * 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.
@@@ -1849,35 -1817,23 +1850,38 @@@ static int dualshock4_get_calibration_d
         */
        speed_2x = (gyro_speed_plus + gyro_speed_minus);
        ds4->gyro_calib_data[0].abs_code = ABS_RX;
-       ds4->gyro_calib_data[0].bias = gyro_pitch_bias;
+       ds4->gyro_calib_data[0].bias = 0;
        ds4->gyro_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
-       ds4->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus;
+       ds4->gyro_calib_data[0].sens_denom = abs(gyro_pitch_plus - gyro_pitch_bias) +
+                       abs(gyro_pitch_minus - gyro_pitch_bias);
  
        ds4->gyro_calib_data[1].abs_code = ABS_RY;
-       ds4->gyro_calib_data[1].bias = gyro_yaw_bias;
+       ds4->gyro_calib_data[1].bias = 0;
        ds4->gyro_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
-       ds4->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus;
+       ds4->gyro_calib_data[1].sens_denom = abs(gyro_yaw_plus - gyro_yaw_bias) +
+                       abs(gyro_yaw_minus - gyro_yaw_bias);
  
        ds4->gyro_calib_data[2].abs_code = ABS_RZ;
-       ds4->gyro_calib_data[2].bias = gyro_roll_bias;
+       ds4->gyro_calib_data[2].bias = 0;
        ds4->gyro_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S;
-       ds4->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus;
+       ds4->gyro_calib_data[2].sens_denom = abs(gyro_roll_plus - gyro_roll_bias) +
+                       abs(gyro_roll_minus - gyro_roll_bias);
  
 +      /*
 +       * 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(ds4->gyro_calib_data); i++) {
 +              if (ds4->gyro_calib_data[i].sens_denom == 0) {
 +                      hid_warn(hdev, "Invalid gyro calibration data for axis (%d), disabling calibration.",
 +                                      ds4->gyro_calib_data[i].abs_code);
 +                      ds4->gyro_calib_data[i].bias = 0;
 +                      ds4->gyro_calib_data[i].sens_numer = DS4_GYRO_RANGE;
 +                      ds4->gyro_calib_data[i].sens_denom = S16_MAX;
 +              }
 +      }
 +
        /*
         * Set accelerometer calibration and normalization parameters.
         * Data values will be normalized to 1/DS4_ACC_RES_PER_G g.