Lines Matching refs:sc
576 static void sony_set_leds(struct sony_sc *sc);
578 static inline void sony_schedule_work(struct sony_sc *sc, in sony_schedule_work() argument
585 spin_lock_irqsave(&sc->lock, flags); in sony_schedule_work()
586 if (!sc->defer_initialization && sc->state_worker_initialized) in sony_schedule_work()
587 schedule_work(&sc->state_worker); in sony_schedule_work()
588 spin_unlock_irqrestore(&sc->lock, flags); in sony_schedule_work()
591 if (sc->hotplug_worker_initialized) in sony_schedule_work()
592 schedule_work(&sc->hotplug_worker); in sony_schedule_work()
602 struct sony_sc *sc = hid_get_drvdata(hdev); in ds4_show_poll_interval() local
604 return snprintf(buf, PAGE_SIZE, "%i\n", sc->ds4_bt_poll_interval); in ds4_show_poll_interval()
612 struct sony_sc *sc = hid_get_drvdata(hdev); in ds4_store_poll_interval() local
622 spin_lock_irqsave(&sc->lock, flags); in ds4_store_poll_interval()
623 sc->ds4_bt_poll_interval = interval; in ds4_store_poll_interval()
624 spin_unlock_irqrestore(&sc->lock, flags); in ds4_store_poll_interval()
626 sony_schedule_work(sc, SONY_WORKER_STATE); in ds4_store_poll_interval()
813 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_report_fixup() local
815 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT)) in sony_report_fixup()
822 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 && in sony_report_fixup()
834 if (sc->quirks & MOTION_CONTROLLER) in sony_report_fixup()
837 if (sc->quirks & PS3REMOTE) in sony_report_fixup()
843 static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size) in sixaxis_parse_report() argument
856 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30; in sixaxis_parse_report()
869 spin_lock_irqsave(&sc->lock, flags); in sixaxis_parse_report()
870 sc->cable_state = cable_state; in sixaxis_parse_report()
871 sc->battery_capacity = battery_capacity; in sixaxis_parse_report()
872 sc->battery_charging = battery_charging; in sixaxis_parse_report()
873 spin_unlock_irqrestore(&sc->lock, flags); in sixaxis_parse_report()
875 if (sc->quirks & SIXAXIS_CONTROLLER) { in sixaxis_parse_report()
880 input_report_abs(sc->sensor_dev, ABS_X, val); in sixaxis_parse_report()
884 input_report_abs(sc->sensor_dev, ABS_Y, val); in sixaxis_parse_report()
887 input_report_abs(sc->sensor_dev, ABS_Z, val); in sixaxis_parse_report()
889 input_sync(sc->sensor_dev); in sixaxis_parse_report()
893 static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size) in dualshock4_parse_report() argument
895 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, in dualshock4_parse_report()
904 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 2 : 0; in dualshock4_parse_report()
908 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2); in dualshock4_parse_report()
964 if (!sc->timestamp_initialized) { in dualshock4_parse_report()
965 sc->timestamp_us = ((unsigned int)timestamp * 16) / 3; in dualshock4_parse_report()
966 sc->timestamp_initialized = true; in dualshock4_parse_report()
970 if (sc->prev_timestamp > timestamp) in dualshock4_parse_report()
971 delta = (U16_MAX - sc->prev_timestamp + timestamp + 1); in dualshock4_parse_report()
973 delta = timestamp - sc->prev_timestamp; in dualshock4_parse_report()
974 sc->timestamp_us += (delta * 16) / 3; in dualshock4_parse_report()
976 sc->prev_timestamp = timestamp; in dualshock4_parse_report()
977 input_event(sc->sensor_dev, EV_MSC, MSC_TIMESTAMP, sc->timestamp_us); in dualshock4_parse_report()
983 struct ds4_calibration_data *calib = &sc->ds4_calib_data[n]; in dualshock4_parse_report()
994 input_report_abs(sc->sensor_dev, calib->abs_code, calib_data); in dualshock4_parse_report()
997 input_sync(sc->sensor_dev); in dualshock4_parse_report()
1024 spin_lock_irqsave(&sc->lock, flags); in dualshock4_parse_report()
1025 sc->cable_state = cable_state; in dualshock4_parse_report()
1026 sc->battery_capacity = battery_capacity; in dualshock4_parse_report()
1027 sc->battery_charging = battery_charging; in dualshock4_parse_report()
1028 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_parse_report()
1037 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 4 : 3; in dualshock4_parse_report()
1064 input_mt_slot(sc->touchpad, n); in dualshock4_parse_report()
1065 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active); in dualshock4_parse_report()
1068 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x); in dualshock4_parse_report()
1069 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y); in dualshock4_parse_report()
1074 input_mt_sync_frame(sc->touchpad); in dualshock4_parse_report()
1075 input_sync(sc->touchpad); in dualshock4_parse_report()
1082 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_raw_event() local
1088 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1105 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1106 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1107 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1108 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 && in sony_raw_event()
1110 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1111 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 && in sony_raw_event()
1113 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1114 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && rd[0] == 0x11 && in sony_raw_event()
1125 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n", in sony_raw_event()
1130 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1131 } else if ((sc->quirks & DUALSHOCK4_DONGLE) && rd[0] == 0x01 && in sony_raw_event()
1143 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1144 dongle_state = sc->ds4_dongle_state; in sony_raw_event()
1145 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1156 hid_info(sc->hdev, "DualShock 4 USB dongle: controller connected\n"); in sony_raw_event()
1157 sony_set_leds(sc); in sony_raw_event()
1159 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1160 sc->ds4_dongle_state = DONGLE_CALIBRATING; in sony_raw_event()
1161 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1163 sony_schedule_work(sc, SONY_WORKER_HOTPLUG); in sony_raw_event()
1171 hid_info(sc->hdev, "DualShock 4 USB dongle: controller disconnected\n"); in sony_raw_event()
1173 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1174 sc->ds4_dongle_state = DONGLE_DISCONNECTED; in sony_raw_event()
1175 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1186 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1189 if (sc->defer_initialization) { in sony_raw_event()
1190 sc->defer_initialization = 0; in sony_raw_event()
1191 sony_schedule_work(sc, SONY_WORKER_STATE); in sony_raw_event()
1201 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_mapping() local
1203 if (sc->quirks & BUZZ_CONTROLLER) { in sony_mapping()
1226 if (sc->quirks & PS3REMOTE) in sony_mapping()
1229 if (sc->quirks & NAVIGATION_CONTROLLER) in sony_mapping()
1232 if (sc->quirks & SIXAXIS_CONTROLLER) in sony_mapping()
1235 if (sc->quirks & DUALSHOCK4_CONTROLLER) in sony_mapping()
1243 static int sony_register_touchpad(struct sony_sc *sc, int touch_count, in sony_register_touchpad() argument
1250 sc->touchpad = input_allocate_device(); in sony_register_touchpad()
1251 if (!sc->touchpad) in sony_register_touchpad()
1254 input_set_drvdata(sc->touchpad, sc); in sony_register_touchpad()
1255 sc->touchpad->dev.parent = &sc->hdev->dev; in sony_register_touchpad()
1256 sc->touchpad->phys = sc->hdev->phys; in sony_register_touchpad()
1257 sc->touchpad->uniq = sc->hdev->uniq; in sony_register_touchpad()
1258 sc->touchpad->id.bustype = sc->hdev->bus; in sony_register_touchpad()
1259 sc->touchpad->id.vendor = sc->hdev->vendor; in sony_register_touchpad()
1260 sc->touchpad->id.product = sc->hdev->product; in sony_register_touchpad()
1261 sc->touchpad->id.version = sc->hdev->version; in sony_register_touchpad()
1266 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX); in sony_register_touchpad()
1272 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name); in sony_register_touchpad()
1273 sc->touchpad->name = name; in sony_register_touchpad()
1275 ret = input_mt_init_slots(sc->touchpad, touch_count, INPUT_MT_POINTER); in sony_register_touchpad()
1280 __set_bit(EV_KEY, sc->touchpad->evbit); in sony_register_touchpad()
1281 __set_bit(BTN_LEFT, sc->touchpad->keybit); in sony_register_touchpad()
1282 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit); in sony_register_touchpad()
1284 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0); in sony_register_touchpad()
1285 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0); in sony_register_touchpad()
1287 ret = input_register_device(sc->touchpad); in sony_register_touchpad()
1294 kfree(sc->touchpad->name); in sony_register_touchpad()
1295 sc->touchpad->name = NULL; in sony_register_touchpad()
1297 input_free_device(sc->touchpad); in sony_register_touchpad()
1298 sc->touchpad = NULL; in sony_register_touchpad()
1303 static void sony_unregister_touchpad(struct sony_sc *sc) in sony_unregister_touchpad() argument
1305 if (!sc->touchpad) in sony_unregister_touchpad()
1308 kfree(sc->touchpad->name); in sony_unregister_touchpad()
1309 sc->touchpad->name = NULL; in sony_unregister_touchpad()
1311 input_unregister_device(sc->touchpad); in sony_unregister_touchpad()
1312 sc->touchpad = NULL; in sony_unregister_touchpad()
1315 static int sony_register_sensors(struct sony_sc *sc) in sony_register_sensors() argument
1322 sc->sensor_dev = input_allocate_device(); in sony_register_sensors()
1323 if (!sc->sensor_dev) in sony_register_sensors()
1326 input_set_drvdata(sc->sensor_dev, sc); in sony_register_sensors()
1327 sc->sensor_dev->dev.parent = &sc->hdev->dev; in sony_register_sensors()
1328 sc->sensor_dev->phys = sc->hdev->phys; in sony_register_sensors()
1329 sc->sensor_dev->uniq = sc->hdev->uniq; in sony_register_sensors()
1330 sc->sensor_dev->id.bustype = sc->hdev->bus; in sony_register_sensors()
1331 sc->sensor_dev->id.vendor = sc->hdev->vendor; in sony_register_sensors()
1332 sc->sensor_dev->id.product = sc->hdev->product; in sony_register_sensors()
1333 sc->sensor_dev->id.version = sc->hdev->version; in sony_register_sensors()
1338 name_sz = strlen(sc->hdev->name) + sizeof(SENSOR_SUFFIX); in sony_register_sensors()
1344 snprintf(name, name_sz, "%s" SENSOR_SUFFIX, sc->hdev->name); in sony_register_sensors()
1345 sc->sensor_dev->name = name; in sony_register_sensors()
1347 if (sc->quirks & SIXAXIS_CONTROLLER) { in sony_register_sensors()
1354 input_set_abs_params(sc->sensor_dev, ABS_X, -512, 511, 4, 0); in sony_register_sensors()
1355 input_set_abs_params(sc->sensor_dev, ABS_Y, -512, 511, 4, 0); in sony_register_sensors()
1356 input_set_abs_params(sc->sensor_dev, ABS_Z, -512, 511, 4, 0); in sony_register_sensors()
1357 input_abs_set_res(sc->sensor_dev, ABS_X, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1358 input_abs_set_res(sc->sensor_dev, ABS_Y, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1359 input_abs_set_res(sc->sensor_dev, ABS_Z, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1360 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_register_sensors()
1362 input_set_abs_params(sc->sensor_dev, ABS_X, -range, range, 16, 0); in sony_register_sensors()
1363 input_set_abs_params(sc->sensor_dev, ABS_Y, -range, range, 16, 0); in sony_register_sensors()
1364 input_set_abs_params(sc->sensor_dev, ABS_Z, -range, range, 16, 0); in sony_register_sensors()
1365 input_abs_set_res(sc->sensor_dev, ABS_X, DS4_ACC_RES_PER_G); in sony_register_sensors()
1366 input_abs_set_res(sc->sensor_dev, ABS_Y, DS4_ACC_RES_PER_G); in sony_register_sensors()
1367 input_abs_set_res(sc->sensor_dev, ABS_Z, DS4_ACC_RES_PER_G); in sony_register_sensors()
1370 input_set_abs_params(sc->sensor_dev, ABS_RX, -range, range, 16, 0); in sony_register_sensors()
1371 input_set_abs_params(sc->sensor_dev, ABS_RY, -range, range, 16, 0); in sony_register_sensors()
1372 input_set_abs_params(sc->sensor_dev, ABS_RZ, -range, range, 16, 0); in sony_register_sensors()
1373 input_abs_set_res(sc->sensor_dev, ABS_RX, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1374 input_abs_set_res(sc->sensor_dev, ABS_RY, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1375 input_abs_set_res(sc->sensor_dev, ABS_RZ, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1377 __set_bit(EV_MSC, sc->sensor_dev->evbit); in sony_register_sensors()
1378 __set_bit(MSC_TIMESTAMP, sc->sensor_dev->mscbit); in sony_register_sensors()
1381 __set_bit(INPUT_PROP_ACCELEROMETER, sc->sensor_dev->propbit); in sony_register_sensors()
1383 ret = input_register_device(sc->sensor_dev); in sony_register_sensors()
1390 kfree(sc->sensor_dev->name); in sony_register_sensors()
1391 sc->sensor_dev->name = NULL; in sony_register_sensors()
1393 input_free_device(sc->sensor_dev); in sony_register_sensors()
1394 sc->sensor_dev = NULL; in sony_register_sensors()
1399 static void sony_unregister_sensors(struct sony_sc *sc) in sony_unregister_sensors() argument
1401 if (!sc->sensor_dev) in sony_unregister_sensors()
1404 kfree(sc->sensor_dev->name); in sony_unregister_sensors()
1405 sc->sensor_dev->name = NULL; in sony_unregister_sensors()
1407 input_unregister_device(sc->sensor_dev); in sony_unregister_sensors()
1408 sc->sensor_dev = NULL; in sony_unregister_sensors()
1480 static int dualshock4_get_calibration_data(struct sony_sc *sc) in dualshock4_get_calibration_data() argument
1498 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in dualshock4_get_calibration_data()
1503 ret = hid_hw_raw_request(sc->hdev, 0x02, buf, in dualshock4_get_calibration_data()
1520 ret = hid_hw_raw_request(sc->hdev, 0x05, buf, in dualshock4_get_calibration_data()
1532 …hid_warn(sc->hdev, "DualShock 4 calibration report's CRC check failed, received crc 0x%0x != 0x%0x… in dualshock4_get_calibration_data()
1535 hid_warn(sc->hdev, "Retrying DualShock 4 get calibration report request\n"); in dualshock4_get_calibration_data()
1550 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { in dualshock4_get_calibration_data()
1579 sc->ds4_calib_data[0].abs_code = ABS_RX; in dualshock4_get_calibration_data()
1580 sc->ds4_calib_data[0].bias = gyro_pitch_bias; in dualshock4_get_calibration_data()
1581 sc->ds4_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1582 sc->ds4_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus; in dualshock4_get_calibration_data()
1584 sc->ds4_calib_data[1].abs_code = ABS_RY; in dualshock4_get_calibration_data()
1585 sc->ds4_calib_data[1].bias = gyro_yaw_bias; in dualshock4_get_calibration_data()
1586 sc->ds4_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1587 sc->ds4_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus; in dualshock4_get_calibration_data()
1589 sc->ds4_calib_data[2].abs_code = ABS_RZ; in dualshock4_get_calibration_data()
1590 sc->ds4_calib_data[2].bias = gyro_roll_bias; in dualshock4_get_calibration_data()
1591 sc->ds4_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1592 sc->ds4_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus; in dualshock4_get_calibration_data()
1598 sc->ds4_calib_data[3].abs_code = ABS_X; in dualshock4_get_calibration_data()
1599 sc->ds4_calib_data[3].bias = acc_x_plus - range_2g / 2; in dualshock4_get_calibration_data()
1600 sc->ds4_calib_data[3].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1601 sc->ds4_calib_data[3].sens_denom = range_2g; in dualshock4_get_calibration_data()
1604 sc->ds4_calib_data[4].abs_code = ABS_Y; in dualshock4_get_calibration_data()
1605 sc->ds4_calib_data[4].bias = acc_y_plus - range_2g / 2; in dualshock4_get_calibration_data()
1606 sc->ds4_calib_data[4].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1607 sc->ds4_calib_data[4].sens_denom = range_2g; in dualshock4_get_calibration_data()
1610 sc->ds4_calib_data[5].abs_code = ABS_Z; in dualshock4_get_calibration_data()
1611 sc->ds4_calib_data[5].bias = acc_z_plus - range_2g / 2; in dualshock4_get_calibration_data()
1612 sc->ds4_calib_data[5].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1613 sc->ds4_calib_data[5].sens_denom = range_2g; in dualshock4_get_calibration_data()
1622 struct sony_sc *sc = container_of(work, struct sony_sc, hotplug_worker); in dualshock4_calibration_work() local
1627 ret = dualshock4_get_calibration_data(sc); in dualshock4_calibration_work()
1635 hid_err(sc->hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n"); in dualshock4_calibration_work()
1638 hid_info(sc->hdev, "DualShock 4 USB dongle: calibration completed\n"); in dualshock4_calibration_work()
1642 spin_lock_irqsave(&sc->lock, flags); in dualshock4_calibration_work()
1643 sc->ds4_dongle_state = dongle_state; in dualshock4_calibration_work()
1644 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_calibration_work()
1647 static void sixaxis_set_leds_from_id(struct sony_sc *sc) in sixaxis_set_leds_from_id() argument
1662 int id = sc->device_id; in sixaxis_set_leds_from_id()
1670 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id])); in sixaxis_set_leds_from_id()
1673 static void dualshock4_set_leds_from_id(struct sony_sc *sc) in dualshock4_set_leds_from_id() argument
1686 int id = sc->device_id; in dualshock4_set_leds_from_id()
1694 memcpy(sc->led_state, color_code[id], sizeof(color_code[id])); in dualshock4_set_leds_from_id()
1697 static void buzz_set_leds(struct sony_sc *sc) in buzz_set_leds() argument
1699 struct hid_device *hdev = sc->hdev; in buzz_set_leds()
1709 value[1] = sc->led_state[0] ? 0xff : 0x00; in buzz_set_leds()
1710 value[2] = sc->led_state[1] ? 0xff : 0x00; in buzz_set_leds()
1711 value[3] = sc->led_state[2] ? 0xff : 0x00; in buzz_set_leds()
1712 value[4] = sc->led_state[3] ? 0xff : 0x00; in buzz_set_leds()
1718 static void sony_set_leds(struct sony_sc *sc) in sony_set_leds() argument
1720 if (!(sc->quirks & BUZZ_CONTROLLER)) in sony_set_leds()
1721 sony_schedule_work(sc, SONY_WORKER_STATE); in sony_set_leds()
1723 buzz_set_leds(sc); in sony_set_leds()
1838 static void sony_leds_remove(struct sony_sc *sc) in sony_leds_remove() argument
1843 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_remove()
1845 for (n = 0; n < sc->led_count; n++) { in sony_leds_remove()
1846 led = sc->leds[n]; in sony_leds_remove()
1847 sc->leds[n] = NULL; in sony_leds_remove()
1854 sc->led_count = 0; in sony_leds_remove()
1857 static int sony_leds_init(struct sony_sc *sc) in sony_leds_init() argument
1859 struct hid_device *hdev = sc->hdev; in sony_leds_init()
1872 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_init()
1874 if (sc->quirks & BUZZ_CONTROLLER) { in sony_leds_init()
1875 sc->led_count = 4; in sony_leds_init()
1882 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_leds_init()
1883 dualshock4_set_leds_from_id(sc); in sony_leds_init()
1884 sc->led_state[3] = 1; in sony_leds_init()
1885 sc->led_count = 4; in sony_leds_init()
1891 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_leds_init()
1892 sc->led_count = 3; in sony_leds_init()
1897 } else if (sc->quirks & NAVIGATION_CONTROLLER) { in sony_leds_init()
1900 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds)); in sony_leds_init()
1901 sc->led_count = 1; in sony_leds_init()
1907 sixaxis_set_leds_from_id(sc); in sony_leds_init()
1908 sc->led_count = 4; in sony_leds_init()
1920 sony_set_leds(sc); in sony_leds_init()
1924 for (n = 0; n < sc->led_count; n++) { in sony_leds_init()
1943 led->brightness = sc->led_state[n]; in sony_leds_init()
1952 sc->leds[n] = led; in sony_leds_init()
1957 sc->leds[n] = NULL; in sony_leds_init()
1966 sony_leds_remove(sc); in sony_leds_init()
1971 static void sixaxis_send_output_report(struct sony_sc *sc) in sixaxis_send_output_report() argument
1986 (struct sixaxis_output_report *)sc->output_report_dmabuf; in sixaxis_send_output_report()
1993 report->rumble.right_motor_on = sc->right ? 1 : 0; in sixaxis_send_output_report()
1994 report->rumble.left_motor_force = sc->left; in sixaxis_send_output_report()
1997 report->leds_bitmap |= sc->led_state[0] << 1; in sixaxis_send_output_report()
1998 report->leds_bitmap |= sc->led_state[1] << 2; in sixaxis_send_output_report()
1999 report->leds_bitmap |= sc->led_state[2] << 3; in sixaxis_send_output_report()
2000 report->leds_bitmap |= sc->led_state[3] << 4; in sixaxis_send_output_report()
2016 if (sc->led_delay_on[n] || sc->led_delay_off[n]) { in sixaxis_send_output_report()
2017 report->led[3 - n].duty_off = sc->led_delay_off[n]; in sixaxis_send_output_report()
2018 report->led[3 - n].duty_on = sc->led_delay_on[n]; in sixaxis_send_output_report()
2022 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report, in sixaxis_send_output_report()
2027 static void dualshock4_send_output_report(struct sony_sc *sc) in dualshock4_send_output_report() argument
2029 struct hid_device *hdev = sc->hdev; in dualshock4_send_output_report()
2030 u8 *buf = sc->output_report_dmabuf; in dualshock4_send_output_report()
2042 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in dualshock4_send_output_report()
2050 buf[1] = 0xC0 /* HID + CRC */ | sc->ds4_bt_poll_interval; in dualshock4_send_output_report()
2056 buf[offset++] = sc->right; in dualshock4_send_output_report()
2057 buf[offset++] = sc->left; in dualshock4_send_output_report()
2063 if (sc->led_state[3]) { in dualshock4_send_output_report()
2064 buf[offset++] = sc->led_state[0]; in dualshock4_send_output_report()
2065 buf[offset++] = sc->led_state[1]; in dualshock4_send_output_report()
2066 buf[offset++] = sc->led_state[2]; in dualshock4_send_output_report()
2072 buf[offset++] = sc->led_delay_on[3]; in dualshock4_send_output_report()
2073 buf[offset++] = sc->led_delay_off[3]; in dualshock4_send_output_report()
2075 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) in dualshock4_send_output_report()
2089 static void motion_send_output_report(struct sony_sc *sc) in motion_send_output_report() argument
2091 struct hid_device *hdev = sc->hdev; in motion_send_output_report()
2093 (struct motion_output_report_02 *)sc->output_report_dmabuf; in motion_send_output_report()
2098 report->r = sc->led_state[0]; in motion_send_output_report()
2099 report->g = sc->led_state[1]; in motion_send_output_report()
2100 report->b = sc->led_state[2]; in motion_send_output_report()
2103 report->rumble = max(sc->right, sc->left); in motion_send_output_report()
2109 static inline void sony_send_output_report(struct sony_sc *sc) in sony_send_output_report() argument
2111 if (sc->send_output_report) in sony_send_output_report()
2112 sc->send_output_report(sc); in sony_send_output_report()
2117 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); in sony_state_worker() local
2119 sc->send_output_report(sc); in sony_state_worker()
2122 static int sony_allocate_output_report(struct sony_sc *sc) in sony_allocate_output_report() argument
2124 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_allocate_output_report()
2125 (sc->quirks & NAVIGATION_CONTROLLER)) in sony_allocate_output_report()
2126 sc->output_report_dmabuf = in sony_allocate_output_report()
2129 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_allocate_output_report()
2130 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x11_SIZE, in sony_allocate_output_report()
2132 else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) in sony_allocate_output_report()
2133 sc->output_report_dmabuf = kmalloc(DS4_OUTPUT_REPORT_0x05_SIZE, in sony_allocate_output_report()
2135 else if (sc->quirks & MOTION_CONTROLLER) in sony_allocate_output_report()
2136 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE, in sony_allocate_output_report()
2141 if (!sc->output_report_dmabuf) in sony_allocate_output_report()
2152 struct sony_sc *sc = hid_get_drvdata(hid); in sony_play_effect() local
2157 sc->left = effect->u.rumble.strong_magnitude / 256; in sony_play_effect()
2158 sc->right = effect->u.rumble.weak_magnitude / 256; in sony_play_effect()
2160 sony_schedule_work(sc, SONY_WORKER_STATE); in sony_play_effect()
2164 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
2169 if (list_empty(&sc->hdev->inputs)) { in sony_init_ff()
2170 hid_err(sc->hdev, "no inputs found\n"); in sony_init_ff()
2173 hidinput = list_entry(sc->hdev->inputs.next, struct hid_input, list); in sony_init_ff()
2181 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
2192 struct sony_sc *sc = power_supply_get_drvdata(psy); in sony_battery_get_property() local
2197 spin_lock_irqsave(&sc->lock, flags); in sony_battery_get_property()
2198 battery_charging = sc->battery_charging; in sony_battery_get_property()
2199 battery_capacity = sc->battery_capacity; in sony_battery_get_property()
2200 cable_state = sc->cable_state; in sony_battery_get_property()
2201 spin_unlock_irqrestore(&sc->lock, flags); in sony_battery_get_property()
2229 static int sony_battery_probe(struct sony_sc *sc, int append_dev_id) in sony_battery_probe() argument
2234 struct power_supply_config psy_cfg = { .drv_data = sc, }; in sony_battery_probe()
2235 struct hid_device *hdev = sc->hdev; in sony_battery_probe()
2242 sc->battery_capacity = 100; in sony_battery_probe()
2244 sc->battery_desc.properties = sony_battery_props; in sony_battery_probe()
2245 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props); in sony_battery_probe()
2246 sc->battery_desc.get_property = sony_battery_get_property; in sony_battery_probe()
2247 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in sony_battery_probe()
2248 sc->battery_desc.use_for_apm = 0; in sony_battery_probe()
2249 sc->battery_desc.name = kasprintf(GFP_KERNEL, battery_str_fmt, in sony_battery_probe()
2250 sc->mac_address, sc->device_id); in sony_battery_probe()
2251 if (!sc->battery_desc.name) in sony_battery_probe()
2254 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc, in sony_battery_probe()
2256 if (IS_ERR(sc->battery)) { in sony_battery_probe()
2257 ret = PTR_ERR(sc->battery); in sony_battery_probe()
2262 power_supply_powers(sc->battery, &hdev->dev); in sony_battery_probe()
2266 kfree(sc->battery_desc.name); in sony_battery_probe()
2267 sc->battery_desc.name = NULL; in sony_battery_probe()
2271 static void sony_battery_remove(struct sony_sc *sc) in sony_battery_remove() argument
2273 if (!sc->battery_desc.name) in sony_battery_remove()
2276 power_supply_unregister(sc->battery); in sony_battery_remove()
2277 kfree(sc->battery_desc.name); in sony_battery_remove()
2278 sc->battery_desc.name = NULL; in sony_battery_remove()
2301 static int sony_check_add_dev_list(struct sony_sc *sc) in sony_check_add_dev_list() argument
2310 ret = memcmp(sc->mac_address, entry->mac_address, in sony_check_add_dev_list()
2311 sizeof(sc->mac_address)); in sony_check_add_dev_list()
2313 if (sony_compare_connection_type(sc, entry)) { in sony_check_add_dev_list()
2317 hid_info(sc->hdev, in sony_check_add_dev_list()
2319 sc->mac_address); in sony_check_add_dev_list()
2326 list_add(&(sc->list_node), &sony_device_list); in sony_check_add_dev_list()
2333 static void sony_remove_dev_list(struct sony_sc *sc) in sony_remove_dev_list() argument
2337 if (sc->list_node.next) { in sony_remove_dev_list()
2339 list_del(&(sc->list_node)); in sony_remove_dev_list()
2344 static int sony_get_bt_devaddr(struct sony_sc *sc) in sony_get_bt_devaddr() argument
2349 ret = strlen(sc->hdev->uniq); in sony_get_bt_devaddr()
2353 ret = sscanf(sc->hdev->uniq, in sony_get_bt_devaddr()
2355 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3], in sony_get_bt_devaddr()
2356 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]); in sony_get_bt_devaddr()
2364 static int sony_check_add(struct sony_sc *sc) in sony_check_add() argument
2369 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) || in sony_check_add()
2370 (sc->quirks & MOTION_CONTROLLER_BT) || in sony_check_add()
2371 (sc->quirks & NAVIGATION_CONTROLLER_BT) || in sony_check_add()
2372 (sc->quirks & SIXAXIS_CONTROLLER_BT)) { in sony_check_add()
2379 if (sony_get_bt_devaddr(sc) < 0) { in sony_check_add()
2380 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n"); in sony_check_add()
2383 } else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in sony_check_add()
2393 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, in sony_check_add()
2398 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n"); in sony_check_add()
2403 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); in sony_check_add()
2405 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq), in sony_check_add()
2407 sc->mac_address[5], sc->mac_address[4], in sony_check_add()
2408 sc->mac_address[3], sc->mac_address[2], in sony_check_add()
2409 sc->mac_address[1], sc->mac_address[0]); in sony_check_add()
2410 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_check_add()
2411 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_check_add()
2421 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, in sony_check_add()
2426 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n"); in sony_check_add()
2436 sc->mac_address[5-n] = buf[4+n]; in sony_check_add()
2438 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq), in sony_check_add()
2440 sc->mac_address[5], sc->mac_address[4], in sony_check_add()
2441 sc->mac_address[3], sc->mac_address[2], in sony_check_add()
2442 sc->mac_address[1], sc->mac_address[0]); in sony_check_add()
2447 ret = sony_check_add_dev_list(sc); in sony_check_add()
2456 static int sony_set_device_id(struct sony_sc *sc) in sony_set_device_id() argument
2464 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_set_device_id()
2465 (sc->quirks & DUALSHOCK4_CONTROLLER)) { in sony_set_device_id()
2469 sc->device_id = -1; in sony_set_device_id()
2472 sc->device_id = ret; in sony_set_device_id()
2474 sc->device_id = -1; in sony_set_device_id()
2480 static void sony_release_device_id(struct sony_sc *sc) in sony_release_device_id() argument
2482 if (sc->device_id >= 0) { in sony_release_device_id()
2483 ida_simple_remove(&sony_device_id_allocator, sc->device_id); in sony_release_device_id()
2484 sc->device_id = -1; in sony_release_device_id()
2488 static inline void sony_init_output_report(struct sony_sc *sc, in sony_init_output_report() argument
2491 sc->send_output_report = send_output_report; in sony_init_output_report()
2493 if (!sc->state_worker_initialized) in sony_init_output_report()
2494 INIT_WORK(&sc->state_worker, sony_state_worker); in sony_init_output_report()
2496 sc->state_worker_initialized = 1; in sony_init_output_report()
2499 static inline void sony_cancel_work_sync(struct sony_sc *sc) in sony_cancel_work_sync() argument
2503 if (sc->hotplug_worker_initialized) in sony_cancel_work_sync()
2504 cancel_work_sync(&sc->hotplug_worker); in sony_cancel_work_sync()
2505 if (sc->state_worker_initialized) { in sony_cancel_work_sync()
2506 spin_lock_irqsave(&sc->lock, flags); in sony_cancel_work_sync()
2507 sc->state_worker_initialized = 0; in sony_cancel_work_sync()
2508 spin_unlock_irqrestore(&sc->lock, flags); in sony_cancel_work_sync()
2509 cancel_work_sync(&sc->state_worker); in sony_cancel_work_sync()
2516 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_input_configured() local
2520 ret = sony_set_device_id(sc); in sony_input_configured()
2526 ret = append_dev_id = sony_check_add(sc); in sony_input_configured()
2530 ret = sony_allocate_output_report(sc); in sony_input_configured()
2536 if (sc->quirks & NAVIGATION_CONTROLLER_USB) { in sony_input_configured()
2555 sc->defer_initialization = 1; in sony_input_configured()
2563 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2564 } else if (sc->quirks & NAVIGATION_CONTROLLER_BT) { in sony_input_configured()
2577 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2578 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) { in sony_input_configured()
2587 sc->defer_initialization = 1; in sony_input_configured()
2595 ret = sony_register_sensors(sc); in sony_input_configured()
2597 hid_err(sc->hdev, in sony_input_configured()
2602 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2603 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) { in sony_input_configured()
2616 ret = sony_register_sensors(sc); in sony_input_configured()
2618 hid_err(sc->hdev, in sony_input_configured()
2623 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2624 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_input_configured()
2625 ret = dualshock4_get_calibration_data(sc); in sony_input_configured()
2635 ret = sony_register_touchpad(sc, 2, 1920, 942); in sony_input_configured()
2637 hid_err(sc->hdev, in sony_input_configured()
2643 ret = sony_register_sensors(sc); in sony_input_configured()
2645 hid_err(sc->hdev, in sony_input_configured()
2650 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { in sony_input_configured()
2651 sc->ds4_bt_poll_interval = DS4_BT_DEFAULT_POLL_INTERVAL_MS; in sony_input_configured()
2652 ret = device_create_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_input_configured()
2654 hid_warn(sc->hdev, in sony_input_configured()
2659 if (sc->quirks & DUALSHOCK4_DONGLE) { in sony_input_configured()
2660 INIT_WORK(&sc->hotplug_worker, dualshock4_calibration_work); in sony_input_configured()
2661 sc->hotplug_worker_initialized = 1; in sony_input_configured()
2662 sc->ds4_dongle_state = DONGLE_DISCONNECTED; in sony_input_configured()
2665 sony_init_output_report(sc, dualshock4_send_output_report); in sony_input_configured()
2666 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_input_configured()
2667 sony_init_output_report(sc, motion_send_output_report); in sony_input_configured()
2672 if (sc->quirks & SONY_LED_SUPPORT) { in sony_input_configured()
2673 ret = sony_leds_init(sc); in sony_input_configured()
2678 if (sc->quirks & SONY_BATTERY_SUPPORT) { in sony_input_configured()
2679 ret = sony_battery_probe(sc, append_dev_id); in sony_input_configured()
2691 if (sc->quirks & SONY_FF_SUPPORT) { in sony_input_configured()
2692 ret = sony_init_ff(sc); in sony_input_configured()
2705 if (sc->ds4_bt_poll_interval) in sony_input_configured()
2706 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_input_configured()
2707 if (sc->quirks & SONY_LED_SUPPORT) in sony_input_configured()
2708 sony_leds_remove(sc); in sony_input_configured()
2709 if (sc->quirks & SONY_BATTERY_SUPPORT) in sony_input_configured()
2710 sony_battery_remove(sc); in sony_input_configured()
2711 if (sc->touchpad) in sony_input_configured()
2712 sony_unregister_touchpad(sc); in sony_input_configured()
2713 if (sc->sensor_dev) in sony_input_configured()
2714 sony_unregister_sensors(sc); in sony_input_configured()
2715 sony_cancel_work_sync(sc); in sony_input_configured()
2716 kfree(sc->output_report_dmabuf); in sony_input_configured()
2717 sony_remove_dev_list(sc); in sony_input_configured()
2718 sony_release_device_id(sc); in sony_input_configured()
2726 struct sony_sc *sc; in sony_probe() local
2732 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL); in sony_probe()
2733 if (sc == NULL) { in sony_probe()
2738 spin_lock_init(&sc->lock); in sony_probe()
2740 sc->quirks = quirks; in sony_probe()
2741 hid_set_drvdata(hdev, sc); in sony_probe()
2742 sc->hdev = hdev; in sony_probe()
2750 if (sc->quirks & VAIO_RDESC_CONSTANT) in sony_probe()
2752 else if (sc->quirks & SIXAXIS_CONTROLLER) in sony_probe()
2761 if (sc->quirks & (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)) in sony_probe()
2789 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_remove() local
2793 if (sc->quirks & SONY_LED_SUPPORT) in sony_remove()
2794 sony_leds_remove(sc); in sony_remove()
2796 if (sc->quirks & SONY_BATTERY_SUPPORT) in sony_remove()
2797 sony_battery_remove(sc); in sony_remove()
2799 if (sc->touchpad) in sony_remove()
2800 sony_unregister_touchpad(sc); in sony_remove()
2802 if (sc->sensor_dev) in sony_remove()
2803 sony_unregister_sensors(sc); in sony_remove()
2805 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_remove()
2806 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_remove()
2808 sony_cancel_work_sync(sc); in sony_remove()
2810 kfree(sc->output_report_dmabuf); in sony_remove()
2812 sony_remove_dev_list(sc); in sony_remove()
2814 sony_release_device_id(sc); in sony_remove()
2827 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_suspend() local
2829 sc->left = sc->right = 0; in sony_suspend()
2830 sony_send_output_report(sc); in sony_suspend()
2839 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_resume() local
2845 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_resume()
2846 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_resume()
2847 sixaxis_set_operational_usb(sc->hdev); in sony_resume()
2848 sc->defer_initialization = 1; in sony_resume()