Hi "Bence,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on wsa/i2c/for-next]
[also build test WARNING on v5.12-rc3 next-20210317]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    
https://github.com/0day-ci/linux/commits/Bence-Cs-k-s/Adding-i2c-cp2615-i2c-support-for-Silicon-Labs-CP2615-Digital-Audio-Bridge/20210317-181539
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git 
i2c/for-next
config: arc-allyesconfig (attached as .config)
compiler: arceb-elf-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        # 
https://github.com/0day-ci/linux/commit/c8c005a08175789b1874e69abf4c6da690d5b323
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review 
Bence-Cs-k-s/Adding-i2c-cp2615-i2c-support-for-Silicon-Labs-CP2615-Digital-Audio-Bridge/20210317-181539
        git checkout c8c005a08175789b1874e69abf4c6da690d5b323
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arc 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <l...@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/i2c/busses/i2c-cp2615.c:82:5: warning: no previous prototype for 
>> 'cp2615_init_iop_msg' [-Wmissing-prototypes]
      82 | int cp2615_init_iop_msg(struct cp2615_iop_msg *ret, enum 
cp2615_iop_msg_type msg, const void *data, size_t data_len)
         |     ^~~~~~~~~~~~~~~~~~~
>> drivers/i2c/busses/i2c-cp2615.c:99:5: warning: no previous prototype for 
>> 'cp2615_init_i2c_msg' [-Wmissing-prototypes]
      99 | int cp2615_init_i2c_msg(struct cp2615_iop_msg *ret, const struct 
cp2615_i2c_transfer *data)
         |     ^~~~~~~~~~~~~~~~~~~
>> drivers/i2c/busses/i2c-cp2615.c:105:5: warning: no previous prototype for 
>> 'cp2615_check_status' [-Wmissing-prototypes]
     105 | int cp2615_check_status(enum cp2615_i2c_status status)
         |     ^~~~~~~~~~~~~~~~~~~
>> drivers/i2c/busses/i2c-cp2615.c:269:1: warning: data definition has no type 
>> or storage class
     269 | MODULE_DEVICE_TABLE(usb, id_table);
         | ^~~~~~~~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:269:1: error: type defaults to 'int' in 
declaration of 'MODULE_DEVICE_TABLE' [-Werror=implicit-int]
>> drivers/i2c/busses/i2c-cp2615.c:269:1: warning: parameter names (without 
>> types) in function declaration
   In file included from include/linux/device.h:32,
                    from include/linux/acpi.h:15,
                    from include/linux/i2c.h:13,
                    from drivers/i2c/busses/i2c-cp2615.c:11:
>> include/linux/device/driver.h:263:1: warning: data definition has no type or 
>> storage class
     263 | module_init(__driver##_init); \
         | ^~~~~~~~~~~
   include/linux/usb.h:1303:2: note: in expansion of macro 'module_driver'
    1303 |  module_driver(__usb_driver, usb_register, \
         |  ^~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:278:1: note: in expansion of macro 
'module_usb_driver'
     278 | module_usb_driver(cp2615_i2c_driver);
         | ^~~~~~~~~~~~~~~~~
   include/linux/device/driver.h:263:1: error: type defaults to 'int' in 
declaration of 'module_init' [-Werror=implicit-int]
     263 | module_init(__driver##_init); \
         | ^~~~~~~~~~~
   include/linux/usb.h:1303:2: note: in expansion of macro 'module_driver'
    1303 |  module_driver(__usb_driver, usb_register, \
         |  ^~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:278:1: note: in expansion of macro 
'module_usb_driver'
     278 | module_usb_driver(cp2615_i2c_driver);
         | ^~~~~~~~~~~~~~~~~
   In file included from include/linux/linkage.h:7,
                    from include/linux/kernel.h:7,
                    from drivers/i2c/busses/i2c-cp2615.c:9:
>> include/linux/export.h:19:30: warning: parameter names (without types) in 
>> function declaration
      19 | #define THIS_MODULE ((struct module *)0)
         |                              ^~~~~~
   include/linux/usb.h:1290:30: note: in expansion of macro 'THIS_MODULE'
    1290 |  usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
         |                              ^~~~~~~~~~~
   include/linux/device/driver.h:261:9: note: in expansion of macro 
'usb_register'
     261 |  return __register(&(__driver) , ##__VA_ARGS__); \
         |         ^~~~~~~~~~
   include/linux/usb.h:1303:2: note: in expansion of macro 'module_driver'
    1303 |  module_driver(__usb_driver, usb_register, \
         |  ^~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:278:1: note: in expansion of macro 
'module_usb_driver'
     278 | module_usb_driver(cp2615_i2c_driver);
         | ^~~~~~~~~~~~~~~~~
   In file included from include/linux/device.h:32,
                    from include/linux/acpi.h:15,
                    from include/linux/i2c.h:13,
                    from drivers/i2c/busses/i2c-cp2615.c:11:
   include/linux/device/driver.h:268:1: warning: data definition has no type or 
storage class
     268 | module_exit(__driver##_exit);
         | ^~~~~~~~~~~
   include/linux/usb.h:1303:2: note: in expansion of macro 'module_driver'
    1303 |  module_driver(__usb_driver, usb_register, \
         |  ^~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:278:1: note: in expansion of macro 
'module_usb_driver'
     278 | module_usb_driver(cp2615_i2c_driver);
         | ^~~~~~~~~~~~~~~~~
   include/linux/device/driver.h:268:1: error: type defaults to 'int' in 
declaration of 'module_exit' [-Werror=implicit-int]
     268 | module_exit(__driver##_exit);
         | ^~~~~~~~~~~
   include/linux/usb.h:1303:2: note: in expansion of macro 'module_driver'
    1303 |  module_driver(__usb_driver, usb_register, \
         |  ^~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:278:1: note: in expansion of macro 
'module_usb_driver'
     278 | module_usb_driver(cp2615_i2c_driver);
         | ^~~~~~~~~~~~~~~~~
   In file included from include/linux/linkage.h:7,
                    from include/linux/kernel.h:7,
                    from drivers/i2c/busses/i2c-cp2615.c:9:
>> include/linux/export.h:19:30: warning: parameter names (without types) in 
>> function declaration
      19 | #define THIS_MODULE ((struct module *)0)
         |                              ^~~~~~
   include/linux/usb.h:1290:30: note: in expansion of macro 'THIS_MODULE'
    1290 |  usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
         |                              ^~~~~~~~~~~
   include/linux/device/driver.h:261:9: note: in expansion of macro 
'usb_register'
     261 |  return __register(&(__driver) , ##__VA_ARGS__); \
         |         ^~~~~~~~~~
   include/linux/usb.h:1303:2: note: in expansion of macro 'module_driver'
    1303 |  module_driver(__usb_driver, usb_register, \
         |  ^~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:278:1: note: in expansion of macro 
'module_usb_driver'
     278 | module_usb_driver(cp2615_i2c_driver);
         | ^~~~~~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:280:15: error: expected declaration 
specifiers or '...' before string constant
     280 | MODULE_AUTHOR("Bence Csókás <benc...@sch.bme.hu>");
         |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:281:20: error: expected declaration 
specifiers or '...' before string constant
     281 | MODULE_DESCRIPTION("CP2615 I2C bus driver");
         |                    ^~~~~~~~~~~~~~~~~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:282:16: error: expected declaration 
specifiers or '...' before string constant
     282 | MODULE_LICENSE("GPL");
         |                ^~~~~
   In file included from include/linux/device.h:32,
                    from include/linux/acpi.h:15,
                    from include/linux/i2c.h:13,
                    from drivers/i2c/busses/i2c-cp2615.c:11:
   drivers/i2c/busses/i2c-cp2615.c:278:19: warning: 'cp2615_i2c_driver_init' 
defined but not used [-Wunused-function]
     278 | module_usb_driver(cp2615_i2c_driver);
         |                   ^~~~~~~~~~~~~~~~~
   include/linux/device/driver.h:259:19: note: in definition of macro 
'module_driver'
     259 | static int __init __driver##_init(void) \
         |                   ^~~~~~~~
   drivers/i2c/busses/i2c-cp2615.c:278:1: note: in expansion of macro 
'module_usb_driver'
     278 | module_usb_driver(cp2615_i2c_driver);
         | ^~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +/cp2615_init_iop_msg +82 drivers/i2c/busses/i2c-cp2615.c

    81  
  > 82  int cp2615_init_iop_msg(struct cp2615_iop_msg *ret, enum 
cp2615_iop_msg_type msg, const void *data, size_t data_len)
    83  {
    84          if (data_len > MAX_IOP_PAYLOAD_SIZE)
    85                  return -EFBIG;
    86  
    87          if (ret) {
    88                  ret->preamble = 0x2A2A;
    89                  ret->length = htons(data_len+6);
    90                  ret->msg = htons(msg);
    91                  if(data && data_len)
    92                          memcpy(&ret->data, data, data_len);
    93          return 0;
    94          } else {
    95          return -EINVAL;
    96          }
    97  }
    98  
  > 99  int cp2615_init_i2c_msg(struct cp2615_iop_msg *ret, const struct 
cp2615_i2c_transfer *data)
   100  {
   101      return cp2615_init_iop_msg(ret, iop_DoI2cTransfer, data, 4 + 
data->write_len);
   102  }
   103  
   104  /* Translates status codes to Linux errno's */
 > 105  int cp2615_check_status(enum cp2615_i2c_status status)
   106  {
   107          switch (status) {
   108          case CP2615_SUCCESS:
   109                          return 0;
   110          case CP2615_BUS_ERROR:
   111                  return -ECOMM;
   112          case CP2615_BUS_BUSY:
   113                  return -EAGAIN;
   114          case CP2615_TIMEOUT:
   115                  return -ETIMEDOUT;
   116          case CP2615_INVALID_PARAM:
   117                  return -EINVAL;
   118          case CP2615_CFG_LOCKED:
   119                  return -EPERM;
   120          }
   121          /* Unknown error code */
   122          return -EPROTO;
   123  }
   124  
   125  
   126  static int
   127  cp2615_i2c_send(struct usb_interface *usbif, struct cp2615_i2c_transfer 
*i2c_w)
   128  {
   129          struct cp2615_iop_msg *msg = kzalloc(sizeof(struct 
cp2615_iop_msg), GFP_KERNEL);
   130          struct usb_device *usbdev = interface_to_usbdev(usbif);
   131          int res = cp2615_init_i2c_msg(msg, i2c_w);
   132          if (!res)
   133                  res = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 
IOP_EP_OUT), msg, ntohs(msg->length), NULL, 0);
   134          kfree(msg);
   135          return res;
   136  }
   137  
   138  static int
   139  cp2615_i2c_recv(struct usb_interface *usbif, unsigned char tag, void 
*buf)
   140  {
   141          struct cp2615_iop_msg *msg = kzalloc(sizeof(struct 
cp2615_iop_msg), GFP_KERNEL);
   142          struct cp2615_i2c_transfer_result *i2c_r = (struct 
cp2615_i2c_transfer_result*) &msg->data;
   143          struct usb_device *usbdev = interface_to_usbdev(usbif);
   144          int res = usb_bulk_msg(usbdev, usb_rcvbulkpipe(usbdev, 
IOP_EP_IN), msg, sizeof(struct cp2615_iop_msg), NULL, 0);
   145          if (res < 0)
   146                  return res;
   147  
   148          if (msg->msg != htons(iop_I2cTransferResult) || i2c_r->tag != 
tag)
   149                  return -EIO;
   150  
   151          res = cp2615_check_status(i2c_r->status);
   152          if (res < 0)
   153                  return res;
   154  
   155          memcpy(buf, &i2c_r->data, i2c_r->read_len);
   156          kfree(msg);
   157          return 0;
   158  }
   159  
   160  static int
   161  cp2615_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, 
int num)
   162  {
   163          struct usb_interface *usbif = adap->algo_data;
   164          int i = 0, ret = 0;
   165          struct i2c_msg *msg;
   166          struct cp2615_i2c_transfer i2c_w = {0};
   167          dev_dbg(&usbif->dev, "Doing %d I2C transactions\n", num);
   168  
   169          for(; !ret && i < num; i++) {
   170                  msg = &msgs[i];
   171  
   172                  i2c_w.tag = 0xdd;
   173                  i2c_w.i2caddr = i2c_8bit_addr_from_msg(msg);
   174                  if (msg->flags & I2C_M_RD) {
   175                          i2c_w.read_len = msg->len;
   176                          i2c_w.write_len = 0;
   177                  } else {
   178                          i2c_w.read_len = 0;
   179                          i2c_w.write_len = msg->len;
   180                          memcpy(&i2c_w.data, msg->buf, i2c_w.write_len);
   181                  }
   182                  ret = cp2615_i2c_send(usbif, &i2c_w);
   183                  if (ret)
   184                          break;
   185                  ret = cp2615_i2c_recv(usbif, i2c_w.tag, msg->buf);
   186          }
   187          if (ret < 0)
   188                  return ret;
   189          return i;
   190  }
   191  
   192  static u32
   193  cp2615_i2c_func(struct i2c_adapter *adap)
   194  {
   195          return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
   196  }
   197  
   198  static const struct i2c_algorithm cp2615_i2c_algo = {
   199          .master_xfer    = cp2615_i2c_master_xfer,
   200          .functionality  = cp2615_i2c_func,
   201  };
   202  
   203  /*
   204   * This chip has some limitations: one is that the USB endpoint
   205   * can only receive 64 bytes/transfer, that leaves 54 bytes for
   206   * the I2C transfer. On top of that, EITHER read_len OR write_len
   207   * may be zero, but not both. If both are non-zero, the adapter
   208   * issues a write followed by a read. And the chip does not
   209   * support repeated START between the write and read phases.
   210   *
   211   * FIXME: There in no quirk flag for specifying that the adapter
   212   * does not support empty transfers, or that it cannot emit a
   213   * START condition between the combined phases.
   214   */
   215  struct i2c_adapter_quirks cp2615_i2c_quirks = {
   216          .max_write_len = MAX_I2C_SIZE,
   217          .max_read_len = MAX_I2C_SIZE,
   218          .flags = I2C_AQ_COMB_WRITE_THEN_READ,
   219          .max_comb_1st_msg_len = MAX_I2C_SIZE,
   220          .max_comb_2nd_msg_len = MAX_I2C_SIZE
   221  };
   222  
   223  static void
   224  cp2615_i2c_remove(struct usb_interface *usbif)
   225  {
   226          struct i2c_adapter *adap = usb_get_intfdata(usbif);
   227  
   228          usb_set_intfdata(usbif, NULL);
   229          i2c_del_adapter(adap);
   230  }
   231  
   232  static int
   233  cp2615_i2c_probe(struct usb_interface *usbif, const struct 
usb_device_id *id)
   234  {
   235          int ret = 0;
   236          struct i2c_adapter *adap;
   237          struct usb_device *usbdev = interface_to_usbdev(usbif);
   238  
   239          ret = usb_set_interface(usbdev, IOP_IFN, IOP_ALTSETTING);
   240          if (ret)
   241                  return ret;
   242  
   243          adap = devm_kzalloc(&usbif->dev, sizeof(struct i2c_adapter), 
GFP_KERNEL);
   244          if (!adap)
   245                  return -ENOMEM;
   246  
   247          strncpy(adap->name, usbdev->serial, sizeof(adap->name));
   248          adap->owner = THIS_MODULE;
   249          adap->dev.parent = &usbif->dev;
   250          adap->dev.of_node = usbif->dev.of_node;
   251          adap->timeout = HZ;
   252          adap->algo = &cp2615_i2c_algo;
   253          adap->quirks = &cp2615_i2c_quirks;
   254          adap->algo_data = usbif;
   255  
   256          ret = i2c_add_adapter(adap);
   257          if (ret)
   258                  return ret;
   259  
   260          usb_set_intfdata(usbif, adap);
   261          return ret;
   262  }
   263  
   264  static const struct usb_device_id id_table[] = {
   265          { USB_DEVICE(CP2615_VID, CP2615_PID) },
   266          { }
   267  };
   268  
 > 269  MODULE_DEVICE_TABLE(usb, id_table);
   270  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org

Attachment: .config.gz
Description: application/gzip

Reply via email to