Lines Matching refs:steam

128 static int steam_recv_report(struct steam_device *steam,  in steam_recv_report()  argument
135 r = steam->hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0]; in steam_recv_report()
149 ret = hid_hw_raw_request(steam->hdev, 0x00, in steam_recv_report()
158 static int steam_send_report(struct steam_device *steam, in steam_send_report() argument
166 r = steam->hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0]; in steam_send_report()
184 ret = hid_hw_raw_request(steam->hdev, 0, in steam_send_report()
194 hid_err(steam->hdev, "%s: error %d (%*ph)\n", __func__, in steam_send_report()
199 static inline int steam_send_report_byte(struct steam_device *steam, u8 cmd) in steam_send_report_byte() argument
201 return steam_send_report(steam, &cmd, 1); in steam_send_report_byte()
204 static int steam_write_registers(struct steam_device *steam, in steam_write_registers() argument
213 va_start(args, steam); in steam_write_registers()
226 return steam_send_report(steam, cmd, 2 + cmd[1]); in steam_write_registers()
229 static int steam_get_serial(struct steam_device *steam) in steam_get_serial() argument
239 ret = steam_send_report(steam, cmd, sizeof(cmd)); in steam_get_serial()
242 ret = steam_recv_report(steam, reply, sizeof(reply)); in steam_get_serial()
248 strlcpy(steam->serial_no, reply + 3, sizeof(steam->serial_no)); in steam_get_serial()
257 static inline int steam_request_conn_status(struct steam_device *steam) in steam_request_conn_status() argument
259 return steam_send_report_byte(steam, STEAM_CMD_REQUEST_COMM_STATUS); in steam_request_conn_status()
262 static void steam_set_lizard_mode(struct steam_device *steam, bool enable) in steam_set_lizard_mode() argument
266 steam_send_report_byte(steam, STEAM_CMD_DEFAULT_MAPPINGS); in steam_set_lizard_mode()
268 steam_send_report_byte(steam, STEAM_CMD_DEFAULT_MOUSE); in steam_set_lizard_mode()
269 steam_write_registers(steam, in steam_set_lizard_mode()
274 steam_send_report_byte(steam, STEAM_CMD_CLEAR_MAPPINGS); in steam_set_lizard_mode()
275 steam_write_registers(steam, in steam_set_lizard_mode()
282 static void steam_update_lizard_mode(struct steam_device *steam) in steam_update_lizard_mode() argument
284 mutex_lock(&steam->mutex); in steam_update_lizard_mode()
285 if (!steam->client_opened) { in steam_update_lizard_mode()
286 if (steam->input_opened) in steam_update_lizard_mode()
287 steam_set_lizard_mode(steam, false); in steam_update_lizard_mode()
289 steam_set_lizard_mode(steam, lizard_mode); in steam_update_lizard_mode()
291 mutex_unlock(&steam->mutex); in steam_update_lizard_mode()
296 struct steam_device *steam = input_get_drvdata(dev); in steam_input_open() local
299 ret = hid_hw_open(steam->hdev); in steam_input_open()
303 mutex_lock(&steam->mutex); in steam_input_open()
304 steam->input_opened = true; in steam_input_open()
305 if (!steam->client_opened && lizard_mode) in steam_input_open()
306 steam_set_lizard_mode(steam, false); in steam_input_open()
307 mutex_unlock(&steam->mutex); in steam_input_open()
313 struct steam_device *steam = input_get_drvdata(dev); in steam_input_close() local
315 mutex_lock(&steam->mutex); in steam_input_close()
316 steam->input_opened = false; in steam_input_close()
317 if (!steam->client_opened && lizard_mode) in steam_input_close()
318 steam_set_lizard_mode(steam, true); in steam_input_close()
319 mutex_unlock(&steam->mutex); in steam_input_close()
321 hid_hw_close(steam->hdev); in steam_input_close()
335 struct steam_device *steam = power_supply_get_drvdata(psy); in steam_battery_get_property() local
341 spin_lock_irqsave(&steam->lock, flags); in steam_battery_get_property()
342 volts = steam->voltage; in steam_battery_get_property()
343 batt = steam->battery_charge; in steam_battery_get_property()
344 spin_unlock_irqrestore(&steam->lock, flags); in steam_battery_get_property()
366 static int steam_battery_register(struct steam_device *steam) in steam_battery_register() argument
369 struct power_supply_config battery_cfg = { .drv_data = steam, }; in steam_battery_register()
373 steam->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in steam_battery_register()
374 steam->battery_desc.properties = steam_battery_props; in steam_battery_register()
375 steam->battery_desc.num_properties = ARRAY_SIZE(steam_battery_props); in steam_battery_register()
376 steam->battery_desc.get_property = steam_battery_get_property; in steam_battery_register()
377 steam->battery_desc.name = devm_kasprintf(&steam->hdev->dev, in steam_battery_register()
379 steam->serial_no); in steam_battery_register()
380 if (!steam->battery_desc.name) in steam_battery_register()
384 spin_lock_irqsave(&steam->lock, flags); in steam_battery_register()
385 steam->voltage = 3000; in steam_battery_register()
386 steam->battery_charge = 100; in steam_battery_register()
387 spin_unlock_irqrestore(&steam->lock, flags); in steam_battery_register()
389 battery = power_supply_register(&steam->hdev->dev, in steam_battery_register()
390 &steam->battery_desc, &battery_cfg); in steam_battery_register()
393 hid_err(steam->hdev, in steam_battery_register()
398 rcu_assign_pointer(steam->battery, battery); in steam_battery_register()
399 power_supply_powers(battery, &steam->hdev->dev); in steam_battery_register()
403 static int steam_register(struct steam_device *steam) in steam_register() argument
405 struct hid_device *hdev = steam->hdev; in steam_register()
410 input = rcu_dereference(steam->input); in steam_register()
421 if (steam_get_serial(steam) < 0) in steam_register()
422 strlcpy(steam->serial_no, "XXXXXXXXXX", in steam_register()
423 sizeof(steam->serial_no)); in steam_register()
426 steam->serial_no); in steam_register()
432 input_set_drvdata(input, steam); in steam_register()
437 input->name = (steam->quirks & STEAM_QUIRK_WIRELESS) ? in steam_register()
441 input->uniq = steam->serial_no; in steam_register()
494 rcu_assign_pointer(steam->input, input); in steam_register()
497 if (steam->quirks & STEAM_QUIRK_WIRELESS) in steam_register()
498 steam_battery_register(steam); in steam_register()
507 static void steam_unregister(struct steam_device *steam) in steam_unregister() argument
513 input = rcu_dereference(steam->input); in steam_unregister()
514 battery = rcu_dereference(steam->battery); in steam_unregister()
518 RCU_INIT_POINTER(steam->battery, NULL); in steam_unregister()
523 RCU_INIT_POINTER(steam->input, NULL); in steam_unregister()
525 hid_info(steam->hdev, "Steam Controller '%s' disconnected", in steam_unregister()
526 steam->serial_no); in steam_unregister()
533 struct steam_device *steam = container_of(work, struct steam_device, in steam_work_connect_cb() local
539 spin_lock_irqsave(&steam->lock, flags); in steam_work_connect_cb()
540 connected = steam->connected; in steam_work_connect_cb()
541 spin_unlock_irqrestore(&steam->lock, flags); in steam_work_connect_cb()
544 ret = steam_register(steam); in steam_work_connect_cb()
546 hid_err(steam->hdev, in steam_work_connect_cb()
551 steam_unregister(steam); in steam_work_connect_cb()
576 struct steam_device *steam = hdev->driver_data; in steam_client_ll_parse() local
578 return hid_parse_report(hdev, steam->hdev->dev_rdesc, in steam_client_ll_parse()
579 steam->hdev->dev_rsize); in steam_client_ll_parse()
593 struct steam_device *steam = hdev->driver_data; in steam_client_ll_open() local
596 ret = hid_hw_open(steam->hdev); in steam_client_ll_open()
600 mutex_lock(&steam->mutex); in steam_client_ll_open()
601 steam->client_opened = true; in steam_client_ll_open()
602 mutex_unlock(&steam->mutex); in steam_client_ll_open()
608 struct steam_device *steam = hdev->driver_data; in steam_client_ll_close() local
610 mutex_lock(&steam->mutex); in steam_client_ll_close()
611 steam->client_opened = false; in steam_client_ll_close()
612 if (steam->input_opened) in steam_client_ll_close()
613 steam_set_lizard_mode(steam, false); in steam_client_ll_close()
615 steam_set_lizard_mode(steam, lizard_mode); in steam_client_ll_close()
616 mutex_unlock(&steam->mutex); in steam_client_ll_close()
618 hid_hw_close(steam->hdev); in steam_client_ll_close()
626 struct steam_device *steam = hdev->driver_data; in steam_client_ll_raw_request() local
628 return hid_hw_raw_request(steam->hdev, reportnum, buf, count, in steam_client_ll_raw_request()
673 struct steam_device *steam; in steam_probe() local
696 steam = devm_kzalloc(&hdev->dev, sizeof(*steam), GFP_KERNEL); in steam_probe()
697 if (!steam) { in steam_probe()
701 steam->hdev = hdev; in steam_probe()
702 hid_set_drvdata(hdev, steam); in steam_probe()
703 spin_lock_init(&steam->lock); in steam_probe()
704 mutex_init(&steam->mutex); in steam_probe()
705 steam->quirks = id->driver_data; in steam_probe()
706 INIT_WORK(&steam->work_connect, steam_work_connect_cb); in steam_probe()
708 steam->client_hdev = steam_create_client_hid(hdev); in steam_probe()
709 if (IS_ERR(steam->client_hdev)) { in steam_probe()
710 ret = PTR_ERR(steam->client_hdev); in steam_probe()
713 steam->client_hdev->driver_data = steam; in steam_probe()
723 ret = hid_add_device(steam->client_hdev); in steam_probe()
727 if (steam->quirks & STEAM_QUIRK_WIRELESS) { in steam_probe()
736 steam_request_conn_status(steam); in steam_probe()
738 ret = steam_register(steam); in steam_probe()
748 steam_update_lizard_mode(steam); in steam_probe()
749 list_add(&steam->list, &steam_devices); in steam_probe()
759 hid_destroy_device(steam->client_hdev); in steam_probe()
761 cancel_work_sync(&steam->work_connect); in steam_probe()
770 struct steam_device *steam = hid_get_drvdata(hdev); in steam_remove() local
772 if (!steam || hdev->group == HID_GROUP_STEAM) { in steam_remove()
778 list_del(&steam->list); in steam_remove()
781 hid_destroy_device(steam->client_hdev); in steam_remove()
782 steam->client_opened = false; in steam_remove()
783 cancel_work_sync(&steam->work_connect); in steam_remove()
784 if (steam->quirks & STEAM_QUIRK_WIRELESS) { in steam_remove()
789 steam_unregister(steam); in steam_remove()
792 static void steam_do_connect_event(struct steam_device *steam, bool connected) in steam_do_connect_event() argument
796 spin_lock_irqsave(&steam->lock, flags); in steam_do_connect_event()
797 steam->connected = connected; in steam_do_connect_event()
798 spin_unlock_irqrestore(&steam->lock, flags); in steam_do_connect_event()
800 if (schedule_work(&steam->work_connect) == 0) in steam_do_connect_event()
883 static void steam_do_input_event(struct steam_device *steam, in steam_do_input_event() argument
962 static void steam_do_battery_event(struct steam_device *steam, in steam_do_battery_event() argument
972 battery = rcu_dereference(steam->battery); in steam_do_battery_event()
974 spin_lock_irqsave(&steam->lock, flags); in steam_do_battery_event()
975 steam->voltage = volts; in steam_do_battery_event()
976 steam->battery_charge = batt; in steam_do_battery_event()
977 spin_unlock_irqrestore(&steam->lock, flags); in steam_do_battery_event()
987 struct steam_device *steam = hid_get_drvdata(hdev); in steam_raw_event() local
991 if (!steam) in steam_raw_event()
994 if (steam->client_opened) in steam_raw_event()
995 hid_input_report(steam->client_hdev, HID_FEATURE_REPORT, in steam_raw_event()
1018 if (steam->client_opened) in steam_raw_event()
1021 input = rcu_dereference(steam->input); in steam_raw_event()
1023 steam_do_input_event(steam, input, data); in steam_raw_event()
1027 steam_do_connect_event(steam, true); in steam_raw_event()
1039 steam_do_connect_event(steam, false); in steam_raw_event()
1042 steam_do_connect_event(steam, true); in steam_raw_event()
1047 if (steam->quirks & STEAM_QUIRK_WIRELESS) { in steam_raw_event()
1049 battery = rcu_dereference(steam->battery); in steam_raw_event()
1051 steam_do_battery_event(steam, battery, data); in steam_raw_event()
1056 steam_do_connect_event(steam, true); in steam_raw_event()
1068 struct steam_device *steam; in steam_param_set_lizard_mode() local
1076 list_for_each_entry(steam, &steam_devices, list) { in steam_param_set_lizard_mode()
1077 steam_update_lizard_mode(steam); in steam_param_set_lizard_mode()