CC: [email protected] CC: [email protected] TO: Marek Vasut <[email protected]> CC: Dmitry Torokhov <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: ee1703cda8dc777e937dec172da55beaf1a74919 commit: c6ac8f0b4ca927316eb40e1e9ba83df5d29f3793 Input: ili210x - add ili251x firmware update support date: 5 weeks ago :::::: branch date: 2 hours ago :::::: commit date: 5 weeks ago config: i386-randconfig-m021-20211116 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> New smatch warnings: drivers/input/touchscreen/ili210x.c:600 ili251x_firmware_to_buffer() error: uninitialized symbol 'fw_addr'. drivers/input/touchscreen/ili210x.c:600 ili251x_firmware_to_buffer() error: uninitialized symbol 'fw_len'. drivers/input/touchscreen/ili210x.c:690 ili251x_firmware_write_to_ic() warn: right shifting more than type allows 16 vs 16 Old smatch warnings: drivers/input/touchscreen/ili210x.c:691 ili251x_firmware_write_to_ic() warn: right shifting more than type allows 16 vs 16 vim +/fw_addr +600 drivers/input/touchscreen/ili210x.c 5c6a7a62c130afe Olivier Sobrie 2012-03-16 559 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 560 static int ili251x_firmware_to_buffer(const struct firmware *fw, c6ac8f0b4ca9273 Marek Vasut 2021-10-16 561 u8 **buf, u16 *ac_end, u16 *df_end) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 562 { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 563 const struct ihex_binrec *rec; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 564 u32 fw_addr, fw_last_addr = 0; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 565 u16 fw_len; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 566 u8 *fw_buf; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 567 int error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 568 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 569 /* c6ac8f0b4ca9273 Marek Vasut 2021-10-16 570 * The firmware ihex blob can never be bigger than 64 kiB, so make this c6ac8f0b4ca9273 Marek Vasut 2021-10-16 571 * simple -- allocate a 64 kiB buffer, iterate over the ihex blob records c6ac8f0b4ca9273 Marek Vasut 2021-10-16 572 * once, copy them all into this buffer at the right locations, and then c6ac8f0b4ca9273 Marek Vasut 2021-10-16 573 * do all operations on this linear buffer. c6ac8f0b4ca9273 Marek Vasut 2021-10-16 574 */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 575 fw_buf = kzalloc(SZ_64K, GFP_KERNEL); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 576 if (!fw_buf) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 577 return -ENOMEM; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 578 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 579 rec = (const struct ihex_binrec *)fw->data; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 580 while (rec) { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 581 fw_addr = be32_to_cpu(rec->addr); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 582 fw_len = be16_to_cpu(rec->len); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 583 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 584 /* The last 32 Byte firmware block can be 0xffe0 */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 585 if (fw_addr + fw_len > SZ_64K || fw_addr > SZ_64K - 32) { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 586 error = -EFBIG; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 587 goto err_big; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 588 } c6ac8f0b4ca9273 Marek Vasut 2021-10-16 589 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 590 /* Find the last address before DF start address, that is AC end */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 591 if (fw_addr == 0xf000) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 592 *ac_end = fw_last_addr; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 593 fw_last_addr = fw_addr + fw_len; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 594 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 595 memcpy(fw_buf + fw_addr, rec->data, fw_len); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 596 rec = ihex_next_binrec(rec); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 597 } c6ac8f0b4ca9273 Marek Vasut 2021-10-16 598 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 599 /* DF end address is the last address in the firmware blob */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 @600 *df_end = fw_addr + fw_len; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 601 *buf = fw_buf; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 602 return 0; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 603 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 604 err_big: c6ac8f0b4ca9273 Marek Vasut 2021-10-16 605 kfree(fw_buf); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 606 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 607 } c6ac8f0b4ca9273 Marek Vasut 2021-10-16 608 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 609 /* Switch mode between Application and BootLoader */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 610 static int ili251x_switch_ic_mode(struct i2c_client *client, u8 cmd_mode) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 611 { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 612 struct ili210x *priv = i2c_get_clientdata(client); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 613 u8 cmd_wren[3] = { REG_WRITE_ENABLE, 0x5a, 0xa5 }; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 614 u8 md[2]; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 615 int error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 616 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 617 error = priv->chip->read_reg(client, REG_GET_MODE, md, sizeof(md)); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 618 if (error) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 619 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 620 /* Mode already set */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 621 if ((cmd_mode == REG_SET_MODE_AP && md[0] == REG_GET_MODE_AP) || c6ac8f0b4ca9273 Marek Vasut 2021-10-16 622 (cmd_mode == REG_SET_MODE_BL && md[0] == REG_GET_MODE_BL)) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 623 return 0; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 624 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 625 /* Unlock writes */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 626 error = i2c_master_send(client, cmd_wren, sizeof(cmd_wren)); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 627 if (error != sizeof(cmd_wren)) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 628 return -EINVAL; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 629 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 630 mdelay(20); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 631 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 632 /* Select mode (BootLoader or Application) */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 633 error = i2c_master_send(client, &cmd_mode, 1); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 634 if (error != 1) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 635 return -EINVAL; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 636 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 637 mdelay(200); /* Reboot into bootloader takes a lot of time ... */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 638 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 639 /* Read back mode */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 640 error = priv->chip->read_reg(client, REG_GET_MODE, md, sizeof(md)); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 641 if (error) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 642 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 643 /* Check if mode is correct now. */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 644 if ((cmd_mode == REG_SET_MODE_AP && md[0] == REG_GET_MODE_AP) || c6ac8f0b4ca9273 Marek Vasut 2021-10-16 645 (cmd_mode == REG_SET_MODE_BL && md[0] == REG_GET_MODE_BL)) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 646 return 0; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 647 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 648 return -EINVAL; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 649 } c6ac8f0b4ca9273 Marek Vasut 2021-10-16 650 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 651 static int ili251x_firmware_busy(struct i2c_client *client) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 652 { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 653 struct ili210x *priv = i2c_get_clientdata(client); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 654 int error, i = 0; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 655 u8 data; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 656 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 657 do { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 658 /* The read_reg already contains suitable delay */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 659 error = priv->chip->read_reg(client, REG_IC_BUSY, &data, 1); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 660 if (error) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 661 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 662 if (i++ == 100000) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 663 return -ETIMEDOUT; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 664 } while (data != REG_IC_BUSY_NOT_BUSY); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 665 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 666 return 0; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 667 } c6ac8f0b4ca9273 Marek Vasut 2021-10-16 668 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 669 static int ili251x_firmware_write_to_ic(struct device *dev, u8 *fwbuf, c6ac8f0b4ca9273 Marek Vasut 2021-10-16 670 u16 start, u16 end, u8 dataflash) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 671 { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 672 struct i2c_client *client = to_i2c_client(dev); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 673 struct ili210x *priv = i2c_get_clientdata(client); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 674 u8 cmd_crc = REG_READ_DATA_CRC; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 675 u8 crcrb[4] = { 0 }; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 676 u8 fw_data[33]; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 677 u16 fw_addr; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 678 int error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 679 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 680 /* c6ac8f0b4ca9273 Marek Vasut 2021-10-16 681 * The DF (dataflash) needs 2 bytes offset for unknown reasons, c6ac8f0b4ca9273 Marek Vasut 2021-10-16 682 * the AC (application) has 2 bytes CRC16-CCITT at the end. c6ac8f0b4ca9273 Marek Vasut 2021-10-16 683 */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 684 u16 crc = crc_ccitt(0, fwbuf + start + (dataflash ? 2 : 0), c6ac8f0b4ca9273 Marek Vasut 2021-10-16 685 end - start - 2); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 686 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 687 /* Unlock write to either AC (application) or DF (dataflash) area */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 688 u8 cmd_wr[10] = { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 689 REG_WRITE_ENABLE, 0x5a, 0xa5, dataflash, c6ac8f0b4ca9273 Marek Vasut 2021-10-16 @690 (end >> 16) & 0xff, (end >> 8) & 0xff, end & 0xff, c6ac8f0b4ca9273 Marek Vasut 2021-10-16 691 (crc >> 16) & 0xff, (crc >> 8) & 0xff, crc & 0xff c6ac8f0b4ca9273 Marek Vasut 2021-10-16 692 }; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 693 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 694 error = i2c_master_send(client, cmd_wr, sizeof(cmd_wr)); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 695 if (error != sizeof(cmd_wr)) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 696 return -EINVAL; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 697 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 698 error = ili251x_firmware_busy(client); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 699 if (error) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 700 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 701 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 702 for (fw_addr = start; fw_addr < end; fw_addr += 32) { c6ac8f0b4ca9273 Marek Vasut 2021-10-16 703 fw_data[0] = REG_WRITE_DATA; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 704 memcpy(&(fw_data[1]), fwbuf + fw_addr, 32); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 705 error = i2c_master_send(client, fw_data, 33); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 706 if (error != sizeof(fw_data)) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 707 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 708 error = ili251x_firmware_busy(client); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 709 if (error) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 710 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 711 } c6ac8f0b4ca9273 Marek Vasut 2021-10-16 712 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 713 error = i2c_master_send(client, &cmd_crc, 1); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 714 if (error != 1) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 715 return -EINVAL; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 716 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 717 error = ili251x_firmware_busy(client); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 718 if (error) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 719 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 720 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 721 error = priv->chip->read_reg(client, REG_READ_DATA_CRC, c6ac8f0b4ca9273 Marek Vasut 2021-10-16 722 &crcrb, sizeof(crcrb)); c6ac8f0b4ca9273 Marek Vasut 2021-10-16 723 if (error) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 724 return error; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 725 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 726 /* Check CRC readback */ c6ac8f0b4ca9273 Marek Vasut 2021-10-16 727 if ((crcrb[0] != (crc & 0xff)) || crcrb[1] != ((crc >> 8) & 0xff)) c6ac8f0b4ca9273 Marek Vasut 2021-10-16 728 return -EINVAL; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 729 c6ac8f0b4ca9273 Marek Vasut 2021-10-16 730 return 0; c6ac8f0b4ca9273 Marek Vasut 2021-10-16 731 } c6ac8f0b4ca9273 Marek Vasut 2021-10-16 732 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
