Lines Matching refs:pcu
183 static void ims_pcu_buttons_report(struct ims_pcu *pcu, u32 data) in ims_pcu_buttons_report() argument
185 struct ims_pcu_buttons *buttons = &pcu->buttons; in ims_pcu_buttons_report()
199 static int ims_pcu_setup_buttons(struct ims_pcu *pcu, in ims_pcu_setup_buttons() argument
203 struct ims_pcu_buttons *buttons = &pcu->buttons; in ims_pcu_setup_buttons()
210 dev_err(pcu->dev, "Not enough memory for input device\n"); in ims_pcu_setup_buttons()
215 "IMS PCU#%d Button Interface", pcu->device_no); in ims_pcu_setup_buttons()
217 usb_make_path(pcu->udev, buttons->phys, sizeof(buttons->phys)); in ims_pcu_setup_buttons()
224 usb_to_input_id(pcu->udev, &input->id); in ims_pcu_setup_buttons()
225 input->dev.parent = &pcu->ctrl_intf->dev; in ims_pcu_setup_buttons()
238 dev_err(pcu->dev, in ims_pcu_setup_buttons()
249 static void ims_pcu_destroy_buttons(struct ims_pcu *pcu) in ims_pcu_destroy_buttons() argument
251 struct ims_pcu_buttons *buttons = &pcu->buttons; in ims_pcu_destroy_buttons()
261 static void ims_pcu_gamepad_report(struct ims_pcu *pcu, u32 data) in ims_pcu_gamepad_report() argument
263 struct ims_pcu_gamepad *gamepad = pcu->gamepad; in ims_pcu_gamepad_report()
283 static int ims_pcu_setup_gamepad(struct ims_pcu *pcu) in ims_pcu_setup_gamepad() argument
292 dev_err(pcu->dev, in ims_pcu_setup_gamepad()
301 "IMS PCU#%d Gamepad Interface", pcu->device_no); in ims_pcu_setup_gamepad()
303 usb_make_path(pcu->udev, gamepad->phys, sizeof(gamepad->phys)); in ims_pcu_setup_gamepad()
308 usb_to_input_id(pcu->udev, &input->id); in ims_pcu_setup_gamepad()
309 input->dev.parent = &pcu->ctrl_intf->dev; in ims_pcu_setup_gamepad()
325 dev_err(pcu->dev, in ims_pcu_setup_gamepad()
331 pcu->gamepad = gamepad; in ims_pcu_setup_gamepad()
340 static void ims_pcu_destroy_gamepad(struct ims_pcu *pcu) in ims_pcu_destroy_gamepad() argument
342 struct ims_pcu_gamepad *gamepad = pcu->gamepad; in ims_pcu_destroy_gamepad()
407 static void ims_pcu_report_events(struct ims_pcu *pcu) in ims_pcu_report_events() argument
409 u32 data = get_unaligned_be32(&pcu->read_buf[3]); in ims_pcu_report_events()
411 ims_pcu_buttons_report(pcu, data & ~IMS_PCU_GAMEPAD_MASK); in ims_pcu_report_events()
412 if (pcu->gamepad) in ims_pcu_report_events()
413 ims_pcu_gamepad_report(pcu, data); in ims_pcu_report_events()
416 static void ims_pcu_handle_response(struct ims_pcu *pcu) in ims_pcu_handle_response() argument
418 switch (pcu->read_buf[0]) { in ims_pcu_handle_response()
420 if (likely(pcu->setup_complete)) in ims_pcu_handle_response()
421 ims_pcu_report_events(pcu); in ims_pcu_handle_response()
430 if (pcu->read_buf[0] == pcu->expected_response && in ims_pcu_handle_response()
431 pcu->read_buf[1] == pcu->ack_id - 1) { in ims_pcu_handle_response()
433 memcpy(pcu->cmd_buf, pcu->read_buf, pcu->read_pos); in ims_pcu_handle_response()
434 pcu->cmd_buf_len = pcu->read_pos; in ims_pcu_handle_response()
435 complete(&pcu->cmd_done); in ims_pcu_handle_response()
441 static void ims_pcu_process_data(struct ims_pcu *pcu, struct urb *urb) in ims_pcu_process_data() argument
446 u8 data = pcu->urb_in_buf[i]; in ims_pcu_process_data()
449 if (!pcu->have_stx && data != IMS_PCU_PROTOCOL_STX) in ims_pcu_process_data()
452 if (pcu->have_dle) { in ims_pcu_process_data()
453 pcu->have_dle = false; in ims_pcu_process_data()
454 pcu->read_buf[pcu->read_pos++] = data; in ims_pcu_process_data()
455 pcu->check_sum += data; in ims_pcu_process_data()
461 if (pcu->have_stx) in ims_pcu_process_data()
462 dev_warn(pcu->dev, in ims_pcu_process_data()
464 pcu->read_pos); in ims_pcu_process_data()
465 pcu->have_stx = true; in ims_pcu_process_data()
466 pcu->have_dle = false; in ims_pcu_process_data()
467 pcu->read_pos = 0; in ims_pcu_process_data()
468 pcu->check_sum = 0; in ims_pcu_process_data()
472 pcu->have_dle = true; in ims_pcu_process_data()
476 if (pcu->read_pos < IMS_PCU_MIN_PACKET_LEN) { in ims_pcu_process_data()
477 dev_warn(pcu->dev, in ims_pcu_process_data()
479 pcu->read_pos); in ims_pcu_process_data()
480 } else if (pcu->check_sum != 0) { in ims_pcu_process_data()
481 dev_warn(pcu->dev, in ims_pcu_process_data()
483 pcu->read_pos); in ims_pcu_process_data()
485 ims_pcu_handle_response(pcu); in ims_pcu_process_data()
488 pcu->have_stx = false; in ims_pcu_process_data()
489 pcu->have_dle = false; in ims_pcu_process_data()
490 pcu->read_pos = 0; in ims_pcu_process_data()
494 pcu->read_buf[pcu->read_pos++] = data; in ims_pcu_process_data()
495 pcu->check_sum += data; in ims_pcu_process_data()
508 static int ims_pcu_send_cmd_chunk(struct ims_pcu *pcu, in ims_pcu_send_cmd_chunk() argument
513 error = usb_bulk_msg(pcu->udev, in ims_pcu_send_cmd_chunk()
514 usb_sndbulkpipe(pcu->udev, in ims_pcu_send_cmd_chunk()
515 pcu->ep_out->bEndpointAddress), in ims_pcu_send_cmd_chunk()
516 pcu->urb_out_buf, len, in ims_pcu_send_cmd_chunk()
519 dev_dbg(pcu->dev, in ims_pcu_send_cmd_chunk()
528 static int ims_pcu_send_command(struct ims_pcu *pcu, in ims_pcu_send_command() argument
539 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_STX; in ims_pcu_send_command()
542 pcu->urb_out_buf[count++] = command; in ims_pcu_send_command()
545 ack_id = pcu->ack_id++; in ims_pcu_send_command()
547 ack_id = pcu->ack_id++; in ims_pcu_send_command()
550 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
552 pcu->urb_out_buf[count++] = ack_id; in ims_pcu_send_command()
558 if (count + delta >= pcu->max_out_size) { in ims_pcu_send_command()
559 error = ims_pcu_send_cmd_chunk(pcu, command, in ims_pcu_send_command()
568 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
570 pcu->urb_out_buf[count++] = data[i]; in ims_pcu_send_command()
577 if (count + delta >= pcu->max_out_size) { in ims_pcu_send_command()
578 error = ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); in ims_pcu_send_command()
586 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
588 pcu->urb_out_buf[count++] = csum; in ims_pcu_send_command()
589 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_ETX; in ims_pcu_send_command()
591 return ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); in ims_pcu_send_command()
594 static int __ims_pcu_execute_command(struct ims_pcu *pcu, in __ims_pcu_execute_command() argument
600 pcu->expected_response = expected_response; in __ims_pcu_execute_command()
601 init_completion(&pcu->cmd_done); in __ims_pcu_execute_command()
603 error = ims_pcu_send_command(pcu, command, data, len); in __ims_pcu_execute_command()
608 !wait_for_completion_timeout(&pcu->cmd_done, in __ims_pcu_execute_command()
610 dev_dbg(pcu->dev, "Command 0x%02x timed out\n", command); in __ims_pcu_execute_command()
617 #define ims_pcu_execute_command(pcu, code, data, len) \ argument
618 __ims_pcu_execute_command(pcu, \
623 #define ims_pcu_execute_query(pcu, code) \ argument
624 ims_pcu_execute_command(pcu, code, NULL, 0)
648 static int __ims_pcu_execute_bl_command(struct ims_pcu *pcu, in __ims_pcu_execute_bl_command() argument
654 pcu->cmd_buf[0] = command; in __ims_pcu_execute_bl_command()
656 memcpy(&pcu->cmd_buf[1], data, len); in __ims_pcu_execute_bl_command()
658 error = __ims_pcu_execute_command(pcu, in __ims_pcu_execute_bl_command()
659 IMS_PCU_CMD_BOOTLOADER, pcu->cmd_buf, len + 1, in __ims_pcu_execute_bl_command()
663 dev_err(pcu->dev, in __ims_pcu_execute_bl_command()
665 pcu->cmd_buf[0], error); in __ims_pcu_execute_bl_command()
669 if (expected_response && pcu->cmd_buf[2] != expected_response) { in __ims_pcu_execute_bl_command()
670 dev_err(pcu->dev, in __ims_pcu_execute_bl_command()
672 pcu->cmd_buf[2], expected_response); in __ims_pcu_execute_bl_command()
679 #define ims_pcu_execute_bl_command(pcu, code, data, len, timeout) \ argument
680 __ims_pcu_execute_bl_command(pcu, \
690 static int ims_pcu_get_info(struct ims_pcu *pcu) in ims_pcu_get_info() argument
694 error = ims_pcu_execute_query(pcu, GET_INFO); in ims_pcu_get_info()
696 dev_err(pcu->dev, in ims_pcu_get_info()
701 memcpy(pcu->part_number, in ims_pcu_get_info()
702 &pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], in ims_pcu_get_info()
703 sizeof(pcu->part_number)); in ims_pcu_get_info()
704 memcpy(pcu->date_of_manufacturing, in ims_pcu_get_info()
705 &pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], in ims_pcu_get_info()
706 sizeof(pcu->date_of_manufacturing)); in ims_pcu_get_info()
707 memcpy(pcu->serial_number, in ims_pcu_get_info()
708 &pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], in ims_pcu_get_info()
709 sizeof(pcu->serial_number)); in ims_pcu_get_info()
714 static int ims_pcu_set_info(struct ims_pcu *pcu) in ims_pcu_set_info() argument
718 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], in ims_pcu_set_info()
719 pcu->part_number, sizeof(pcu->part_number)); in ims_pcu_set_info()
720 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], in ims_pcu_set_info()
721 pcu->date_of_manufacturing, sizeof(pcu->date_of_manufacturing)); in ims_pcu_set_info()
722 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], in ims_pcu_set_info()
723 pcu->serial_number, sizeof(pcu->serial_number)); in ims_pcu_set_info()
725 error = ims_pcu_execute_command(pcu, SET_INFO, in ims_pcu_set_info()
726 &pcu->cmd_buf[IMS_PCU_DATA_OFFSET], in ims_pcu_set_info()
729 dev_err(pcu->dev, in ims_pcu_set_info()
738 static int ims_pcu_switch_to_bootloader(struct ims_pcu *pcu) in ims_pcu_switch_to_bootloader() argument
743 error = ims_pcu_execute_command(pcu, JUMP_TO_BTLDR, NULL, 0); in ims_pcu_switch_to_bootloader()
745 dev_err(pcu->dev, in ims_pcu_switch_to_bootloader()
779 static int ims_pcu_verify_block(struct ims_pcu *pcu, in ims_pcu_verify_block() argument
785 fragment = (void *)&pcu->cmd_buf[1]; in ims_pcu_verify_block()
789 error = ims_pcu_execute_bl_command(pcu, READ_APP, NULL, 5, in ims_pcu_verify_block()
792 dev_err(pcu->dev, in ims_pcu_verify_block()
798 fragment = (void *)&pcu->cmd_buf[IMS_PCU_BL_DATA_OFFSET]; in ims_pcu_verify_block()
801 dev_err(pcu->dev, in ims_pcu_verify_block()
809 dev_err(pcu->dev, in ims_pcu_verify_block()
818 static int ims_pcu_flash_firmware(struct ims_pcu *pcu, in ims_pcu_flash_firmware() argument
829 error = ims_pcu_execute_bl_command(pcu, ERASE_APP, NULL, 0, 2000); in ims_pcu_flash_firmware()
831 dev_err(pcu->dev, in ims_pcu_flash_firmware()
847 if (len > sizeof(pcu->cmd_buf) - 1 - sizeof(*fragment)) { in ims_pcu_flash_firmware()
848 dev_err(pcu->dev, in ims_pcu_flash_firmware()
853 fragment = (void *)&pcu->cmd_buf[1]; in ims_pcu_flash_firmware()
858 error = ims_pcu_execute_bl_command(pcu, PROGRAM_DEVICE, in ims_pcu_flash_firmware()
862 dev_err(pcu->dev, in ims_pcu_flash_firmware()
868 if (addr >= pcu->fw_start_addr && addr < pcu->fw_end_addr) { in ims_pcu_flash_firmware()
869 error = ims_pcu_verify_block(pcu, addr, len, rec->data); in ims_pcu_flash_firmware()
875 pcu->update_firmware_status = (count * 100) / n_fw_records; in ims_pcu_flash_firmware()
880 error = ims_pcu_execute_bl_command(pcu, PROGRAM_COMPLETE, in ims_pcu_flash_firmware()
883 dev_err(pcu->dev, in ims_pcu_flash_firmware()
890 static int ims_pcu_handle_firmware_update(struct ims_pcu *pcu, in ims_pcu_handle_firmware_update() argument
896 dev_info(pcu->dev, "Updating firmware %s, size: %zu\n", in ims_pcu_handle_firmware_update()
901 retval = ims_pcu_flash_firmware(pcu, fw, n_fw_records); in ims_pcu_handle_firmware_update()
905 retval = ims_pcu_execute_bl_command(pcu, LAUNCH_APP, NULL, 0, 0); in ims_pcu_handle_firmware_update()
907 dev_err(pcu->dev, in ims_pcu_handle_firmware_update()
912 pcu->update_firmware_status = retval; in ims_pcu_handle_firmware_update()
913 sysfs_notify(&pcu->dev->kobj, NULL, "update_firmware_status"); in ims_pcu_handle_firmware_update()
920 struct ims_pcu *pcu = context; in ims_pcu_process_async_firmware() local
924 dev_err(pcu->dev, "Failed to get firmware %s\n", in ims_pcu_process_async_firmware()
931 dev_err(pcu->dev, "Firmware %s is invalid\n", in ims_pcu_process_async_firmware()
936 scoped_guard(mutex, &pcu->cmd_mutex) in ims_pcu_process_async_firmware()
937 ims_pcu_handle_firmware_update(pcu, fw); in ims_pcu_process_async_firmware()
942 complete(&pcu->async_firmware_done); in ims_pcu_process_async_firmware()
956 struct ims_pcu *pcu = in ims_pcu_backlight_set_brightness() local
961 guard(mutex)(&pcu->cmd_mutex); in ims_pcu_backlight_set_brightness()
963 error = ims_pcu_execute_command(pcu, SET_BRIGHTNESS, in ims_pcu_backlight_set_brightness()
966 dev_warn(pcu->dev, in ims_pcu_backlight_set_brightness()
978 struct ims_pcu *pcu = in ims_pcu_backlight_get_brightness() local
983 guard(mutex)(&pcu->cmd_mutex); in ims_pcu_backlight_get_brightness()
985 error = ims_pcu_execute_query(pcu, GET_BRIGHTNESS); in ims_pcu_backlight_get_brightness()
987 dev_warn(pcu->dev, in ims_pcu_backlight_get_brightness()
994 get_unaligned_le16(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); in ims_pcu_backlight_get_brightness()
1000 static int ims_pcu_setup_backlight(struct ims_pcu *pcu) in ims_pcu_setup_backlight() argument
1002 struct ims_pcu_backlight *backlight = &pcu->backlight; in ims_pcu_setup_backlight()
1006 "pcu%d::kbd_backlight", pcu->device_no); in ims_pcu_setup_backlight()
1014 error = led_classdev_register(pcu->dev, &backlight->cdev); in ims_pcu_setup_backlight()
1016 dev_err(pcu->dev, in ims_pcu_setup_backlight()
1025 static void ims_pcu_destroy_backlight(struct ims_pcu *pcu) in ims_pcu_destroy_backlight() argument
1027 struct ims_pcu_backlight *backlight = &pcu->backlight; in ims_pcu_destroy_backlight()
1048 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_attribute_show() local
1051 char *field = (char *)pcu + attr->field_offset; in ims_pcu_attribute_show()
1062 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_attribute_store() local
1065 char *field = (char *)pcu + attr->field_offset; in ims_pcu_attribute_store()
1076 scoped_cond_guard(mutex_intr, return -EINTR, &pcu->cmd_mutex) { in ims_pcu_attribute_store()
1080 error = ims_pcu_set_info(pcu); in ims_pcu_attribute_store()
1086 ims_pcu_get_info(pcu); in ims_pcu_attribute_store()
1123 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_reset_device() local
1134 dev_info(pcu->dev, "Attempting to reset device\n"); in ims_pcu_reset_device()
1136 error = ims_pcu_execute_command(pcu, PCU_RESET, &reset_byte, 1); in ims_pcu_reset_device()
1138 dev_info(pcu->dev, in ims_pcu_reset_device()
1154 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_update_firmware_store() local
1166 error = request_ihex_firmware(&fw, IMS_PCU_FIRMWARE_NAME, pcu->dev); in ims_pcu_update_firmware_store()
1168 dev_err(pcu->dev, "Failed to request firmware %s, error: %d\n", in ims_pcu_update_firmware_store()
1173 scoped_cond_guard(mutex_intr, return -EINTR, &pcu->cmd_mutex) { in ims_pcu_update_firmware_store()
1182 if (pcu->bootloader_mode) in ims_pcu_update_firmware_store()
1183 error = ims_pcu_handle_firmware_update(pcu, fw); in ims_pcu_update_firmware_store()
1185 error = ims_pcu_switch_to_bootloader(pcu); in ims_pcu_update_firmware_store()
1203 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_update_firmware_status_show() local
1205 return sysfs_emit(buf, "%d\n", pcu->update_firmware_status); in ims_pcu_update_firmware_status_show()
1229 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_is_attr_visible() local
1232 if (pcu->bootloader_mode) { in ims_pcu_is_attr_visible()
1255 static int ims_pcu_read_ofn_config(struct ims_pcu *pcu, u8 addr, u8 *data) in ims_pcu_read_ofn_config() argument
1260 error = ims_pcu_execute_command(pcu, OFN_GET_CONFIG, in ims_pcu_read_ofn_config()
1265 result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET); in ims_pcu_read_ofn_config()
1270 *data = pcu->cmd_buf[OFN_REG_RESULT_OFFSET]; in ims_pcu_read_ofn_config()
1274 static int ims_pcu_write_ofn_config(struct ims_pcu *pcu, u8 addr, u8 data) in ims_pcu_write_ofn_config() argument
1280 error = ims_pcu_execute_command(pcu, OFN_SET_CONFIG, in ims_pcu_write_ofn_config()
1285 result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET); in ims_pcu_write_ofn_config()
1297 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_data_show() local
1301 scoped_guard(mutex, &pcu->cmd_mutex) { in ims_pcu_ofn_reg_data_show()
1302 error = ims_pcu_read_ofn_config(pcu, pcu->ofn_reg_addr, &data); in ims_pcu_ofn_reg_data_show()
1315 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_data_store() local
1323 guard(mutex)(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_store()
1325 error = ims_pcu_write_ofn_config(pcu, pcu->ofn_reg_addr, value); in ims_pcu_ofn_reg_data_store()
1340 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_addr_show() local
1342 guard(mutex)(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_show()
1344 return sysfs_emit(buf, "%x\n", pcu->ofn_reg_addr); in ims_pcu_ofn_reg_addr_show()
1352 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_addr_store() local
1360 guard(mutex)(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_store()
1362 pcu->ofn_reg_addr = value; in ims_pcu_ofn_reg_addr_store()
1381 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_bit_show() local
1387 scoped_guard(mutex, &pcu->cmd_mutex) { in ims_pcu_ofn_bit_show()
1388 error = ims_pcu_read_ofn_config(pcu, attr->addr, &data); in ims_pcu_ofn_bit_show()
1401 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_bit_store() local
1415 scoped_guard(mutex, &pcu->cmd_mutex) { in ims_pcu_ofn_bit_store()
1416 error = ims_pcu_read_ofn_config(pcu, attr->addr, &data); in ims_pcu_ofn_bit_store()
1425 error = ims_pcu_write_ofn_config(pcu, attr->addr, data); in ims_pcu_ofn_bit_store()
1468 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_is_attr_visible() local
1474 if (pcu->bootloader_mode || pcu->device_id == IMS_PCU_PCU_B_DEVICE_ID) in ims_pcu_ofn_is_attr_visible()
1488 struct ims_pcu *pcu = urb->context; in ims_pcu_irq() local
1501 dev_dbg(pcu->dev, "%s - urb shutting down with status: %d\n", in ims_pcu_irq()
1505 dev_dbg(pcu->dev, "%s - nonzero urb status received: %d\n", in ims_pcu_irq()
1510 dev_dbg(pcu->dev, "%s: received %d: %*ph\n", __func__, in ims_pcu_irq()
1511 urb->actual_length, urb->actual_length, pcu->urb_in_buf); in ims_pcu_irq()
1513 if (urb == pcu->urb_in) in ims_pcu_irq()
1514 ims_pcu_process_data(pcu, urb); in ims_pcu_irq()
1519 dev_err(pcu->dev, "%s - usb_submit_urb failed with result %d\n", in ims_pcu_irq()
1523 static int ims_pcu_buffers_alloc(struct ims_pcu *pcu) in ims_pcu_buffers_alloc() argument
1527 pcu->urb_in_buf = usb_alloc_coherent(pcu->udev, pcu->max_in_size, in ims_pcu_buffers_alloc()
1528 GFP_KERNEL, &pcu->read_dma); in ims_pcu_buffers_alloc()
1529 if (!pcu->urb_in_buf) { in ims_pcu_buffers_alloc()
1530 dev_err(pcu->dev, in ims_pcu_buffers_alloc()
1535 pcu->urb_in = usb_alloc_urb(0, GFP_KERNEL); in ims_pcu_buffers_alloc()
1536 if (!pcu->urb_in) { in ims_pcu_buffers_alloc()
1537 dev_err(pcu->dev, "Failed to allocate input URB\n"); in ims_pcu_buffers_alloc()
1542 pcu->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ims_pcu_buffers_alloc()
1543 pcu->urb_in->transfer_dma = pcu->read_dma; in ims_pcu_buffers_alloc()
1545 usb_fill_bulk_urb(pcu->urb_in, pcu->udev, in ims_pcu_buffers_alloc()
1546 usb_rcvbulkpipe(pcu->udev, in ims_pcu_buffers_alloc()
1547 pcu->ep_in->bEndpointAddress), in ims_pcu_buffers_alloc()
1548 pcu->urb_in_buf, pcu->max_in_size, in ims_pcu_buffers_alloc()
1549 ims_pcu_irq, pcu); in ims_pcu_buffers_alloc()
1555 pcu->urb_out_buf = kmalloc(pcu->max_out_size, GFP_KERNEL); in ims_pcu_buffers_alloc()
1556 if (!pcu->urb_out_buf) { in ims_pcu_buffers_alloc()
1557 dev_err(pcu->dev, "Failed to allocate memory for write buffer\n"); in ims_pcu_buffers_alloc()
1562 pcu->urb_ctrl_buf = usb_alloc_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1563 GFP_KERNEL, &pcu->ctrl_dma); in ims_pcu_buffers_alloc()
1564 if (!pcu->urb_ctrl_buf) { in ims_pcu_buffers_alloc()
1565 dev_err(pcu->dev, in ims_pcu_buffers_alloc()
1571 pcu->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL); in ims_pcu_buffers_alloc()
1572 if (!pcu->urb_ctrl) { in ims_pcu_buffers_alloc()
1573 dev_err(pcu->dev, "Failed to allocate input URB\n"); in ims_pcu_buffers_alloc()
1578 pcu->urb_ctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ims_pcu_buffers_alloc()
1579 pcu->urb_ctrl->transfer_dma = pcu->ctrl_dma; in ims_pcu_buffers_alloc()
1581 usb_fill_int_urb(pcu->urb_ctrl, pcu->udev, in ims_pcu_buffers_alloc()
1582 usb_rcvintpipe(pcu->udev, in ims_pcu_buffers_alloc()
1583 pcu->ep_ctrl->bEndpointAddress), in ims_pcu_buffers_alloc()
1584 pcu->urb_ctrl_buf, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1585 ims_pcu_irq, pcu, pcu->ep_ctrl->bInterval); in ims_pcu_buffers_alloc()
1590 usb_free_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1591 pcu->urb_ctrl_buf, pcu->ctrl_dma); in ims_pcu_buffers_alloc()
1593 kfree(pcu->urb_out_buf); in ims_pcu_buffers_alloc()
1595 usb_free_urb(pcu->urb_in); in ims_pcu_buffers_alloc()
1597 usb_free_coherent(pcu->udev, pcu->max_in_size, in ims_pcu_buffers_alloc()
1598 pcu->urb_in_buf, pcu->read_dma); in ims_pcu_buffers_alloc()
1602 static void ims_pcu_buffers_free(struct ims_pcu *pcu) in ims_pcu_buffers_free() argument
1604 usb_kill_urb(pcu->urb_in); in ims_pcu_buffers_free()
1605 usb_free_urb(pcu->urb_in); in ims_pcu_buffers_free()
1607 usb_free_coherent(pcu->udev, pcu->max_out_size, in ims_pcu_buffers_free()
1608 pcu->urb_in_buf, pcu->read_dma); in ims_pcu_buffers_free()
1610 kfree(pcu->urb_out_buf); in ims_pcu_buffers_free()
1612 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_buffers_free()
1613 usb_free_urb(pcu->urb_ctrl); in ims_pcu_buffers_free()
1615 usb_free_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_free()
1616 pcu->urb_ctrl_buf, pcu->ctrl_dma); in ims_pcu_buffers_free()
1665 static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pcu) in ims_pcu_parse_cdc_data() argument
1674 pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev, in ims_pcu_parse_cdc_data()
1676 if (!pcu->ctrl_intf) in ims_pcu_parse_cdc_data()
1679 alt = pcu->ctrl_intf->cur_altsetting; in ims_pcu_parse_cdc_data()
1684 pcu->ep_ctrl = &alt->endpoint[0].desc; in ims_pcu_parse_cdc_data()
1685 pcu->max_ctrl_size = usb_endpoint_maxp(pcu->ep_ctrl); in ims_pcu_parse_cdc_data()
1687 pcu->data_intf = usb_ifnum_to_if(pcu->udev, in ims_pcu_parse_cdc_data()
1689 if (!pcu->data_intf) in ims_pcu_parse_cdc_data()
1692 alt = pcu->data_intf->cur_altsetting; in ims_pcu_parse_cdc_data()
1694 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1700 pcu->ep_out = &alt->endpoint[0].desc; in ims_pcu_parse_cdc_data()
1701 if (!usb_endpoint_is_bulk_out(pcu->ep_out)) { in ims_pcu_parse_cdc_data()
1702 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1707 pcu->max_out_size = usb_endpoint_maxp(pcu->ep_out); in ims_pcu_parse_cdc_data()
1708 if (pcu->max_out_size < 8) { in ims_pcu_parse_cdc_data()
1709 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1711 pcu->max_out_size); in ims_pcu_parse_cdc_data()
1715 pcu->ep_in = &alt->endpoint[1].desc; in ims_pcu_parse_cdc_data()
1716 if (!usb_endpoint_is_bulk_in(pcu->ep_in)) { in ims_pcu_parse_cdc_data()
1717 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1722 pcu->max_in_size = usb_endpoint_maxp(pcu->ep_in); in ims_pcu_parse_cdc_data()
1723 if (pcu->max_in_size < 8) { in ims_pcu_parse_cdc_data()
1724 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1726 pcu->max_in_size); in ims_pcu_parse_cdc_data()
1733 static int ims_pcu_start_io(struct ims_pcu *pcu) in ims_pcu_start_io() argument
1737 error = usb_submit_urb(pcu->urb_ctrl, GFP_KERNEL); in ims_pcu_start_io()
1739 dev_err(pcu->dev, in ims_pcu_start_io()
1745 error = usb_submit_urb(pcu->urb_in, GFP_KERNEL); in ims_pcu_start_io()
1747 dev_err(pcu->dev, in ims_pcu_start_io()
1750 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_start_io()
1757 static void ims_pcu_stop_io(struct ims_pcu *pcu) in ims_pcu_stop_io() argument
1759 usb_kill_urb(pcu->urb_in); in ims_pcu_stop_io()
1760 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_stop_io()
1763 static int ims_pcu_line_setup(struct ims_pcu *pcu) in ims_pcu_line_setup() argument
1765 struct usb_host_interface *interface = pcu->ctrl_intf->cur_altsetting; in ims_pcu_line_setup()
1766 struct usb_cdc_line_coding *line = (void *)pcu->cmd_buf; in ims_pcu_line_setup()
1773 error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), in ims_pcu_line_setup()
1780 dev_err(pcu->dev, "Failed to set line coding, error: %d\n", in ims_pcu_line_setup()
1785 error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), in ims_pcu_line_setup()
1791 dev_err(pcu->dev, "Failed to set line state, error: %d\n", in ims_pcu_line_setup()
1799 static int ims_pcu_get_device_info(struct ims_pcu *pcu) in ims_pcu_get_device_info() argument
1803 error = ims_pcu_get_info(pcu); in ims_pcu_get_device_info()
1807 error = ims_pcu_execute_query(pcu, GET_FW_VERSION); in ims_pcu_get_device_info()
1809 dev_err(pcu->dev, in ims_pcu_get_device_info()
1814 snprintf(pcu->fw_version, sizeof(pcu->fw_version), in ims_pcu_get_device_info()
1816 pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5], in ims_pcu_get_device_info()
1817 pcu->cmd_buf[6], pcu->cmd_buf[7]); in ims_pcu_get_device_info()
1819 error = ims_pcu_execute_query(pcu, GET_BL_VERSION); in ims_pcu_get_device_info()
1821 dev_err(pcu->dev, in ims_pcu_get_device_info()
1826 snprintf(pcu->bl_version, sizeof(pcu->bl_version), in ims_pcu_get_device_info()
1828 pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5], in ims_pcu_get_device_info()
1829 pcu->cmd_buf[6], pcu->cmd_buf[7]); in ims_pcu_get_device_info()
1831 error = ims_pcu_execute_query(pcu, RESET_REASON); in ims_pcu_get_device_info()
1833 dev_err(pcu->dev, in ims_pcu_get_device_info()
1838 snprintf(pcu->reset_reason, sizeof(pcu->reset_reason), in ims_pcu_get_device_info()
1839 "%02x", pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); in ims_pcu_get_device_info()
1841 dev_dbg(pcu->dev, in ims_pcu_get_device_info()
1843 pcu->part_number, in ims_pcu_get_device_info()
1844 pcu->date_of_manufacturing, in ims_pcu_get_device_info()
1845 pcu->serial_number, in ims_pcu_get_device_info()
1846 pcu->fw_version, in ims_pcu_get_device_info()
1847 pcu->bl_version, in ims_pcu_get_device_info()
1848 pcu->reset_reason); in ims_pcu_get_device_info()
1853 static int ims_pcu_identify_type(struct ims_pcu *pcu, u8 *device_id) in ims_pcu_identify_type() argument
1857 error = ims_pcu_execute_query(pcu, GET_DEVICE_ID); in ims_pcu_identify_type()
1859 dev_err(pcu->dev, in ims_pcu_identify_type()
1864 *device_id = pcu->cmd_buf[IMS_PCU_DATA_OFFSET]; in ims_pcu_identify_type()
1865 dev_dbg(pcu->dev, "Detected device ID: %d\n", *device_id); in ims_pcu_identify_type()
1870 static int ims_pcu_init_application_mode(struct ims_pcu *pcu) in ims_pcu_init_application_mode() argument
1877 error = ims_pcu_get_device_info(pcu); in ims_pcu_init_application_mode()
1883 error = ims_pcu_identify_type(pcu, &pcu->device_id); in ims_pcu_init_application_mode()
1885 dev_err(pcu->dev, in ims_pcu_init_application_mode()
1895 if (pcu->device_id >= ARRAY_SIZE(ims_pcu_device_info) || in ims_pcu_init_application_mode()
1896 !ims_pcu_device_info[pcu->device_id].keymap) { in ims_pcu_init_application_mode()
1897 dev_err(pcu->dev, "Device ID %d is not valid\n", pcu->device_id); in ims_pcu_init_application_mode()
1903 pcu->device_no = atomic_inc_return(&device_no); in ims_pcu_init_application_mode()
1905 error = ims_pcu_setup_backlight(pcu); in ims_pcu_init_application_mode()
1909 info = &ims_pcu_device_info[pcu->device_id]; in ims_pcu_init_application_mode()
1910 error = ims_pcu_setup_buttons(pcu, info->keymap, info->keymap_len); in ims_pcu_init_application_mode()
1915 error = ims_pcu_setup_gamepad(pcu); in ims_pcu_init_application_mode()
1920 pcu->setup_complete = true; in ims_pcu_init_application_mode()
1925 ims_pcu_destroy_buttons(pcu); in ims_pcu_init_application_mode()
1927 ims_pcu_destroy_backlight(pcu); in ims_pcu_init_application_mode()
1931 static void ims_pcu_destroy_application_mode(struct ims_pcu *pcu) in ims_pcu_destroy_application_mode() argument
1933 if (pcu->setup_complete) { in ims_pcu_destroy_application_mode()
1934 pcu->setup_complete = false; in ims_pcu_destroy_application_mode()
1937 if (pcu->gamepad) in ims_pcu_destroy_application_mode()
1938 ims_pcu_destroy_gamepad(pcu); in ims_pcu_destroy_application_mode()
1939 ims_pcu_destroy_buttons(pcu); in ims_pcu_destroy_application_mode()
1940 ims_pcu_destroy_backlight(pcu); in ims_pcu_destroy_application_mode()
1944 static int ims_pcu_init_bootloader_mode(struct ims_pcu *pcu) in ims_pcu_init_bootloader_mode() argument
1948 error = ims_pcu_execute_bl_command(pcu, QUERY_DEVICE, NULL, 0, in ims_pcu_init_bootloader_mode()
1951 dev_err(pcu->dev, "Bootloader does not respond, aborting\n"); in ims_pcu_init_bootloader_mode()
1955 pcu->fw_start_addr = in ims_pcu_init_bootloader_mode()
1956 get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 11]); in ims_pcu_init_bootloader_mode()
1957 pcu->fw_end_addr = in ims_pcu_init_bootloader_mode()
1958 get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 15]); in ims_pcu_init_bootloader_mode()
1960 dev_info(pcu->dev, in ims_pcu_init_bootloader_mode()
1962 pcu->fw_start_addr, pcu->fw_end_addr); in ims_pcu_init_bootloader_mode()
1966 pcu->dev, GFP_KERNEL, pcu, in ims_pcu_init_bootloader_mode()
1970 complete(&pcu->async_firmware_done); in ims_pcu_init_bootloader_mode()
1976 static void ims_pcu_destroy_bootloader_mode(struct ims_pcu *pcu) in ims_pcu_destroy_bootloader_mode() argument
1979 wait_for_completion(&pcu->async_firmware_done); in ims_pcu_destroy_bootloader_mode()
1991 struct ims_pcu *pcu; in ims_pcu_probe() local
1994 pcu = kzalloc_obj(*pcu); in ims_pcu_probe()
1995 if (!pcu) in ims_pcu_probe()
1998 pcu->dev = &intf->dev; in ims_pcu_probe()
1999 pcu->udev = udev; in ims_pcu_probe()
2000 pcu->bootloader_mode = id->driver_info == IMS_PCU_BOOTLOADER_MODE; in ims_pcu_probe()
2001 mutex_init(&pcu->cmd_mutex); in ims_pcu_probe()
2002 init_completion(&pcu->cmd_done); in ims_pcu_probe()
2003 init_completion(&pcu->async_firmware_done); in ims_pcu_probe()
2005 error = ims_pcu_parse_cdc_data(intf, pcu); in ims_pcu_probe()
2010 pcu->data_intf, pcu); in ims_pcu_probe()
2018 usb_set_intfdata(pcu->ctrl_intf, pcu); in ims_pcu_probe()
2020 error = ims_pcu_buffers_alloc(pcu); in ims_pcu_probe()
2024 error = ims_pcu_start_io(pcu); in ims_pcu_probe()
2028 error = ims_pcu_line_setup(pcu); in ims_pcu_probe()
2032 error = pcu->bootloader_mode ? in ims_pcu_probe()
2033 ims_pcu_init_bootloader_mode(pcu) : in ims_pcu_probe()
2034 ims_pcu_init_application_mode(pcu); in ims_pcu_probe()
2041 ims_pcu_stop_io(pcu); in ims_pcu_probe()
2043 ims_pcu_buffers_free(pcu); in ims_pcu_probe()
2045 usb_driver_release_interface(&ims_pcu_driver, pcu->data_intf); in ims_pcu_probe()
2047 kfree(pcu); in ims_pcu_probe()
2053 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_disconnect() local
2065 ims_pcu_stop_io(pcu); in ims_pcu_disconnect()
2067 if (pcu->bootloader_mode) in ims_pcu_disconnect()
2068 ims_pcu_destroy_bootloader_mode(pcu); in ims_pcu_disconnect()
2070 ims_pcu_destroy_application_mode(pcu); in ims_pcu_disconnect()
2072 ims_pcu_buffers_free(pcu); in ims_pcu_disconnect()
2073 kfree(pcu); in ims_pcu_disconnect()
2080 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_suspend() local
2084 ims_pcu_stop_io(pcu); in ims_pcu_suspend()
2091 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_resume() local
2096 retval = ims_pcu_start_io(pcu); in ims_pcu_resume()
2098 retval = ims_pcu_line_setup(pcu); in ims_pcu_resume()