[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202103172057.69FnHH8y-lkp@intel.com>
Date: Wed, 17 Mar 2021 20:24:59 +0800
From: kernel test robot <lkp@...el.com>
To: Bence Csókás <bence98@....bme.hu>,
linux-i2c@...r.kernel.org
Cc: kbuild-all@...ts.01.org,
Bence Csókás <bence98@....bme.hu>,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2] Adding i2c-cp2615: i2c support for Silicon Labs'
CP2615 Digital Audio Bridge
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@...el.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 <bence98@....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-all@lists.01.org
Download attachment ".config.gz" of type "application/gzip" (67374 bytes)
Powered by blists - more mailing lists