Lines Matching refs:sc

1117 	struct sony_sc *sc = hid_get_drvdata(hdev);  in sony_report_fixup()  local
1123 if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 && in sony_report_fixup()
1140 if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) { in sony_report_fixup()
1144 } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) { in sony_report_fixup()
1150 if (sc->quirks & SIXAXIS_CONTROLLER) in sony_report_fixup()
1153 if (sc->quirks & MOTION_CONTROLLER) in sony_report_fixup()
1156 if (sc->quirks & NAVIGATION_CONTROLLER) in sony_report_fixup()
1159 if (sc->quirks & PS3REMOTE) in sony_report_fixup()
1165 static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size) in sixaxis_parse_report() argument
1178 offset = (sc->quirks & MOTION_CONTROLLER) ? 12 : 30; in sixaxis_parse_report()
1191 spin_lock_irqsave(&sc->lock, flags); in sixaxis_parse_report()
1192 sc->cable_state = cable_state; in sixaxis_parse_report()
1193 sc->battery_capacity = battery_capacity; in sixaxis_parse_report()
1194 sc->battery_charging = battery_charging; in sixaxis_parse_report()
1195 spin_unlock_irqrestore(&sc->lock, flags); in sixaxis_parse_report()
1198 static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size) in dualshock4_parse_report() argument
1200 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, in dualshock4_parse_report()
1211 offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32; in dualshock4_parse_report()
1237 spin_lock_irqsave(&sc->lock, flags); in dualshock4_parse_report()
1238 sc->cable_state = cable_state; in dualshock4_parse_report()
1239 sc->battery_capacity = battery_capacity; in dualshock4_parse_report()
1240 sc->battery_charging = battery_charging; in dualshock4_parse_report()
1241 spin_unlock_irqrestore(&sc->lock, flags); in dualshock4_parse_report()
1273 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_raw_event() local
1279 if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1296 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1297 } else if ((sc->quirks & MOTION_CONTROLLER_BT) && rd[0] == 0x01 && size == 49) { in sony_raw_event()
1298 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1299 } else if ((sc->quirks & NAVIGATION_CONTROLLER) && rd[0] == 0x01 && in sony_raw_event()
1301 sixaxis_parse_report(sc, rd, size); in sony_raw_event()
1302 } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 && in sony_raw_event()
1303 size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_raw_event()
1305 dualshock4_parse_report(sc, rd, size); in sony_raw_event()
1315 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_mapping() local
1317 if (sc->quirks & BUZZ_CONTROLLER) { in sony_mapping()
1340 if (sc->quirks & PS3REMOTE) in sony_mapping()
1366 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_input_configured() local
1373 if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_input_configured()
1376 hid_err(sc->hdev, in sony_input_configured()
1469 static void sixaxis_set_leds_from_id(struct sony_sc *sc) in sixaxis_set_leds_from_id() argument
1484 int id = sc->device_id; in sixaxis_set_leds_from_id()
1492 memcpy(sc->led_state, sixaxis_leds[id], sizeof(sixaxis_leds[id])); in sixaxis_set_leds_from_id()
1495 static void dualshock4_set_leds_from_id(struct sony_sc *sc) in dualshock4_set_leds_from_id() argument
1508 int id = sc->device_id; in dualshock4_set_leds_from_id()
1516 memcpy(sc->led_state, color_code[id], sizeof(color_code[id])); in dualshock4_set_leds_from_id()
1519 static void buzz_set_leds(struct sony_sc *sc) in buzz_set_leds() argument
1521 struct hid_device *hdev = sc->hdev; in buzz_set_leds()
1531 value[1] = sc->led_state[0] ? 0xff : 0x00; in buzz_set_leds()
1532 value[2] = sc->led_state[1] ? 0xff : 0x00; in buzz_set_leds()
1533 value[3] = sc->led_state[2] ? 0xff : 0x00; in buzz_set_leds()
1534 value[4] = sc->led_state[3] ? 0xff : 0x00; in buzz_set_leds()
1540 static void sony_set_leds(struct sony_sc *sc) in sony_set_leds() argument
1542 if (!(sc->quirks & BUZZ_CONTROLLER)) in sony_set_leds()
1543 schedule_work(&sc->state_worker); in sony_set_leds()
1545 buzz_set_leds(sc); in sony_set_leds()
1660 static void sony_leds_remove(struct sony_sc *sc) in sony_leds_remove() argument
1665 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_remove()
1667 for (n = 0; n < sc->led_count; n++) { in sony_leds_remove()
1668 led = sc->leds[n]; in sony_leds_remove()
1669 sc->leds[n] = NULL; in sony_leds_remove()
1676 sc->led_count = 0; in sony_leds_remove()
1679 static int sony_leds_init(struct sony_sc *sc) in sony_leds_init() argument
1681 struct hid_device *hdev = sc->hdev; in sony_leds_init()
1694 BUG_ON(!(sc->quirks & SONY_LED_SUPPORT)); in sony_leds_init()
1696 if (sc->quirks & BUZZ_CONTROLLER) { in sony_leds_init()
1697 sc->led_count = 4; in sony_leds_init()
1704 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_leds_init()
1705 dualshock4_set_leds_from_id(sc); in sony_leds_init()
1706 sc->led_state[3] = 1; in sony_leds_init()
1707 sc->led_count = 4; in sony_leds_init()
1713 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_leds_init()
1714 sc->led_count = 3; in sony_leds_init()
1719 } else if (sc->quirks & NAVIGATION_CONTROLLER) { in sony_leds_init()
1722 memcpy(sc->led_state, navigation_leds, sizeof(navigation_leds)); in sony_leds_init()
1723 sc->led_count = 1; in sony_leds_init()
1729 sixaxis_set_leds_from_id(sc); in sony_leds_init()
1730 sc->led_count = 4; in sony_leds_init()
1742 sony_set_leds(sc); in sony_leds_init()
1746 for (n = 0; n < sc->led_count; n++) { in sony_leds_init()
1765 led->brightness = sc->led_state[n]; in sony_leds_init()
1773 sc->leds[n] = led; in sony_leds_init()
1778 sc->leds[n] = NULL; in sony_leds_init()
1787 sony_leds_remove(sc); in sony_leds_init()
1806 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); in sixaxis_state_worker() local
1808 (struct sixaxis_output_report *)sc->output_report_dmabuf; in sixaxis_state_worker()
1815 report->rumble.right_motor_on = sc->right ? 1 : 0; in sixaxis_state_worker()
1816 report->rumble.left_motor_force = sc->left; in sixaxis_state_worker()
1819 report->leds_bitmap |= sc->led_state[0] << 1; in sixaxis_state_worker()
1820 report->leds_bitmap |= sc->led_state[1] << 2; in sixaxis_state_worker()
1821 report->leds_bitmap |= sc->led_state[2] << 3; in sixaxis_state_worker()
1822 report->leds_bitmap |= sc->led_state[3] << 4; in sixaxis_state_worker()
1838 if (sc->led_delay_on[n] || sc->led_delay_off[n]) { in sixaxis_state_worker()
1839 report->led[3 - n].duty_off = sc->led_delay_off[n]; in sixaxis_state_worker()
1840 report->led[3 - n].duty_on = sc->led_delay_on[n]; in sixaxis_state_worker()
1844 hid_hw_raw_request(sc->hdev, report->report_id, (__u8 *)report, in sixaxis_state_worker()
1851 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); in dualshock4_state_worker() local
1852 struct hid_device *hdev = sc->hdev; in dualshock4_state_worker()
1853 __u8 *buf = sc->output_report_dmabuf; in dualshock4_state_worker()
1856 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { in dualshock4_state_worker()
1870 buf[offset++] = sc->right; in dualshock4_state_worker()
1871 buf[offset++] = sc->left; in dualshock4_state_worker()
1877 if (sc->led_state[3]) { in dualshock4_state_worker()
1878 buf[offset++] = sc->led_state[0]; in dualshock4_state_worker()
1879 buf[offset++] = sc->led_state[1]; in dualshock4_state_worker()
1880 buf[offset++] = sc->led_state[2]; in dualshock4_state_worker()
1886 buf[offset++] = sc->led_delay_on[3]; in dualshock4_state_worker()
1887 buf[offset++] = sc->led_delay_off[3]; in dualshock4_state_worker()
1889 if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) in dualshock4_state_worker()
1898 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); in motion_state_worker() local
1899 struct hid_device *hdev = sc->hdev; in motion_state_worker()
1901 (struct motion_output_report_02 *)sc->output_report_dmabuf; in motion_state_worker()
1906 report->r = sc->led_state[0]; in motion_state_worker()
1907 report->g = sc->led_state[1]; in motion_state_worker()
1908 report->b = sc->led_state[2]; in motion_state_worker()
1911 report->rumble = max(sc->right, sc->left); in motion_state_worker()
1917 static int sony_allocate_output_report(struct sony_sc *sc) in sony_allocate_output_report() argument
1919 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_allocate_output_report()
1920 (sc->quirks & NAVIGATION_CONTROLLER)) in sony_allocate_output_report()
1921 sc->output_report_dmabuf = in sony_allocate_output_report()
1924 else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) in sony_allocate_output_report()
1925 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x11_SIZE, in sony_allocate_output_report()
1927 else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) in sony_allocate_output_report()
1928 sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x05_SIZE, in sony_allocate_output_report()
1930 else if (sc->quirks & MOTION_CONTROLLER) in sony_allocate_output_report()
1931 sc->output_report_dmabuf = kmalloc(MOTION_REPORT_0x02_SIZE, in sony_allocate_output_report()
1936 if (!sc->output_report_dmabuf) in sony_allocate_output_report()
1947 struct sony_sc *sc = hid_get_drvdata(hid); in sony_play_effect() local
1952 sc->left = effect->u.rumble.strong_magnitude / 256; in sony_play_effect()
1953 sc->right = effect->u.rumble.weak_magnitude / 256; in sony_play_effect()
1955 schedule_work(&sc->state_worker); in sony_play_effect()
1959 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
1961 struct hid_input *hidinput = list_entry(sc->hdev->inputs.next, in sony_init_ff()
1970 static int sony_init_ff(struct sony_sc *sc) in sony_init_ff() argument
1981 struct sony_sc *sc = power_supply_get_drvdata(psy); in sony_battery_get_property() local
1986 spin_lock_irqsave(&sc->lock, flags); in sony_battery_get_property()
1987 battery_charging = sc->battery_charging; in sony_battery_get_property()
1988 battery_capacity = sc->battery_capacity; in sony_battery_get_property()
1989 cable_state = sc->cable_state; in sony_battery_get_property()
1990 spin_unlock_irqrestore(&sc->lock, flags); in sony_battery_get_property()
2018 static int sony_battery_probe(struct sony_sc *sc) in sony_battery_probe() argument
2020 struct power_supply_config psy_cfg = { .drv_data = sc, }; in sony_battery_probe()
2021 struct hid_device *hdev = sc->hdev; in sony_battery_probe()
2028 sc->battery_capacity = 100; in sony_battery_probe()
2030 sc->battery_desc.properties = sony_battery_props; in sony_battery_probe()
2031 sc->battery_desc.num_properties = ARRAY_SIZE(sony_battery_props); in sony_battery_probe()
2032 sc->battery_desc.get_property = sony_battery_get_property; in sony_battery_probe()
2033 sc->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in sony_battery_probe()
2034 sc->battery_desc.use_for_apm = 0; in sony_battery_probe()
2035 sc->battery_desc.name = kasprintf(GFP_KERNEL, in sony_battery_probe()
2037 sc->mac_address); in sony_battery_probe()
2038 if (!sc->battery_desc.name) in sony_battery_probe()
2041 sc->battery = power_supply_register(&hdev->dev, &sc->battery_desc, in sony_battery_probe()
2043 if (IS_ERR(sc->battery)) { in sony_battery_probe()
2044 ret = PTR_ERR(sc->battery); in sony_battery_probe()
2049 power_supply_powers(sc->battery, &hdev->dev); in sony_battery_probe()
2053 kfree(sc->battery_desc.name); in sony_battery_probe()
2054 sc->battery_desc.name = NULL; in sony_battery_probe()
2058 static void sony_battery_remove(struct sony_sc *sc) in sony_battery_remove() argument
2060 if (!sc->battery_desc.name) in sony_battery_remove()
2063 power_supply_unregister(sc->battery); in sony_battery_remove()
2064 kfree(sc->battery_desc.name); in sony_battery_remove()
2065 sc->battery_desc.name = NULL; in sony_battery_remove()
2074 static int sony_check_add_dev_list(struct sony_sc *sc) in sony_check_add_dev_list() argument
2083 ret = memcmp(sc->mac_address, entry->mac_address, in sony_check_add_dev_list()
2084 sizeof(sc->mac_address)); in sony_check_add_dev_list()
2087 hid_info(sc->hdev, "controller with MAC address %pMR already connected\n", in sony_check_add_dev_list()
2088 sc->mac_address); in sony_check_add_dev_list()
2094 list_add(&(sc->list_node), &sony_device_list); in sony_check_add_dev_list()
2101 static void sony_remove_dev_list(struct sony_sc *sc) in sony_remove_dev_list() argument
2105 if (sc->list_node.next) { in sony_remove_dev_list()
2107 list_del(&(sc->list_node)); in sony_remove_dev_list()
2112 static int sony_get_bt_devaddr(struct sony_sc *sc) in sony_get_bt_devaddr() argument
2117 ret = strlen(sc->hdev->uniq); in sony_get_bt_devaddr()
2121 ret = sscanf(sc->hdev->uniq, in sony_get_bt_devaddr()
2123 &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3], in sony_get_bt_devaddr()
2124 &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]); in sony_get_bt_devaddr()
2132 static int sony_check_add(struct sony_sc *sc) in sony_check_add() argument
2137 if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) || in sony_check_add()
2138 (sc->quirks & MOTION_CONTROLLER_BT) || in sony_check_add()
2139 (sc->quirks & NAVIGATION_CONTROLLER_BT) || in sony_check_add()
2140 (sc->quirks & SIXAXIS_CONTROLLER_BT)) { in sony_check_add()
2147 if (sony_get_bt_devaddr(sc) < 0) { in sony_check_add()
2148 hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n"); in sony_check_add()
2151 } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { in sony_check_add()
2161 ret = hid_hw_raw_request(sc->hdev, 0x81, buf, in sony_check_add()
2166 hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n"); in sony_check_add()
2171 memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); in sony_check_add()
2172 } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_check_add()
2173 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_check_add()
2183 ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, in sony_check_add()
2188 hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n"); in sony_check_add()
2198 sc->mac_address[5-n] = buf[4+n]; in sony_check_add()
2203 ret = sony_check_add_dev_list(sc); in sony_check_add()
2212 static int sony_set_device_id(struct sony_sc *sc) in sony_set_device_id() argument
2220 if ((sc->quirks & SIXAXIS_CONTROLLER) || in sony_set_device_id()
2221 (sc->quirks & DUALSHOCK4_CONTROLLER)) { in sony_set_device_id()
2225 sc->device_id = -1; in sony_set_device_id()
2228 sc->device_id = ret; in sony_set_device_id()
2230 sc->device_id = -1; in sony_set_device_id()
2236 static void sony_release_device_id(struct sony_sc *sc) in sony_release_device_id() argument
2238 if (sc->device_id >= 0) { in sony_release_device_id()
2239 ida_simple_remove(&sony_device_id_allocator, sc->device_id); in sony_release_device_id()
2240 sc->device_id = -1; in sony_release_device_id()
2244 static inline void sony_init_work(struct sony_sc *sc, in sony_init_work() argument
2247 if (!sc->worker_initialized) in sony_init_work()
2248 INIT_WORK(&sc->state_worker, worker); in sony_init_work()
2250 sc->worker_initialized = 1; in sony_init_work()
2253 static inline void sony_cancel_work_sync(struct sony_sc *sc) in sony_cancel_work_sync() argument
2255 if (sc->worker_initialized) in sony_cancel_work_sync()
2256 cancel_work_sync(&sc->state_worker); in sony_cancel_work_sync()
2263 struct sony_sc *sc; in sony_probe() local
2266 sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL); in sony_probe()
2267 if (sc == NULL) { in sony_probe()
2272 spin_lock_init(&sc->lock); in sony_probe()
2274 sc->quirks = quirks; in sony_probe()
2275 hid_set_drvdata(hdev, sc); in sony_probe()
2276 sc->hdev = hdev; in sony_probe()
2284 if (sc->quirks & VAIO_RDESC_CONSTANT) in sony_probe()
2286 else if (sc->quirks & SIXAXIS_CONTROLLER) in sony_probe()
2295 ret = sony_set_device_id(sc); in sony_probe()
2301 ret = sony_allocate_output_report(sc); in sony_probe()
2307 if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || in sony_probe()
2308 (sc->quirks & NAVIGATION_CONTROLLER_USB)) { in sony_probe()
2322 sony_init_work(sc, sixaxis_state_worker); in sony_probe()
2323 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) || in sony_probe()
2324 (sc->quirks & NAVIGATION_CONTROLLER_BT)) { in sony_probe()
2331 sony_init_work(sc, sixaxis_state_worker); in sony_probe()
2332 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { in sony_probe()
2333 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { in sony_probe()
2346 sony_init_work(sc, dualshock4_state_worker); in sony_probe()
2347 } else if (sc->quirks & MOTION_CONTROLLER) { in sony_probe()
2348 sony_init_work(sc, motion_state_worker); in sony_probe()
2356 ret = sony_check_add(sc); in sony_probe()
2360 if (sc->quirks & SONY_LED_SUPPORT) { in sony_probe()
2361 ret = sony_leds_init(sc); in sony_probe()
2366 if (sc->quirks & SONY_BATTERY_SUPPORT) { in sony_probe()
2367 ret = sony_battery_probe(sc); in sony_probe()
2379 if (sc->quirks & SONY_FF_SUPPORT) { in sony_probe()
2380 ret = sony_init_ff(sc); in sony_probe()
2389 if (sc->quirks & SONY_LED_SUPPORT) in sony_probe()
2390 sony_leds_remove(sc); in sony_probe()
2391 if (sc->quirks & SONY_BATTERY_SUPPORT) in sony_probe()
2392 sony_battery_remove(sc); in sony_probe()
2393 sony_cancel_work_sync(sc); in sony_probe()
2394 kfree(sc->output_report_dmabuf); in sony_probe()
2395 sony_remove_dev_list(sc); in sony_probe()
2396 sony_release_device_id(sc); in sony_probe()
2403 struct sony_sc *sc = hid_get_drvdata(hdev); in sony_remove() local
2405 if (sc->quirks & SONY_LED_SUPPORT) in sony_remove()
2406 sony_leds_remove(sc); in sony_remove()
2408 if (sc->quirks & SONY_BATTERY_SUPPORT) { in sony_remove()
2410 sony_battery_remove(sc); in sony_remove()
2413 sony_cancel_work_sync(sc); in sony_remove()
2415 kfree(sc->output_report_dmabuf); in sony_remove()
2417 sony_remove_dev_list(sc); in sony_remove()
2419 sony_release_device_id(sc); in sony_remove()