Lines Matching refs:sc

891 	struct sony_sc *sc = hid_get_drvdata(hdev);  in sony_report_fixup()  local
897 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 && in sony_report_fixup()
914 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) { in sony_report_fixup()
918 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) { in sony_report_fixup()
924 if (sc->quirks & SIXAXIS_CONTROLLER) in sony_report_fixup()
927 if (sc->quirks & PS3REMOTE) in sony_report_fixup()
933 static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size) in sixaxis_parse_report() argument
956 spin_lock_irqsave(&sc->lock, flags); in sixaxis_parse_report()
957 sc->cable_state = cable_state; in sixaxis_parse_report()
958 sc->battery_capacity = battery_capacity; in sixaxis_parse_report()
959 sc->battery_charging = battery_charging; in sixaxis_parse_report()
960 spin_unlock_irqrestore(&sc->lock, flags); in sixaxis_parse_report()
963 static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size) in dualshock4_parse_report() argument
965 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, in dualshock4_parse_report()
976 offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32; in dualshock4_parse_report()
1002 spin_lock_irqsave(&sc->lock, flags); in dualshock4_parse_report()
1003 sc->cable_state = cable_state; in dualshock4_parse_report()
1004 sc->battery_capacity = battery_capacity; in dualshock4_parse_report()
1005 sc->battery_charging = battery_charging; in dualshock4_parse_report()
1006 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_parse_report()
1038 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_raw_event() local
1044 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1050 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1051 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 && in sony_raw_event()
1052 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_raw_event()
1054 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1064 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_mapping() local
1066 if (sc->quirks & BUZZ_CONTROLLER) { in sony_mapping()
1089 if (sc->quirks & PS3REMOTE) in sony_mapping()
1115 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_input_configured() local
1121 if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_input_configured()
1123 hid_err(sc->hdev, in sony_input_configured()
1275 static void sony_set_leds(struct sony_sc *sc, const __u8 *leds, int count) in sony_set_leds() argument
1281 if (sc->quirks & BUZZ_CONTROLLER && count == 4) { in sony_set_leds()
1282 buzz_set_leds(sc->hdev, leds); in sony_set_leds()
1285 sc->led_state[n] = leds[n]; in sony_set_leds()
1286 schedule_work(&sc->state_worker); in sony_set_leds()
1403 static void sony_leds_remove(struct sony_sc *sc) in sony_leds_remove() argument
1408 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_remove()
1410 for (n = 0; n < sc->led_count; n++) { in sony_leds_remove()
1411 led = sc->leds[n]; in sony_leds_remove()
1412 sc->leds[n] = NULL; in sony_leds_remove()
1419 sc->led_count = 0; in sony_leds_remove()
1422 static int sony_leds_init(struct sony_sc *sc) in sony_leds_init() argument
1424 struct hid_device *hdev = sc->hdev; in sony_leds_init()
1438 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_init()
1440 if (sc->quirks & BUZZ_CONTROLLER) { in sony_leds_init()
1441 sc->led_count = 4; in sony_leds_init()
1448 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_leds_init()
1449 dualshock4_set_leds_from_id(sc->device_id, initial_values); in sony_leds_init()
1451 sc->led_count = 4; in sony_leds_init()
1458 sixaxis_set_leds_from_id(sc->device_id, initial_values); in sony_leds_init()
1459 sc->led_count = 4; in sony_leds_init()
1471 sony_set_leds(sc, initial_values, sc->led_count); in sony_leds_init()
1475 for (n = 0; n < sc->led_count; n++) { in sony_leds_init()
1502 sc->leds[n] = led; in sony_leds_init()
1507 sc->leds[n] = NULL; in sony_leds_init()
1516 sony_leds_remove(sc); in sony_leds_init()
1535 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); in sixaxis_state_worker() local
1537 (struct sixaxis_output_report *)sc->output_report_dmabuf; in sixaxis_state_worker()
1544 report->rumble.right_motor_on = sc->right ? 1 : 0; in sixaxis_state_worker()
1545 report->rumble.left_motor_force = sc->left; in sixaxis_state_worker()
1548 report->leds_bitmap |= sc->led_state[0] << 1; in sixaxis_state_worker()
1549 report->leds_bitmap |= sc->led_state[1] << 2; in sixaxis_state_worker()
1550 report->leds_bitmap |= sc->led_state[2] << 3; in sixaxis_state_worker()
1551 report->leds_bitmap |= sc->led_state[3] << 4; in sixaxis_state_worker()
1567 if (sc->led_delay_on[n] || sc->led_delay_off[n]) { in sixaxis_state_worker()
1568 report->led[3 - n].duty_off = sc->led_delay_off[n]; in sixaxis_state_worker()
1569 report->led[3 - n].duty_on = sc->led_delay_on[n]; in sixaxis_state_worker()
1573 hid_hw_raw_request(sc->hdev, report->report_id, (__u8 *)report, in sixaxis_state_worker()
1580 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); in dualshock4_state_worker() local
1581 struct hid_device *hdev = sc->hdev; in dualshock4_state_worker()
1582 __u8 *buf = sc->output_report_dmabuf; in dualshock4_state_worker()
1585 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { in dualshock4_state_worker()
1599 buf[offset++] = sc->right; in dualshock4_state_worker()
1600 buf[offset++] = sc->left; in dualshock4_state_worker()
1606 if (sc->led_state[3]) { in dualshock4_state_worker()
1607 buf[offset++] = sc->led_state[0]; in dualshock4_state_worker()
1608 buf[offset++] = sc->led_state[1]; in dualshock4_state_worker()
1609 buf[offset++] = sc->led_state[2]; in dualshock4_state_worker()
1615 buf[offset++] = sc->led_delay_on[3]; in dualshock4_state_worker()
1616 buf[offset++] = sc->led_delay_off[3]; in dualshock4_state_worker()
1618 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) in dualshock4_state_worker()
1625 static int sony_allocate_output_report(struct sony_sc *sc) in sony_allocate_output_report() argument
1627 if (sc->quirks & SIXAXIS_CONTROLLER) in sony_allocate_output_report()
1628 sc->output_report_dmabuf = in sony_allocate_output_report()
1631 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_allocate_output_report()
1632 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x11_SIZE, in sony_allocate_output_report()
1634 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) in sony_allocate_output_report()
1635 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x05_SIZE, in sony_allocate_output_report()
1640 if (!sc->output_report_dmabuf) in sony_allocate_output_report()
1651 struct sony_sc *sc = hid_get_drvdata(hid); in sony_play_effect() local
1656 sc->left = effect->u.rumble.strong_magnitude / 256; in sony_play_effect()
1657 sc->right = effect->u.rumble.weak_magnitude / 256; in sony_play_effect()
1659 schedule_work(&sc->state_worker); in sony_play_effect()
1663 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
1665 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, in sony_init_ff()
1674 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
1685 struct sony_sc *sc = power_supply_get_drvdata(psy); in sony_battery_get_property() local
1690 spin_lock_irqsave(&sc->lock, flags); in sony_battery_get_property()
1691 battery_charging = sc->battery_charging; in sony_battery_get_property()
1692 battery_capacity = sc->battery_capacity; in sony_battery_get_property()
1693 cable_state = sc->cable_state; in sony_battery_get_property()
1694 spin_unlock_irqrestore(&sc->lock, flags); in sony_battery_get_property()
1722 static int sony_battery_probe(struct sony_sc *sc) in sony_battery_probe() argument
1724 struct power_supply_config psy_cfg = { .drv_data = sc, }; in sony_battery_probe()
1725 struct hid_device *hdev = sc->hdev; in sony_battery_probe()
1732 sc->battery_capacity = 100; in sony_battery_probe()
1734 sc->battery_desc.properties = sony_battery_props; in sony_battery_probe()
1735 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props); in sony_battery_probe()
1736 sc->battery_desc.get_property = sony_battery_get_property; in sony_battery_probe()
1737 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in sony_battery_probe()
1738 sc->battery_desc.use_for_apm = 0; in sony_battery_probe()
1739 sc->battery_desc.name = kasprintf(GFP_KERNEL, in sony_battery_probe()
1741 sc->mac_address); in sony_battery_probe()
1742 if (!sc->battery_desc.name) in sony_battery_probe()
1745 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc, in sony_battery_probe()
1747 if (IS_ERR(sc->battery)) { in sony_battery_probe()
1748 ret = PTR_ERR(sc->battery); in sony_battery_probe()
1753 power_supply_powers(sc->battery, &hdev->dev); in sony_battery_probe()
1757 kfree(sc->battery_desc.name); in sony_battery_probe()
1758 sc->battery_desc.name = NULL; in sony_battery_probe()
1762 static void sony_battery_remove(struct sony_sc *sc) in sony_battery_remove() argument
1764 if (!sc->battery_desc.name) in sony_battery_remove()
1767 power_supply_unregister(sc->battery); in sony_battery_remove()
1768 kfree(sc->battery_desc.name); in sony_battery_remove()
1769 sc->battery_desc.name = NULL; in sony_battery_remove()
1778 static int sony_check_add_dev_list(struct sony_sc *sc) in sony_check_add_dev_list() argument
1787 ret = memcmp(sc->mac_address, entry->mac_address, in sony_check_add_dev_list()
1788 sizeof(sc->mac_address)); in sony_check_add_dev_list()
1791 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n", in sony_check_add_dev_list()
1792 sc->mac_address); in sony_check_add_dev_list()
1798 list_add(&(sc->list_node), &sony_device_list); in sony_check_add_dev_list()
1805 static void sony_remove_dev_list(struct sony_sc *sc) in sony_remove_dev_list() argument
1809 if (sc->list_node.next) { in sony_remove_dev_list()
1811 list_del(&(sc->list_node)); in sony_remove_dev_list()
1816 static int sony_get_bt_devaddr(struct sony_sc *sc) in sony_get_bt_devaddr() argument
1821 ret = strlen(sc->hdev->uniq); in sony_get_bt_devaddr()
1825 ret = sscanf(sc->hdev->uniq, in sony_get_bt_devaddr()
1827 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3], in sony_get_bt_devaddr()
1828 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]); in sony_get_bt_devaddr()
1836 static int sony_check_add(struct sony_sc *sc) in sony_check_add() argument
1841 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) || in sony_check_add()
1842 (sc->quirks & SIXAXIS_CONTROLLER_BT)) { in sony_check_add()
1849 if (sony_get_bt_devaddr(sc) < 0) { in sony_check_add()
1850 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n"); in sony_check_add()
1853 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { in sony_check_add()
1863 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, in sony_check_add()
1868 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n"); in sony_check_add()
1873 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); in sony_check_add()
1874 } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) { in sony_check_add()
1884 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, in sony_check_add()
1889 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n"); in sony_check_add()
1899 sc->mac_address[5-n] = buf[4+n]; in sony_check_add()
1904 ret = sony_check_add_dev_list(sc); in sony_check_add()
1913 static int sony_set_device_id(struct sony_sc *sc) in sony_set_device_id() argument
1921 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_set_device_id()
1922 (sc->quirks & DUALSHOCK4_CONTROLLER)) { in sony_set_device_id()
1926 sc->device_id = -1; in sony_set_device_id()
1929 sc->device_id = ret; in sony_set_device_id()
1931 sc->device_id = -1; in sony_set_device_id()
1937 static void sony_release_device_id(struct sony_sc *sc) in sony_release_device_id() argument
1939 if (sc->device_id >= 0) { in sony_release_device_id()
1940 ida_simple_remove(&sony_device_id_allocator, sc->device_id); in sony_release_device_id()
1941 sc->device_id = -1; in sony_release_device_id()
1945 static inline void sony_init_work(struct sony_sc *sc, in sony_init_work() argument
1948 if (!sc->worker_initialized) in sony_init_work()
1949 INIT_WORK(&sc->state_worker, worker); in sony_init_work()
1951 sc->worker_initialized = 1; in sony_init_work()
1954 static inline void sony_cancel_work_sync(struct sony_sc *sc) in sony_cancel_work_sync() argument
1956 if (sc->worker_initialized) in sony_cancel_work_sync()
1957 cancel_work_sync(&sc->state_worker); in sony_cancel_work_sync()
1964 struct sony_sc *sc; in sony_probe() local
1967 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL); in sony_probe()
1968 if (sc == NULL) { in sony_probe()
1973 spin_lock_init(&sc->lock); in sony_probe()
1975 sc->quirks = quirks; in sony_probe()
1976 hid_set_drvdata(hdev, sc); in sony_probe()
1977 sc->hdev = hdev; in sony_probe()
1985 if (sc->quirks & VAIO_RDESC_CONSTANT) in sony_probe()
1987 else if (sc->quirks & SIXAXIS_CONTROLLER) in sony_probe()
1996 ret = sony_allocate_output_report(sc); in sony_probe()
2002 ret = sony_set_device_id(sc); in sony_probe()
2008 if (sc->quirks & SIXAXIS_CONTROLLER_USB) { in sony_probe()
2022 sony_init_work(sc, sixaxis_state_worker); in sony_probe()
2023 } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) { in sony_probe()
2030 sony_init_work(sc, sixaxis_state_worker); in sony_probe()
2031 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_probe()
2032 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { in sony_probe()
2045 sony_init_work(sc, dualshock4_state_worker); in sony_probe()
2053 ret = sony_check_add(sc); in sony_probe()
2057 if (sc->quirks & SONY_LED_SUPPORT) { in sony_probe()
2058 ret = sony_leds_init(sc); in sony_probe()
2063 if (sc->quirks & SONY_BATTERY_SUPPORT) { in sony_probe()
2064 ret = sony_battery_probe(sc); in sony_probe()
2076 if (sc->quirks & SONY_FF_SUPPORT) { in sony_probe()
2077 ret = sony_init_ff(sc); in sony_probe()
2086 if (sc->quirks & SONY_LED_SUPPORT) in sony_probe()
2087 sony_leds_remove(sc); in sony_probe()
2088 if (sc->quirks & SONY_BATTERY_SUPPORT) in sony_probe()
2089 sony_battery_remove(sc); in sony_probe()
2090 sony_cancel_work_sync(sc); in sony_probe()
2091 kfree(sc->output_report_dmabuf); in sony_probe()
2092 sony_remove_dev_list(sc); in sony_probe()
2093 sony_release_device_id(sc); in sony_probe()
2100 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_remove() local
2102 if (sc->quirks & SONY_LED_SUPPORT) in sony_remove()
2103 sony_leds_remove(sc); in sony_remove()
2105 if (sc->quirks & SONY_BATTERY_SUPPORT) { in sony_remove()
2107 sony_battery_remove(sc); in sony_remove()
2110 sony_cancel_work_sync(sc); in sony_remove()
2112 kfree(sc->output_report_dmabuf); in sony_remove()
2114 sony_remove_dev_list(sc); in sony_remove()
2116 sony_release_device_id(sc); in sony_remove()