Hi Takashi, I love your patch! Perhaps something to improve: [auto build test WARNING on input/next] [also build test WARNING on hid/for-next linux/master linus/master v5.13-rc3 next-20210527] [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/Takashi-Iwai/Input-elants_i2c-Fix-NULL-dereference-at-probing/20210528-013428 base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next config: s390-randconfig-r023-20210526 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 6505c630407c5feec818f0bb1c284f9eeebf2071) 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 # install s390 cross compiling tool for clang build # apt-get install binutils-s390x-linux-gnu # https://github.com/0day-ci/linux/commit/8a6af622a33ab5301cea789e5ff6a9afd9b09828 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Takashi-Iwai/Input-elants_i2c-Fix-NULL-dereference-at-probing/20210528-013428 git checkout 8a6af622a33ab5301cea789e5ff6a9afd9b09828 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=s390 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@xxxxxxxxx> All warnings (new ones prefixed by >>): In file included from drivers/input/touchscreen/elants_i2c.c:26: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/s390/include/asm/io.h:80: include/asm-generic/io.h:464:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __raw_readb(PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:477:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:36:59: note: expanded from macro '__le16_to_cpu' #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x)) ^ include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16' #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x)) ^ In file included from drivers/input/touchscreen/elants_i2c.c:26: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/s390/include/asm/io.h:80: include/asm-generic/io.h:490:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:34:59: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32' #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x)) ^ In file included from drivers/input/touchscreen/elants_i2c.c:26: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/s390/include/asm/io.h:80: include/asm-generic/io.h:501:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writeb(value, PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:511:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:521:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:609:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:617:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:625:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:634:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:643:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:652:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ >> drivers/input/touchscreen/elants_i2c.c:1399:16: warning: cast to smaller integer type 'enum elants_chip_id' from 'const void *' [-Wvoid-pointer-to-enum-cast] ts->chip_id = (enum elants_chip_id)device_get_match_data(&client->dev); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 13 warnings generated. vim +1399 drivers/input/touchscreen/elants_i2c.c 1371 1372 static int elants_i2c_probe(struct i2c_client *client, 1373 const struct i2c_device_id *id) 1374 { 1375 union i2c_smbus_data dummy; 1376 struct elants_data *ts; 1377 unsigned long irqflags; 1378 int error; 1379 1380 /* Don't bind to i2c-hid compatible devices, these are handled by the i2c-hid drv. */ 1381 if (elants_acpi_is_hid_device(&client->dev)) { 1382 dev_warn(&client->dev, "This device appears to be an I2C-HID device, not binding\n"); 1383 return -ENODEV; 1384 } 1385 1386 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 1387 dev_err(&client->dev, "I2C check functionality error\n"); 1388 return -ENXIO; 1389 } 1390 1391 ts = devm_kzalloc(&client->dev, sizeof(struct elants_data), GFP_KERNEL); 1392 if (!ts) 1393 return -ENOMEM; 1394 1395 mutex_init(&ts->sysfs_mutex); 1396 init_completion(&ts->cmd_done); 1397 1398 ts->client = client; > 1399 ts->chip_id = (enum elants_chip_id)device_get_match_data(&client->dev); 1400 i2c_set_clientdata(client, ts); 1401 1402 ts->vcc33 = devm_regulator_get(&client->dev, "vcc33"); 1403 if (IS_ERR(ts->vcc33)) { 1404 error = PTR_ERR(ts->vcc33); 1405 if (error != -EPROBE_DEFER) 1406 dev_err(&client->dev, 1407 "Failed to get 'vcc33' regulator: %d\n", 1408 error); 1409 return error; 1410 } 1411 1412 ts->vccio = devm_regulator_get(&client->dev, "vccio"); 1413 if (IS_ERR(ts->vccio)) { 1414 error = PTR_ERR(ts->vccio); 1415 if (error != -EPROBE_DEFER) 1416 dev_err(&client->dev, 1417 "Failed to get 'vccio' regulator: %d\n", 1418 error); 1419 return error; 1420 } 1421 1422 ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW); 1423 if (IS_ERR(ts->reset_gpio)) { 1424 error = PTR_ERR(ts->reset_gpio); 1425 1426 if (error == -EPROBE_DEFER) 1427 return error; 1428 1429 if (error != -ENOENT && error != -ENOSYS) { 1430 dev_err(&client->dev, 1431 "failed to get reset gpio: %d\n", 1432 error); 1433 return error; 1434 } 1435 1436 ts->keep_power_in_suspend = true; 1437 } 1438 1439 error = elants_i2c_power_on(ts); 1440 if (error) 1441 return error; 1442 1443 error = devm_add_action(&client->dev, elants_i2c_power_off, ts); 1444 if (error) { 1445 dev_err(&client->dev, 1446 "failed to install power off action: %d\n", error); 1447 elants_i2c_power_off(ts); 1448 return error; 1449 } 1450 1451 /* Make sure there is something at this address */ 1452 if (i2c_smbus_xfer(client->adapter, client->addr, 0, 1453 I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &dummy) < 0) { 1454 dev_err(&client->dev, "nothing at this address\n"); 1455 return -ENXIO; 1456 } 1457 1458 error = elants_i2c_initialize(ts); 1459 if (error) { 1460 dev_err(&client->dev, "failed to initialize: %d\n", error); 1461 return error; 1462 } 1463 1464 ts->input = devm_input_allocate_device(&client->dev); 1465 if (!ts->input) { 1466 dev_err(&client->dev, "Failed to allocate input device\n"); 1467 return -ENOMEM; 1468 } 1469 1470 ts->input->name = "Elan Touchscreen"; 1471 ts->input->id.bustype = BUS_I2C; 1472 1473 /* Multitouch input params setup */ 1474 1475 input_set_abs_params(ts->input, ABS_MT_POSITION_X, 0, ts->x_max, 0, 0); 1476 input_set_abs_params(ts->input, ABS_MT_POSITION_Y, 0, ts->y_max, 0, 0); 1477 input_set_abs_params(ts->input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); 1478 input_set_abs_params(ts->input, ABS_MT_PRESSURE, 0, 255, 0, 0); 1479 input_set_abs_params(ts->input, ABS_MT_TOOL_TYPE, 1480 0, MT_TOOL_PALM, 0, 0); 1481 1482 touchscreen_parse_properties(ts->input, true, &ts->prop); 1483 1484 if (ts->chip_id == EKTF3624 && ts->phy_x && ts->phy_y) { 1485 /* calculate resolution from size */ 1486 ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, ts->phy_x); 1487 ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, ts->phy_y); 1488 } 1489 1490 input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res); 1491 input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res); 1492 input_abs_set_res(ts->input, ABS_MT_TOUCH_MAJOR, ts->major_res); 1493 1494 error = input_mt_init_slots(ts->input, MAX_CONTACT_NUM, 1495 INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED); 1496 if (error) { 1497 dev_err(&client->dev, 1498 "failed to initialize MT slots: %d\n", error); 1499 return error; 1500 } 1501 1502 error = input_register_device(ts->input); 1503 if (error) { 1504 dev_err(&client->dev, 1505 "unable to register input device: %d\n", error); 1506 return error; 1507 } 1508 1509 /* 1510 * Platform code (ACPI, DTS) should normally set up interrupt 1511 * for us, but in case it did not let's fall back to using falling 1512 * edge to be compatible with older Chromebooks. 1513 */ 1514 irqflags = irq_get_trigger_type(client->irq); 1515 if (!irqflags) 1516 irqflags = IRQF_TRIGGER_FALLING; 1517 1518 error = devm_request_threaded_irq(&client->dev, client->irq, 1519 NULL, elants_i2c_irq, 1520 irqflags | IRQF_ONESHOT, 1521 client->name, ts); 1522 if (error) { 1523 dev_err(&client->dev, "Failed to register interrupt\n"); 1524 return error; 1525 } 1526 1527 /* 1528 * Systems using device tree should set up wakeup via DTS, 1529 * the rest will configure device as wakeup source by default. 1530 */ 1531 if (!client->dev.of_node) 1532 device_init_wakeup(&client->dev, true); 1533 1534 error = devm_device_add_group(&client->dev, &elants_attribute_group); 1535 if (error) { 1536 dev_err(&client->dev, "failed to create sysfs attributes: %d\n", 1537 error); 1538 return error; 1539 } 1540 1541 return 0; 1542 } 1543 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip