Re: [PATCH v2] Adding i2c-cp2615: i2c support for Silicon Labs' CP2615 Digital Audio Bridge

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <lkp@xxxxxxxxx>

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 <bence98@xxxxxxxxxx>");
         |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   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-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux