Lines Matching refs:sc
583 static void sony_set_leds(struct sony_sc *sc);
585 static inline void sony_schedule_work(struct sony_sc *sc, in sony_schedule_work() argument
592 spin_lock_irqsave(&sc->lock, flags); in sony_schedule_work()
593 if (!sc->defer_initialization && sc->state_worker_initialized) in sony_schedule_work()
594 schedule_work(&sc->state_worker); in sony_schedule_work()
595 spin_unlock_irqrestore(&sc->lock, flags); in sony_schedule_work()
598 if (sc->hotplug_worker_initialized) in sony_schedule_work()
599 schedule_work(&sc->hotplug_worker); in sony_schedule_work()
609 struct sony_sc *sc = hid_get_drvdata(hdev); in ds4_show_poll_interval() local
611 return snprintf(buf, PAGE_SIZE, "%i\n", sc->ds4_bt_poll_interval); in ds4_show_poll_interval()
619 struct sony_sc *sc = hid_get_drvdata(hdev); in ds4_store_poll_interval() local
629 spin_lock_irqsave(&sc->lock, flags); in ds4_store_poll_interval()
630 sc->ds4_bt_poll_interval = interval; in ds4_store_poll_interval()
631 spin_unlock_irqrestore(&sc->lock, flags); in ds4_store_poll_interval()
633 sony_schedule_work(sc, SONY_WORKER_STATE); in ds4_store_poll_interval()
646 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_show_firmware_version() local
648 return snprintf(buf, PAGE_SIZE, "0x%04x\n", sc->fw_version); in sony_show_firmware_version()
658 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_show_hardware_version() local
660 return snprintf(buf, PAGE_SIZE, "0x%04x\n", sc->hw_version); in sony_show_hardware_version()
843 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_report_fixup() local
845 if (sc->quirks & (SINO_LITE_CONTROLLER | FUTUREMAX_DANCE_MAT)) in sony_report_fixup()
852 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 && in sony_report_fixup()
864 if (sc->quirks & MOTION_CONTROLLER) in sony_report_fixup()
867 if (sc->quirks & PS3REMOTE) in sony_report_fixup()
873 static void sixaxis_parse_report(struct sony_sc *sc, u8 *rd, int size) in sixaxis_parse_report() argument
886 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30; in sixaxis_parse_report()
899 spin_lock_irqsave(&sc->lock, flags); in sixaxis_parse_report()
900 sc->cable_state = cable_state; in sixaxis_parse_report()
901 sc->battery_capacity = battery_capacity; in sixaxis_parse_report()
902 sc->battery_charging = battery_charging; in sixaxis_parse_report()
903 spin_unlock_irqrestore(&sc->lock, flags); in sixaxis_parse_report()
905 if (sc->quirks & SIXAXIS_CONTROLLER) { in sixaxis_parse_report()
910 input_report_abs(sc->sensor_dev, ABS_X, val); in sixaxis_parse_report()
914 input_report_abs(sc->sensor_dev, ABS_Y, val); in sixaxis_parse_report()
917 input_report_abs(sc->sensor_dev, ABS_Z, val); in sixaxis_parse_report()
919 input_sync(sc->sensor_dev); in sixaxis_parse_report()
923 static void dualshock4_parse_report(struct sony_sc *sc, u8 *rd, int size) in dualshock4_parse_report() argument
925 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, in dualshock4_parse_report()
934 int data_offset = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 2 : 0; in dualshock4_parse_report()
938 input_report_key(sc->touchpad, BTN_LEFT, rd[offset+2] & 0x2); in dualshock4_parse_report()
994 if (!sc->timestamp_initialized) { in dualshock4_parse_report()
995 sc->timestamp_us = ((unsigned int)timestamp * 16) / 3; in dualshock4_parse_report()
996 sc->timestamp_initialized = true; in dualshock4_parse_report()
1000 if (sc->prev_timestamp > timestamp) in dualshock4_parse_report()
1001 delta = (U16_MAX - sc->prev_timestamp + timestamp + 1); in dualshock4_parse_report()
1003 delta = timestamp - sc->prev_timestamp; in dualshock4_parse_report()
1004 sc->timestamp_us += (delta * 16) / 3; in dualshock4_parse_report()
1006 sc->prev_timestamp = timestamp; in dualshock4_parse_report()
1007 input_event(sc->sensor_dev, EV_MSC, MSC_TIMESTAMP, sc->timestamp_us); in dualshock4_parse_report()
1013 struct ds4_calibration_data *calib = &sc->ds4_calib_data[n]; in dualshock4_parse_report()
1024 input_report_abs(sc->sensor_dev, calib->abs_code, calib_data); in dualshock4_parse_report()
1027 input_sync(sc->sensor_dev); in dualshock4_parse_report()
1054 spin_lock_irqsave(&sc->lock, flags); in dualshock4_parse_report()
1055 sc->cable_state = cable_state; in dualshock4_parse_report()
1056 sc->battery_capacity = battery_capacity; in dualshock4_parse_report()
1057 sc->battery_charging = battery_charging; in dualshock4_parse_report()
1058 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_parse_report()
1067 max_touch_data = (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ? 4 : 3; in dualshock4_parse_report()
1094 input_mt_slot(sc->touchpad, n); in dualshock4_parse_report()
1095 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active); in dualshock4_parse_report()
1098 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x); in dualshock4_parse_report()
1099 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, y); in dualshock4_parse_report()
1104 input_mt_sync_frame(sc->touchpad); in dualshock4_parse_report()
1105 input_sync(sc->touchpad); in dualshock4_parse_report()
1109 static void nsg_mrxu_parse_report(struct sony_sc *sc, u8 *rd, int size) in nsg_mrxu_parse_report() argument
1134 input_report_key(sc->touchpad, BTN_LEFT, rd[offset] & 0x0F); in nsg_mrxu_parse_report()
1148 input_mt_slot(sc->touchpad, n); in nsg_mrxu_parse_report()
1149 input_mt_report_slot_state(sc->touchpad, MT_TOOL_FINGER, active & 0x03); in nsg_mrxu_parse_report()
1154 input_report_abs(sc->touchpad, ABS_MT_TOUCH_MAJOR, in nsg_mrxu_parse_report()
1156 input_report_abs(sc->touchpad, ABS_MT_TOUCH_MINOR, in nsg_mrxu_parse_report()
1158 input_report_abs(sc->touchpad, ABS_MT_ORIENTATION, in nsg_mrxu_parse_report()
1160 input_report_abs(sc->touchpad, ABS_MT_POSITION_X, x); in nsg_mrxu_parse_report()
1161 input_report_abs(sc->touchpad, ABS_MT_POSITION_Y, in nsg_mrxu_parse_report()
1169 input_report_rel(sc->touchpad, REL_X, relx); in nsg_mrxu_parse_report()
1170 input_report_rel(sc->touchpad, REL_Y, rely); in nsg_mrxu_parse_report()
1178 input_mt_sync_frame(sc->touchpad); in nsg_mrxu_parse_report()
1180 input_sync(sc->touchpad); in nsg_mrxu_parse_report()
1186 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_raw_event() local
1192 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1209 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1210 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1211 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1212 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 && in sony_raw_event()
1214 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1215 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 && in sony_raw_event()
1217 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1218 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && rd[0] == 0x11 && in sony_raw_event()
1229 hid_dbg(sc->hdev, "DualShock 4 input report's CRC check failed, received crc 0x%0x != 0x%0x\n", in sony_raw_event()
1234 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1235 } else if ((sc->quirks & DUALSHOCK4_DONGLE) && rd[0] == 0x01 && in sony_raw_event()
1247 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1248 dongle_state = sc->ds4_dongle_state; in sony_raw_event()
1249 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1260 hid_info(sc->hdev, "DualShock 4 USB dongle: controller connected\n"); in sony_raw_event()
1261 sony_set_leds(sc); in sony_raw_event()
1263 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1264 sc->ds4_dongle_state = DONGLE_CALIBRATING; in sony_raw_event()
1265 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1267 sony_schedule_work(sc, SONY_WORKER_HOTPLUG); in sony_raw_event()
1275 hid_info(sc->hdev, "DualShock 4 USB dongle: controller disconnected\n"); in sony_raw_event()
1277 spin_lock_irqsave(&sc->lock, flags); in sony_raw_event()
1278 sc->ds4_dongle_state = DONGLE_DISCONNECTED; in sony_raw_event()
1279 spin_unlock_irqrestore(&sc->lock, flags); in sony_raw_event()
1290 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1292 } else if ((sc->quirks & NSG_MRXU_REMOTE) && rd[0] == 0x02) { in sony_raw_event()
1293 nsg_mrxu_parse_report(sc, rd, size); in sony_raw_event()
1297 if (sc->defer_initialization) { in sony_raw_event()
1298 sc->defer_initialization = 0; in sony_raw_event()
1299 sony_schedule_work(sc, SONY_WORKER_STATE); in sony_raw_event()
1309 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_mapping() local
1311 if (sc->quirks & BUZZ_CONTROLLER) { in sony_mapping()
1334 if (sc->quirks & PS3REMOTE) in sony_mapping()
1337 if (sc->quirks & NAVIGATION_CONTROLLER) in sony_mapping()
1340 if (sc->quirks & SIXAXIS_CONTROLLER) in sony_mapping()
1343 if (sc->quirks & DUALSHOCK4_CONTROLLER) in sony_mapping()
1351 static int sony_register_touchpad(struct sony_sc *sc, int touch_count, in sony_register_touchpad() argument
1358 sc->touchpad = devm_input_allocate_device(&sc->hdev->dev); in sony_register_touchpad()
1359 if (!sc->touchpad) in sony_register_touchpad()
1362 input_set_drvdata(sc->touchpad, sc); in sony_register_touchpad()
1363 sc->touchpad->dev.parent = &sc->hdev->dev; in sony_register_touchpad()
1364 sc->touchpad->phys = sc->hdev->phys; in sony_register_touchpad()
1365 sc->touchpad->uniq = sc->hdev->uniq; in sony_register_touchpad()
1366 sc->touchpad->id.bustype = sc->hdev->bus; in sony_register_touchpad()
1367 sc->touchpad->id.vendor = sc->hdev->vendor; in sony_register_touchpad()
1368 sc->touchpad->id.product = sc->hdev->product; in sony_register_touchpad()
1369 sc->touchpad->id.version = sc->hdev->version; in sony_register_touchpad()
1374 name_sz = strlen(sc->hdev->name) + sizeof(DS4_TOUCHPAD_SUFFIX); in sony_register_touchpad()
1375 name = devm_kzalloc(&sc->hdev->dev, name_sz, GFP_KERNEL); in sony_register_touchpad()
1378 snprintf(name, name_sz, "%s" DS4_TOUCHPAD_SUFFIX, sc->hdev->name); in sony_register_touchpad()
1379 sc->touchpad->name = name; in sony_register_touchpad()
1382 __set_bit(EV_KEY, sc->touchpad->evbit); in sony_register_touchpad()
1383 __set_bit(BTN_LEFT, sc->touchpad->keybit); in sony_register_touchpad()
1384 __set_bit(INPUT_PROP_BUTTONPAD, sc->touchpad->propbit); in sony_register_touchpad()
1386 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_X, 0, w, 0, 0); in sony_register_touchpad()
1387 input_set_abs_params(sc->touchpad, ABS_MT_POSITION_Y, 0, h, 0, 0); in sony_register_touchpad()
1390 input_set_abs_params(sc->touchpad, ABS_MT_TOUCH_MAJOR, in sony_register_touchpad()
1393 input_set_abs_params(sc->touchpad, ABS_MT_TOUCH_MINOR, in sony_register_touchpad()
1396 input_set_abs_params(sc->touchpad, ABS_MT_ORIENTATION, in sony_register_touchpad()
1400 if (sc->quirks & NSG_MRXU_REMOTE) { in sony_register_touchpad()
1401 __set_bit(EV_REL, sc->touchpad->evbit); in sony_register_touchpad()
1404 ret = input_mt_init_slots(sc->touchpad, touch_count, INPUT_MT_POINTER); in sony_register_touchpad()
1408 ret = input_register_device(sc->touchpad); in sony_register_touchpad()
1415 static int sony_register_sensors(struct sony_sc *sc) in sony_register_sensors() argument
1422 sc->sensor_dev = devm_input_allocate_device(&sc->hdev->dev); in sony_register_sensors()
1423 if (!sc->sensor_dev) in sony_register_sensors()
1426 input_set_drvdata(sc->sensor_dev, sc); in sony_register_sensors()
1427 sc->sensor_dev->dev.parent = &sc->hdev->dev; in sony_register_sensors()
1428 sc->sensor_dev->phys = sc->hdev->phys; in sony_register_sensors()
1429 sc->sensor_dev->uniq = sc->hdev->uniq; in sony_register_sensors()
1430 sc->sensor_dev->id.bustype = sc->hdev->bus; in sony_register_sensors()
1431 sc->sensor_dev->id.vendor = sc->hdev->vendor; in sony_register_sensors()
1432 sc->sensor_dev->id.product = sc->hdev->product; in sony_register_sensors()
1433 sc->sensor_dev->id.version = sc->hdev->version; in sony_register_sensors()
1438 name_sz = strlen(sc->hdev->name) + sizeof(SENSOR_SUFFIX); in sony_register_sensors()
1439 name = devm_kzalloc(&sc->hdev->dev, name_sz, GFP_KERNEL); in sony_register_sensors()
1442 snprintf(name, name_sz, "%s" SENSOR_SUFFIX, sc->hdev->name); in sony_register_sensors()
1443 sc->sensor_dev->name = name; in sony_register_sensors()
1445 if (sc->quirks & SIXAXIS_CONTROLLER) { in sony_register_sensors()
1452 input_set_abs_params(sc->sensor_dev, ABS_X, -512, 511, 4, 0); in sony_register_sensors()
1453 input_set_abs_params(sc->sensor_dev, ABS_Y, -512, 511, 4, 0); in sony_register_sensors()
1454 input_set_abs_params(sc->sensor_dev, ABS_Z, -512, 511, 4, 0); in sony_register_sensors()
1455 input_abs_set_res(sc->sensor_dev, ABS_X, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1456 input_abs_set_res(sc->sensor_dev, ABS_Y, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1457 input_abs_set_res(sc->sensor_dev, ABS_Z, SIXAXIS_ACC_RES_PER_G); in sony_register_sensors()
1458 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_register_sensors()
1460 input_set_abs_params(sc->sensor_dev, ABS_X, -range, range, 16, 0); in sony_register_sensors()
1461 input_set_abs_params(sc->sensor_dev, ABS_Y, -range, range, 16, 0); in sony_register_sensors()
1462 input_set_abs_params(sc->sensor_dev, ABS_Z, -range, range, 16, 0); in sony_register_sensors()
1463 input_abs_set_res(sc->sensor_dev, ABS_X, DS4_ACC_RES_PER_G); in sony_register_sensors()
1464 input_abs_set_res(sc->sensor_dev, ABS_Y, DS4_ACC_RES_PER_G); in sony_register_sensors()
1465 input_abs_set_res(sc->sensor_dev, ABS_Z, DS4_ACC_RES_PER_G); in sony_register_sensors()
1468 input_set_abs_params(sc->sensor_dev, ABS_RX, -range, range, 16, 0); in sony_register_sensors()
1469 input_set_abs_params(sc->sensor_dev, ABS_RY, -range, range, 16, 0); in sony_register_sensors()
1470 input_set_abs_params(sc->sensor_dev, ABS_RZ, -range, range, 16, 0); in sony_register_sensors()
1471 input_abs_set_res(sc->sensor_dev, ABS_RX, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1472 input_abs_set_res(sc->sensor_dev, ABS_RY, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1473 input_abs_set_res(sc->sensor_dev, ABS_RZ, DS4_GYRO_RES_PER_DEG_S); in sony_register_sensors()
1475 __set_bit(EV_MSC, sc->sensor_dev->evbit); in sony_register_sensors()
1476 __set_bit(MSC_TIMESTAMP, sc->sensor_dev->mscbit); in sony_register_sensors()
1479 __set_bit(INPUT_PROP_ACCELEROMETER, sc->sensor_dev->propbit); in sony_register_sensors()
1481 ret = input_register_device(sc->sensor_dev); in sony_register_sensors()
1495 struct sony_sc *sc = hid_get_drvdata(hdev); in sixaxis_set_operational_usb() local
1527 if (sc->quirks & SHANWAN_GAMEPAD) in sixaxis_set_operational_usb()
1564 static int dualshock4_get_calibration_data(struct sony_sc *sc) in dualshock4_get_calibration_data() argument
1582 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in dualshock4_get_calibration_data()
1587 ret = hid_hw_raw_request(sc->hdev, 0x02, buf, in dualshock4_get_calibration_data()
1604 ret = hid_hw_raw_request(sc->hdev, 0x05, buf, in dualshock4_get_calibration_data()
1616 …hid_warn(sc->hdev, "DualShock 4 calibration report's CRC check failed, received crc 0x%0x != 0x%0x… in dualshock4_get_calibration_data()
1619 hid_warn(sc->hdev, "Retrying DualShock 4 get calibration report request\n"); in dualshock4_get_calibration_data()
1634 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { in dualshock4_get_calibration_data()
1663 sc->ds4_calib_data[0].abs_code = ABS_RX; in dualshock4_get_calibration_data()
1664 sc->ds4_calib_data[0].bias = gyro_pitch_bias; in dualshock4_get_calibration_data()
1665 sc->ds4_calib_data[0].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1666 sc->ds4_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus; in dualshock4_get_calibration_data()
1668 sc->ds4_calib_data[1].abs_code = ABS_RY; in dualshock4_get_calibration_data()
1669 sc->ds4_calib_data[1].bias = gyro_yaw_bias; in dualshock4_get_calibration_data()
1670 sc->ds4_calib_data[1].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1671 sc->ds4_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus; in dualshock4_get_calibration_data()
1673 sc->ds4_calib_data[2].abs_code = ABS_RZ; in dualshock4_get_calibration_data()
1674 sc->ds4_calib_data[2].bias = gyro_roll_bias; in dualshock4_get_calibration_data()
1675 sc->ds4_calib_data[2].sens_numer = speed_2x*DS4_GYRO_RES_PER_DEG_S; in dualshock4_get_calibration_data()
1676 sc->ds4_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus; in dualshock4_get_calibration_data()
1682 sc->ds4_calib_data[3].abs_code = ABS_X; in dualshock4_get_calibration_data()
1683 sc->ds4_calib_data[3].bias = acc_x_plus - range_2g / 2; in dualshock4_get_calibration_data()
1684 sc->ds4_calib_data[3].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1685 sc->ds4_calib_data[3].sens_denom = range_2g; in dualshock4_get_calibration_data()
1688 sc->ds4_calib_data[4].abs_code = ABS_Y; in dualshock4_get_calibration_data()
1689 sc->ds4_calib_data[4].bias = acc_y_plus - range_2g / 2; in dualshock4_get_calibration_data()
1690 sc->ds4_calib_data[4].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1691 sc->ds4_calib_data[4].sens_denom = range_2g; in dualshock4_get_calibration_data()
1694 sc->ds4_calib_data[5].abs_code = ABS_Z; in dualshock4_get_calibration_data()
1695 sc->ds4_calib_data[5].bias = acc_z_plus - range_2g / 2; in dualshock4_get_calibration_data()
1696 sc->ds4_calib_data[5].sens_numer = 2*DS4_ACC_RES_PER_G; in dualshock4_get_calibration_data()
1697 sc->ds4_calib_data[5].sens_denom = range_2g; in dualshock4_get_calibration_data()
1706 struct sony_sc *sc = container_of(work, struct sony_sc, hotplug_worker); in dualshock4_calibration_work() local
1711 ret = dualshock4_get_calibration_data(sc); in dualshock4_calibration_work()
1719 hid_err(sc->hdev, "DualShock 4 USB dongle: calibration failed, disabling device\n"); in dualshock4_calibration_work()
1722 hid_info(sc->hdev, "DualShock 4 USB dongle: calibration completed\n"); in dualshock4_calibration_work()
1726 spin_lock_irqsave(&sc->lock, flags); in dualshock4_calibration_work()
1727 sc->ds4_dongle_state = dongle_state; in dualshock4_calibration_work()
1728 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_calibration_work()
1731 static int dualshock4_get_version_info(struct sony_sc *sc) in dualshock4_get_version_info() argument
1740 ret = hid_hw_raw_request(sc->hdev, 0xA3, buf, in dualshock4_get_version_info()
1749 sc->hw_version = get_unaligned_le16(&buf[35]); in dualshock4_get_version_info()
1750 sc->fw_version = get_unaligned_le16(&buf[41]); in dualshock4_get_version_info()
1756 static void sixaxis_set_leds_from_id(struct sony_sc *sc) in sixaxis_set_leds_from_id() argument
1771 int id = sc->device_id; in sixaxis_set_leds_from_id()
1779 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id])); in sixaxis_set_leds_from_id()
1782 static void dualshock4_set_leds_from_id(struct sony_sc *sc) in dualshock4_set_leds_from_id() argument
1795 int id = sc->device_id; in dualshock4_set_leds_from_id()
1803 memcpy(sc->led_state, color_code[id], sizeof(color_code[id])); in dualshock4_set_leds_from_id()
1806 static void buzz_set_leds(struct sony_sc *sc) in buzz_set_leds() argument
1808 struct hid_device *hdev = sc->hdev; in buzz_set_leds()
1818 value[1] = sc->led_state[0] ? 0xff : 0x00; in buzz_set_leds()
1819 value[2] = sc->led_state[1] ? 0xff : 0x00; in buzz_set_leds()
1820 value[3] = sc->led_state[2] ? 0xff : 0x00; in buzz_set_leds()
1821 value[4] = sc->led_state[3] ? 0xff : 0x00; in buzz_set_leds()
1827 static void sony_set_leds(struct sony_sc *sc) in sony_set_leds() argument
1829 if (!(sc->quirks & BUZZ_CONTROLLER)) in sony_set_leds()
1830 sony_schedule_work(sc, SONY_WORKER_STATE); in sony_set_leds()
1832 buzz_set_leds(sc); in sony_set_leds()
1947 static int sony_leds_init(struct sony_sc *sc) in sony_leds_init() argument
1949 struct hid_device *hdev = sc->hdev; in sony_leds_init()
1962 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_init()
1964 if (sc->quirks & BUZZ_CONTROLLER) { in sony_leds_init()
1965 sc->led_count = 4; in sony_leds_init()
1972 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_leds_init()
1973 dualshock4_set_leds_from_id(sc); in sony_leds_init()
1974 sc->led_state[3] = 1; in sony_leds_init()
1975 sc->led_count = 4; in sony_leds_init()
1981 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_leds_init()
1982 sc->led_count = 3; in sony_leds_init()
1987 } else if (sc->quirks & NAVIGATION_CONTROLLER) { in sony_leds_init()
1990 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds)); in sony_leds_init()
1991 sc->led_count = 1; in sony_leds_init()
1997 sixaxis_set_leds_from_id(sc); in sony_leds_init()
1998 sc->led_count = 4; in sony_leds_init()
2010 sony_set_leds(sc); in sony_leds_init()
2014 for (n = 0; n < sc->led_count; n++) { in sony_leds_init()
2032 led->brightness = sc->led_state[n]; in sony_leds_init()
2041 sc->leds[n] = led; in sony_leds_init()
2053 static void sixaxis_send_output_report(struct sony_sc *sc) in sixaxis_send_output_report() argument
2068 (struct sixaxis_output_report *)sc->output_report_dmabuf; in sixaxis_send_output_report()
2075 report->rumble.right_motor_on = sc->right ? 1 : 0; in sixaxis_send_output_report()
2076 report->rumble.left_motor_force = sc->left; in sixaxis_send_output_report()
2079 report->leds_bitmap |= sc->led_state[0] << 1; in sixaxis_send_output_report()
2080 report->leds_bitmap |= sc->led_state[1] << 2; in sixaxis_send_output_report()
2081 report->leds_bitmap |= sc->led_state[2] << 3; in sixaxis_send_output_report()
2082 report->leds_bitmap |= sc->led_state[3] << 4; in sixaxis_send_output_report()
2098 if (sc->led_delay_on[n] || sc->led_delay_off[n]) { in sixaxis_send_output_report()
2099 report->led[3 - n].duty_off = sc->led_delay_off[n]; in sixaxis_send_output_report()
2100 report->led[3 - n].duty_on = sc->led_delay_on[n]; in sixaxis_send_output_report()
2105 if (sc->quirks & SHANWAN_GAMEPAD) in sixaxis_send_output_report()
2106 hid_hw_output_report(sc->hdev, (u8 *)report, in sixaxis_send_output_report()
2109 hid_hw_raw_request(sc->hdev, report->report_id, (u8 *)report, in sixaxis_send_output_report()
2114 static void dualshock4_send_output_report(struct sony_sc *sc) in dualshock4_send_output_report() argument
2116 struct hid_device *hdev = sc->hdev; in dualshock4_send_output_report()
2117 u8 *buf = sc->output_report_dmabuf; in dualshock4_send_output_report()
2129 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in dualshock4_send_output_report()
2137 buf[1] = 0xC0 /* HID + CRC */ | sc->ds4_bt_poll_interval; in dualshock4_send_output_report()
2143 buf[offset++] = sc->right; in dualshock4_send_output_report()
2144 buf[offset++] = sc->left; in dualshock4_send_output_report()
2150 if (sc->led_state[3]) { in dualshock4_send_output_report()
2151 buf[offset++] = sc->led_state[0]; in dualshock4_send_output_report()
2152 buf[offset++] = sc->led_state[1]; in dualshock4_send_output_report()
2153 buf[offset++] = sc->led_state[2]; in dualshock4_send_output_report()
2159 buf[offset++] = sc->led_delay_on[3]; in dualshock4_send_output_report()
2160 buf[offset++] = sc->led_delay_off[3]; in dualshock4_send_output_report()
2162 if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) in dualshock4_send_output_report()
2176 static void motion_send_output_report(struct sony_sc *sc) in motion_send_output_report() argument
2178 struct hid_device *hdev = sc->hdev; in motion_send_output_report()
2180 (struct motion_output_report_02 *)sc->output_report_dmabuf; in motion_send_output_report()
2185 report->r = sc->led_state[0]; in motion_send_output_report()
2186 report->g = sc->led_state[1]; in motion_send_output_report()
2187 report->b = sc->led_state[2]; in motion_send_output_report()
2190 report->rumble = max(sc->right, sc->left); in motion_send_output_report()
2196 static inline void sony_send_output_report(struct sony_sc *sc) in sony_send_output_report() argument
2198 if (sc->send_output_report) in sony_send_output_report()
2199 sc->send_output_report(sc); in sony_send_output_report()
2204 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); in sony_state_worker() local
2206 sc->send_output_report(sc); in sony_state_worker()
2209 static int sony_allocate_output_report(struct sony_sc *sc) in sony_allocate_output_report() argument
2211 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_allocate_output_report()
2212 (sc->quirks & NAVIGATION_CONTROLLER)) in sony_allocate_output_report()
2213 sc->output_report_dmabuf = in sony_allocate_output_report()
2214 devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2217 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_allocate_output_report()
2218 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2221 else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) in sony_allocate_output_report()
2222 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2225 else if (sc->quirks & MOTION_CONTROLLER) in sony_allocate_output_report()
2226 sc->output_report_dmabuf = devm_kmalloc(&sc->hdev->dev, in sony_allocate_output_report()
2232 if (!sc->output_report_dmabuf) in sony_allocate_output_report()
2243 struct sony_sc *sc = hid_get_drvdata(hid); in sony_play_effect() local
2248 sc->left = effect->u.rumble.strong_magnitude / 256; in sony_play_effect()
2249 sc->right = effect->u.rumble.weak_magnitude / 256; in sony_play_effect()
2251 sony_schedule_work(sc, SONY_WORKER_STATE); in sony_play_effect()
2255 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
2260 if (list_empty(&sc->hdev->inputs)) { in sony_init_ff()
2261 hid_err(sc->hdev, "no inputs found\n"); in sony_init_ff()
2264 hidinput = list_entry(sc->hdev->inputs.next, struct hid_input, list); in sony_init_ff()
2272 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
2283 struct sony_sc *sc = power_supply_get_drvdata(psy); in sony_battery_get_property() local
2288 spin_lock_irqsave(&sc->lock, flags); in sony_battery_get_property()
2289 battery_charging = sc->battery_charging; in sony_battery_get_property()
2290 battery_capacity = sc->battery_capacity; in sony_battery_get_property()
2291 cable_state = sc->cable_state; in sony_battery_get_property()
2292 spin_unlock_irqrestore(&sc->lock, flags); in sony_battery_get_property()
2320 static int sony_battery_probe(struct sony_sc *sc, int append_dev_id) in sony_battery_probe() argument
2325 struct power_supply_config psy_cfg = { .drv_data = sc, }; in sony_battery_probe()
2326 struct hid_device *hdev = sc->hdev; in sony_battery_probe()
2333 sc->battery_capacity = 100; in sony_battery_probe()
2335 sc->battery_desc.properties = sony_battery_props; in sony_battery_probe()
2336 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props); in sony_battery_probe()
2337 sc->battery_desc.get_property = sony_battery_get_property; in sony_battery_probe()
2338 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in sony_battery_probe()
2339 sc->battery_desc.use_for_apm = 0; in sony_battery_probe()
2340 sc->battery_desc.name = devm_kasprintf(&hdev->dev, GFP_KERNEL, in sony_battery_probe()
2341 battery_str_fmt, sc->mac_address, sc->device_id); in sony_battery_probe()
2342 if (!sc->battery_desc.name) in sony_battery_probe()
2345 sc->battery = devm_power_supply_register(&hdev->dev, &sc->battery_desc, in sony_battery_probe()
2347 if (IS_ERR(sc->battery)) { in sony_battery_probe()
2348 ret = PTR_ERR(sc->battery); in sony_battery_probe()
2353 power_supply_powers(sc->battery, &hdev->dev); in sony_battery_probe()
2377 static int sony_check_add_dev_list(struct sony_sc *sc) in sony_check_add_dev_list() argument
2386 ret = memcmp(sc->mac_address, entry->mac_address, in sony_check_add_dev_list()
2387 sizeof(sc->mac_address)); in sony_check_add_dev_list()
2389 if (sony_compare_connection_type(sc, entry)) { in sony_check_add_dev_list()
2393 hid_info(sc->hdev, in sony_check_add_dev_list()
2395 sc->mac_address); in sony_check_add_dev_list()
2402 list_add(&(sc->list_node), &sony_device_list); in sony_check_add_dev_list()
2409 static void sony_remove_dev_list(struct sony_sc *sc) in sony_remove_dev_list() argument
2413 if (sc->list_node.next) { in sony_remove_dev_list()
2415 list_del(&(sc->list_node)); in sony_remove_dev_list()
2420 static int sony_get_bt_devaddr(struct sony_sc *sc) in sony_get_bt_devaddr() argument
2425 ret = strlen(sc->hdev->uniq); in sony_get_bt_devaddr()
2429 ret = sscanf(sc->hdev->uniq, in sony_get_bt_devaddr()
2431 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3], in sony_get_bt_devaddr()
2432 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]); in sony_get_bt_devaddr()
2440 static int sony_check_add(struct sony_sc *sc) in sony_check_add() argument
2445 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) || in sony_check_add()
2446 (sc->quirks & MOTION_CONTROLLER_BT) || in sony_check_add()
2447 (sc->quirks & NAVIGATION_CONTROLLER_BT) || in sony_check_add()
2448 (sc->quirks & SIXAXIS_CONTROLLER_BT)) { in sony_check_add()
2455 if (sony_get_bt_devaddr(sc) < 0) { in sony_check_add()
2456 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n"); in sony_check_add()
2459 } else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) { in sony_check_add()
2469 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, in sony_check_add()
2474 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n"); in sony_check_add()
2479 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); in sony_check_add()
2481 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq), in sony_check_add()
2482 "%pMR", sc->mac_address); in sony_check_add()
2483 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_check_add()
2484 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_check_add()
2494 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, in sony_check_add()
2499 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n"); in sony_check_add()
2509 sc->mac_address[5-n] = buf[4+n]; in sony_check_add()
2511 snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq), in sony_check_add()
2512 "%pMR", sc->mac_address); in sony_check_add()
2517 ret = sony_check_add_dev_list(sc); in sony_check_add()
2526 static int sony_set_device_id(struct sony_sc *sc) in sony_set_device_id() argument
2534 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_set_device_id()
2535 (sc->quirks & DUALSHOCK4_CONTROLLER)) { in sony_set_device_id()
2539 sc->device_id = -1; in sony_set_device_id()
2542 sc->device_id = ret; in sony_set_device_id()
2544 sc->device_id = -1; in sony_set_device_id()
2550 static void sony_release_device_id(struct sony_sc *sc) in sony_release_device_id() argument
2552 if (sc->device_id >= 0) { in sony_release_device_id()
2553 ida_simple_remove(&sony_device_id_allocator, sc->device_id); in sony_release_device_id()
2554 sc->device_id = -1; in sony_release_device_id()
2558 static inline void sony_init_output_report(struct sony_sc *sc, in sony_init_output_report() argument
2561 sc->send_output_report = send_output_report; in sony_init_output_report()
2563 if (!sc->state_worker_initialized) in sony_init_output_report()
2564 INIT_WORK(&sc->state_worker, sony_state_worker); in sony_init_output_report()
2566 sc->state_worker_initialized = 1; in sony_init_output_report()
2569 static inline void sony_cancel_work_sync(struct sony_sc *sc) in sony_cancel_work_sync() argument
2573 if (sc->hotplug_worker_initialized) in sony_cancel_work_sync()
2574 cancel_work_sync(&sc->hotplug_worker); in sony_cancel_work_sync()
2575 if (sc->state_worker_initialized) { in sony_cancel_work_sync()
2576 spin_lock_irqsave(&sc->lock, flags); in sony_cancel_work_sync()
2577 sc->state_worker_initialized = 0; in sony_cancel_work_sync()
2578 spin_unlock_irqrestore(&sc->lock, flags); in sony_cancel_work_sync()
2579 cancel_work_sync(&sc->state_worker); in sony_cancel_work_sync()
2586 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_input_configured() local
2590 ret = sony_set_device_id(sc); in sony_input_configured()
2596 ret = append_dev_id = sony_check_add(sc); in sony_input_configured()
2600 ret = sony_allocate_output_report(sc); in sony_input_configured()
2606 if (sc->quirks & NAVIGATION_CONTROLLER_USB) { in sony_input_configured()
2625 sc->defer_initialization = 1; in sony_input_configured()
2633 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2634 } else if (sc->quirks & NAVIGATION_CONTROLLER_BT) { in sony_input_configured()
2647 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2648 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) { in sony_input_configured()
2657 sc->defer_initialization = 1; in sony_input_configured()
2665 ret = sony_register_sensors(sc); in sony_input_configured()
2667 hid_err(sc->hdev, in sony_input_configured()
2672 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2673 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) { in sony_input_configured()
2686 ret = sony_register_sensors(sc); in sony_input_configured()
2688 hid_err(sc->hdev, in sony_input_configured()
2693 sony_init_output_report(sc, sixaxis_send_output_report); in sony_input_configured()
2694 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_input_configured()
2695 ret = dualshock4_get_calibration_data(sc); in sony_input_configured()
2701 ret = dualshock4_get_version_info(sc); in sony_input_configured()
2703 hid_err(sc->hdev, "Failed to get version data from Dualshock 4\n"); in sony_input_configured()
2707 ret = device_create_file(&sc->hdev->dev, &dev_attr_firmware_version); in sony_input_configured()
2710 sc->fw_version = 0; in sony_input_configured()
2711 sc->hw_version = 0; in sony_input_configured()
2712 hid_err(sc->hdev, "can't create sysfs firmware_version attribute err: %d\n", ret); in sony_input_configured()
2716 ret = device_create_file(&sc->hdev->dev, &dev_attr_hardware_version); in sony_input_configured()
2718 sc->hw_version = 0; in sony_input_configured()
2719 hid_err(sc->hdev, "can't create sysfs hardware_version attribute err: %d\n", ret); in sony_input_configured()
2727 ret = sony_register_touchpad(sc, 2, 1920, 942, 0, 0, 0); in sony_input_configured()
2729 hid_err(sc->hdev, in sony_input_configured()
2735 ret = sony_register_sensors(sc); in sony_input_configured()
2737 hid_err(sc->hdev, in sony_input_configured()
2742 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { in sony_input_configured()
2743 sc->ds4_bt_poll_interval = DS4_BT_DEFAULT_POLL_INTERVAL_MS; in sony_input_configured()
2744 ret = device_create_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_input_configured()
2746 hid_warn(sc->hdev, in sony_input_configured()
2751 if (sc->quirks & DUALSHOCK4_DONGLE) { in sony_input_configured()
2752 INIT_WORK(&sc->hotplug_worker, dualshock4_calibration_work); in sony_input_configured()
2753 sc->hotplug_worker_initialized = 1; in sony_input_configured()
2754 sc->ds4_dongle_state = DONGLE_DISCONNECTED; in sony_input_configured()
2757 sony_init_output_report(sc, dualshock4_send_output_report); in sony_input_configured()
2758 } else if (sc->quirks & NSG_MRXU_REMOTE) { in sony_input_configured()
2763 ret = sony_register_touchpad(sc, 2, in sony_input_configured()
2766 hid_err(sc->hdev, in sony_input_configured()
2772 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_input_configured()
2773 sony_init_output_report(sc, motion_send_output_report); in sony_input_configured()
2778 if (sc->quirks & SONY_LED_SUPPORT) { in sony_input_configured()
2779 ret = sony_leds_init(sc); in sony_input_configured()
2784 if (sc->quirks & SONY_BATTERY_SUPPORT) { in sony_input_configured()
2785 ret = sony_battery_probe(sc, append_dev_id); in sony_input_configured()
2797 if (sc->quirks & SONY_FF_SUPPORT) { in sony_input_configured()
2798 ret = sony_init_ff(sc); in sony_input_configured()
2811 if (sc->ds4_bt_poll_interval) in sony_input_configured()
2812 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_input_configured()
2813 if (sc->fw_version) in sony_input_configured()
2814 device_remove_file(&sc->hdev->dev, &dev_attr_firmware_version); in sony_input_configured()
2815 if (sc->hw_version) in sony_input_configured()
2816 device_remove_file(&sc->hdev->dev, &dev_attr_hardware_version); in sony_input_configured()
2817 sony_cancel_work_sync(sc); in sony_input_configured()
2818 sony_remove_dev_list(sc); in sony_input_configured()
2819 sony_release_device_id(sc); in sony_input_configured()
2827 struct sony_sc *sc; in sony_probe() local
2836 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL); in sony_probe()
2837 if (sc == NULL) { in sony_probe()
2842 spin_lock_init(&sc->lock); in sony_probe()
2844 sc->quirks = quirks; in sony_probe()
2845 hid_set_drvdata(hdev, sc); in sony_probe()
2846 sc->hdev = hdev; in sony_probe()
2854 if (sc->quirks & VAIO_RDESC_CONSTANT) in sony_probe()
2856 else if (sc->quirks & SIXAXIS_CONTROLLER) in sony_probe()
2865 if (sc->quirks & (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)) in sony_probe()
2893 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_remove() local
2897 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_remove()
2898 device_remove_file(&sc->hdev->dev, &dev_attr_bt_poll_interval); in sony_remove()
2900 if (sc->fw_version) in sony_remove()
2901 device_remove_file(&sc->hdev->dev, &dev_attr_firmware_version); in sony_remove()
2903 if (sc->hw_version) in sony_remove()
2904 device_remove_file(&sc->hdev->dev, &dev_attr_hardware_version); in sony_remove()
2906 sony_cancel_work_sync(sc); in sony_remove()
2908 sony_remove_dev_list(sc); in sony_remove()
2910 sony_release_device_id(sc); in sony_remove()
2923 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_suspend() local
2925 sc->left = sc->right = 0; in sony_suspend()
2926 sony_send_output_report(sc); in sony_suspend()
2935 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_resume() local
2941 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_resume()
2942 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_resume()
2943 sixaxis_set_operational_usb(sc->hdev); in sony_resume()
2944 sc->defer_initialization = 1; in sony_resume()