From: kernel test robot <lkp@intel.com>
To: "Bence Csókás" <bence98@sch.bme.hu>, linux-i2c@vger.kernel.org
Cc: kbuild-all@lists.01.org, "Bence Csókás" <bence98@sch.bme.hu>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] Adding i2c-cp2615: i2c support for Silicon Labs' CP2615 Digital Audio Bridge
Date: Wed, 17 Mar 2021 20:24:59 +0800 [thread overview]
Message-ID: <202103172057.69FnHH8y-lkp@intel.com> (raw)
In-Reply-To: <20210317103021.1913858-1-bence98@sch.bme.hu>
[-- Attachment #1: Type: text/plain, Size: 15154 bytes --]
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@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 <bence98@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-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 67374 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH v2] Adding i2c-cp2615: i2c support for Silicon Labs' CP2615 Digital Audio Bridge
Date: Wed, 17 Mar 2021 20:24:59 +0800 [thread overview]
Message-ID: <202103172057.69FnHH8y-lkp@intel.com> (raw)
In-Reply-To: <20210317103021.1913858-1-bence98@sch.bme.hu>
[-- Attachment #1: Type: text/plain, Size: 15502 bytes --]
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@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 <bence98@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-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 67374 bytes --]
next prev parent reply other threads:[~2021-03-17 12:26 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-17 10:30 [PATCH v2] Adding i2c-cp2615: i2c support for Silicon Labs' CP2615 Digital Audio Bridge Bence Csókás
2021-03-17 12:24 ` kernel test robot [this message]
2021-03-17 12:24 ` kernel test robot
2021-03-17 12:33 ` Wolfram Sang
2021-03-18 1:55 ` Bence Csókás
2021-03-18 5:59 ` Wolfram Sang
2021-03-17 14:29 ` kernel test robot
2021-03-17 14:29 ` kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202103172057.69FnHH8y-lkp@intel.com \
--to=lkp@intel.com \
--cc=bence98@sch.bme.hu \
--cc=kbuild-all@lists.01.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.