Hi Carl,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on input/next]
[also build test WARNING on v5.10-rc2 next-20201102]
[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/Carl-Philipp-Klemm/Drivers-input-misc-Add-driver-touchscreen-buttons-to-support-physically-labeled-buttons-on-touch-screen-surfaces/20201030-010622
base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
config: mips-allyesconfig (attached as .config)
compiler: mips-linux-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/00fd93a32ffbfc2ce311ed11e49a596eae970933
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Carl-Philipp-Klemm/Drivers-input-misc-Add-driver-touchscreen-buttons-to-support-physically-labeled-buttons-on-touch-screen-surfaces/20201030-010622
git checkout 00fd93a32ffbfc2ce311ed11e49a596eae970933
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=mips
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>
All warnings (new ones prefixed by >>):
drivers/input/misc/touchscreen-buttons.c: In function 'touchscreen_buttons_input_event':
drivers/input/misc/touchscreen-buttons.c:179:85: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
179 | } else if (buttons->queue.lastindex < EVENT_QUEUE_SIZE && buttons->queue.lastindex >= 0) {
| ^~
drivers/input/misc/touchscreen-buttons.c: At top level:quoted
drivers/input/misc/touchscreen-buttons.c:230:6: warning: no previous prototype for 'merge_task_handler' [-Wmissing-prototypes]
230 | void merge_task_handler(struct work_struct *work)
| ^~~~~~~~~~~~~~~~~~quoted
drivers/input/misc/touchscreen-buttons.c:240:6: warning: no previous prototype for 'close_task_handler' [-Wmissing-prototypes]
240 | void close_task_handler(struct work_struct *work)
| ^~~~~~~~~~~~~~~~~~quoted
drivers/input/misc/touchscreen-buttons.c:250:6: warning: no previous prototype for 'open_task_handler' [-Wmissing-prototypes]
250 | void open_task_handler(struct work_struct *work)
| ^~~~~~~~~~~~~~~~~quoted
drivers/input/misc/touchscreen-buttons.c:382:5: warning: no previous prototype for 'touchscreen_buttons_idev_opened' [-Wmissing-prototypes]
382 | int touchscreen_buttons_idev_opened(struct input_dev *idev)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~quoted
drivers/input/misc/touchscreen-buttons.c:405:6: warning: no previous prototype for 'touchscreen_buttons_idev_closed' [-Wmissing-prototypes]
405 | void touchscreen_buttons_idev_closed(struct input_dev *idev)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim +/merge_task_handler +230 drivers/input/misc/touchscreen-buttons.c
229
> 230 void merge_task_handler(struct work_struct *work)
231 {
232 struct touchscreen_buttons *buttons = container_of(work, struct touchscreen_buttons, merge_task);
233
234 mutex_lock(&buttons->mutex);
235 if (buttons->ts_handle && buttons->ts_handle->dev)
236 touchscreen_buttons_merge_capabilitys(buttons->filtered_ts_idev, buttons->ts_handle->dev);
237 mutex_unlock(&buttons->mutex);
238 }
239
> 240 void close_task_handler(struct work_struct *work)
241 {
242 struct touchscreen_buttons *buttons = container_of(work, struct touchscreen_buttons, close_task);
243
244 mutex_lock(&buttons->mutex);
245 if (buttons && buttons->ts_handle && buttons->ts_handle->open != 0)
246 input_close_device(buttons->ts_handle);
247 mutex_unlock(&buttons->mutex);
248 }
249
> 250 void open_task_handler(struct work_struct *work)
251 {
252 struct touchscreen_buttons *buttons = container_of(work, struct touchscreen_buttons, open_task);
253 int error;
254
255 mutex_lock(&buttons->mutex);
256 if (buttons && buttons->ts_handle) {
257 error = input_open_device(buttons->ts_handle);
258 if (error) {
259 dev_err(buttons->dev, "Failed to open input device, error %d\n", error);
260 input_unregister_handle(buttons->ts_handle);
261 kfree(buttons->ts_handle);
262 buttons->ts_handle = NULL;
263 }
264 }
265 mutex_unlock(&buttons->mutex);
266 }
267
268 static int touchscreen_buttons_input_connect(struct input_handler *handler,
269 struct input_dev *dev, const struct input_device_id *id)
270 {
271 struct touchscreen_buttons *buttons;
272
273 buttons = handler->private;
274
275 mutex_lock(&buttons->mutex);
276
277 if ((!buttons->ts_handle && device_match_of_node(&dev->dev, buttons->map->ts_node)) ||
278 (dev->dev.parent && device_match_of_node(dev->dev.parent, buttons->map->ts_node))) {
279 int error;
280
281 dev_info(buttons->dev, "Binding to device: %s\n", dev_name(&dev->dev));
282
283 buttons->ts_handle = kzalloc(sizeof(*buttons->ts_handle), GFP_KERNEL);
284 if (!buttons->ts_handle) {
285 mutex_unlock(&buttons->mutex);
286 return -ENOMEM;
287 }
288
289 buttons->ts_handle->dev = dev;
290 buttons->ts_handle->handler = handler;
291 buttons->ts_handle->name = "touchscreen-buttons";
292 buttons->ts_handle->private = handler->private;
293 buttons->queue.lastindex = 0;
294
295 error = input_register_handle(buttons->ts_handle);
296 if (error) {
297 dev_err(buttons->dev, "Failed to register input handler, error %d\n", error);
298 kfree(buttons->ts_handle);
299 buttons->ts_handle = NULL;
300 mutex_unlock(&buttons->mutex);
301 return error;
302 }
303
304 queue_work(buttons->workqueue, &buttons->merge_task);
305
306 if (buttons->filtered_ts_idev->users > 0 && buttons->ts_handle->open == 0)
307 queue_work(buttons->workqueue, &buttons->open_task);
308 }
309
310 mutex_unlock(&buttons->mutex);
311 return 0;
312 }
313
314 static void touchscreen_buttons_input_disconnect(struct input_handle *handle)
315 {
316 struct touchscreen_buttons *buttons;
317
318 buttons = handle->private;
319
320 mutex_lock(&buttons->mutex);
321 if (handle == buttons->ts_handle) {
322 input_close_device(handle);
323 input_unregister_handle(handle);
324 kfree(handle);
325 buttons->ts_handle = NULL;
326 dev_info(buttons->dev, "Touchscreen device disconnected buttons disabled\n");
327 } else {
328 dev_err(buttons->dev, "Unknown device disconnected, %p should be %p", handle,
329 buttons->ts_handle);
330 }
331 mutex_unlock(&buttons->mutex);
332 }
333
334 static struct touchscreen_button_map
335 *touchscreen_buttons_get_devtree_pdata(struct device *dev)
336 {
337 struct touchscreen_button_map *map;
338 struct fwnode_handle *child_node;
339 struct device_node *node;
340 int i;
341
342 map = kzalloc(sizeof(*map), GFP_KERNEL);
343 if (!map)
344 return ERR_PTR(-ENOMEM);
345
346 map->count = device_get_child_node_count(dev);
347 if (map->count == 0)
348 return ERR_PTR(-ENODEV);
349
350 map->buttons = kcalloc(map->count, sizeof(*map->buttons), GFP_KERNEL);
351 if (!map->buttons)
352 return ERR_PTR(-ENOMEM);
353
354 node = dev->of_node;
355 map->ts_node = of_parse_phandle(node, "touchscreen_phandle", 0);
356 if (!map->ts_node) {
357 dev_err(dev, "touchscreen_phandle node missing\n");
358 return ERR_PTR(-ENODEV);
359 }
360
361 dev_info(dev, "Device_node name: %s\n", map->ts_node->name);
362
363 i = 0;
364 device_for_each_child_node(dev, child_node) {
365 struct touchscreen_button *button;
366
367 button = &map->buttons[i];
368
369 fwnode_property_read_u32(child_node, "x-position", &button->x);
370 fwnode_property_read_u32(child_node, "y-position", &button->y);
371 fwnode_property_read_u32(child_node, "x-size", &button->width);
372 fwnode_property_read_u32(child_node, "y-size", &button->height);
373 fwnode_property_read_u32(child_node, "keycode", &button->keycode);
374 dev_info(dev,
375 "Adding button at x=%u y=%u size %u x %u keycode=%u\n",
376 button->x, button->y, button->width, button->height, button->keycode);
377 ++i;
378 }
379 return map;
380 }
381
> 382 int touchscreen_buttons_idev_opened(struct input_dev *idev)
383 {
384 struct touchscreen_buttons *buttons;
385
386 buttons = dev_get_drvdata(idev->dev.parent);
387
388 mutex_lock(&buttons->mutex);
389 if (buttons && buttons->ts_handle) {
390 if (buttons->ts_handle->open == 0) {
391 queue_work(buttons->workqueue, &buttons->open_task);
392 dev_dbg(idev->dev.parent, "idev opened\n");
393 } else {
394 dev_info(idev->dev.parent, "idev allready opened\n");
395 }
396 } else {
397 dev_warn(idev->dev.parent,
398 "Input device opend but touchscreen not opened. %p %p\n", buttons,
399 buttons->ts_handle);
400 }
401 mutex_unlock(&buttons->mutex);
402 return 0;
403 }
404
> 405 void touchscreen_buttons_idev_closed(struct input_dev *idev)
406 {
407 struct touchscreen_buttons *buttons;
408
409 buttons = dev_get_drvdata(idev->dev.parent);
410
411 mutex_lock(&buttons->mutex);
412 if (buttons && buttons->ts_handle && buttons->ts_handle->open != 0) {
413 queue_work(buttons->workqueue, &buttons->close_task);
414 dev_dbg(idev->dev.parent, "idev closed\n");
415 }
416 mutex_unlock(&buttons->mutex);
417 }
418
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org