Lines Matching refs:pcu
188 static void ims_pcu_buttons_report(struct ims_pcu *pcu, u32 data) in ims_pcu_buttons_report() argument
190 struct ims_pcu_buttons *buttons = &pcu->buttons; in ims_pcu_buttons_report()
204 static int ims_pcu_setup_buttons(struct ims_pcu *pcu, in ims_pcu_setup_buttons() argument
208 struct ims_pcu_buttons *buttons = &pcu->buttons; in ims_pcu_setup_buttons()
215 dev_err(pcu->dev, in ims_pcu_setup_buttons()
221 "IMS PCU#%d Button Interface", pcu->device_no); in ims_pcu_setup_buttons()
223 usb_make_path(pcu->udev, buttons->phys, sizeof(buttons->phys)); in ims_pcu_setup_buttons()
230 usb_to_input_id(pcu->udev, &input->id); in ims_pcu_setup_buttons()
231 input->dev.parent = &pcu->ctrl_intf->dev; in ims_pcu_setup_buttons()
244 dev_err(pcu->dev, in ims_pcu_setup_buttons()
255 static void ims_pcu_destroy_buttons(struct ims_pcu *pcu) in ims_pcu_destroy_buttons() argument
257 struct ims_pcu_buttons *buttons = &pcu->buttons; in ims_pcu_destroy_buttons()
267 static void ims_pcu_gamepad_report(struct ims_pcu *pcu, u32 data) in ims_pcu_gamepad_report() argument
269 struct ims_pcu_gamepad *gamepad = pcu->gamepad; in ims_pcu_gamepad_report()
289 static int ims_pcu_setup_gamepad(struct ims_pcu *pcu) in ims_pcu_setup_gamepad() argument
298 dev_err(pcu->dev, in ims_pcu_setup_gamepad()
307 "IMS PCU#%d Gamepad Interface", pcu->device_no); in ims_pcu_setup_gamepad()
309 usb_make_path(pcu->udev, gamepad->phys, sizeof(gamepad->phys)); in ims_pcu_setup_gamepad()
314 usb_to_input_id(pcu->udev, &input->id); in ims_pcu_setup_gamepad()
315 input->dev.parent = &pcu->ctrl_intf->dev; in ims_pcu_setup_gamepad()
331 dev_err(pcu->dev, in ims_pcu_setup_gamepad()
337 pcu->gamepad = gamepad; in ims_pcu_setup_gamepad()
346 static void ims_pcu_destroy_gamepad(struct ims_pcu *pcu) in ims_pcu_destroy_gamepad() argument
348 struct ims_pcu_gamepad *gamepad = pcu->gamepad; in ims_pcu_destroy_gamepad()
413 static void ims_pcu_report_events(struct ims_pcu *pcu) in ims_pcu_report_events() argument
415 u32 data = get_unaligned_be32(&pcu->read_buf[3]); in ims_pcu_report_events()
417 ims_pcu_buttons_report(pcu, data & ~IMS_PCU_GAMEPAD_MASK); in ims_pcu_report_events()
418 if (pcu->gamepad) in ims_pcu_report_events()
419 ims_pcu_gamepad_report(pcu, data); in ims_pcu_report_events()
422 static void ims_pcu_handle_response(struct ims_pcu *pcu) in ims_pcu_handle_response() argument
424 switch (pcu->read_buf[0]) { in ims_pcu_handle_response()
426 if (likely(pcu->setup_complete)) in ims_pcu_handle_response()
427 ims_pcu_report_events(pcu); in ims_pcu_handle_response()
436 if (pcu->read_buf[0] == pcu->expected_response && in ims_pcu_handle_response()
437 pcu->read_buf[1] == pcu->ack_id - 1) { in ims_pcu_handle_response()
439 memcpy(pcu->cmd_buf, pcu->read_buf, pcu->read_pos); in ims_pcu_handle_response()
440 pcu->cmd_buf_len = pcu->read_pos; in ims_pcu_handle_response()
441 complete(&pcu->cmd_done); in ims_pcu_handle_response()
447 static void ims_pcu_process_data(struct ims_pcu *pcu, struct urb *urb) in ims_pcu_process_data() argument
452 u8 data = pcu->urb_in_buf[i]; in ims_pcu_process_data()
455 if (!pcu->have_stx && data != IMS_PCU_PROTOCOL_STX) in ims_pcu_process_data()
458 if (pcu->have_dle) { in ims_pcu_process_data()
459 pcu->have_dle = false; in ims_pcu_process_data()
460 pcu->read_buf[pcu->read_pos++] = data; in ims_pcu_process_data()
461 pcu->check_sum += data; in ims_pcu_process_data()
467 if (pcu->have_stx) in ims_pcu_process_data()
468 dev_warn(pcu->dev, in ims_pcu_process_data()
470 pcu->read_pos); in ims_pcu_process_data()
471 pcu->have_stx = true; in ims_pcu_process_data()
472 pcu->have_dle = false; in ims_pcu_process_data()
473 pcu->read_pos = 0; in ims_pcu_process_data()
474 pcu->check_sum = 0; in ims_pcu_process_data()
478 pcu->have_dle = true; in ims_pcu_process_data()
482 if (pcu->read_pos < IMS_PCU_MIN_PACKET_LEN) { in ims_pcu_process_data()
483 dev_warn(pcu->dev, in ims_pcu_process_data()
485 pcu->read_pos); in ims_pcu_process_data()
486 } else if (pcu->check_sum != 0) { in ims_pcu_process_data()
487 dev_warn(pcu->dev, in ims_pcu_process_data()
489 pcu->read_pos); in ims_pcu_process_data()
491 ims_pcu_handle_response(pcu); in ims_pcu_process_data()
494 pcu->have_stx = false; in ims_pcu_process_data()
495 pcu->have_dle = false; in ims_pcu_process_data()
496 pcu->read_pos = 0; in ims_pcu_process_data()
500 pcu->read_buf[pcu->read_pos++] = data; in ims_pcu_process_data()
501 pcu->check_sum += data; in ims_pcu_process_data()
514 static int ims_pcu_send_cmd_chunk(struct ims_pcu *pcu, in ims_pcu_send_cmd_chunk() argument
519 error = usb_bulk_msg(pcu->udev, in ims_pcu_send_cmd_chunk()
520 usb_sndbulkpipe(pcu->udev, in ims_pcu_send_cmd_chunk()
521 pcu->ep_out->bEndpointAddress), in ims_pcu_send_cmd_chunk()
522 pcu->urb_out_buf, len, in ims_pcu_send_cmd_chunk()
525 dev_dbg(pcu->dev, in ims_pcu_send_cmd_chunk()
534 static int ims_pcu_send_command(struct ims_pcu *pcu, in ims_pcu_send_command() argument
545 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_STX; in ims_pcu_send_command()
548 pcu->urb_out_buf[count++] = command; in ims_pcu_send_command()
551 ack_id = pcu->ack_id++; in ims_pcu_send_command()
553 ack_id = pcu->ack_id++; in ims_pcu_send_command()
556 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
558 pcu->urb_out_buf[count++] = ack_id; in ims_pcu_send_command()
564 if (count + delta >= pcu->max_out_size) { in ims_pcu_send_command()
565 error = ims_pcu_send_cmd_chunk(pcu, command, in ims_pcu_send_command()
574 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
576 pcu->urb_out_buf[count++] = data[i]; in ims_pcu_send_command()
583 if (count + delta >= pcu->max_out_size) { in ims_pcu_send_command()
584 error = ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); in ims_pcu_send_command()
592 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
594 pcu->urb_out_buf[count++] = csum; in ims_pcu_send_command()
595 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_ETX; in ims_pcu_send_command()
597 return ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); in ims_pcu_send_command()
600 static int __ims_pcu_execute_command(struct ims_pcu *pcu, in __ims_pcu_execute_command() argument
606 pcu->expected_response = expected_response; in __ims_pcu_execute_command()
607 init_completion(&pcu->cmd_done); in __ims_pcu_execute_command()
609 error = ims_pcu_send_command(pcu, command, data, len); in __ims_pcu_execute_command()
614 !wait_for_completion_timeout(&pcu->cmd_done, in __ims_pcu_execute_command()
616 dev_dbg(pcu->dev, "Command 0x%02x timed out\n", command); in __ims_pcu_execute_command()
623 #define ims_pcu_execute_command(pcu, code, data, len) \ argument
624 __ims_pcu_execute_command(pcu, \
629 #define ims_pcu_execute_query(pcu, code) \ argument
630 ims_pcu_execute_command(pcu, code, NULL, 0)
654 static int __ims_pcu_execute_bl_command(struct ims_pcu *pcu, in __ims_pcu_execute_bl_command() argument
660 pcu->cmd_buf[0] = command; in __ims_pcu_execute_bl_command()
662 memcpy(&pcu->cmd_buf[1], data, len); in __ims_pcu_execute_bl_command()
664 error = __ims_pcu_execute_command(pcu, in __ims_pcu_execute_bl_command()
665 IMS_PCU_CMD_BOOTLOADER, pcu->cmd_buf, len + 1, in __ims_pcu_execute_bl_command()
669 dev_err(pcu->dev, in __ims_pcu_execute_bl_command()
671 pcu->cmd_buf[0], error); in __ims_pcu_execute_bl_command()
675 if (expected_response && pcu->cmd_buf[2] != expected_response) { in __ims_pcu_execute_bl_command()
676 dev_err(pcu->dev, in __ims_pcu_execute_bl_command()
678 pcu->cmd_buf[2], expected_response); in __ims_pcu_execute_bl_command()
685 #define ims_pcu_execute_bl_command(pcu, code, data, len, timeout) \ argument
686 __ims_pcu_execute_bl_command(pcu, \
696 static int ims_pcu_get_info(struct ims_pcu *pcu) in ims_pcu_get_info() argument
700 error = ims_pcu_execute_query(pcu, GET_INFO); in ims_pcu_get_info()
702 dev_err(pcu->dev, in ims_pcu_get_info()
707 memcpy(pcu->part_number, in ims_pcu_get_info()
708 &pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], in ims_pcu_get_info()
709 sizeof(pcu->part_number)); in ims_pcu_get_info()
710 memcpy(pcu->date_of_manufacturing, in ims_pcu_get_info()
711 &pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], in ims_pcu_get_info()
712 sizeof(pcu->date_of_manufacturing)); in ims_pcu_get_info()
713 memcpy(pcu->serial_number, in ims_pcu_get_info()
714 &pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], in ims_pcu_get_info()
715 sizeof(pcu->serial_number)); in ims_pcu_get_info()
720 static int ims_pcu_set_info(struct ims_pcu *pcu) in ims_pcu_set_info() argument
724 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], in ims_pcu_set_info()
725 pcu->part_number, sizeof(pcu->part_number)); in ims_pcu_set_info()
726 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], in ims_pcu_set_info()
727 pcu->date_of_manufacturing, sizeof(pcu->date_of_manufacturing)); in ims_pcu_set_info()
728 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], in ims_pcu_set_info()
729 pcu->serial_number, sizeof(pcu->serial_number)); in ims_pcu_set_info()
731 error = ims_pcu_execute_command(pcu, SET_INFO, in ims_pcu_set_info()
732 &pcu->cmd_buf[IMS_PCU_DATA_OFFSET], in ims_pcu_set_info()
735 dev_err(pcu->dev, in ims_pcu_set_info()
744 static int ims_pcu_switch_to_bootloader(struct ims_pcu *pcu) in ims_pcu_switch_to_bootloader() argument
749 error = ims_pcu_execute_command(pcu, JUMP_TO_BTLDR, NULL, 0); in ims_pcu_switch_to_bootloader()
751 dev_err(pcu->dev, in ims_pcu_switch_to_bootloader()
785 static int ims_pcu_verify_block(struct ims_pcu *pcu, in ims_pcu_verify_block() argument
791 fragment = (void *)&pcu->cmd_buf[1]; in ims_pcu_verify_block()
795 error = ims_pcu_execute_bl_command(pcu, READ_APP, NULL, 5, in ims_pcu_verify_block()
798 dev_err(pcu->dev, in ims_pcu_verify_block()
804 fragment = (void *)&pcu->cmd_buf[IMS_PCU_BL_DATA_OFFSET]; in ims_pcu_verify_block()
807 dev_err(pcu->dev, in ims_pcu_verify_block()
815 dev_err(pcu->dev, in ims_pcu_verify_block()
824 static int ims_pcu_flash_firmware(struct ims_pcu *pcu, in ims_pcu_flash_firmware() argument
835 error = ims_pcu_execute_bl_command(pcu, ERASE_APP, NULL, 0, 2000); in ims_pcu_flash_firmware()
837 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 mutex_lock(&pcu->cmd_mutex); in ims_pcu_process_async_firmware()
937 ims_pcu_handle_firmware_update(pcu, fw); in ims_pcu_process_async_firmware()
938 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_process_async_firmware()
943 complete(&pcu->async_firmware_done); in ims_pcu_process_async_firmware()
956 struct ims_pcu *pcu = in ims_pcu_backlight_work() local
962 mutex_lock(&pcu->cmd_mutex); in ims_pcu_backlight_work()
964 error = ims_pcu_execute_command(pcu, SET_BRIGHTNESS, in ims_pcu_backlight_work()
967 dev_warn(pcu->dev, in ims_pcu_backlight_work()
971 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_backlight_work()
989 struct ims_pcu *pcu = in ims_pcu_backlight_get_brightness() local
994 mutex_lock(&pcu->cmd_mutex); in ims_pcu_backlight_get_brightness()
996 error = ims_pcu_execute_query(pcu, GET_BRIGHTNESS); in ims_pcu_backlight_get_brightness()
998 dev_warn(pcu->dev, in ims_pcu_backlight_get_brightness()
1005 get_unaligned_le16(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); in ims_pcu_backlight_get_brightness()
1008 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_backlight_get_brightness()
1013 static int ims_pcu_setup_backlight(struct ims_pcu *pcu) in ims_pcu_setup_backlight() argument
1015 struct ims_pcu_backlight *backlight = &pcu->backlight; in ims_pcu_setup_backlight()
1020 "pcu%d::kbd_backlight", pcu->device_no); in ims_pcu_setup_backlight()
1027 error = led_classdev_register(pcu->dev, &backlight->cdev); in ims_pcu_setup_backlight()
1029 dev_err(pcu->dev, in ims_pcu_setup_backlight()
1038 static void ims_pcu_destroy_backlight(struct ims_pcu *pcu) in ims_pcu_destroy_backlight() argument
1040 struct ims_pcu_backlight *backlight = &pcu->backlight; in ims_pcu_destroy_backlight()
1062 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_attribute_show() local
1065 char *field = (char *)pcu + attr->field_offset; in ims_pcu_attribute_show()
1076 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_attribute_store() local
1079 char *field = (char *)pcu + attr->field_offset; in ims_pcu_attribute_store()
1090 error = mutex_lock_interruptible(&pcu->cmd_mutex); in ims_pcu_attribute_store()
1097 error = ims_pcu_set_info(pcu); in ims_pcu_attribute_store()
1103 ims_pcu_get_info(pcu); in ims_pcu_attribute_store()
1105 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_attribute_store()
1138 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_reset_device() local
1149 dev_info(pcu->dev, "Attempting to reset device\n"); in ims_pcu_reset_device()
1151 error = ims_pcu_execute_command(pcu, PCU_RESET, &reset_byte, 1); in ims_pcu_reset_device()
1153 dev_info(pcu->dev, in ims_pcu_reset_device()
1169 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_update_firmware_store() local
1181 error = mutex_lock_interruptible(&pcu->cmd_mutex); in ims_pcu_update_firmware_store()
1185 error = request_ihex_firmware(&fw, IMS_PCU_FIRMWARE_NAME, pcu->dev); in ims_pcu_update_firmware_store()
1187 dev_err(pcu->dev, "Failed to request firmware %s, error: %d\n", in ims_pcu_update_firmware_store()
1200 if (pcu->bootloader_mode) in ims_pcu_update_firmware_store()
1201 error = ims_pcu_handle_firmware_update(pcu, fw); in ims_pcu_update_firmware_store()
1203 error = ims_pcu_switch_to_bootloader(pcu); in ims_pcu_update_firmware_store()
1208 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_update_firmware_store()
1221 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_update_firmware_status_show() local
1223 return scnprintf(buf, PAGE_SIZE, "%d\n", pcu->update_firmware_status); in ims_pcu_update_firmware_status_show()
1247 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_is_attr_visible() local
1250 if (pcu->bootloader_mode) { in ims_pcu_is_attr_visible()
1273 static int ims_pcu_read_ofn_config(struct ims_pcu *pcu, u8 addr, u8 *data) in ims_pcu_read_ofn_config() argument
1278 error = ims_pcu_execute_command(pcu, OFN_GET_CONFIG, in ims_pcu_read_ofn_config()
1283 result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET); in ims_pcu_read_ofn_config()
1288 *data = pcu->cmd_buf[OFN_REG_RESULT_OFFSET]; in ims_pcu_read_ofn_config()
1292 static int ims_pcu_write_ofn_config(struct ims_pcu *pcu, u8 addr, u8 data) in ims_pcu_write_ofn_config() argument
1298 error = ims_pcu_execute_command(pcu, OFN_SET_CONFIG, in ims_pcu_write_ofn_config()
1303 result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET); in ims_pcu_write_ofn_config()
1315 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_data_show() local
1319 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_show()
1320 error = ims_pcu_read_ofn_config(pcu, pcu->ofn_reg_addr, &data); in ims_pcu_ofn_reg_data_show()
1321 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_show()
1334 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_data_store() local
1342 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_store()
1343 error = ims_pcu_write_ofn_config(pcu, pcu->ofn_reg_addr, value); in ims_pcu_ofn_reg_data_store()
1344 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_store()
1357 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_addr_show() local
1360 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_show()
1361 error = scnprintf(buf, PAGE_SIZE, "%x\n", pcu->ofn_reg_addr); in ims_pcu_ofn_reg_addr_show()
1362 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_show()
1372 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_addr_store() local
1380 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_store()
1381 pcu->ofn_reg_addr = value; in ims_pcu_ofn_reg_addr_store()
1382 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_store()
1401 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_bit_show() local
1407 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_show()
1408 error = ims_pcu_read_ofn_config(pcu, attr->addr, &data); in ims_pcu_ofn_bit_show()
1409 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_show()
1422 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_bit_store() local
1436 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_store()
1438 error = ims_pcu_read_ofn_config(pcu, attr->addr, &data); in ims_pcu_ofn_bit_store()
1445 error = ims_pcu_write_ofn_config(pcu, attr->addr, data); in ims_pcu_ofn_bit_store()
1448 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_store()
1490 struct ims_pcu *pcu = urb->context; in ims_pcu_irq() local
1503 dev_dbg(pcu->dev, "%s - urb shutting down with status: %d\n", in ims_pcu_irq()
1507 dev_dbg(pcu->dev, "%s - nonzero urb status received: %d\n", in ims_pcu_irq()
1512 dev_dbg(pcu->dev, "%s: received %d: %*ph\n", __func__, in ims_pcu_irq()
1513 urb->actual_length, urb->actual_length, pcu->urb_in_buf); in ims_pcu_irq()
1515 if (urb == pcu->urb_in) in ims_pcu_irq()
1516 ims_pcu_process_data(pcu, urb); in ims_pcu_irq()
1521 dev_err(pcu->dev, "%s - usb_submit_urb failed with result %d\n", in ims_pcu_irq()
1525 static int ims_pcu_buffers_alloc(struct ims_pcu *pcu) in ims_pcu_buffers_alloc() argument
1529 pcu->urb_in_buf = usb_alloc_coherent(pcu->udev, pcu->max_in_size, in ims_pcu_buffers_alloc()
1530 GFP_KERNEL, &pcu->read_dma); in ims_pcu_buffers_alloc()
1531 if (!pcu->urb_in_buf) { in ims_pcu_buffers_alloc()
1532 dev_err(pcu->dev, in ims_pcu_buffers_alloc()
1537 pcu->urb_in = usb_alloc_urb(0, GFP_KERNEL); in ims_pcu_buffers_alloc()
1538 if (!pcu->urb_in) { in ims_pcu_buffers_alloc()
1539 dev_err(pcu->dev, "Failed to allocate input URB\n"); in ims_pcu_buffers_alloc()
1544 pcu->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ims_pcu_buffers_alloc()
1545 pcu->urb_in->transfer_dma = pcu->read_dma; in ims_pcu_buffers_alloc()
1547 usb_fill_bulk_urb(pcu->urb_in, pcu->udev, in ims_pcu_buffers_alloc()
1548 usb_rcvbulkpipe(pcu->udev, in ims_pcu_buffers_alloc()
1549 pcu->ep_in->bEndpointAddress), in ims_pcu_buffers_alloc()
1550 pcu->urb_in_buf, pcu->max_in_size, in ims_pcu_buffers_alloc()
1551 ims_pcu_irq, pcu); in ims_pcu_buffers_alloc()
1557 pcu->urb_out_buf = kmalloc(pcu->max_out_size, GFP_KERNEL); in ims_pcu_buffers_alloc()
1558 if (!pcu->urb_out_buf) { in ims_pcu_buffers_alloc()
1559 dev_err(pcu->dev, "Failed to allocate memory for write buffer\n"); in ims_pcu_buffers_alloc()
1564 pcu->urb_ctrl_buf = usb_alloc_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1565 GFP_KERNEL, &pcu->ctrl_dma); in ims_pcu_buffers_alloc()
1566 if (!pcu->urb_ctrl_buf) { in ims_pcu_buffers_alloc()
1567 dev_err(pcu->dev, in ims_pcu_buffers_alloc()
1573 pcu->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL); in ims_pcu_buffers_alloc()
1574 if (!pcu->urb_ctrl) { in ims_pcu_buffers_alloc()
1575 dev_err(pcu->dev, "Failed to allocate input URB\n"); in ims_pcu_buffers_alloc()
1580 pcu->urb_ctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ims_pcu_buffers_alloc()
1581 pcu->urb_ctrl->transfer_dma = pcu->ctrl_dma; in ims_pcu_buffers_alloc()
1583 usb_fill_int_urb(pcu->urb_ctrl, pcu->udev, in ims_pcu_buffers_alloc()
1584 usb_rcvintpipe(pcu->udev, in ims_pcu_buffers_alloc()
1585 pcu->ep_ctrl->bEndpointAddress), in ims_pcu_buffers_alloc()
1586 pcu->urb_ctrl_buf, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1587 ims_pcu_irq, pcu, pcu->ep_ctrl->bInterval); in ims_pcu_buffers_alloc()
1592 usb_free_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1593 pcu->urb_ctrl_buf, pcu->ctrl_dma); in ims_pcu_buffers_alloc()
1595 kfree(pcu->urb_out_buf); in ims_pcu_buffers_alloc()
1597 usb_free_urb(pcu->urb_in); in ims_pcu_buffers_alloc()
1599 usb_free_coherent(pcu->udev, pcu->max_in_size, in ims_pcu_buffers_alloc()
1600 pcu->urb_in_buf, pcu->read_dma); in ims_pcu_buffers_alloc()
1604 static void ims_pcu_buffers_free(struct ims_pcu *pcu) in ims_pcu_buffers_free() argument
1606 usb_kill_urb(pcu->urb_in); in ims_pcu_buffers_free()
1607 usb_free_urb(pcu->urb_in); in ims_pcu_buffers_free()
1609 usb_free_coherent(pcu->udev, pcu->max_out_size, in ims_pcu_buffers_free()
1610 pcu->urb_in_buf, pcu->read_dma); in ims_pcu_buffers_free()
1612 kfree(pcu->urb_out_buf); in ims_pcu_buffers_free()
1614 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_buffers_free()
1615 usb_free_urb(pcu->urb_ctrl); in ims_pcu_buffers_free()
1617 usb_free_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_free()
1618 pcu->urb_ctrl_buf, pcu->ctrl_dma); in ims_pcu_buffers_free()
1667 static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pcu) in ims_pcu_parse_cdc_data() argument
1676 pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev, in ims_pcu_parse_cdc_data()
1678 if (!pcu->ctrl_intf) in ims_pcu_parse_cdc_data()
1681 alt = pcu->ctrl_intf->cur_altsetting; in ims_pcu_parse_cdc_data()
1686 pcu->ep_ctrl = &alt->endpoint[0].desc; in ims_pcu_parse_cdc_data()
1687 pcu->max_ctrl_size = usb_endpoint_maxp(pcu->ep_ctrl); in ims_pcu_parse_cdc_data()
1689 pcu->data_intf = usb_ifnum_to_if(pcu->udev, in ims_pcu_parse_cdc_data()
1691 if (!pcu->data_intf) in ims_pcu_parse_cdc_data()
1694 alt = pcu->data_intf->cur_altsetting; in ims_pcu_parse_cdc_data()
1696 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1702 pcu->ep_out = &alt->endpoint[0].desc; in ims_pcu_parse_cdc_data()
1703 if (!usb_endpoint_is_bulk_out(pcu->ep_out)) { in ims_pcu_parse_cdc_data()
1704 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1709 pcu->max_out_size = usb_endpoint_maxp(pcu->ep_out); in ims_pcu_parse_cdc_data()
1710 if (pcu->max_out_size < 8) { in ims_pcu_parse_cdc_data()
1711 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1713 pcu->max_out_size); in ims_pcu_parse_cdc_data()
1717 pcu->ep_in = &alt->endpoint[1].desc; in ims_pcu_parse_cdc_data()
1718 if (!usb_endpoint_is_bulk_in(pcu->ep_in)) { in ims_pcu_parse_cdc_data()
1719 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1724 pcu->max_in_size = usb_endpoint_maxp(pcu->ep_in); in ims_pcu_parse_cdc_data()
1725 if (pcu->max_in_size < 8) { in ims_pcu_parse_cdc_data()
1726 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1728 pcu->max_in_size); in ims_pcu_parse_cdc_data()
1735 static int ims_pcu_start_io(struct ims_pcu *pcu) in ims_pcu_start_io() argument
1739 error = usb_submit_urb(pcu->urb_ctrl, GFP_KERNEL); in ims_pcu_start_io()
1741 dev_err(pcu->dev, in ims_pcu_start_io()
1747 error = usb_submit_urb(pcu->urb_in, GFP_KERNEL); in ims_pcu_start_io()
1749 dev_err(pcu->dev, in ims_pcu_start_io()
1752 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_start_io()
1759 static void ims_pcu_stop_io(struct ims_pcu *pcu) in ims_pcu_stop_io() argument
1761 usb_kill_urb(pcu->urb_in); in ims_pcu_stop_io()
1762 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_stop_io()
1765 static int ims_pcu_line_setup(struct ims_pcu *pcu) in ims_pcu_line_setup() argument
1767 struct usb_host_interface *interface = pcu->ctrl_intf->cur_altsetting; in ims_pcu_line_setup()
1768 struct usb_cdc_line_coding *line = (void *)pcu->cmd_buf; in ims_pcu_line_setup()
1775 error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), in ims_pcu_line_setup()
1782 dev_err(pcu->dev, "Failed to set line coding, error: %d\n", in ims_pcu_line_setup()
1787 error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), in ims_pcu_line_setup()
1793 dev_err(pcu->dev, "Failed to set line state, error: %d\n", in ims_pcu_line_setup()
1801 static int ims_pcu_get_device_info(struct ims_pcu *pcu) in ims_pcu_get_device_info() argument
1805 error = ims_pcu_get_info(pcu); in ims_pcu_get_device_info()
1809 error = ims_pcu_execute_query(pcu, GET_FW_VERSION); in ims_pcu_get_device_info()
1811 dev_err(pcu->dev, in ims_pcu_get_device_info()
1816 snprintf(pcu->fw_version, sizeof(pcu->fw_version), in ims_pcu_get_device_info()
1818 pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5], in ims_pcu_get_device_info()
1819 pcu->cmd_buf[6], pcu->cmd_buf[7]); in ims_pcu_get_device_info()
1821 error = ims_pcu_execute_query(pcu, GET_BL_VERSION); in ims_pcu_get_device_info()
1823 dev_err(pcu->dev, in ims_pcu_get_device_info()
1828 snprintf(pcu->bl_version, sizeof(pcu->bl_version), in ims_pcu_get_device_info()
1830 pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5], in ims_pcu_get_device_info()
1831 pcu->cmd_buf[6], pcu->cmd_buf[7]); in ims_pcu_get_device_info()
1833 error = ims_pcu_execute_query(pcu, RESET_REASON); in ims_pcu_get_device_info()
1835 dev_err(pcu->dev, in ims_pcu_get_device_info()
1840 snprintf(pcu->reset_reason, sizeof(pcu->reset_reason), in ims_pcu_get_device_info()
1841 "%02x", pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); in ims_pcu_get_device_info()
1843 dev_dbg(pcu->dev, in ims_pcu_get_device_info()
1845 pcu->part_number, in ims_pcu_get_device_info()
1846 pcu->date_of_manufacturing, in ims_pcu_get_device_info()
1847 pcu->serial_number, in ims_pcu_get_device_info()
1848 pcu->fw_version, in ims_pcu_get_device_info()
1849 pcu->bl_version, in ims_pcu_get_device_info()
1850 pcu->reset_reason); in ims_pcu_get_device_info()
1855 static int ims_pcu_identify_type(struct ims_pcu *pcu, u8 *device_id) in ims_pcu_identify_type() argument
1859 error = ims_pcu_execute_query(pcu, GET_DEVICE_ID); in ims_pcu_identify_type()
1861 dev_err(pcu->dev, in ims_pcu_identify_type()
1866 *device_id = pcu->cmd_buf[IMS_PCU_DATA_OFFSET]; in ims_pcu_identify_type()
1867 dev_dbg(pcu->dev, "Detected device ID: %d\n", *device_id); in ims_pcu_identify_type()
1872 static int ims_pcu_init_application_mode(struct ims_pcu *pcu) in ims_pcu_init_application_mode() argument
1879 error = ims_pcu_get_device_info(pcu); in ims_pcu_init_application_mode()
1885 error = ims_pcu_identify_type(pcu, &pcu->device_id); in ims_pcu_init_application_mode()
1887 dev_err(pcu->dev, in ims_pcu_init_application_mode()
1897 if (pcu->device_id >= ARRAY_SIZE(ims_pcu_device_info) || in ims_pcu_init_application_mode()
1898 !ims_pcu_device_info[pcu->device_id].keymap) { in ims_pcu_init_application_mode()
1899 dev_err(pcu->dev, "Device ID %d is not valid\n", pcu->device_id); in ims_pcu_init_application_mode()
1905 pcu->device_no = atomic_inc_return(&device_no); in ims_pcu_init_application_mode()
1910 if (pcu->device_id != IMS_PCU_PCU_B_DEVICE_ID) { in ims_pcu_init_application_mode()
1911 error = sysfs_create_group(&pcu->dev->kobj, in ims_pcu_init_application_mode()
1917 error = ims_pcu_setup_backlight(pcu); in ims_pcu_init_application_mode()
1921 info = &ims_pcu_device_info[pcu->device_id]; in ims_pcu_init_application_mode()
1922 error = ims_pcu_setup_buttons(pcu, info->keymap, info->keymap_len); in ims_pcu_init_application_mode()
1927 error = ims_pcu_setup_gamepad(pcu); in ims_pcu_init_application_mode()
1932 pcu->setup_complete = true; in ims_pcu_init_application_mode()
1937 ims_pcu_destroy_buttons(pcu); in ims_pcu_init_application_mode()
1939 ims_pcu_destroy_backlight(pcu); in ims_pcu_init_application_mode()
1943 static void ims_pcu_destroy_application_mode(struct ims_pcu *pcu) in ims_pcu_destroy_application_mode() argument
1945 if (pcu->setup_complete) { in ims_pcu_destroy_application_mode()
1946 pcu->setup_complete = false; in ims_pcu_destroy_application_mode()
1949 if (pcu->gamepad) in ims_pcu_destroy_application_mode()
1950 ims_pcu_destroy_gamepad(pcu); in ims_pcu_destroy_application_mode()
1951 ims_pcu_destroy_buttons(pcu); in ims_pcu_destroy_application_mode()
1952 ims_pcu_destroy_backlight(pcu); in ims_pcu_destroy_application_mode()
1954 if (pcu->device_id != IMS_PCU_PCU_B_DEVICE_ID) in ims_pcu_destroy_application_mode()
1955 sysfs_remove_group(&pcu->dev->kobj, in ims_pcu_destroy_application_mode()
1960 static int ims_pcu_init_bootloader_mode(struct ims_pcu *pcu) in ims_pcu_init_bootloader_mode() argument
1964 error = ims_pcu_execute_bl_command(pcu, QUERY_DEVICE, NULL, 0, in ims_pcu_init_bootloader_mode()
1967 dev_err(pcu->dev, "Bootloader does not respond, aborting\n"); in ims_pcu_init_bootloader_mode()
1971 pcu->fw_start_addr = in ims_pcu_init_bootloader_mode()
1972 get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 11]); in ims_pcu_init_bootloader_mode()
1973 pcu->fw_end_addr = in ims_pcu_init_bootloader_mode()
1974 get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 15]); in ims_pcu_init_bootloader_mode()
1976 dev_info(pcu->dev, in ims_pcu_init_bootloader_mode()
1978 pcu->fw_start_addr, pcu->fw_end_addr); in ims_pcu_init_bootloader_mode()
1982 pcu->dev, GFP_KERNEL, pcu, in ims_pcu_init_bootloader_mode()
1986 complete(&pcu->async_firmware_done); in ims_pcu_init_bootloader_mode()
1992 static void ims_pcu_destroy_bootloader_mode(struct ims_pcu *pcu) in ims_pcu_destroy_bootloader_mode() argument
1995 wait_for_completion(&pcu->async_firmware_done); in ims_pcu_destroy_bootloader_mode()
2007 struct ims_pcu *pcu; in ims_pcu_probe() local
2010 pcu = kzalloc(sizeof(struct ims_pcu), GFP_KERNEL); in ims_pcu_probe()
2011 if (!pcu) in ims_pcu_probe()
2014 pcu->dev = &intf->dev; in ims_pcu_probe()
2015 pcu->udev = udev; in ims_pcu_probe()
2016 pcu->bootloader_mode = id->driver_info == IMS_PCU_BOOTLOADER_MODE; in ims_pcu_probe()
2017 mutex_init(&pcu->cmd_mutex); in ims_pcu_probe()
2018 init_completion(&pcu->cmd_done); in ims_pcu_probe()
2019 init_completion(&pcu->async_firmware_done); in ims_pcu_probe()
2021 error = ims_pcu_parse_cdc_data(intf, pcu); in ims_pcu_probe()
2026 pcu->data_intf, pcu); in ims_pcu_probe()
2034 usb_set_intfdata(pcu->ctrl_intf, pcu); in ims_pcu_probe()
2035 usb_set_intfdata(pcu->data_intf, pcu); in ims_pcu_probe()
2037 error = ims_pcu_buffers_alloc(pcu); in ims_pcu_probe()
2041 error = ims_pcu_start_io(pcu); in ims_pcu_probe()
2045 error = ims_pcu_line_setup(pcu); in ims_pcu_probe()
2053 error = pcu->bootloader_mode ? in ims_pcu_probe()
2054 ims_pcu_init_bootloader_mode(pcu) : in ims_pcu_probe()
2055 ims_pcu_init_application_mode(pcu); in ims_pcu_probe()
2064 ims_pcu_stop_io(pcu); in ims_pcu_probe()
2066 ims_pcu_buffers_free(pcu); in ims_pcu_probe()
2068 usb_driver_release_interface(&ims_pcu_driver, pcu->data_intf); in ims_pcu_probe()
2070 kfree(pcu); in ims_pcu_probe()
2076 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_disconnect() local
2090 ims_pcu_stop_io(pcu); in ims_pcu_disconnect()
2092 if (pcu->bootloader_mode) in ims_pcu_disconnect()
2093 ims_pcu_destroy_bootloader_mode(pcu); in ims_pcu_disconnect()
2095 ims_pcu_destroy_application_mode(pcu); in ims_pcu_disconnect()
2097 ims_pcu_buffers_free(pcu); in ims_pcu_disconnect()
2098 kfree(pcu); in ims_pcu_disconnect()
2105 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_suspend() local
2109 ims_pcu_stop_io(pcu); in ims_pcu_suspend()
2116 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_resume() local
2121 retval = ims_pcu_start_io(pcu); in ims_pcu_resume()
2123 retval = ims_pcu_line_setup(pcu); in ims_pcu_resume()