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