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]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to