rmi_f34v7.c (33948B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (c) 2016, Zodiac Inflight Innovations 4 * Copyright (c) 2007-2016, Synaptics Incorporated 5 * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com> 6 * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com> 7 */ 8 9#include <linux/bitops.h> 10#include <linux/kernel.h> 11#include <linux/rmi.h> 12#include <linux/firmware.h> 13#include <linux/delay.h> 14#include <linux/slab.h> 15#include <linux/jiffies.h> 16#include <asm/unaligned.h> 17 18#include "rmi_driver.h" 19#include "rmi_f34.h" 20 21static int rmi_f34v7_read_flash_status(struct f34_data *f34) 22{ 23 u8 status; 24 u8 command; 25 int ret; 26 27 ret = rmi_read_block(f34->fn->rmi_dev, 28 f34->fn->fd.data_base_addr + f34->v7.off.flash_status, 29 &status, 30 sizeof(status)); 31 if (ret < 0) { 32 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 33 "%s: Error %d reading flash status\n", __func__, ret); 34 return ret; 35 } 36 37 f34->v7.in_bl_mode = status >> 7; 38 f34->v7.flash_status = status & 0x1f; 39 40 if (f34->v7.flash_status != 0x00) { 41 dev_err(&f34->fn->dev, "%s: status=%d, command=0x%02x\n", 42 __func__, f34->v7.flash_status, f34->v7.command); 43 } 44 45 ret = rmi_read_block(f34->fn->rmi_dev, 46 f34->fn->fd.data_base_addr + f34->v7.off.flash_cmd, 47 &command, 48 sizeof(command)); 49 if (ret < 0) { 50 dev_err(&f34->fn->dev, "%s: Failed to read flash command\n", 51 __func__); 52 return ret; 53 } 54 55 f34->v7.command = command; 56 57 return 0; 58} 59 60static int rmi_f34v7_wait_for_idle(struct f34_data *f34, int timeout_ms) 61{ 62 unsigned long timeout; 63 64 timeout = msecs_to_jiffies(timeout_ms); 65 66 if (!wait_for_completion_timeout(&f34->v7.cmd_done, timeout)) { 67 dev_warn(&f34->fn->dev, "%s: Timed out waiting for idle status\n", 68 __func__); 69 return -ETIMEDOUT; 70 } 71 72 return 0; 73} 74 75static int rmi_f34v7_write_command_single_transaction(struct f34_data *f34, 76 u8 cmd) 77{ 78 int ret; 79 u8 base; 80 struct f34v7_data_1_5 data_1_5; 81 82 base = f34->fn->fd.data_base_addr; 83 84 memset(&data_1_5, 0, sizeof(data_1_5)); 85 86 switch (cmd) { 87 case v7_CMD_ERASE_ALL: 88 data_1_5.partition_id = CORE_CODE_PARTITION; 89 data_1_5.command = CMD_V7_ERASE_AP; 90 break; 91 case v7_CMD_ERASE_UI_FIRMWARE: 92 data_1_5.partition_id = CORE_CODE_PARTITION; 93 data_1_5.command = CMD_V7_ERASE; 94 break; 95 case v7_CMD_ERASE_BL_CONFIG: 96 data_1_5.partition_id = GLOBAL_PARAMETERS_PARTITION; 97 data_1_5.command = CMD_V7_ERASE; 98 break; 99 case v7_CMD_ERASE_UI_CONFIG: 100 data_1_5.partition_id = CORE_CONFIG_PARTITION; 101 data_1_5.command = CMD_V7_ERASE; 102 break; 103 case v7_CMD_ERASE_DISP_CONFIG: 104 data_1_5.partition_id = DISPLAY_CONFIG_PARTITION; 105 data_1_5.command = CMD_V7_ERASE; 106 break; 107 case v7_CMD_ERASE_FLASH_CONFIG: 108 data_1_5.partition_id = FLASH_CONFIG_PARTITION; 109 data_1_5.command = CMD_V7_ERASE; 110 break; 111 case v7_CMD_ERASE_GUEST_CODE: 112 data_1_5.partition_id = GUEST_CODE_PARTITION; 113 data_1_5.command = CMD_V7_ERASE; 114 break; 115 case v7_CMD_ENABLE_FLASH_PROG: 116 data_1_5.partition_id = BOOTLOADER_PARTITION; 117 data_1_5.command = CMD_V7_ENTER_BL; 118 break; 119 } 120 121 data_1_5.payload[0] = f34->bootloader_id[0]; 122 data_1_5.payload[1] = f34->bootloader_id[1]; 123 124 ret = rmi_write_block(f34->fn->rmi_dev, 125 base + f34->v7.off.partition_id, 126 &data_1_5, sizeof(data_1_5)); 127 if (ret < 0) { 128 dev_err(&f34->fn->dev, 129 "%s: Failed to write single transaction command\n", 130 __func__); 131 return ret; 132 } 133 134 return 0; 135} 136 137static int rmi_f34v7_write_command(struct f34_data *f34, u8 cmd) 138{ 139 int ret; 140 u8 base; 141 u8 command; 142 143 base = f34->fn->fd.data_base_addr; 144 145 switch (cmd) { 146 case v7_CMD_WRITE_FW: 147 case v7_CMD_WRITE_CONFIG: 148 case v7_CMD_WRITE_GUEST_CODE: 149 command = CMD_V7_WRITE; 150 break; 151 case v7_CMD_READ_CONFIG: 152 command = CMD_V7_READ; 153 break; 154 case v7_CMD_ERASE_ALL: 155 command = CMD_V7_ERASE_AP; 156 break; 157 case v7_CMD_ERASE_UI_FIRMWARE: 158 case v7_CMD_ERASE_BL_CONFIG: 159 case v7_CMD_ERASE_UI_CONFIG: 160 case v7_CMD_ERASE_DISP_CONFIG: 161 case v7_CMD_ERASE_FLASH_CONFIG: 162 case v7_CMD_ERASE_GUEST_CODE: 163 command = CMD_V7_ERASE; 164 break; 165 case v7_CMD_ENABLE_FLASH_PROG: 166 command = CMD_V7_ENTER_BL; 167 break; 168 default: 169 dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n", 170 __func__, cmd); 171 return -EINVAL; 172 } 173 174 f34->v7.command = command; 175 176 switch (cmd) { 177 case v7_CMD_ERASE_ALL: 178 case v7_CMD_ERASE_UI_FIRMWARE: 179 case v7_CMD_ERASE_BL_CONFIG: 180 case v7_CMD_ERASE_UI_CONFIG: 181 case v7_CMD_ERASE_DISP_CONFIG: 182 case v7_CMD_ERASE_FLASH_CONFIG: 183 case v7_CMD_ERASE_GUEST_CODE: 184 case v7_CMD_ENABLE_FLASH_PROG: 185 ret = rmi_f34v7_write_command_single_transaction(f34, cmd); 186 if (ret < 0) 187 return ret; 188 else 189 return 0; 190 default: 191 break; 192 } 193 194 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: writing cmd %02X\n", 195 __func__, command); 196 197 ret = rmi_write_block(f34->fn->rmi_dev, 198 base + f34->v7.off.flash_cmd, 199 &command, sizeof(command)); 200 if (ret < 0) { 201 dev_err(&f34->fn->dev, "%s: Failed to write flash command\n", 202 __func__); 203 return ret; 204 } 205 206 return 0; 207} 208 209static int rmi_f34v7_write_partition_id(struct f34_data *f34, u8 cmd) 210{ 211 int ret; 212 u8 base; 213 u8 partition; 214 215 base = f34->fn->fd.data_base_addr; 216 217 switch (cmd) { 218 case v7_CMD_WRITE_FW: 219 partition = CORE_CODE_PARTITION; 220 break; 221 case v7_CMD_WRITE_CONFIG: 222 case v7_CMD_READ_CONFIG: 223 if (f34->v7.config_area == v7_UI_CONFIG_AREA) 224 partition = CORE_CONFIG_PARTITION; 225 else if (f34->v7.config_area == v7_DP_CONFIG_AREA) 226 partition = DISPLAY_CONFIG_PARTITION; 227 else if (f34->v7.config_area == v7_PM_CONFIG_AREA) 228 partition = GUEST_SERIALIZATION_PARTITION; 229 else if (f34->v7.config_area == v7_BL_CONFIG_AREA) 230 partition = GLOBAL_PARAMETERS_PARTITION; 231 else if (f34->v7.config_area == v7_FLASH_CONFIG_AREA) 232 partition = FLASH_CONFIG_PARTITION; 233 break; 234 case v7_CMD_WRITE_GUEST_CODE: 235 partition = GUEST_CODE_PARTITION; 236 break; 237 case v7_CMD_ERASE_ALL: 238 partition = CORE_CODE_PARTITION; 239 break; 240 case v7_CMD_ERASE_BL_CONFIG: 241 partition = GLOBAL_PARAMETERS_PARTITION; 242 break; 243 case v7_CMD_ERASE_UI_CONFIG: 244 partition = CORE_CONFIG_PARTITION; 245 break; 246 case v7_CMD_ERASE_DISP_CONFIG: 247 partition = DISPLAY_CONFIG_PARTITION; 248 break; 249 case v7_CMD_ERASE_FLASH_CONFIG: 250 partition = FLASH_CONFIG_PARTITION; 251 break; 252 case v7_CMD_ERASE_GUEST_CODE: 253 partition = GUEST_CODE_PARTITION; 254 break; 255 case v7_CMD_ENABLE_FLASH_PROG: 256 partition = BOOTLOADER_PARTITION; 257 break; 258 default: 259 dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n", 260 __func__, cmd); 261 return -EINVAL; 262 } 263 264 ret = rmi_write_block(f34->fn->rmi_dev, 265 base + f34->v7.off.partition_id, 266 &partition, sizeof(partition)); 267 if (ret < 0) { 268 dev_err(&f34->fn->dev, "%s: Failed to write partition ID\n", 269 __func__); 270 return ret; 271 } 272 273 return 0; 274} 275 276static int rmi_f34v7_read_partition_table(struct f34_data *f34) 277{ 278 int ret; 279 unsigned long timeout; 280 u8 base; 281 __le16 length; 282 u16 block_number = 0; 283 284 base = f34->fn->fd.data_base_addr; 285 286 f34->v7.config_area = v7_FLASH_CONFIG_AREA; 287 288 ret = rmi_f34v7_write_partition_id(f34, v7_CMD_READ_CONFIG); 289 if (ret < 0) 290 return ret; 291 292 ret = rmi_write_block(f34->fn->rmi_dev, 293 base + f34->v7.off.block_number, 294 &block_number, sizeof(block_number)); 295 if (ret < 0) { 296 dev_err(&f34->fn->dev, "%s: Failed to write block number\n", 297 __func__); 298 return ret; 299 } 300 301 put_unaligned_le16(f34->v7.flash_config_length, &length); 302 303 ret = rmi_write_block(f34->fn->rmi_dev, 304 base + f34->v7.off.transfer_length, 305 &length, sizeof(length)); 306 if (ret < 0) { 307 dev_err(&f34->fn->dev, "%s: Failed to write transfer length\n", 308 __func__); 309 return ret; 310 } 311 312 init_completion(&f34->v7.cmd_done); 313 314 ret = rmi_f34v7_write_command(f34, v7_CMD_READ_CONFIG); 315 if (ret < 0) { 316 dev_err(&f34->fn->dev, "%s: Failed to write command\n", 317 __func__); 318 return ret; 319 } 320 321 timeout = msecs_to_jiffies(F34_WRITE_WAIT_MS); 322 while (time_before(jiffies, timeout)) { 323 usleep_range(5000, 6000); 324 rmi_f34v7_read_flash_status(f34); 325 326 if (f34->v7.command == v7_CMD_IDLE && 327 f34->v7.flash_status == 0x00) { 328 break; 329 } 330 } 331 332 ret = rmi_read_block(f34->fn->rmi_dev, 333 base + f34->v7.off.payload, 334 f34->v7.read_config_buf, 335 f34->v7.partition_table_bytes); 336 if (ret < 0) { 337 dev_err(&f34->fn->dev, "%s: Failed to read block data\n", 338 __func__); 339 return ret; 340 } 341 342 return 0; 343} 344 345static void rmi_f34v7_parse_partition_table(struct f34_data *f34, 346 const void *partition_table, 347 struct block_count *blkcount, 348 struct physical_address *phyaddr) 349{ 350 int i; 351 int index; 352 u16 partition_length; 353 u16 physical_address; 354 const struct partition_table *ptable; 355 356 for (i = 0; i < f34->v7.partitions; i++) { 357 index = i * 8 + 2; 358 ptable = partition_table + index; 359 partition_length = le16_to_cpu(ptable->partition_length); 360 physical_address = le16_to_cpu(ptable->start_physical_address); 361 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 362 "%s: Partition entry %d: %*ph\n", 363 __func__, i, sizeof(struct partition_table), ptable); 364 switch (ptable->partition_id & 0x1f) { 365 case CORE_CODE_PARTITION: 366 blkcount->ui_firmware = partition_length; 367 phyaddr->ui_firmware = physical_address; 368 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 369 "%s: Core code block count: %d\n", 370 __func__, blkcount->ui_firmware); 371 break; 372 case CORE_CONFIG_PARTITION: 373 blkcount->ui_config = partition_length; 374 phyaddr->ui_config = physical_address; 375 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 376 "%s: Core config block count: %d\n", 377 __func__, blkcount->ui_config); 378 break; 379 case DISPLAY_CONFIG_PARTITION: 380 blkcount->dp_config = partition_length; 381 phyaddr->dp_config = physical_address; 382 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 383 "%s: Display config block count: %d\n", 384 __func__, blkcount->dp_config); 385 break; 386 case FLASH_CONFIG_PARTITION: 387 blkcount->fl_config = partition_length; 388 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 389 "%s: Flash config block count: %d\n", 390 __func__, blkcount->fl_config); 391 break; 392 case GUEST_CODE_PARTITION: 393 blkcount->guest_code = partition_length; 394 phyaddr->guest_code = physical_address; 395 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 396 "%s: Guest code block count: %d\n", 397 __func__, blkcount->guest_code); 398 break; 399 case GUEST_SERIALIZATION_PARTITION: 400 blkcount->pm_config = partition_length; 401 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 402 "%s: Guest serialization block count: %d\n", 403 __func__, blkcount->pm_config); 404 break; 405 case GLOBAL_PARAMETERS_PARTITION: 406 blkcount->bl_config = partition_length; 407 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 408 "%s: Global parameters block count: %d\n", 409 __func__, blkcount->bl_config); 410 break; 411 case DEVICE_CONFIG_PARTITION: 412 blkcount->lockdown = partition_length; 413 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 414 "%s: Device config block count: %d\n", 415 __func__, blkcount->lockdown); 416 break; 417 } 418 } 419} 420 421static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34) 422{ 423 int ret; 424 u8 base; 425 int offset; 426 u8 query_0; 427 struct f34v7_query_1_7 query_1_7; 428 429 base = f34->fn->fd.query_base_addr; 430 431 ret = rmi_read_block(f34->fn->rmi_dev, 432 base, 433 &query_0, 434 sizeof(query_0)); 435 if (ret < 0) { 436 dev_err(&f34->fn->dev, 437 "%s: Failed to read query 0\n", __func__); 438 return ret; 439 } 440 441 offset = (query_0 & 0x7) + 1; 442 443 ret = rmi_read_block(f34->fn->rmi_dev, 444 base + offset, 445 &query_1_7, 446 sizeof(query_1_7)); 447 if (ret < 0) { 448 dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n", 449 __func__); 450 return ret; 451 } 452 453 f34->bootloader_id[0] = query_1_7.bl_minor_revision; 454 f34->bootloader_id[1] = query_1_7.bl_major_revision; 455 456 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Bootloader V%d.%d\n", 457 f34->bootloader_id[1], f34->bootloader_id[0]); 458 459 return 0; 460} 461 462static int rmi_f34v7_read_queries(struct f34_data *f34) 463{ 464 int ret; 465 int i; 466 u8 base; 467 int offset; 468 u8 *ptable; 469 u8 query_0; 470 struct f34v7_query_1_7 query_1_7; 471 472 base = f34->fn->fd.query_base_addr; 473 474 ret = rmi_read_block(f34->fn->rmi_dev, 475 base, 476 &query_0, 477 sizeof(query_0)); 478 if (ret < 0) { 479 dev_err(&f34->fn->dev, 480 "%s: Failed to read query 0\n", __func__); 481 return ret; 482 } 483 484 offset = (query_0 & 0x07) + 1; 485 486 ret = rmi_read_block(f34->fn->rmi_dev, 487 base + offset, 488 &query_1_7, 489 sizeof(query_1_7)); 490 if (ret < 0) { 491 dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n", 492 __func__); 493 return ret; 494 } 495 496 f34->bootloader_id[0] = query_1_7.bl_minor_revision; 497 f34->bootloader_id[1] = query_1_7.bl_major_revision; 498 499 f34->v7.block_size = le16_to_cpu(query_1_7.block_size); 500 f34->v7.flash_config_length = 501 le16_to_cpu(query_1_7.flash_config_length); 502 f34->v7.payload_length = le16_to_cpu(query_1_7.payload_length); 503 504 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.block_size = %d\n", 505 __func__, f34->v7.block_size); 506 507 f34->v7.off.flash_status = V7_FLASH_STATUS_OFFSET; 508 f34->v7.off.partition_id = V7_PARTITION_ID_OFFSET; 509 f34->v7.off.block_number = V7_BLOCK_NUMBER_OFFSET; 510 f34->v7.off.transfer_length = V7_TRANSFER_LENGTH_OFFSET; 511 f34->v7.off.flash_cmd = V7_COMMAND_OFFSET; 512 f34->v7.off.payload = V7_PAYLOAD_OFFSET; 513 514 f34->v7.has_display_cfg = query_1_7.partition_support[1] & HAS_DISP_CFG; 515 f34->v7.has_guest_code = 516 query_1_7.partition_support[1] & HAS_GUEST_CODE; 517 518 if (query_0 & HAS_CONFIG_ID) { 519 u8 f34_ctrl[CONFIG_ID_SIZE]; 520 521 ret = rmi_read_block(f34->fn->rmi_dev, 522 f34->fn->fd.control_base_addr, 523 f34_ctrl, 524 sizeof(f34_ctrl)); 525 if (ret) 526 return ret; 527 528 /* Eat leading zeros */ 529 for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++) 530 /* Empty */; 531 532 snprintf(f34->configuration_id, sizeof(f34->configuration_id), 533 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i); 534 535 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n", 536 f34->configuration_id); 537 } 538 539 f34->v7.partitions = 0; 540 for (i = 0; i < sizeof(query_1_7.partition_support); i++) 541 f34->v7.partitions += hweight8(query_1_7.partition_support[i]); 542 543 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n", 544 __func__, sizeof(query_1_7.partition_support), 545 query_1_7.partition_support); 546 547 548 f34->v7.partition_table_bytes = f34->v7.partitions * 8 + 2; 549 550 f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev, 551 f34->v7.partition_table_bytes, 552 GFP_KERNEL); 553 if (!f34->v7.read_config_buf) { 554 f34->v7.read_config_buf_size = 0; 555 return -ENOMEM; 556 } 557 558 f34->v7.read_config_buf_size = f34->v7.partition_table_bytes; 559 ptable = f34->v7.read_config_buf; 560 561 ret = rmi_f34v7_read_partition_table(f34); 562 if (ret < 0) { 563 dev_err(&f34->fn->dev, "%s: Failed to read partition table\n", 564 __func__); 565 return ret; 566 } 567 568 rmi_f34v7_parse_partition_table(f34, ptable, 569 &f34->v7.blkcount, &f34->v7.phyaddr); 570 571 return 0; 572} 573 574static int rmi_f34v7_check_ui_firmware_size(struct f34_data *f34) 575{ 576 u16 block_count; 577 578 block_count = f34->v7.img.ui_firmware.size / f34->v7.block_size; 579 f34->update_size += block_count; 580 581 if (block_count != f34->v7.blkcount.ui_firmware) { 582 dev_err(&f34->fn->dev, 583 "UI firmware size mismatch: %d != %d\n", 584 block_count, f34->v7.blkcount.ui_firmware); 585 return -EINVAL; 586 } 587 588 return 0; 589} 590 591static int rmi_f34v7_check_ui_config_size(struct f34_data *f34) 592{ 593 u16 block_count; 594 595 block_count = f34->v7.img.ui_config.size / f34->v7.block_size; 596 f34->update_size += block_count; 597 598 if (block_count != f34->v7.blkcount.ui_config) { 599 dev_err(&f34->fn->dev, "UI config size mismatch\n"); 600 return -EINVAL; 601 } 602 603 return 0; 604} 605 606static int rmi_f34v7_check_dp_config_size(struct f34_data *f34) 607{ 608 u16 block_count; 609 610 block_count = f34->v7.img.dp_config.size / f34->v7.block_size; 611 f34->update_size += block_count; 612 613 if (block_count != f34->v7.blkcount.dp_config) { 614 dev_err(&f34->fn->dev, "Display config size mismatch\n"); 615 return -EINVAL; 616 } 617 618 return 0; 619} 620 621static int rmi_f34v7_check_guest_code_size(struct f34_data *f34) 622{ 623 u16 block_count; 624 625 block_count = f34->v7.img.guest_code.size / f34->v7.block_size; 626 f34->update_size += block_count; 627 628 if (block_count != f34->v7.blkcount.guest_code) { 629 dev_err(&f34->fn->dev, "Guest code size mismatch\n"); 630 return -EINVAL; 631 } 632 633 return 0; 634} 635 636static int rmi_f34v7_check_bl_config_size(struct f34_data *f34) 637{ 638 u16 block_count; 639 640 block_count = f34->v7.img.bl_config.size / f34->v7.block_size; 641 f34->update_size += block_count; 642 643 if (block_count != f34->v7.blkcount.bl_config) { 644 dev_err(&f34->fn->dev, "Bootloader config size mismatch\n"); 645 return -EINVAL; 646 } 647 648 return 0; 649} 650 651static int rmi_f34v7_erase_config(struct f34_data *f34) 652{ 653 int ret; 654 655 dev_info(&f34->fn->dev, "Erasing config...\n"); 656 657 init_completion(&f34->v7.cmd_done); 658 659 switch (f34->v7.config_area) { 660 case v7_UI_CONFIG_AREA: 661 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_UI_CONFIG); 662 if (ret < 0) 663 return ret; 664 break; 665 case v7_DP_CONFIG_AREA: 666 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_DISP_CONFIG); 667 if (ret < 0) 668 return ret; 669 break; 670 case v7_BL_CONFIG_AREA: 671 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_BL_CONFIG); 672 if (ret < 0) 673 return ret; 674 break; 675 } 676 677 ret = rmi_f34v7_wait_for_idle(f34, F34_ERASE_WAIT_MS); 678 if (ret < 0) 679 return ret; 680 681 return 0; 682} 683 684static int rmi_f34v7_erase_guest_code(struct f34_data *f34) 685{ 686 int ret; 687 688 dev_info(&f34->fn->dev, "Erasing guest code...\n"); 689 690 init_completion(&f34->v7.cmd_done); 691 692 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_GUEST_CODE); 693 if (ret < 0) 694 return ret; 695 696 ret = rmi_f34v7_wait_for_idle(f34, F34_ERASE_WAIT_MS); 697 if (ret < 0) 698 return ret; 699 700 return 0; 701} 702 703static int rmi_f34v7_erase_all(struct f34_data *f34) 704{ 705 int ret; 706 707 dev_info(&f34->fn->dev, "Erasing firmware...\n"); 708 709 init_completion(&f34->v7.cmd_done); 710 711 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_UI_FIRMWARE); 712 if (ret < 0) 713 return ret; 714 715 ret = rmi_f34v7_wait_for_idle(f34, F34_ERASE_WAIT_MS); 716 if (ret < 0) 717 return ret; 718 719 f34->v7.config_area = v7_UI_CONFIG_AREA; 720 ret = rmi_f34v7_erase_config(f34); 721 if (ret < 0) 722 return ret; 723 724 if (f34->v7.has_display_cfg) { 725 f34->v7.config_area = v7_DP_CONFIG_AREA; 726 ret = rmi_f34v7_erase_config(f34); 727 if (ret < 0) 728 return ret; 729 } 730 731 if (f34->v7.new_partition_table && f34->v7.has_guest_code) { 732 ret = rmi_f34v7_erase_guest_code(f34); 733 if (ret < 0) 734 return ret; 735 } 736 737 return 0; 738} 739 740static int rmi_f34v7_read_blocks(struct f34_data *f34, 741 u16 block_cnt, u8 command) 742{ 743 int ret; 744 u8 base; 745 __le16 length; 746 u16 transfer; 747 u16 max_transfer; 748 u16 remaining = block_cnt; 749 u16 block_number = 0; 750 u16 index = 0; 751 752 base = f34->fn->fd.data_base_addr; 753 754 ret = rmi_f34v7_write_partition_id(f34, command); 755 if (ret < 0) 756 return ret; 757 758 ret = rmi_write_block(f34->fn->rmi_dev, 759 base + f34->v7.off.block_number, 760 &block_number, sizeof(block_number)); 761 if (ret < 0) { 762 dev_err(&f34->fn->dev, "%s: Failed to write block number\n", 763 __func__); 764 return ret; 765 } 766 767 max_transfer = min(f34->v7.payload_length, 768 (u16)(PAGE_SIZE / f34->v7.block_size)); 769 770 do { 771 transfer = min(remaining, max_transfer); 772 put_unaligned_le16(transfer, &length); 773 774 ret = rmi_write_block(f34->fn->rmi_dev, 775 base + f34->v7.off.transfer_length, 776 &length, sizeof(length)); 777 if (ret < 0) { 778 dev_err(&f34->fn->dev, 779 "%s: Write transfer length fail (%d remaining)\n", 780 __func__, remaining); 781 return ret; 782 } 783 784 init_completion(&f34->v7.cmd_done); 785 786 ret = rmi_f34v7_write_command(f34, command); 787 if (ret < 0) 788 return ret; 789 790 ret = rmi_f34v7_wait_for_idle(f34, F34_ENABLE_WAIT_MS); 791 if (ret < 0) 792 return ret; 793 794 ret = rmi_read_block(f34->fn->rmi_dev, 795 base + f34->v7.off.payload, 796 &f34->v7.read_config_buf[index], 797 transfer * f34->v7.block_size); 798 if (ret < 0) { 799 dev_err(&f34->fn->dev, 800 "%s: Read block failed (%d blks remaining)\n", 801 __func__, remaining); 802 return ret; 803 } 804 805 index += (transfer * f34->v7.block_size); 806 remaining -= transfer; 807 } while (remaining); 808 809 return 0; 810} 811 812static int rmi_f34v7_write_f34v7_blocks(struct f34_data *f34, 813 const void *block_ptr, u16 block_cnt, 814 u8 command) 815{ 816 int ret; 817 u8 base; 818 __le16 length; 819 u16 transfer; 820 u16 max_transfer; 821 u16 remaining = block_cnt; 822 u16 block_number = 0; 823 824 base = f34->fn->fd.data_base_addr; 825 826 ret = rmi_f34v7_write_partition_id(f34, command); 827 if (ret < 0) 828 return ret; 829 830 ret = rmi_write_block(f34->fn->rmi_dev, 831 base + f34->v7.off.block_number, 832 &block_number, sizeof(block_number)); 833 if (ret < 0) { 834 dev_err(&f34->fn->dev, "%s: Failed to write block number\n", 835 __func__); 836 return ret; 837 } 838 839 if (f34->v7.payload_length > (PAGE_SIZE / f34->v7.block_size)) 840 max_transfer = PAGE_SIZE / f34->v7.block_size; 841 else 842 max_transfer = f34->v7.payload_length; 843 844 do { 845 transfer = min(remaining, max_transfer); 846 put_unaligned_le16(transfer, &length); 847 848 init_completion(&f34->v7.cmd_done); 849 850 ret = rmi_write_block(f34->fn->rmi_dev, 851 base + f34->v7.off.transfer_length, 852 &length, sizeof(length)); 853 if (ret < 0) { 854 dev_err(&f34->fn->dev, 855 "%s: Write transfer length fail (%d remaining)\n", 856 __func__, remaining); 857 return ret; 858 } 859 860 ret = rmi_f34v7_write_command(f34, command); 861 if (ret < 0) 862 return ret; 863 864 ret = rmi_write_block(f34->fn->rmi_dev, 865 base + f34->v7.off.payload, 866 block_ptr, transfer * f34->v7.block_size); 867 if (ret < 0) { 868 dev_err(&f34->fn->dev, 869 "%s: Failed writing data (%d blks remaining)\n", 870 __func__, remaining); 871 return ret; 872 } 873 874 ret = rmi_f34v7_wait_for_idle(f34, F34_ENABLE_WAIT_MS); 875 if (ret < 0) 876 return ret; 877 878 block_ptr += (transfer * f34->v7.block_size); 879 remaining -= transfer; 880 f34->update_progress += transfer; 881 f34->update_status = (f34->update_progress * 100) / 882 f34->update_size; 883 } while (remaining); 884 885 return 0; 886} 887 888static int rmi_f34v7_write_config(struct f34_data *f34) 889{ 890 return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.config_data, 891 f34->v7.config_block_count, 892 v7_CMD_WRITE_CONFIG); 893} 894 895static int rmi_f34v7_write_ui_config(struct f34_data *f34) 896{ 897 f34->v7.config_area = v7_UI_CONFIG_AREA; 898 f34->v7.config_data = f34->v7.img.ui_config.data; 899 f34->v7.config_size = f34->v7.img.ui_config.size; 900 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 901 902 return rmi_f34v7_write_config(f34); 903} 904 905static int rmi_f34v7_write_dp_config(struct f34_data *f34) 906{ 907 f34->v7.config_area = v7_DP_CONFIG_AREA; 908 f34->v7.config_data = f34->v7.img.dp_config.data; 909 f34->v7.config_size = f34->v7.img.dp_config.size; 910 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 911 912 return rmi_f34v7_write_config(f34); 913} 914 915static int rmi_f34v7_write_guest_code(struct f34_data *f34) 916{ 917 return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.guest_code.data, 918 f34->v7.img.guest_code.size / 919 f34->v7.block_size, 920 v7_CMD_WRITE_GUEST_CODE); 921} 922 923static int rmi_f34v7_write_flash_config(struct f34_data *f34) 924{ 925 int ret; 926 927 f34->v7.config_area = v7_FLASH_CONFIG_AREA; 928 f34->v7.config_data = f34->v7.img.fl_config.data; 929 f34->v7.config_size = f34->v7.img.fl_config.size; 930 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 931 932 if (f34->v7.config_block_count != f34->v7.blkcount.fl_config) { 933 dev_err(&f34->fn->dev, "%s: Flash config size mismatch\n", 934 __func__); 935 return -EINVAL; 936 } 937 938 init_completion(&f34->v7.cmd_done); 939 940 ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_FLASH_CONFIG); 941 if (ret < 0) 942 return ret; 943 944 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 945 "%s: Erase flash config command written\n", __func__); 946 947 ret = rmi_f34v7_wait_for_idle(f34, F34_WRITE_WAIT_MS); 948 if (ret < 0) 949 return ret; 950 951 ret = rmi_f34v7_write_config(f34); 952 if (ret < 0) 953 return ret; 954 955 return 0; 956} 957 958static int rmi_f34v7_write_partition_table(struct f34_data *f34) 959{ 960 u16 block_count; 961 int ret; 962 963 block_count = f34->v7.blkcount.bl_config; 964 f34->v7.config_area = v7_BL_CONFIG_AREA; 965 f34->v7.config_size = f34->v7.block_size * block_count; 966 devm_kfree(&f34->fn->dev, f34->v7.read_config_buf); 967 f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev, 968 f34->v7.config_size, GFP_KERNEL); 969 if (!f34->v7.read_config_buf) { 970 f34->v7.read_config_buf_size = 0; 971 return -ENOMEM; 972 } 973 974 f34->v7.read_config_buf_size = f34->v7.config_size; 975 976 ret = rmi_f34v7_read_blocks(f34, block_count, v7_CMD_READ_CONFIG); 977 if (ret < 0) 978 return ret; 979 980 ret = rmi_f34v7_erase_config(f34); 981 if (ret < 0) 982 return ret; 983 984 ret = rmi_f34v7_write_flash_config(f34); 985 if (ret < 0) 986 return ret; 987 988 f34->v7.config_area = v7_BL_CONFIG_AREA; 989 f34->v7.config_data = f34->v7.read_config_buf; 990 f34->v7.config_size = f34->v7.img.bl_config.size; 991 f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 992 993 ret = rmi_f34v7_write_config(f34); 994 if (ret < 0) 995 return ret; 996 997 return 0; 998} 999 1000static int rmi_f34v7_write_firmware(struct f34_data *f34) 1001{ 1002 u16 blk_count; 1003 1004 blk_count = f34->v7.img.ui_firmware.size / f34->v7.block_size; 1005 1006 return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.ui_firmware.data, 1007 blk_count, v7_CMD_WRITE_FW); 1008} 1009 1010static void rmi_f34v7_compare_partition_tables(struct f34_data *f34) 1011{ 1012 if (f34->v7.phyaddr.ui_firmware != f34->v7.img.phyaddr.ui_firmware) { 1013 f34->v7.new_partition_table = true; 1014 return; 1015 } 1016 1017 if (f34->v7.phyaddr.ui_config != f34->v7.img.phyaddr.ui_config) { 1018 f34->v7.new_partition_table = true; 1019 return; 1020 } 1021 1022 if (f34->v7.has_display_cfg && 1023 f34->v7.phyaddr.dp_config != f34->v7.img.phyaddr.dp_config) { 1024 f34->v7.new_partition_table = true; 1025 return; 1026 } 1027 1028 if (f34->v7.has_guest_code && 1029 f34->v7.phyaddr.guest_code != f34->v7.img.phyaddr.guest_code) { 1030 f34->v7.new_partition_table = true; 1031 return; 1032 } 1033 1034 f34->v7.new_partition_table = false; 1035} 1036 1037static void rmi_f34v7_parse_img_header_10_bl_container(struct f34_data *f34, 1038 const void *image) 1039{ 1040 int i; 1041 int num_of_containers; 1042 unsigned int addr; 1043 unsigned int container_id; 1044 unsigned int length; 1045 const void *content; 1046 const struct container_descriptor *descriptor; 1047 1048 num_of_containers = f34->v7.img.bootloader.size / 4 - 1; 1049 1050 for (i = 1; i <= num_of_containers; i++) { 1051 addr = get_unaligned_le32(f34->v7.img.bootloader.data + i * 4); 1052 descriptor = image + addr; 1053 container_id = le16_to_cpu(descriptor->container_id); 1054 content = image + le32_to_cpu(descriptor->content_address); 1055 length = le32_to_cpu(descriptor->content_length); 1056 switch (container_id) { 1057 case BL_CONFIG_CONTAINER: 1058 case GLOBAL_PARAMETERS_CONTAINER: 1059 f34->v7.img.bl_config.data = content; 1060 f34->v7.img.bl_config.size = length; 1061 break; 1062 case BL_LOCKDOWN_INFO_CONTAINER: 1063 case DEVICE_CONFIG_CONTAINER: 1064 f34->v7.img.lockdown.data = content; 1065 f34->v7.img.lockdown.size = length; 1066 break; 1067 default: 1068 break; 1069 } 1070 } 1071} 1072 1073static void rmi_f34v7_parse_image_header_10(struct f34_data *f34) 1074{ 1075 unsigned int i; 1076 unsigned int num_of_containers; 1077 unsigned int addr; 1078 unsigned int offset; 1079 unsigned int container_id; 1080 unsigned int length; 1081 const void *image = f34->v7.image; 1082 const u8 *content; 1083 const struct container_descriptor *descriptor; 1084 const struct image_header_10 *header = image; 1085 1086 f34->v7.img.checksum = le32_to_cpu(header->checksum); 1087 1088 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.img.checksum=%X\n", 1089 __func__, f34->v7.img.checksum); 1090 1091 /* address of top level container */ 1092 offset = le32_to_cpu(header->top_level_container_start_addr); 1093 descriptor = image + offset; 1094 1095 /* address of top level container content */ 1096 offset = le32_to_cpu(descriptor->content_address); 1097 num_of_containers = le32_to_cpu(descriptor->content_length) / 4; 1098 1099 for (i = 0; i < num_of_containers; i++) { 1100 addr = get_unaligned_le32(image + offset); 1101 offset += 4; 1102 descriptor = image + addr; 1103 container_id = le16_to_cpu(descriptor->container_id); 1104 content = image + le32_to_cpu(descriptor->content_address); 1105 length = le32_to_cpu(descriptor->content_length); 1106 1107 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 1108 "%s: container_id=%d, length=%d\n", __func__, 1109 container_id, length); 1110 1111 switch (container_id) { 1112 case UI_CONTAINER: 1113 case CORE_CODE_CONTAINER: 1114 f34->v7.img.ui_firmware.data = content; 1115 f34->v7.img.ui_firmware.size = length; 1116 break; 1117 case UI_CONFIG_CONTAINER: 1118 case CORE_CONFIG_CONTAINER: 1119 f34->v7.img.ui_config.data = content; 1120 f34->v7.img.ui_config.size = length; 1121 break; 1122 case BL_CONTAINER: 1123 f34->v7.img.bl_version = *content; 1124 f34->v7.img.bootloader.data = content; 1125 f34->v7.img.bootloader.size = length; 1126 rmi_f34v7_parse_img_header_10_bl_container(f34, image); 1127 break; 1128 case GUEST_CODE_CONTAINER: 1129 f34->v7.img.contains_guest_code = true; 1130 f34->v7.img.guest_code.data = content; 1131 f34->v7.img.guest_code.size = length; 1132 break; 1133 case DISPLAY_CONFIG_CONTAINER: 1134 f34->v7.img.contains_display_cfg = true; 1135 f34->v7.img.dp_config.data = content; 1136 f34->v7.img.dp_config.size = length; 1137 break; 1138 case FLASH_CONFIG_CONTAINER: 1139 f34->v7.img.contains_flash_config = true; 1140 f34->v7.img.fl_config.data = content; 1141 f34->v7.img.fl_config.size = length; 1142 break; 1143 case GENERAL_INFORMATION_CONTAINER: 1144 f34->v7.img.contains_firmware_id = true; 1145 f34->v7.img.firmware_id = 1146 get_unaligned_le32(content + 4); 1147 break; 1148 default: 1149 break; 1150 } 1151 } 1152} 1153 1154static int rmi_f34v7_parse_image_info(struct f34_data *f34) 1155{ 1156 const struct image_header_10 *header = f34->v7.image; 1157 1158 memset(&f34->v7.img, 0x00, sizeof(f34->v7.img)); 1159 1160 rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 1161 "%s: header->major_header_version = %d\n", 1162 __func__, header->major_header_version); 1163 1164 switch (header->major_header_version) { 1165 case IMAGE_HEADER_VERSION_10: 1166 rmi_f34v7_parse_image_header_10(f34); 1167 break; 1168 default: 1169 dev_err(&f34->fn->dev, "Unsupported image file format %02X\n", 1170 header->major_header_version); 1171 return -EINVAL; 1172 } 1173 1174 if (!f34->v7.img.contains_flash_config) { 1175 dev_err(&f34->fn->dev, "%s: No flash config in fw image\n", 1176 __func__); 1177 return -EINVAL; 1178 } 1179 1180 rmi_f34v7_parse_partition_table(f34, f34->v7.img.fl_config.data, 1181 &f34->v7.img.blkcount, &f34->v7.img.phyaddr); 1182 1183 rmi_f34v7_compare_partition_tables(f34); 1184 1185 return 0; 1186} 1187 1188int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw) 1189{ 1190 int ret; 1191 1192 f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, 1193 f34->fn->irq_mask); 1194 1195 rmi_f34v7_read_queries_bl_version(f34); 1196 1197 f34->v7.image = fw->data; 1198 f34->update_progress = 0; 1199 f34->update_size = 0; 1200 1201 ret = rmi_f34v7_parse_image_info(f34); 1202 if (ret < 0) 1203 goto fail; 1204 1205 if (!f34->v7.new_partition_table) { 1206 ret = rmi_f34v7_check_ui_firmware_size(f34); 1207 if (ret < 0) 1208 goto fail; 1209 1210 ret = rmi_f34v7_check_ui_config_size(f34); 1211 if (ret < 0) 1212 goto fail; 1213 1214 if (f34->v7.has_display_cfg && 1215 f34->v7.img.contains_display_cfg) { 1216 ret = rmi_f34v7_check_dp_config_size(f34); 1217 if (ret < 0) 1218 goto fail; 1219 } 1220 1221 if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) { 1222 ret = rmi_f34v7_check_guest_code_size(f34); 1223 if (ret < 0) 1224 goto fail; 1225 } 1226 } else { 1227 ret = rmi_f34v7_check_bl_config_size(f34); 1228 if (ret < 0) 1229 goto fail; 1230 } 1231 1232 ret = rmi_f34v7_erase_all(f34); 1233 if (ret < 0) 1234 goto fail; 1235 1236 if (f34->v7.new_partition_table) { 1237 ret = rmi_f34v7_write_partition_table(f34); 1238 if (ret < 0) 1239 goto fail; 1240 dev_info(&f34->fn->dev, "%s: Partition table programmed\n", 1241 __func__); 1242 } 1243 1244 dev_info(&f34->fn->dev, "Writing firmware (%d bytes)...\n", 1245 f34->v7.img.ui_firmware.size); 1246 1247 ret = rmi_f34v7_write_firmware(f34); 1248 if (ret < 0) 1249 goto fail; 1250 1251 dev_info(&f34->fn->dev, "Writing config (%d bytes)...\n", 1252 f34->v7.img.ui_config.size); 1253 1254 f34->v7.config_area = v7_UI_CONFIG_AREA; 1255 ret = rmi_f34v7_write_ui_config(f34); 1256 if (ret < 0) 1257 goto fail; 1258 1259 if (f34->v7.has_display_cfg && f34->v7.img.contains_display_cfg) { 1260 dev_info(&f34->fn->dev, "Writing display config...\n"); 1261 1262 ret = rmi_f34v7_write_dp_config(f34); 1263 if (ret < 0) 1264 goto fail; 1265 } 1266 1267 if (f34->v7.new_partition_table) { 1268 if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) { 1269 dev_info(&f34->fn->dev, "Writing guest code...\n"); 1270 1271 ret = rmi_f34v7_write_guest_code(f34); 1272 if (ret < 0) 1273 goto fail; 1274 } 1275 } 1276 1277fail: 1278 return ret; 1279} 1280 1281static int rmi_f34v7_enter_flash_prog(struct f34_data *f34) 1282{ 1283 int ret; 1284 1285 f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, f34->fn->irq_mask); 1286 1287 ret = rmi_f34v7_read_flash_status(f34); 1288 if (ret < 0) 1289 return ret; 1290 1291 if (f34->v7.in_bl_mode) 1292 return 0; 1293 1294 init_completion(&f34->v7.cmd_done); 1295 1296 ret = rmi_f34v7_write_command(f34, v7_CMD_ENABLE_FLASH_PROG); 1297 if (ret < 0) 1298 return ret; 1299 1300 ret = rmi_f34v7_wait_for_idle(f34, F34_ENABLE_WAIT_MS); 1301 if (ret < 0) 1302 return ret; 1303 1304 return 0; 1305} 1306 1307int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw) 1308{ 1309 int ret = 0; 1310 1311 f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, f34->fn->irq_mask); 1312 1313 f34->v7.config_area = v7_UI_CONFIG_AREA; 1314 f34->v7.image = fw->data; 1315 1316 ret = rmi_f34v7_parse_image_info(f34); 1317 if (ret < 0) 1318 goto exit; 1319 1320 if (!f34->v7.force_update && f34->v7.new_partition_table) { 1321 dev_err(&f34->fn->dev, "%s: Partition table mismatch\n", 1322 __func__); 1323 ret = -EINVAL; 1324 goto exit; 1325 } 1326 1327 dev_info(&f34->fn->dev, "Firmware image OK\n"); 1328 1329 ret = rmi_f34v7_read_flash_status(f34); 1330 if (ret < 0) 1331 goto exit; 1332 1333 if (f34->v7.in_bl_mode) { 1334 dev_info(&f34->fn->dev, "%s: Device in bootloader mode\n", 1335 __func__); 1336 } 1337 1338 rmi_f34v7_enter_flash_prog(f34); 1339 1340 return 0; 1341 1342exit: 1343 return ret; 1344} 1345 1346int rmi_f34v7_probe(struct f34_data *f34) 1347{ 1348 int ret; 1349 1350 /* Read bootloader version */ 1351 ret = rmi_read_block(f34->fn->rmi_dev, 1352 f34->fn->fd.query_base_addr + V7_BOOTLOADER_ID_OFFSET, 1353 f34->bootloader_id, 1354 sizeof(f34->bootloader_id)); 1355 if (ret < 0) { 1356 dev_err(&f34->fn->dev, "%s: Failed to read bootloader ID\n", 1357 __func__); 1358 return ret; 1359 } 1360 1361 if (f34->bootloader_id[1] == '5') { 1362 f34->bl_version = 5; 1363 } else if (f34->bootloader_id[1] == '6') { 1364 f34->bl_version = 6; 1365 } else if (f34->bootloader_id[1] == 7) { 1366 f34->bl_version = 7; 1367 } else if (f34->bootloader_id[1] == 8) { 1368 f34->bl_version = 8; 1369 } else { 1370 dev_err(&f34->fn->dev, 1371 "%s: Unrecognized bootloader version: %d (%c) %d (%c)\n", 1372 __func__, 1373 f34->bootloader_id[0], f34->bootloader_id[0], 1374 f34->bootloader_id[1], f34->bootloader_id[1]); 1375 return -EINVAL; 1376 } 1377 1378 memset(&f34->v7.blkcount, 0x00, sizeof(f34->v7.blkcount)); 1379 memset(&f34->v7.phyaddr, 0x00, sizeof(f34->v7.phyaddr)); 1380 1381 init_completion(&f34->v7.cmd_done); 1382 1383 ret = rmi_f34v7_read_queries(f34); 1384 if (ret < 0) 1385 return ret; 1386 1387 f34->v7.force_update = true; 1388 return 0; 1389}