Lines Matching refs:f34
21 static int rmi_f34v7_read_flash_status(struct f34_data *f34) in rmi_f34v7_read_flash_status() argument
27 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_flash_status()
28 f34->fn->fd.data_base_addr + f34->v7.off.flash_status, in rmi_f34v7_read_flash_status()
32 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_read_flash_status()
37 f34->v7.in_bl_mode = status >> 7; in rmi_f34v7_read_flash_status()
38 f34->v7.flash_status = status & 0x1f; in rmi_f34v7_read_flash_status()
40 if (f34->v7.flash_status != 0x00) { in rmi_f34v7_read_flash_status()
41 dev_err(&f34->fn->dev, "%s: status=%d, command=0x%02x\n", in rmi_f34v7_read_flash_status()
42 __func__, f34->v7.flash_status, f34->v7.command); in rmi_f34v7_read_flash_status()
45 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_flash_status()
46 f34->fn->fd.data_base_addr + f34->v7.off.flash_cmd, in rmi_f34v7_read_flash_status()
50 dev_err(&f34->fn->dev, "%s: Failed to read flash command\n", in rmi_f34v7_read_flash_status()
55 f34->v7.command = command; in rmi_f34v7_read_flash_status()
60 static int rmi_f34v7_wait_for_idle(struct f34_data *f34, int timeout_ms) in rmi_f34v7_wait_for_idle() argument
66 if (!wait_for_completion_timeout(&f34->v7.cmd_done, timeout)) { in rmi_f34v7_wait_for_idle()
67 dev_warn(&f34->fn->dev, "%s: Timed out waiting for idle status\n", in rmi_f34v7_wait_for_idle()
75 static int rmi_f34v7_write_command_single_transaction(struct f34_data *f34, in rmi_f34v7_write_command_single_transaction() argument
82 base = f34->fn->fd.data_base_addr; in rmi_f34v7_write_command_single_transaction()
121 data_1_5.payload[0] = f34->bootloader_id[0]; in rmi_f34v7_write_command_single_transaction()
122 data_1_5.payload[1] = f34->bootloader_id[1]; in rmi_f34v7_write_command_single_transaction()
124 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_write_command_single_transaction()
125 base + f34->v7.off.partition_id, in rmi_f34v7_write_command_single_transaction()
128 dev_err(&f34->fn->dev, in rmi_f34v7_write_command_single_transaction()
137 static int rmi_f34v7_write_command(struct f34_data *f34, u8 cmd) in rmi_f34v7_write_command() argument
143 base = f34->fn->fd.data_base_addr; in rmi_f34v7_write_command()
169 dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n", in rmi_f34v7_write_command()
174 f34->v7.command = command; in rmi_f34v7_write_command()
185 ret = rmi_f34v7_write_command_single_transaction(f34, cmd); in rmi_f34v7_write_command()
194 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: writing cmd %02X\n", in rmi_f34v7_write_command()
197 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_write_command()
198 base + f34->v7.off.flash_cmd, in rmi_f34v7_write_command()
201 dev_err(&f34->fn->dev, "%s: Failed to write flash command\n", in rmi_f34v7_write_command()
209 static int rmi_f34v7_write_partition_id(struct f34_data *f34, u8 cmd) in rmi_f34v7_write_partition_id() argument
215 base = f34->fn->fd.data_base_addr; in rmi_f34v7_write_partition_id()
223 if (f34->v7.config_area == v7_UI_CONFIG_AREA) in rmi_f34v7_write_partition_id()
225 else if (f34->v7.config_area == v7_DP_CONFIG_AREA) in rmi_f34v7_write_partition_id()
227 else if (f34->v7.config_area == v7_PM_CONFIG_AREA) in rmi_f34v7_write_partition_id()
229 else if (f34->v7.config_area == v7_BL_CONFIG_AREA) in rmi_f34v7_write_partition_id()
231 else if (f34->v7.config_area == v7_FLASH_CONFIG_AREA) in rmi_f34v7_write_partition_id()
259 dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n", in rmi_f34v7_write_partition_id()
264 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_write_partition_id()
265 base + f34->v7.off.partition_id, in rmi_f34v7_write_partition_id()
268 dev_err(&f34->fn->dev, "%s: Failed to write partition ID\n", in rmi_f34v7_write_partition_id()
276 static int rmi_f34v7_read_partition_table(struct f34_data *f34) in rmi_f34v7_read_partition_table() argument
284 base = f34->fn->fd.data_base_addr; in rmi_f34v7_read_partition_table()
286 f34->v7.config_area = v7_FLASH_CONFIG_AREA; in rmi_f34v7_read_partition_table()
288 ret = rmi_f34v7_write_partition_id(f34, v7_CMD_READ_CONFIG); in rmi_f34v7_read_partition_table()
292 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_read_partition_table()
293 base + f34->v7.off.block_number, in rmi_f34v7_read_partition_table()
296 dev_err(&f34->fn->dev, "%s: Failed to write block number\n", in rmi_f34v7_read_partition_table()
301 put_unaligned_le16(f34->v7.flash_config_length, &length); in rmi_f34v7_read_partition_table()
303 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_read_partition_table()
304 base + f34->v7.off.transfer_length, in rmi_f34v7_read_partition_table()
307 dev_err(&f34->fn->dev, "%s: Failed to write transfer length\n", in rmi_f34v7_read_partition_table()
312 init_completion(&f34->v7.cmd_done); in rmi_f34v7_read_partition_table()
314 ret = rmi_f34v7_write_command(f34, v7_CMD_READ_CONFIG); in rmi_f34v7_read_partition_table()
316 dev_err(&f34->fn->dev, "%s: Failed to write command\n", in rmi_f34v7_read_partition_table()
324 rmi_f34v7_read_flash_status(f34); in rmi_f34v7_read_partition_table()
326 if (f34->v7.command == v7_CMD_IDLE && in rmi_f34v7_read_partition_table()
327 f34->v7.flash_status == 0x00) { in rmi_f34v7_read_partition_table()
332 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_partition_table()
333 base + f34->v7.off.payload, in rmi_f34v7_read_partition_table()
334 f34->v7.read_config_buf, in rmi_f34v7_read_partition_table()
335 f34->v7.partition_table_bytes); in rmi_f34v7_read_partition_table()
337 dev_err(&f34->fn->dev, "%s: Failed to read block data\n", in rmi_f34v7_read_partition_table()
345 static void rmi_f34v7_parse_partition_table(struct f34_data *f34, in rmi_f34v7_parse_partition_table() argument
356 for (i = 0; i < f34->v7.partitions; i++) { in rmi_f34v7_parse_partition_table()
361 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
368 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
375 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
382 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
388 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
395 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
401 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
407 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
413 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_partition_table()
421 static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34) in rmi_f34v7_read_queries_bl_version() argument
429 base = f34->fn->fd.query_base_addr; in rmi_f34v7_read_queries_bl_version()
431 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_queries_bl_version()
436 dev_err(&f34->fn->dev, in rmi_f34v7_read_queries_bl_version()
443 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_queries_bl_version()
448 dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n", in rmi_f34v7_read_queries_bl_version()
453 f34->bootloader_id[0] = query_1_7.bl_minor_revision; in rmi_f34v7_read_queries_bl_version()
454 f34->bootloader_id[1] = query_1_7.bl_major_revision; in rmi_f34v7_read_queries_bl_version()
456 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Bootloader V%d.%d\n", in rmi_f34v7_read_queries_bl_version()
457 f34->bootloader_id[1], f34->bootloader_id[0]); in rmi_f34v7_read_queries_bl_version()
462 static int rmi_f34v7_read_queries(struct f34_data *f34) in rmi_f34v7_read_queries() argument
472 base = f34->fn->fd.query_base_addr; in rmi_f34v7_read_queries()
474 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_queries()
479 dev_err(&f34->fn->dev, in rmi_f34v7_read_queries()
486 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_queries()
491 dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n", in rmi_f34v7_read_queries()
496 f34->bootloader_id[0] = query_1_7.bl_minor_revision; in rmi_f34v7_read_queries()
497 f34->bootloader_id[1] = query_1_7.bl_major_revision; in rmi_f34v7_read_queries()
499 f34->v7.block_size = le16_to_cpu(query_1_7.block_size); in rmi_f34v7_read_queries()
500 f34->v7.flash_config_length = in rmi_f34v7_read_queries()
502 f34->v7.payload_length = le16_to_cpu(query_1_7.payload_length); in rmi_f34v7_read_queries()
504 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.block_size = %d\n", in rmi_f34v7_read_queries()
505 __func__, f34->v7.block_size); in rmi_f34v7_read_queries()
507 f34->v7.off.flash_status = V7_FLASH_STATUS_OFFSET; in rmi_f34v7_read_queries()
508 f34->v7.off.partition_id = V7_PARTITION_ID_OFFSET; in rmi_f34v7_read_queries()
509 f34->v7.off.block_number = V7_BLOCK_NUMBER_OFFSET; in rmi_f34v7_read_queries()
510 f34->v7.off.transfer_length = V7_TRANSFER_LENGTH_OFFSET; in rmi_f34v7_read_queries()
511 f34->v7.off.flash_cmd = V7_COMMAND_OFFSET; in rmi_f34v7_read_queries()
512 f34->v7.off.payload = V7_PAYLOAD_OFFSET; in rmi_f34v7_read_queries()
514 f34->v7.has_display_cfg = query_1_7.partition_support[1] & HAS_DISP_CFG; in rmi_f34v7_read_queries()
515 f34->v7.has_guest_code = in rmi_f34v7_read_queries()
521 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_queries()
522 f34->fn->fd.control_base_addr, in rmi_f34v7_read_queries()
532 snprintf(f34->configuration_id, sizeof(f34->configuration_id), in rmi_f34v7_read_queries()
535 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n", in rmi_f34v7_read_queries()
536 f34->configuration_id); in rmi_f34v7_read_queries()
539 f34->v7.partitions = 0; in rmi_f34v7_read_queries()
541 f34->v7.partitions += hweight8(query_1_7.partition_support[i]); in rmi_f34v7_read_queries()
543 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n", in rmi_f34v7_read_queries()
548 f34->v7.partition_table_bytes = f34->v7.partitions * 8 + 2; in rmi_f34v7_read_queries()
550 f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev, in rmi_f34v7_read_queries()
551 f34->v7.partition_table_bytes, in rmi_f34v7_read_queries()
553 if (!f34->v7.read_config_buf) { in rmi_f34v7_read_queries()
554 f34->v7.read_config_buf_size = 0; in rmi_f34v7_read_queries()
558 f34->v7.read_config_buf_size = f34->v7.partition_table_bytes; in rmi_f34v7_read_queries()
559 ptable = f34->v7.read_config_buf; in rmi_f34v7_read_queries()
561 ret = rmi_f34v7_read_partition_table(f34); in rmi_f34v7_read_queries()
563 dev_err(&f34->fn->dev, "%s: Failed to read partition table\n", in rmi_f34v7_read_queries()
568 rmi_f34v7_parse_partition_table(f34, ptable, in rmi_f34v7_read_queries()
569 &f34->v7.blkcount, &f34->v7.phyaddr); in rmi_f34v7_read_queries()
574 static int rmi_f34v7_check_ui_firmware_size(struct f34_data *f34) in rmi_f34v7_check_ui_firmware_size() argument
578 block_count = f34->v7.img.ui_firmware.size / f34->v7.block_size; in rmi_f34v7_check_ui_firmware_size()
579 f34->update_size += block_count; in rmi_f34v7_check_ui_firmware_size()
581 if (block_count != f34->v7.blkcount.ui_firmware) { in rmi_f34v7_check_ui_firmware_size()
582 dev_err(&f34->fn->dev, in rmi_f34v7_check_ui_firmware_size()
584 block_count, f34->v7.blkcount.ui_firmware); in rmi_f34v7_check_ui_firmware_size()
591 static int rmi_f34v7_check_ui_config_size(struct f34_data *f34) in rmi_f34v7_check_ui_config_size() argument
595 block_count = f34->v7.img.ui_config.size / f34->v7.block_size; in rmi_f34v7_check_ui_config_size()
596 f34->update_size += block_count; in rmi_f34v7_check_ui_config_size()
598 if (block_count != f34->v7.blkcount.ui_config) { in rmi_f34v7_check_ui_config_size()
599 dev_err(&f34->fn->dev, "UI config size mismatch\n"); in rmi_f34v7_check_ui_config_size()
606 static int rmi_f34v7_check_dp_config_size(struct f34_data *f34) in rmi_f34v7_check_dp_config_size() argument
610 block_count = f34->v7.img.dp_config.size / f34->v7.block_size; in rmi_f34v7_check_dp_config_size()
611 f34->update_size += block_count; in rmi_f34v7_check_dp_config_size()
613 if (block_count != f34->v7.blkcount.dp_config) { in rmi_f34v7_check_dp_config_size()
614 dev_err(&f34->fn->dev, "Display config size mismatch\n"); in rmi_f34v7_check_dp_config_size()
621 static int rmi_f34v7_check_guest_code_size(struct f34_data *f34) in rmi_f34v7_check_guest_code_size() argument
625 block_count = f34->v7.img.guest_code.size / f34->v7.block_size; in rmi_f34v7_check_guest_code_size()
626 f34->update_size += block_count; in rmi_f34v7_check_guest_code_size()
628 if (block_count != f34->v7.blkcount.guest_code) { in rmi_f34v7_check_guest_code_size()
629 dev_err(&f34->fn->dev, "Guest code size mismatch\n"); in rmi_f34v7_check_guest_code_size()
636 static int rmi_f34v7_check_bl_config_size(struct f34_data *f34) in rmi_f34v7_check_bl_config_size() argument
640 block_count = f34->v7.img.bl_config.size / f34->v7.block_size; in rmi_f34v7_check_bl_config_size()
641 f34->update_size += block_count; in rmi_f34v7_check_bl_config_size()
643 if (block_count != f34->v7.blkcount.bl_config) { in rmi_f34v7_check_bl_config_size()
644 dev_err(&f34->fn->dev, "Bootloader config size mismatch\n"); in rmi_f34v7_check_bl_config_size()
651 static int rmi_f34v7_erase_config(struct f34_data *f34) in rmi_f34v7_erase_config() argument
655 dev_info(&f34->fn->dev, "Erasing config...\n"); in rmi_f34v7_erase_config()
657 init_completion(&f34->v7.cmd_done); in rmi_f34v7_erase_config()
659 switch (f34->v7.config_area) { in rmi_f34v7_erase_config()
661 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_UI_CONFIG); in rmi_f34v7_erase_config()
666 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_DISP_CONFIG); in rmi_f34v7_erase_config()
671 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_BL_CONFIG); in rmi_f34v7_erase_config()
677 ret = rmi_f34v7_wait_for_idle(f34, F34_ERASE_WAIT_MS); in rmi_f34v7_erase_config()
684 static int rmi_f34v7_erase_guest_code(struct f34_data *f34) in rmi_f34v7_erase_guest_code() argument
688 dev_info(&f34->fn->dev, "Erasing guest code...\n"); in rmi_f34v7_erase_guest_code()
690 init_completion(&f34->v7.cmd_done); in rmi_f34v7_erase_guest_code()
692 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_GUEST_CODE); in rmi_f34v7_erase_guest_code()
696 ret = rmi_f34v7_wait_for_idle(f34, F34_ERASE_WAIT_MS); in rmi_f34v7_erase_guest_code()
703 static int rmi_f34v7_erase_all(struct f34_data *f34) in rmi_f34v7_erase_all() argument
707 dev_info(&f34->fn->dev, "Erasing firmware...\n"); in rmi_f34v7_erase_all()
709 init_completion(&f34->v7.cmd_done); in rmi_f34v7_erase_all()
711 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_UI_FIRMWARE); in rmi_f34v7_erase_all()
715 ret = rmi_f34v7_wait_for_idle(f34, F34_ERASE_WAIT_MS); in rmi_f34v7_erase_all()
719 f34->v7.config_area = v7_UI_CONFIG_AREA; in rmi_f34v7_erase_all()
720 ret = rmi_f34v7_erase_config(f34); in rmi_f34v7_erase_all()
724 if (f34->v7.has_display_cfg) { in rmi_f34v7_erase_all()
725 f34->v7.config_area = v7_DP_CONFIG_AREA; in rmi_f34v7_erase_all()
726 ret = rmi_f34v7_erase_config(f34); in rmi_f34v7_erase_all()
731 if (f34->v7.new_partition_table && f34->v7.has_guest_code) { in rmi_f34v7_erase_all()
732 ret = rmi_f34v7_erase_guest_code(f34); in rmi_f34v7_erase_all()
740 static int rmi_f34v7_read_blocks(struct f34_data *f34, in rmi_f34v7_read_blocks() argument
752 base = f34->fn->fd.data_base_addr; in rmi_f34v7_read_blocks()
754 ret = rmi_f34v7_write_partition_id(f34, command); in rmi_f34v7_read_blocks()
758 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_read_blocks()
759 base + f34->v7.off.block_number, in rmi_f34v7_read_blocks()
762 dev_err(&f34->fn->dev, "%s: Failed to write block number\n", in rmi_f34v7_read_blocks()
767 max_transfer = min(f34->v7.payload_length, in rmi_f34v7_read_blocks()
768 (u16)(PAGE_SIZE / f34->v7.block_size)); in rmi_f34v7_read_blocks()
774 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_read_blocks()
775 base + f34->v7.off.transfer_length, in rmi_f34v7_read_blocks()
778 dev_err(&f34->fn->dev, in rmi_f34v7_read_blocks()
784 init_completion(&f34->v7.cmd_done); in rmi_f34v7_read_blocks()
786 ret = rmi_f34v7_write_command(f34, command); in rmi_f34v7_read_blocks()
790 ret = rmi_f34v7_wait_for_idle(f34, F34_ENABLE_WAIT_MS); in rmi_f34v7_read_blocks()
794 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_read_blocks()
795 base + f34->v7.off.payload, in rmi_f34v7_read_blocks()
796 &f34->v7.read_config_buf[index], in rmi_f34v7_read_blocks()
797 transfer * f34->v7.block_size); in rmi_f34v7_read_blocks()
799 dev_err(&f34->fn->dev, in rmi_f34v7_read_blocks()
805 index += (transfer * f34->v7.block_size); in rmi_f34v7_read_blocks()
812 static int rmi_f34v7_write_f34v7_blocks(struct f34_data *f34, in rmi_f34v7_write_f34v7_blocks() argument
824 base = f34->fn->fd.data_base_addr; in rmi_f34v7_write_f34v7_blocks()
826 ret = rmi_f34v7_write_partition_id(f34, command); in rmi_f34v7_write_f34v7_blocks()
830 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_write_f34v7_blocks()
831 base + f34->v7.off.block_number, in rmi_f34v7_write_f34v7_blocks()
834 dev_err(&f34->fn->dev, "%s: Failed to write block number\n", in rmi_f34v7_write_f34v7_blocks()
839 if (f34->v7.payload_length > (PAGE_SIZE / f34->v7.block_size)) in rmi_f34v7_write_f34v7_blocks()
840 max_transfer = PAGE_SIZE / f34->v7.block_size; in rmi_f34v7_write_f34v7_blocks()
842 max_transfer = f34->v7.payload_length; in rmi_f34v7_write_f34v7_blocks()
848 init_completion(&f34->v7.cmd_done); in rmi_f34v7_write_f34v7_blocks()
850 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_write_f34v7_blocks()
851 base + f34->v7.off.transfer_length, in rmi_f34v7_write_f34v7_blocks()
854 dev_err(&f34->fn->dev, in rmi_f34v7_write_f34v7_blocks()
860 ret = rmi_f34v7_write_command(f34, command); in rmi_f34v7_write_f34v7_blocks()
864 ret = rmi_write_block(f34->fn->rmi_dev, in rmi_f34v7_write_f34v7_blocks()
865 base + f34->v7.off.payload, in rmi_f34v7_write_f34v7_blocks()
866 block_ptr, transfer * f34->v7.block_size); in rmi_f34v7_write_f34v7_blocks()
868 dev_err(&f34->fn->dev, in rmi_f34v7_write_f34v7_blocks()
874 ret = rmi_f34v7_wait_for_idle(f34, F34_ENABLE_WAIT_MS); in rmi_f34v7_write_f34v7_blocks()
878 block_ptr += (transfer * f34->v7.block_size); in rmi_f34v7_write_f34v7_blocks()
880 f34->update_progress += transfer; in rmi_f34v7_write_f34v7_blocks()
881 f34->update_status = (f34->update_progress * 100) / in rmi_f34v7_write_f34v7_blocks()
882 f34->update_size; in rmi_f34v7_write_f34v7_blocks()
888 static int rmi_f34v7_write_config(struct f34_data *f34) in rmi_f34v7_write_config() argument
890 return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.config_data, in rmi_f34v7_write_config()
891 f34->v7.config_block_count, in rmi_f34v7_write_config()
895 static int rmi_f34v7_write_ui_config(struct f34_data *f34) in rmi_f34v7_write_ui_config() argument
897 f34->v7.config_area = v7_UI_CONFIG_AREA; in rmi_f34v7_write_ui_config()
898 f34->v7.config_data = f34->v7.img.ui_config.data; in rmi_f34v7_write_ui_config()
899 f34->v7.config_size = f34->v7.img.ui_config.size; in rmi_f34v7_write_ui_config()
900 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; in rmi_f34v7_write_ui_config()
902 return rmi_f34v7_write_config(f34); in rmi_f34v7_write_ui_config()
905 static int rmi_f34v7_write_dp_config(struct f34_data *f34) in rmi_f34v7_write_dp_config() argument
907 f34->v7.config_area = v7_DP_CONFIG_AREA; in rmi_f34v7_write_dp_config()
908 f34->v7.config_data = f34->v7.img.dp_config.data; in rmi_f34v7_write_dp_config()
909 f34->v7.config_size = f34->v7.img.dp_config.size; in rmi_f34v7_write_dp_config()
910 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; in rmi_f34v7_write_dp_config()
912 return rmi_f34v7_write_config(f34); in rmi_f34v7_write_dp_config()
915 static int rmi_f34v7_write_guest_code(struct f34_data *f34) in rmi_f34v7_write_guest_code() argument
917 return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.guest_code.data, in rmi_f34v7_write_guest_code()
918 f34->v7.img.guest_code.size / in rmi_f34v7_write_guest_code()
919 f34->v7.block_size, in rmi_f34v7_write_guest_code()
923 static int rmi_f34v7_write_flash_config(struct f34_data *f34) in rmi_f34v7_write_flash_config() argument
927 f34->v7.config_area = v7_FLASH_CONFIG_AREA; in rmi_f34v7_write_flash_config()
928 f34->v7.config_data = f34->v7.img.fl_config.data; in rmi_f34v7_write_flash_config()
929 f34->v7.config_size = f34->v7.img.fl_config.size; in rmi_f34v7_write_flash_config()
930 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; in rmi_f34v7_write_flash_config()
932 if (f34->v7.config_block_count != f34->v7.blkcount.fl_config) { in rmi_f34v7_write_flash_config()
933 dev_err(&f34->fn->dev, "%s: Flash config size mismatch\n", in rmi_f34v7_write_flash_config()
938 init_completion(&f34->v7.cmd_done); in rmi_f34v7_write_flash_config()
940 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_FLASH_CONFIG); in rmi_f34v7_write_flash_config()
944 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_write_flash_config()
947 ret = rmi_f34v7_wait_for_idle(f34, F34_WRITE_WAIT_MS); in rmi_f34v7_write_flash_config()
951 ret = rmi_f34v7_write_config(f34); in rmi_f34v7_write_flash_config()
958 static int rmi_f34v7_write_partition_table(struct f34_data *f34) in rmi_f34v7_write_partition_table() argument
963 block_count = f34->v7.blkcount.bl_config; in rmi_f34v7_write_partition_table()
964 f34->v7.config_area = v7_BL_CONFIG_AREA; in rmi_f34v7_write_partition_table()
965 f34->v7.config_size = f34->v7.block_size * block_count; in rmi_f34v7_write_partition_table()
966 devm_kfree(&f34->fn->dev, f34->v7.read_config_buf); in rmi_f34v7_write_partition_table()
967 f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev, in rmi_f34v7_write_partition_table()
968 f34->v7.config_size, GFP_KERNEL); in rmi_f34v7_write_partition_table()
969 if (!f34->v7.read_config_buf) { in rmi_f34v7_write_partition_table()
970 f34->v7.read_config_buf_size = 0; in rmi_f34v7_write_partition_table()
974 f34->v7.read_config_buf_size = f34->v7.config_size; in rmi_f34v7_write_partition_table()
976 ret = rmi_f34v7_read_blocks(f34, block_count, v7_CMD_READ_CONFIG); in rmi_f34v7_write_partition_table()
980 ret = rmi_f34v7_erase_config(f34); in rmi_f34v7_write_partition_table()
984 ret = rmi_f34v7_write_flash_config(f34); in rmi_f34v7_write_partition_table()
988 f34->v7.config_area = v7_BL_CONFIG_AREA; in rmi_f34v7_write_partition_table()
989 f34->v7.config_data = f34->v7.read_config_buf; in rmi_f34v7_write_partition_table()
990 f34->v7.config_size = f34->v7.img.bl_config.size; in rmi_f34v7_write_partition_table()
991 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; in rmi_f34v7_write_partition_table()
993 ret = rmi_f34v7_write_config(f34); in rmi_f34v7_write_partition_table()
1000 static int rmi_f34v7_write_firmware(struct f34_data *f34) in rmi_f34v7_write_firmware() argument
1004 blk_count = f34->v7.img.ui_firmware.size / f34->v7.block_size; in rmi_f34v7_write_firmware()
1006 return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.ui_firmware.data, in rmi_f34v7_write_firmware()
1010 static void rmi_f34v7_compare_partition_tables(struct f34_data *f34) in rmi_f34v7_compare_partition_tables() argument
1012 if (f34->v7.phyaddr.ui_firmware != f34->v7.img.phyaddr.ui_firmware) { in rmi_f34v7_compare_partition_tables()
1013 f34->v7.new_partition_table = true; in rmi_f34v7_compare_partition_tables()
1017 if (f34->v7.phyaddr.ui_config != f34->v7.img.phyaddr.ui_config) { in rmi_f34v7_compare_partition_tables()
1018 f34->v7.new_partition_table = true; in rmi_f34v7_compare_partition_tables()
1022 if (f34->v7.has_display_cfg && in rmi_f34v7_compare_partition_tables()
1023 f34->v7.phyaddr.dp_config != f34->v7.img.phyaddr.dp_config) { in rmi_f34v7_compare_partition_tables()
1024 f34->v7.new_partition_table = true; in rmi_f34v7_compare_partition_tables()
1028 if (f34->v7.has_guest_code && in rmi_f34v7_compare_partition_tables()
1029 f34->v7.phyaddr.guest_code != f34->v7.img.phyaddr.guest_code) { in rmi_f34v7_compare_partition_tables()
1030 f34->v7.new_partition_table = true; in rmi_f34v7_compare_partition_tables()
1034 f34->v7.new_partition_table = false; in rmi_f34v7_compare_partition_tables()
1037 static void rmi_f34v7_parse_img_header_10_bl_container(struct f34_data *f34, in rmi_f34v7_parse_img_header_10_bl_container() argument
1048 num_of_containers = f34->v7.img.bootloader.size / 4 - 1; in rmi_f34v7_parse_img_header_10_bl_container()
1051 addr = get_unaligned_le32(f34->v7.img.bootloader.data + i * 4); in rmi_f34v7_parse_img_header_10_bl_container()
1059 f34->v7.img.bl_config.data = content; in rmi_f34v7_parse_img_header_10_bl_container()
1060 f34->v7.img.bl_config.size = length; in rmi_f34v7_parse_img_header_10_bl_container()
1064 f34->v7.img.lockdown.data = content; in rmi_f34v7_parse_img_header_10_bl_container()
1065 f34->v7.img.lockdown.size = length; in rmi_f34v7_parse_img_header_10_bl_container()
1073 static void rmi_f34v7_parse_image_header_10(struct f34_data *f34) in rmi_f34v7_parse_image_header_10() argument
1081 const void *image = f34->v7.image; in rmi_f34v7_parse_image_header_10()
1086 f34->v7.img.checksum = le32_to_cpu(header->checksum); in rmi_f34v7_parse_image_header_10()
1088 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.img.checksum=%X\n", in rmi_f34v7_parse_image_header_10()
1089 __func__, f34->v7.img.checksum); in rmi_f34v7_parse_image_header_10()
1107 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_image_header_10()
1114 f34->v7.img.ui_firmware.data = content; in rmi_f34v7_parse_image_header_10()
1115 f34->v7.img.ui_firmware.size = length; in rmi_f34v7_parse_image_header_10()
1119 f34->v7.img.ui_config.data = content; in rmi_f34v7_parse_image_header_10()
1120 f34->v7.img.ui_config.size = length; in rmi_f34v7_parse_image_header_10()
1123 f34->v7.img.bl_version = *content; in rmi_f34v7_parse_image_header_10()
1124 f34->v7.img.bootloader.data = content; in rmi_f34v7_parse_image_header_10()
1125 f34->v7.img.bootloader.size = length; in rmi_f34v7_parse_image_header_10()
1126 rmi_f34v7_parse_img_header_10_bl_container(f34, image); in rmi_f34v7_parse_image_header_10()
1129 f34->v7.img.contains_guest_code = true; in rmi_f34v7_parse_image_header_10()
1130 f34->v7.img.guest_code.data = content; in rmi_f34v7_parse_image_header_10()
1131 f34->v7.img.guest_code.size = length; in rmi_f34v7_parse_image_header_10()
1134 f34->v7.img.contains_display_cfg = true; in rmi_f34v7_parse_image_header_10()
1135 f34->v7.img.dp_config.data = content; in rmi_f34v7_parse_image_header_10()
1136 f34->v7.img.dp_config.size = length; in rmi_f34v7_parse_image_header_10()
1139 f34->v7.img.contains_flash_config = true; in rmi_f34v7_parse_image_header_10()
1140 f34->v7.img.fl_config.data = content; in rmi_f34v7_parse_image_header_10()
1141 f34->v7.img.fl_config.size = length; in rmi_f34v7_parse_image_header_10()
1144 f34->v7.img.contains_firmware_id = true; in rmi_f34v7_parse_image_header_10()
1145 f34->v7.img.firmware_id = in rmi_f34v7_parse_image_header_10()
1154 static int rmi_f34v7_parse_image_info(struct f34_data *f34) in rmi_f34v7_parse_image_info() argument
1156 const struct image_header_10 *header = f34->v7.image; in rmi_f34v7_parse_image_info()
1158 memset(&f34->v7.img, 0x00, sizeof(f34->v7.img)); in rmi_f34v7_parse_image_info()
1160 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, in rmi_f34v7_parse_image_info()
1166 rmi_f34v7_parse_image_header_10(f34); in rmi_f34v7_parse_image_info()
1169 dev_err(&f34->fn->dev, "Unsupported image file format %02X\n", in rmi_f34v7_parse_image_info()
1174 if (!f34->v7.img.contains_flash_config) { in rmi_f34v7_parse_image_info()
1175 dev_err(&f34->fn->dev, "%s: No flash config in fw image\n", in rmi_f34v7_parse_image_info()
1180 rmi_f34v7_parse_partition_table(f34, f34->v7.img.fl_config.data, in rmi_f34v7_parse_image_info()
1181 &f34->v7.img.blkcount, &f34->v7.img.phyaddr); in rmi_f34v7_parse_image_info()
1183 rmi_f34v7_compare_partition_tables(f34); in rmi_f34v7_parse_image_info()
1188 int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw) in rmi_f34v7_do_reflash() argument
1192 f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, in rmi_f34v7_do_reflash()
1193 f34->fn->irq_mask); in rmi_f34v7_do_reflash()
1195 rmi_f34v7_read_queries_bl_version(f34); in rmi_f34v7_do_reflash()
1197 f34->v7.image = fw->data; in rmi_f34v7_do_reflash()
1198 f34->update_progress = 0; in rmi_f34v7_do_reflash()
1199 f34->update_size = 0; in rmi_f34v7_do_reflash()
1201 ret = rmi_f34v7_parse_image_info(f34); in rmi_f34v7_do_reflash()
1205 if (!f34->v7.new_partition_table) { in rmi_f34v7_do_reflash()
1206 ret = rmi_f34v7_check_ui_firmware_size(f34); in rmi_f34v7_do_reflash()
1210 ret = rmi_f34v7_check_ui_config_size(f34); in rmi_f34v7_do_reflash()
1214 if (f34->v7.has_display_cfg && in rmi_f34v7_do_reflash()
1215 f34->v7.img.contains_display_cfg) { in rmi_f34v7_do_reflash()
1216 ret = rmi_f34v7_check_dp_config_size(f34); in rmi_f34v7_do_reflash()
1221 if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) { in rmi_f34v7_do_reflash()
1222 ret = rmi_f34v7_check_guest_code_size(f34); in rmi_f34v7_do_reflash()
1227 ret = rmi_f34v7_check_bl_config_size(f34); in rmi_f34v7_do_reflash()
1232 ret = rmi_f34v7_erase_all(f34); in rmi_f34v7_do_reflash()
1236 if (f34->v7.new_partition_table) { in rmi_f34v7_do_reflash()
1237 ret = rmi_f34v7_write_partition_table(f34); in rmi_f34v7_do_reflash()
1240 dev_info(&f34->fn->dev, "%s: Partition table programmed\n", in rmi_f34v7_do_reflash()
1244 dev_info(&f34->fn->dev, "Writing firmware (%d bytes)...\n", in rmi_f34v7_do_reflash()
1245 f34->v7.img.ui_firmware.size); in rmi_f34v7_do_reflash()
1247 ret = rmi_f34v7_write_firmware(f34); in rmi_f34v7_do_reflash()
1251 dev_info(&f34->fn->dev, "Writing config (%d bytes)...\n", in rmi_f34v7_do_reflash()
1252 f34->v7.img.ui_config.size); in rmi_f34v7_do_reflash()
1254 f34->v7.config_area = v7_UI_CONFIG_AREA; in rmi_f34v7_do_reflash()
1255 ret = rmi_f34v7_write_ui_config(f34); in rmi_f34v7_do_reflash()
1259 if (f34->v7.has_display_cfg && f34->v7.img.contains_display_cfg) { in rmi_f34v7_do_reflash()
1260 dev_info(&f34->fn->dev, "Writing display config...\n"); in rmi_f34v7_do_reflash()
1262 ret = rmi_f34v7_write_dp_config(f34); in rmi_f34v7_do_reflash()
1267 if (f34->v7.new_partition_table) { in rmi_f34v7_do_reflash()
1268 if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) { in rmi_f34v7_do_reflash()
1269 dev_info(&f34->fn->dev, "Writing guest code...\n"); in rmi_f34v7_do_reflash()
1271 ret = rmi_f34v7_write_guest_code(f34); in rmi_f34v7_do_reflash()
1281 static int rmi_f34v7_enter_flash_prog(struct f34_data *f34) in rmi_f34v7_enter_flash_prog() argument
1285 f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, f34->fn->irq_mask); in rmi_f34v7_enter_flash_prog()
1287 ret = rmi_f34v7_read_flash_status(f34); in rmi_f34v7_enter_flash_prog()
1291 if (f34->v7.in_bl_mode) in rmi_f34v7_enter_flash_prog()
1294 init_completion(&f34->v7.cmd_done); in rmi_f34v7_enter_flash_prog()
1296 ret = rmi_f34v7_write_command(f34, v7_CMD_ENABLE_FLASH_PROG); in rmi_f34v7_enter_flash_prog()
1300 ret = rmi_f34v7_wait_for_idle(f34, F34_ENABLE_WAIT_MS); in rmi_f34v7_enter_flash_prog()
1307 int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw) in rmi_f34v7_start_reflash() argument
1311 f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, f34->fn->irq_mask); in rmi_f34v7_start_reflash()
1313 f34->v7.config_area = v7_UI_CONFIG_AREA; in rmi_f34v7_start_reflash()
1314 f34->v7.image = fw->data; in rmi_f34v7_start_reflash()
1316 ret = rmi_f34v7_parse_image_info(f34); in rmi_f34v7_start_reflash()
1320 if (!f34->v7.force_update && f34->v7.new_partition_table) { in rmi_f34v7_start_reflash()
1321 dev_err(&f34->fn->dev, "%s: Partition table mismatch\n", in rmi_f34v7_start_reflash()
1327 dev_info(&f34->fn->dev, "Firmware image OK\n"); in rmi_f34v7_start_reflash()
1329 ret = rmi_f34v7_read_flash_status(f34); in rmi_f34v7_start_reflash()
1333 if (f34->v7.in_bl_mode) { in rmi_f34v7_start_reflash()
1334 dev_info(&f34->fn->dev, "%s: Device in bootloader mode\n", in rmi_f34v7_start_reflash()
1338 rmi_f34v7_enter_flash_prog(f34); in rmi_f34v7_start_reflash()
1346 int rmi_f34v7_probe(struct f34_data *f34) in rmi_f34v7_probe() argument
1351 ret = rmi_read_block(f34->fn->rmi_dev, in rmi_f34v7_probe()
1352 f34->fn->fd.query_base_addr + V7_BOOTLOADER_ID_OFFSET, in rmi_f34v7_probe()
1353 f34->bootloader_id, in rmi_f34v7_probe()
1354 sizeof(f34->bootloader_id)); in rmi_f34v7_probe()
1356 dev_err(&f34->fn->dev, "%s: Failed to read bootloader ID\n", in rmi_f34v7_probe()
1361 if (f34->bootloader_id[1] == '5') { in rmi_f34v7_probe()
1362 f34->bl_version = 5; in rmi_f34v7_probe()
1363 } else if (f34->bootloader_id[1] == '6') { in rmi_f34v7_probe()
1364 f34->bl_version = 6; in rmi_f34v7_probe()
1365 } else if (f34->bootloader_id[1] == 7) { in rmi_f34v7_probe()
1366 f34->bl_version = 7; in rmi_f34v7_probe()
1367 } else if (f34->bootloader_id[1] == 8) { in rmi_f34v7_probe()
1368 f34->bl_version = 8; in rmi_f34v7_probe()
1370 dev_err(&f34->fn->dev, in rmi_f34v7_probe()
1373 f34->bootloader_id[0], f34->bootloader_id[0], in rmi_f34v7_probe()
1374 f34->bootloader_id[1], f34->bootloader_id[1]); in rmi_f34v7_probe()
1378 memset(&f34->v7.blkcount, 0x00, sizeof(f34->v7.blkcount)); in rmi_f34v7_probe()
1379 memset(&f34->v7.phyaddr, 0x00, sizeof(f34->v7.phyaddr)); in rmi_f34v7_probe()
1381 init_completion(&f34->v7.cmd_done); in rmi_f34v7_probe()
1383 ret = rmi_f34v7_read_queries(f34); in rmi_f34v7_probe()
1387 f34->v7.force_update = true; in rmi_f34v7_probe()