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, in ims_pcu_setup_buttons()
216 "IMS PCU#%d Button Interface", pcu->device_no); in ims_pcu_setup_buttons()
218 usb_make_path(pcu->udev, buttons->phys, sizeof(buttons->phys)); in ims_pcu_setup_buttons()
225 usb_to_input_id(pcu->udev, &input->id); in ims_pcu_setup_buttons()
226 input->dev.parent = &pcu->ctrl_intf->dev; in ims_pcu_setup_buttons()
239 dev_err(pcu->dev, in ims_pcu_setup_buttons()
250 static void ims_pcu_destroy_buttons(struct ims_pcu *pcu) in ims_pcu_destroy_buttons() argument
252 struct ims_pcu_buttons *buttons = &pcu->buttons; in ims_pcu_destroy_buttons()
262 static void ims_pcu_gamepad_report(struct ims_pcu *pcu, u32 data) in ims_pcu_gamepad_report() argument
264 struct ims_pcu_gamepad *gamepad = pcu->gamepad; in ims_pcu_gamepad_report()
284 static int ims_pcu_setup_gamepad(struct ims_pcu *pcu) in ims_pcu_setup_gamepad() argument
293 dev_err(pcu->dev, in ims_pcu_setup_gamepad()
302 "IMS PCU#%d Gamepad Interface", pcu->device_no); in ims_pcu_setup_gamepad()
304 usb_make_path(pcu->udev, gamepad->phys, sizeof(gamepad->phys)); in ims_pcu_setup_gamepad()
309 usb_to_input_id(pcu->udev, &input->id); in ims_pcu_setup_gamepad()
310 input->dev.parent = &pcu->ctrl_intf->dev; in ims_pcu_setup_gamepad()
326 dev_err(pcu->dev, in ims_pcu_setup_gamepad()
332 pcu->gamepad = gamepad; in ims_pcu_setup_gamepad()
341 static void ims_pcu_destroy_gamepad(struct ims_pcu *pcu) in ims_pcu_destroy_gamepad() argument
343 struct ims_pcu_gamepad *gamepad = pcu->gamepad; in ims_pcu_destroy_gamepad()
408 static void ims_pcu_report_events(struct ims_pcu *pcu) in ims_pcu_report_events() argument
410 u32 data = get_unaligned_be32(&pcu->read_buf[3]); in ims_pcu_report_events()
412 ims_pcu_buttons_report(pcu, data & ~IMS_PCU_GAMEPAD_MASK); in ims_pcu_report_events()
413 if (pcu->gamepad) in ims_pcu_report_events()
414 ims_pcu_gamepad_report(pcu, data); in ims_pcu_report_events()
417 static void ims_pcu_handle_response(struct ims_pcu *pcu) in ims_pcu_handle_response() argument
419 switch (pcu->read_buf[0]) { in ims_pcu_handle_response()
421 if (likely(pcu->setup_complete)) in ims_pcu_handle_response()
422 ims_pcu_report_events(pcu); in ims_pcu_handle_response()
431 if (pcu->read_buf[0] == pcu->expected_response && in ims_pcu_handle_response()
432 pcu->read_buf[1] == pcu->ack_id - 1) { in ims_pcu_handle_response()
434 memcpy(pcu->cmd_buf, pcu->read_buf, pcu->read_pos); in ims_pcu_handle_response()
435 pcu->cmd_buf_len = pcu->read_pos; in ims_pcu_handle_response()
436 complete(&pcu->cmd_done); in ims_pcu_handle_response()
442 static void ims_pcu_process_data(struct ims_pcu *pcu, struct urb *urb) in ims_pcu_process_data() argument
447 u8 data = pcu->urb_in_buf[i]; in ims_pcu_process_data()
450 if (!pcu->have_stx && data != IMS_PCU_PROTOCOL_STX) in ims_pcu_process_data()
453 if (pcu->have_dle) { in ims_pcu_process_data()
454 pcu->have_dle = false; in ims_pcu_process_data()
455 pcu->read_buf[pcu->read_pos++] = data; in ims_pcu_process_data()
456 pcu->check_sum += data; in ims_pcu_process_data()
462 if (pcu->have_stx) in ims_pcu_process_data()
463 dev_warn(pcu->dev, in ims_pcu_process_data()
465 pcu->read_pos); in ims_pcu_process_data()
466 pcu->have_stx = true; in ims_pcu_process_data()
467 pcu->have_dle = false; in ims_pcu_process_data()
468 pcu->read_pos = 0; in ims_pcu_process_data()
469 pcu->check_sum = 0; in ims_pcu_process_data()
473 pcu->have_dle = true; in ims_pcu_process_data()
477 if (pcu->read_pos < IMS_PCU_MIN_PACKET_LEN) { in ims_pcu_process_data()
478 dev_warn(pcu->dev, in ims_pcu_process_data()
480 pcu->read_pos); in ims_pcu_process_data()
481 } else if (pcu->check_sum != 0) { in ims_pcu_process_data()
482 dev_warn(pcu->dev, in ims_pcu_process_data()
484 pcu->read_pos); in ims_pcu_process_data()
486 ims_pcu_handle_response(pcu); in ims_pcu_process_data()
489 pcu->have_stx = false; in ims_pcu_process_data()
490 pcu->have_dle = false; in ims_pcu_process_data()
491 pcu->read_pos = 0; in ims_pcu_process_data()
495 pcu->read_buf[pcu->read_pos++] = data; in ims_pcu_process_data()
496 pcu->check_sum += data; in ims_pcu_process_data()
509 static int ims_pcu_send_cmd_chunk(struct ims_pcu *pcu, in ims_pcu_send_cmd_chunk() argument
514 error = usb_bulk_msg(pcu->udev, in ims_pcu_send_cmd_chunk()
515 usb_sndbulkpipe(pcu->udev, in ims_pcu_send_cmd_chunk()
516 pcu->ep_out->bEndpointAddress), in ims_pcu_send_cmd_chunk()
517 pcu->urb_out_buf, len, in ims_pcu_send_cmd_chunk()
520 dev_dbg(pcu->dev, in ims_pcu_send_cmd_chunk()
529 static int ims_pcu_send_command(struct ims_pcu *pcu, in ims_pcu_send_command() argument
540 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_STX; in ims_pcu_send_command()
543 pcu->urb_out_buf[count++] = command; in ims_pcu_send_command()
546 ack_id = pcu->ack_id++; in ims_pcu_send_command()
548 ack_id = pcu->ack_id++; in ims_pcu_send_command()
551 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
553 pcu->urb_out_buf[count++] = ack_id; in ims_pcu_send_command()
559 if (count + delta >= pcu->max_out_size) { in ims_pcu_send_command()
560 error = ims_pcu_send_cmd_chunk(pcu, command, in ims_pcu_send_command()
569 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
571 pcu->urb_out_buf[count++] = data[i]; in ims_pcu_send_command()
578 if (count + delta >= pcu->max_out_size) { in ims_pcu_send_command()
579 error = ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); in ims_pcu_send_command()
587 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; in ims_pcu_send_command()
589 pcu->urb_out_buf[count++] = csum; in ims_pcu_send_command()
590 pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_ETX; in ims_pcu_send_command()
592 return ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); in ims_pcu_send_command()
595 static int __ims_pcu_execute_command(struct ims_pcu *pcu, in __ims_pcu_execute_command() argument
601 pcu->expected_response = expected_response; in __ims_pcu_execute_command()
602 init_completion(&pcu->cmd_done); in __ims_pcu_execute_command()
604 error = ims_pcu_send_command(pcu, command, data, len); in __ims_pcu_execute_command()
609 !wait_for_completion_timeout(&pcu->cmd_done, in __ims_pcu_execute_command()
611 dev_dbg(pcu->dev, "Command 0x%02x timed out\n", command); in __ims_pcu_execute_command()
618 #define ims_pcu_execute_command(pcu, code, data, len) \ argument
619 __ims_pcu_execute_command(pcu, \
624 #define ims_pcu_execute_query(pcu, code) \ argument
625 ims_pcu_execute_command(pcu, code, NULL, 0)
649 static int __ims_pcu_execute_bl_command(struct ims_pcu *pcu, in __ims_pcu_execute_bl_command() argument
655 pcu->cmd_buf[0] = command; in __ims_pcu_execute_bl_command()
657 memcpy(&pcu->cmd_buf[1], data, len); in __ims_pcu_execute_bl_command()
659 error = __ims_pcu_execute_command(pcu, in __ims_pcu_execute_bl_command()
660 IMS_PCU_CMD_BOOTLOADER, pcu->cmd_buf, len + 1, in __ims_pcu_execute_bl_command()
664 dev_err(pcu->dev, in __ims_pcu_execute_bl_command()
666 pcu->cmd_buf[0], error); in __ims_pcu_execute_bl_command()
670 if (expected_response && pcu->cmd_buf[2] != expected_response) { in __ims_pcu_execute_bl_command()
671 dev_err(pcu->dev, in __ims_pcu_execute_bl_command()
673 pcu->cmd_buf[2], expected_response); in __ims_pcu_execute_bl_command()
680 #define ims_pcu_execute_bl_command(pcu, code, data, len, timeout) \ argument
681 __ims_pcu_execute_bl_command(pcu, \
691 static int ims_pcu_get_info(struct ims_pcu *pcu) in ims_pcu_get_info() argument
695 error = ims_pcu_execute_query(pcu, GET_INFO); in ims_pcu_get_info()
697 dev_err(pcu->dev, in ims_pcu_get_info()
702 memcpy(pcu->part_number, in ims_pcu_get_info()
703 &pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], in ims_pcu_get_info()
704 sizeof(pcu->part_number)); in ims_pcu_get_info()
705 memcpy(pcu->date_of_manufacturing, in ims_pcu_get_info()
706 &pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], in ims_pcu_get_info()
707 sizeof(pcu->date_of_manufacturing)); in ims_pcu_get_info()
708 memcpy(pcu->serial_number, in ims_pcu_get_info()
709 &pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], in ims_pcu_get_info()
710 sizeof(pcu->serial_number)); in ims_pcu_get_info()
715 static int ims_pcu_set_info(struct ims_pcu *pcu) in ims_pcu_set_info() argument
719 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], in ims_pcu_set_info()
720 pcu->part_number, sizeof(pcu->part_number)); in ims_pcu_set_info()
721 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], in ims_pcu_set_info()
722 pcu->date_of_manufacturing, sizeof(pcu->date_of_manufacturing)); in ims_pcu_set_info()
723 memcpy(&pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], in ims_pcu_set_info()
724 pcu->serial_number, sizeof(pcu->serial_number)); in ims_pcu_set_info()
726 error = ims_pcu_execute_command(pcu, SET_INFO, in ims_pcu_set_info()
727 &pcu->cmd_buf[IMS_PCU_DATA_OFFSET], in ims_pcu_set_info()
730 dev_err(pcu->dev, in ims_pcu_set_info()
739 static int ims_pcu_switch_to_bootloader(struct ims_pcu *pcu) in ims_pcu_switch_to_bootloader() argument
744 error = ims_pcu_execute_command(pcu, JUMP_TO_BTLDR, NULL, 0); in ims_pcu_switch_to_bootloader()
746 dev_err(pcu->dev, in ims_pcu_switch_to_bootloader()
780 static int ims_pcu_verify_block(struct ims_pcu *pcu, in ims_pcu_verify_block() argument
786 fragment = (void *)&pcu->cmd_buf[1]; in ims_pcu_verify_block()
790 error = ims_pcu_execute_bl_command(pcu, READ_APP, NULL, 5, in ims_pcu_verify_block()
793 dev_err(pcu->dev, in ims_pcu_verify_block()
799 fragment = (void *)&pcu->cmd_buf[IMS_PCU_BL_DATA_OFFSET]; in ims_pcu_verify_block()
802 dev_err(pcu->dev, in ims_pcu_verify_block()
810 dev_err(pcu->dev, in ims_pcu_verify_block()
819 static int ims_pcu_flash_firmware(struct ims_pcu *pcu, in ims_pcu_flash_firmware() argument
830 error = ims_pcu_execute_bl_command(pcu, ERASE_APP, NULL, 0, 2000); in ims_pcu_flash_firmware()
832 dev_err(pcu->dev, in ims_pcu_flash_firmware()
848 fragment = (void *)&pcu->cmd_buf[1]; in ims_pcu_flash_firmware()
853 error = ims_pcu_execute_bl_command(pcu, PROGRAM_DEVICE, in ims_pcu_flash_firmware()
857 dev_err(pcu->dev, in ims_pcu_flash_firmware()
863 if (addr >= pcu->fw_start_addr && addr < pcu->fw_end_addr) { in ims_pcu_flash_firmware()
864 error = ims_pcu_verify_block(pcu, addr, len, rec->data); in ims_pcu_flash_firmware()
870 pcu->update_firmware_status = (count * 100) / n_fw_records; in ims_pcu_flash_firmware()
875 error = ims_pcu_execute_bl_command(pcu, PROGRAM_COMPLETE, in ims_pcu_flash_firmware()
878 dev_err(pcu->dev, in ims_pcu_flash_firmware()
885 static int ims_pcu_handle_firmware_update(struct ims_pcu *pcu, in ims_pcu_handle_firmware_update() argument
891 dev_info(pcu->dev, "Updating firmware %s, size: %zu\n", in ims_pcu_handle_firmware_update()
896 retval = ims_pcu_flash_firmware(pcu, fw, n_fw_records); in ims_pcu_handle_firmware_update()
900 retval = ims_pcu_execute_bl_command(pcu, LAUNCH_APP, NULL, 0, 0); in ims_pcu_handle_firmware_update()
902 dev_err(pcu->dev, in ims_pcu_handle_firmware_update()
907 pcu->update_firmware_status = retval; in ims_pcu_handle_firmware_update()
908 sysfs_notify(&pcu->dev->kobj, NULL, "update_firmware_status"); in ims_pcu_handle_firmware_update()
915 struct ims_pcu *pcu = context; in ims_pcu_process_async_firmware() local
919 dev_err(pcu->dev, "Failed to get firmware %s\n", in ims_pcu_process_async_firmware()
926 dev_err(pcu->dev, "Firmware %s is invalid\n", in ims_pcu_process_async_firmware()
931 mutex_lock(&pcu->cmd_mutex); in ims_pcu_process_async_firmware()
932 ims_pcu_handle_firmware_update(pcu, fw); in ims_pcu_process_async_firmware()
933 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_process_async_firmware()
938 complete(&pcu->async_firmware_done); in ims_pcu_process_async_firmware()
952 struct ims_pcu *pcu = in ims_pcu_backlight_set_brightness() local
957 mutex_lock(&pcu->cmd_mutex); in ims_pcu_backlight_set_brightness()
959 error = ims_pcu_execute_command(pcu, SET_BRIGHTNESS, in ims_pcu_backlight_set_brightness()
962 dev_warn(pcu->dev, in ims_pcu_backlight_set_brightness()
966 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_backlight_set_brightness()
976 struct ims_pcu *pcu = in ims_pcu_backlight_get_brightness() local
981 mutex_lock(&pcu->cmd_mutex); in ims_pcu_backlight_get_brightness()
983 error = ims_pcu_execute_query(pcu, GET_BRIGHTNESS); in ims_pcu_backlight_get_brightness()
985 dev_warn(pcu->dev, in ims_pcu_backlight_get_brightness()
992 get_unaligned_le16(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); in ims_pcu_backlight_get_brightness()
995 mutex_unlock(&pcu->cmd_mutex); 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 error = mutex_lock_interruptible(&pcu->cmd_mutex); in ims_pcu_attribute_store()
1083 error = ims_pcu_set_info(pcu); in ims_pcu_attribute_store()
1089 ims_pcu_get_info(pcu); in ims_pcu_attribute_store()
1091 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_attribute_store()
1124 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_reset_device() local
1135 dev_info(pcu->dev, "Attempting to reset device\n"); in ims_pcu_reset_device()
1137 error = ims_pcu_execute_command(pcu, PCU_RESET, &reset_byte, 1); in ims_pcu_reset_device()
1139 dev_info(pcu->dev, in ims_pcu_reset_device()
1155 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_update_firmware_store() local
1167 error = mutex_lock_interruptible(&pcu->cmd_mutex); in ims_pcu_update_firmware_store()
1171 error = request_ihex_firmware(&fw, IMS_PCU_FIRMWARE_NAME, pcu->dev); in ims_pcu_update_firmware_store()
1173 dev_err(pcu->dev, "Failed to request firmware %s, error: %d\n", in ims_pcu_update_firmware_store()
1186 if (pcu->bootloader_mode) in ims_pcu_update_firmware_store()
1187 error = ims_pcu_handle_firmware_update(pcu, fw); in ims_pcu_update_firmware_store()
1189 error = ims_pcu_switch_to_bootloader(pcu); in ims_pcu_update_firmware_store()
1194 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_update_firmware_store()
1207 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_update_firmware_status_show() local
1209 return scnprintf(buf, PAGE_SIZE, "%d\n", pcu->update_firmware_status); in ims_pcu_update_firmware_status_show()
1233 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_is_attr_visible() local
1236 if (pcu->bootloader_mode) { in ims_pcu_is_attr_visible()
1259 static int ims_pcu_read_ofn_config(struct ims_pcu *pcu, u8 addr, u8 *data) in ims_pcu_read_ofn_config() argument
1264 error = ims_pcu_execute_command(pcu, OFN_GET_CONFIG, in ims_pcu_read_ofn_config()
1269 result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET); in ims_pcu_read_ofn_config()
1274 *data = pcu->cmd_buf[OFN_REG_RESULT_OFFSET]; in ims_pcu_read_ofn_config()
1278 static int ims_pcu_write_ofn_config(struct ims_pcu *pcu, u8 addr, u8 data) in ims_pcu_write_ofn_config() argument
1284 error = ims_pcu_execute_command(pcu, OFN_SET_CONFIG, in ims_pcu_write_ofn_config()
1289 result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET); in ims_pcu_write_ofn_config()
1301 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_data_show() local
1305 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_show()
1306 error = ims_pcu_read_ofn_config(pcu, pcu->ofn_reg_addr, &data); in ims_pcu_ofn_reg_data_show()
1307 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_show()
1320 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_data_store() local
1328 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_store()
1329 error = ims_pcu_write_ofn_config(pcu, pcu->ofn_reg_addr, value); in ims_pcu_ofn_reg_data_store()
1330 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_data_store()
1343 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_addr_show() local
1346 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_show()
1347 error = scnprintf(buf, PAGE_SIZE, "%x\n", pcu->ofn_reg_addr); in ims_pcu_ofn_reg_addr_show()
1348 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_show()
1358 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_reg_addr_store() local
1366 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_store()
1367 pcu->ofn_reg_addr = value; in ims_pcu_ofn_reg_addr_store()
1368 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_reg_addr_store()
1387 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_bit_show() local
1393 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_show()
1394 error = ims_pcu_read_ofn_config(pcu, attr->addr, &data); in ims_pcu_ofn_bit_show()
1395 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_show()
1408 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_ofn_bit_store() local
1422 mutex_lock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_store()
1424 error = ims_pcu_read_ofn_config(pcu, attr->addr, &data); in ims_pcu_ofn_bit_store()
1431 error = ims_pcu_write_ofn_config(pcu, attr->addr, data); in ims_pcu_ofn_bit_store()
1434 mutex_unlock(&pcu->cmd_mutex); in ims_pcu_ofn_bit_store()
1476 struct ims_pcu *pcu = urb->context; in ims_pcu_irq() local
1489 dev_dbg(pcu->dev, "%s - urb shutting down with status: %d\n", in ims_pcu_irq()
1493 dev_dbg(pcu->dev, "%s - nonzero urb status received: %d\n", in ims_pcu_irq()
1498 dev_dbg(pcu->dev, "%s: received %d: %*ph\n", __func__, in ims_pcu_irq()
1499 urb->actual_length, urb->actual_length, pcu->urb_in_buf); in ims_pcu_irq()
1501 if (urb == pcu->urb_in) in ims_pcu_irq()
1502 ims_pcu_process_data(pcu, urb); in ims_pcu_irq()
1507 dev_err(pcu->dev, "%s - usb_submit_urb failed with result %d\n", in ims_pcu_irq()
1511 static int ims_pcu_buffers_alloc(struct ims_pcu *pcu) in ims_pcu_buffers_alloc() argument
1515 pcu->urb_in_buf = usb_alloc_coherent(pcu->udev, pcu->max_in_size, in ims_pcu_buffers_alloc()
1516 GFP_KERNEL, &pcu->read_dma); in ims_pcu_buffers_alloc()
1517 if (!pcu->urb_in_buf) { in ims_pcu_buffers_alloc()
1518 dev_err(pcu->dev, in ims_pcu_buffers_alloc()
1523 pcu->urb_in = usb_alloc_urb(0, GFP_KERNEL); in ims_pcu_buffers_alloc()
1524 if (!pcu->urb_in) { in ims_pcu_buffers_alloc()
1525 dev_err(pcu->dev, "Failed to allocate input URB\n"); in ims_pcu_buffers_alloc()
1530 pcu->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ims_pcu_buffers_alloc()
1531 pcu->urb_in->transfer_dma = pcu->read_dma; in ims_pcu_buffers_alloc()
1533 usb_fill_bulk_urb(pcu->urb_in, pcu->udev, in ims_pcu_buffers_alloc()
1534 usb_rcvbulkpipe(pcu->udev, in ims_pcu_buffers_alloc()
1535 pcu->ep_in->bEndpointAddress), in ims_pcu_buffers_alloc()
1536 pcu->urb_in_buf, pcu->max_in_size, in ims_pcu_buffers_alloc()
1537 ims_pcu_irq, pcu); in ims_pcu_buffers_alloc()
1543 pcu->urb_out_buf = kmalloc(pcu->max_out_size, GFP_KERNEL); in ims_pcu_buffers_alloc()
1544 if (!pcu->urb_out_buf) { in ims_pcu_buffers_alloc()
1545 dev_err(pcu->dev, "Failed to allocate memory for write buffer\n"); in ims_pcu_buffers_alloc()
1550 pcu->urb_ctrl_buf = usb_alloc_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1551 GFP_KERNEL, &pcu->ctrl_dma); in ims_pcu_buffers_alloc()
1552 if (!pcu->urb_ctrl_buf) { in ims_pcu_buffers_alloc()
1553 dev_err(pcu->dev, in ims_pcu_buffers_alloc()
1559 pcu->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL); in ims_pcu_buffers_alloc()
1560 if (!pcu->urb_ctrl) { in ims_pcu_buffers_alloc()
1561 dev_err(pcu->dev, "Failed to allocate input URB\n"); in ims_pcu_buffers_alloc()
1566 pcu->urb_ctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ims_pcu_buffers_alloc()
1567 pcu->urb_ctrl->transfer_dma = pcu->ctrl_dma; in ims_pcu_buffers_alloc()
1569 usb_fill_int_urb(pcu->urb_ctrl, pcu->udev, in ims_pcu_buffers_alloc()
1570 usb_rcvintpipe(pcu->udev, in ims_pcu_buffers_alloc()
1571 pcu->ep_ctrl->bEndpointAddress), in ims_pcu_buffers_alloc()
1572 pcu->urb_ctrl_buf, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1573 ims_pcu_irq, pcu, pcu->ep_ctrl->bInterval); in ims_pcu_buffers_alloc()
1578 usb_free_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_alloc()
1579 pcu->urb_ctrl_buf, pcu->ctrl_dma); in ims_pcu_buffers_alloc()
1581 kfree(pcu->urb_out_buf); in ims_pcu_buffers_alloc()
1583 usb_free_urb(pcu->urb_in); in ims_pcu_buffers_alloc()
1585 usb_free_coherent(pcu->udev, pcu->max_in_size, in ims_pcu_buffers_alloc()
1586 pcu->urb_in_buf, pcu->read_dma); in ims_pcu_buffers_alloc()
1590 static void ims_pcu_buffers_free(struct ims_pcu *pcu) in ims_pcu_buffers_free() argument
1592 usb_kill_urb(pcu->urb_in); in ims_pcu_buffers_free()
1593 usb_free_urb(pcu->urb_in); in ims_pcu_buffers_free()
1595 usb_free_coherent(pcu->udev, pcu->max_out_size, in ims_pcu_buffers_free()
1596 pcu->urb_in_buf, pcu->read_dma); in ims_pcu_buffers_free()
1598 kfree(pcu->urb_out_buf); in ims_pcu_buffers_free()
1600 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_buffers_free()
1601 usb_free_urb(pcu->urb_ctrl); in ims_pcu_buffers_free()
1603 usb_free_coherent(pcu->udev, pcu->max_ctrl_size, in ims_pcu_buffers_free()
1604 pcu->urb_ctrl_buf, pcu->ctrl_dma); in ims_pcu_buffers_free()
1653 static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pcu) in ims_pcu_parse_cdc_data() argument
1662 pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev, in ims_pcu_parse_cdc_data()
1664 if (!pcu->ctrl_intf) in ims_pcu_parse_cdc_data()
1667 alt = pcu->ctrl_intf->cur_altsetting; in ims_pcu_parse_cdc_data()
1672 pcu->ep_ctrl = &alt->endpoint[0].desc; in ims_pcu_parse_cdc_data()
1673 pcu->max_ctrl_size = usb_endpoint_maxp(pcu->ep_ctrl); in ims_pcu_parse_cdc_data()
1675 pcu->data_intf = usb_ifnum_to_if(pcu->udev, in ims_pcu_parse_cdc_data()
1677 if (!pcu->data_intf) in ims_pcu_parse_cdc_data()
1680 alt = pcu->data_intf->cur_altsetting; in ims_pcu_parse_cdc_data()
1682 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1688 pcu->ep_out = &alt->endpoint[0].desc; in ims_pcu_parse_cdc_data()
1689 if (!usb_endpoint_is_bulk_out(pcu->ep_out)) { in ims_pcu_parse_cdc_data()
1690 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1695 pcu->max_out_size = usb_endpoint_maxp(pcu->ep_out); in ims_pcu_parse_cdc_data()
1696 if (pcu->max_out_size < 8) { in ims_pcu_parse_cdc_data()
1697 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1699 pcu->max_out_size); in ims_pcu_parse_cdc_data()
1703 pcu->ep_in = &alt->endpoint[1].desc; in ims_pcu_parse_cdc_data()
1704 if (!usb_endpoint_is_bulk_in(pcu->ep_in)) { in ims_pcu_parse_cdc_data()
1705 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1710 pcu->max_in_size = usb_endpoint_maxp(pcu->ep_in); in ims_pcu_parse_cdc_data()
1711 if (pcu->max_in_size < 8) { in ims_pcu_parse_cdc_data()
1712 dev_err(pcu->dev, in ims_pcu_parse_cdc_data()
1714 pcu->max_in_size); in ims_pcu_parse_cdc_data()
1721 static int ims_pcu_start_io(struct ims_pcu *pcu) in ims_pcu_start_io() argument
1725 error = usb_submit_urb(pcu->urb_ctrl, GFP_KERNEL); in ims_pcu_start_io()
1727 dev_err(pcu->dev, in ims_pcu_start_io()
1733 error = usb_submit_urb(pcu->urb_in, GFP_KERNEL); in ims_pcu_start_io()
1735 dev_err(pcu->dev, in ims_pcu_start_io()
1738 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_start_io()
1745 static void ims_pcu_stop_io(struct ims_pcu *pcu) in ims_pcu_stop_io() argument
1747 usb_kill_urb(pcu->urb_in); in ims_pcu_stop_io()
1748 usb_kill_urb(pcu->urb_ctrl); in ims_pcu_stop_io()
1751 static int ims_pcu_line_setup(struct ims_pcu *pcu) in ims_pcu_line_setup() argument
1753 struct usb_host_interface *interface = pcu->ctrl_intf->cur_altsetting; in ims_pcu_line_setup()
1754 struct usb_cdc_line_coding *line = (void *)pcu->cmd_buf; in ims_pcu_line_setup()
1761 error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), in ims_pcu_line_setup()
1768 dev_err(pcu->dev, "Failed to set line coding, error: %d\n", in ims_pcu_line_setup()
1773 error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), in ims_pcu_line_setup()
1779 dev_err(pcu->dev, "Failed to set line state, error: %d\n", in ims_pcu_line_setup()
1787 static int ims_pcu_get_device_info(struct ims_pcu *pcu) in ims_pcu_get_device_info() argument
1791 error = ims_pcu_get_info(pcu); in ims_pcu_get_device_info()
1795 error = ims_pcu_execute_query(pcu, GET_FW_VERSION); in ims_pcu_get_device_info()
1797 dev_err(pcu->dev, in ims_pcu_get_device_info()
1802 snprintf(pcu->fw_version, sizeof(pcu->fw_version), in ims_pcu_get_device_info()
1804 pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5], in ims_pcu_get_device_info()
1805 pcu->cmd_buf[6], pcu->cmd_buf[7]); in ims_pcu_get_device_info()
1807 error = ims_pcu_execute_query(pcu, GET_BL_VERSION); in ims_pcu_get_device_info()
1809 dev_err(pcu->dev, in ims_pcu_get_device_info()
1814 snprintf(pcu->bl_version, sizeof(pcu->bl_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, RESET_REASON); in ims_pcu_get_device_info()
1821 dev_err(pcu->dev, in ims_pcu_get_device_info()
1826 snprintf(pcu->reset_reason, sizeof(pcu->reset_reason), in ims_pcu_get_device_info()
1827 "%02x", pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); in ims_pcu_get_device_info()
1829 dev_dbg(pcu->dev, in ims_pcu_get_device_info()
1831 pcu->part_number, in ims_pcu_get_device_info()
1832 pcu->date_of_manufacturing, in ims_pcu_get_device_info()
1833 pcu->serial_number, in ims_pcu_get_device_info()
1834 pcu->fw_version, in ims_pcu_get_device_info()
1835 pcu->bl_version, in ims_pcu_get_device_info()
1836 pcu->reset_reason); in ims_pcu_get_device_info()
1841 static int ims_pcu_identify_type(struct ims_pcu *pcu, u8 *device_id) in ims_pcu_identify_type() argument
1845 error = ims_pcu_execute_query(pcu, GET_DEVICE_ID); in ims_pcu_identify_type()
1847 dev_err(pcu->dev, in ims_pcu_identify_type()
1852 *device_id = pcu->cmd_buf[IMS_PCU_DATA_OFFSET]; in ims_pcu_identify_type()
1853 dev_dbg(pcu->dev, "Detected device ID: %d\n", *device_id); in ims_pcu_identify_type()
1858 static int ims_pcu_init_application_mode(struct ims_pcu *pcu) in ims_pcu_init_application_mode() argument
1865 error = ims_pcu_get_device_info(pcu); in ims_pcu_init_application_mode()
1871 error = ims_pcu_identify_type(pcu, &pcu->device_id); in ims_pcu_init_application_mode()
1873 dev_err(pcu->dev, in ims_pcu_init_application_mode()
1883 if (pcu->device_id >= ARRAY_SIZE(ims_pcu_device_info) || in ims_pcu_init_application_mode()
1884 !ims_pcu_device_info[pcu->device_id].keymap) { in ims_pcu_init_application_mode()
1885 dev_err(pcu->dev, "Device ID %d is not valid\n", pcu->device_id); in ims_pcu_init_application_mode()
1891 pcu->device_no = atomic_inc_return(&device_no); in ims_pcu_init_application_mode()
1896 if (pcu->device_id != IMS_PCU_PCU_B_DEVICE_ID) { in ims_pcu_init_application_mode()
1897 error = sysfs_create_group(&pcu->dev->kobj, in ims_pcu_init_application_mode()
1903 error = ims_pcu_setup_backlight(pcu); in ims_pcu_init_application_mode()
1907 info = &ims_pcu_device_info[pcu->device_id]; in ims_pcu_init_application_mode()
1908 error = ims_pcu_setup_buttons(pcu, info->keymap, info->keymap_len); in ims_pcu_init_application_mode()
1913 error = ims_pcu_setup_gamepad(pcu); in ims_pcu_init_application_mode()
1918 pcu->setup_complete = true; in ims_pcu_init_application_mode()
1923 ims_pcu_destroy_buttons(pcu); in ims_pcu_init_application_mode()
1925 ims_pcu_destroy_backlight(pcu); in ims_pcu_init_application_mode()
1929 static void ims_pcu_destroy_application_mode(struct ims_pcu *pcu) in ims_pcu_destroy_application_mode() argument
1931 if (pcu->setup_complete) { in ims_pcu_destroy_application_mode()
1932 pcu->setup_complete = false; in ims_pcu_destroy_application_mode()
1935 if (pcu->gamepad) in ims_pcu_destroy_application_mode()
1936 ims_pcu_destroy_gamepad(pcu); in ims_pcu_destroy_application_mode()
1937 ims_pcu_destroy_buttons(pcu); in ims_pcu_destroy_application_mode()
1938 ims_pcu_destroy_backlight(pcu); in ims_pcu_destroy_application_mode()
1940 if (pcu->device_id != IMS_PCU_PCU_B_DEVICE_ID) in ims_pcu_destroy_application_mode()
1941 sysfs_remove_group(&pcu->dev->kobj, in ims_pcu_destroy_application_mode()
1946 static int ims_pcu_init_bootloader_mode(struct ims_pcu *pcu) in ims_pcu_init_bootloader_mode() argument
1950 error = ims_pcu_execute_bl_command(pcu, QUERY_DEVICE, NULL, 0, in ims_pcu_init_bootloader_mode()
1953 dev_err(pcu->dev, "Bootloader does not respond, aborting\n"); in ims_pcu_init_bootloader_mode()
1957 pcu->fw_start_addr = in ims_pcu_init_bootloader_mode()
1958 get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 11]); in ims_pcu_init_bootloader_mode()
1959 pcu->fw_end_addr = in ims_pcu_init_bootloader_mode()
1960 get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 15]); in ims_pcu_init_bootloader_mode()
1962 dev_info(pcu->dev, in ims_pcu_init_bootloader_mode()
1964 pcu->fw_start_addr, pcu->fw_end_addr); in ims_pcu_init_bootloader_mode()
1968 pcu->dev, GFP_KERNEL, pcu, in ims_pcu_init_bootloader_mode()
1972 complete(&pcu->async_firmware_done); in ims_pcu_init_bootloader_mode()
1978 static void ims_pcu_destroy_bootloader_mode(struct ims_pcu *pcu) in ims_pcu_destroy_bootloader_mode() argument
1981 wait_for_completion(&pcu->async_firmware_done); in ims_pcu_destroy_bootloader_mode()
1993 struct ims_pcu *pcu; in ims_pcu_probe() local
1996 pcu = kzalloc(sizeof(struct ims_pcu), GFP_KERNEL); in ims_pcu_probe()
1997 if (!pcu) in ims_pcu_probe()
2000 pcu->dev = &intf->dev; in ims_pcu_probe()
2001 pcu->udev = udev; in ims_pcu_probe()
2002 pcu->bootloader_mode = id->driver_info == IMS_PCU_BOOTLOADER_MODE; in ims_pcu_probe()
2003 mutex_init(&pcu->cmd_mutex); in ims_pcu_probe()
2004 init_completion(&pcu->cmd_done); in ims_pcu_probe()
2005 init_completion(&pcu->async_firmware_done); in ims_pcu_probe()
2007 error = ims_pcu_parse_cdc_data(intf, pcu); in ims_pcu_probe()
2012 pcu->data_intf, pcu); in ims_pcu_probe()
2020 usb_set_intfdata(pcu->ctrl_intf, pcu); in ims_pcu_probe()
2021 usb_set_intfdata(pcu->data_intf, pcu); in ims_pcu_probe()
2023 error = ims_pcu_buffers_alloc(pcu); in ims_pcu_probe()
2027 error = ims_pcu_start_io(pcu); in ims_pcu_probe()
2031 error = ims_pcu_line_setup(pcu); in ims_pcu_probe()
2039 error = pcu->bootloader_mode ? in ims_pcu_probe()
2040 ims_pcu_init_bootloader_mode(pcu) : in ims_pcu_probe()
2041 ims_pcu_init_application_mode(pcu); in ims_pcu_probe()
2050 ims_pcu_stop_io(pcu); in ims_pcu_probe()
2052 ims_pcu_buffers_free(pcu); in ims_pcu_probe()
2054 usb_driver_release_interface(&ims_pcu_driver, pcu->data_intf); in ims_pcu_probe()
2056 kfree(pcu); in ims_pcu_probe()
2062 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_disconnect() local
2076 ims_pcu_stop_io(pcu); in ims_pcu_disconnect()
2078 if (pcu->bootloader_mode) in ims_pcu_disconnect()
2079 ims_pcu_destroy_bootloader_mode(pcu); in ims_pcu_disconnect()
2081 ims_pcu_destroy_application_mode(pcu); in ims_pcu_disconnect()
2083 ims_pcu_buffers_free(pcu); in ims_pcu_disconnect()
2084 kfree(pcu); in ims_pcu_disconnect()
2091 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_suspend() local
2095 ims_pcu_stop_io(pcu); in ims_pcu_suspend()
2102 struct ims_pcu *pcu = usb_get_intfdata(intf); in ims_pcu_resume() local
2107 retval = ims_pcu_start_io(pcu); in ims_pcu_resume()
2109 retval = ims_pcu_line_setup(pcu); in ims_pcu_resume()