[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202509210247.oVPW8pop-lkp@intel.com>
Date: Sun, 21 Sep 2025 02:36:49 +0800
From: kernel test robot <lkp@...el.com>
To: Eric Gonçalves <ghatto404@...il.com>,
Henrik Rydberg <rydberg@...math.org>,
Dmitry Torokhov <dmitry.torokhov@...il.com>,
Rob Herring <robh@...nel.org>,
Krzysztof Kozlowski <krzk@...nel.org>,
Conor Dooley <conor+dt@...nel.org>
Cc: oe-kbuild-all@...ts.linux.dev,
Ivaylo Ivanov <ivo.ivanov.ivanov1@...il.com>,
devicetree@...r.kernel.org, linux-input@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v1 2/2] Input: add support for the STM FTS2BA61Y
touchscreen
Hi Eric,
kernel test robot noticed the following build errors:
[auto build test ERROR on dtor-input/next]
[also build test ERROR on dtor-input/for-linus robh/for-next linus/master v6.17-rc6 next-20250919]
[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#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Eric-Gon-alves/dt-bindings-input-Add-ST-Microelectronics-FTS2BA61Y-touchscreen/20250920-094849
base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
patch link: https://lore.kernel.org/r/20250920014450.37787-3-ghatto404%40gmail.com
patch subject: [PATCH v1 2/2] Input: add support for the STM FTS2BA61Y touchscreen
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20250921/202509210247.oVPW8pop-lkp@intel.com/config)
compiler: sh4-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250921/202509210247.oVPW8pop-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509210247.oVPW8pop-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/input/touchscreen/fts2ba61y.c: In function 'fts2ba61y_wait_for_ready':
>> drivers/input/touchscreen/fts2ba61y.c:250:25: error: implicit declaration of function 'FIELD_GET' [-Wimplicit-function-declaration]
250 | stype = FIELD_GET(FTS2BA61Y_MASK_STYPE, buffer[0]);
| ^~~~~~~~~
drivers/input/touchscreen/fts2ba61y.c: In function 'fts2ba61y_irq_handler':
>> drivers/input/touchscreen/fts2ba61y.c:442:9: error: implicit declaration of function 'usleep'; did you mean 'fsleep'? [-Wimplicit-function-declaration]
442 | usleep(1);
| ^~~~~~
| fsleep
vim +/FIELD_GET +250 drivers/input/touchscreen/fts2ba61y.c
239
240 static int fts2ba61y_wait_for_ready(struct fts2ba61y_data *ts)
241 {
242 u8 buffer[FTS2BA61Y_EVENT_BUFF_SIZE];
243 u8 cmd = FTS2BA61Y_CMD_READ_EVENT;
244 u8 status_id, stype;
245 int ret;
246
247 for (int retries = 5; retries > 0; retries--) {
248 ret = fts2ba61y_read(ts, &cmd, 1, buffer, FTS2BA61Y_EVENT_BUFF_SIZE);
249
> 250 stype = FIELD_GET(FTS2BA61Y_MASK_STYPE, buffer[0]);
251 status_id = buffer[1];
252
253 if (stype == FTS2BA61Y_EVENT_STATUSTYPE_INFO &&
254 status_id == FTS2BA61Y_INFO_READY_STATUS) {
255 ret = 0;
256 break;
257 } else
258 ret = -ENODEV;
259
260 msleep(20);
261 }
262
263 return ret;
264 }
265
266 static int fts2ba61y_reset(struct fts2ba61y_data *ts)
267 {
268 u8 cmd = FTS2BA61Y_CMD_REG_W;
269 /* the following sequence is undocumented */
270 u8 reset[FTS2BA61Y_RESET_CMD_SIZE] = { 0x20, 0x00,
271 0x00, 0x24, 0x81 };
272 int ret;
273
274 disable_irq(ts->spi->irq);
275
276 ret = fts2ba61y_write(ts, &cmd, 1, &reset[0], FTS2BA61Y_RESET_CMD_SIZE);
277 if (ret)
278 return ret;
279 msleep(30);
280
281 ret = fts2ba61y_wait_for_ready(ts);
282 if (ret)
283 return ret;
284
285 enable_irq(ts->spi->irq);
286
287 return 0;
288 }
289
290 static int fts2ba61y_set_channels(struct fts2ba61y_data *ts)
291 {
292 int ret;
293 u8 cmd = FTS2BA61Y_CMD_READ_PANEL_INFO;
294 u8 data[FTS2BA61Y_PANEL_INFO_SIZE];
295
296 ret = fts2ba61y_read(ts, &cmd, 1, data, FTS2BA61Y_PANEL_INFO_SIZE);
297 if (ret)
298 return ret;
299
300 ts->max_x = get_unaligned_be16(data);
301 ts->max_y = get_unaligned_be16(data + 2);
302
303 /* if no tx channels defined, at least keep one */
304 ts->tx_count = max_t(u8, data[8], 1);
305
306 return 0;
307 }
308
309 static int fts2ba61y_set_touch_func(struct fts2ba61y_data *ts)
310 {
311 u8 cmd = FTS2BA61Y_CMD_TOUCHTYPE;
312 u16 touchtype = cpu_to_le16(FTS2BA61Y_TOUCHTYPE_DEFAULT);
313
314 return fts2ba61y_write(ts, &cmd, 1, (u8 *)&touchtype, 2);
315 }
316
317 static int fts2ba61y_hw_init(struct fts2ba61y_data *ts)
318 {
319 int ret;
320
321 ret = regulator_bulk_enable(ARRAY_SIZE(ts->regulators),
322 ts->regulators);
323 if (ret)
324 return ret;
325
326 msleep(140);
327
328 ret = fts2ba61y_reset(ts);
329 if (ret)
330 return ret;
331
332 ret = fts2ba61y_set_channels(ts);
333 if (ret)
334 return ret;
335
336 return fts2ba61y_set_touch_func(ts);
337 }
338
339 static int fts2ba61y_get_event(struct fts2ba61y_data *ts, u8 *data, int *n_events)
340 {
341 int ret;
342 u8 cmd = FTS2BA61Y_CMD_READ_EVENT;
343
344 ret = fts2ba61y_read(ts, &cmd, 1, data, FTS2BA61Y_EVENT_BUFF_SIZE);
345 if (ret < 0)
346 return ret;
347
348 if (!data[0]) {
349 *n_events = 0;
350 return 0;
351 }
352
353 *n_events = FIELD_GET(FTS2BA61Y_MASK_LEFT_EVENTS, data[7]);
354 if (unlikely(*n_events >= FTS2BA61Y_EVENT_COUNT)) {
355 cmd = FTS2BA61Y_CMD_CLEAR_EVENTS;
356 fts2ba61y_write(ts, &cmd, 1, NULL, 0);
357 *n_events = 0;
358 return -EINVAL;
359 }
360
361 if (*n_events > 0) {
362 ret = fts2ba61y_read(ts, &cmd, 1,
363 &data[1 * FTS2BA61Y_EVENT_BUFF_SIZE],
364 FTS2BA61Y_EVENT_BUFF_SIZE * (*n_events));
365 if (ret)
366 return ret;
367 }
368
369 return 0;
370 }
371
372 static void fts2ba61y_report_coordinates(struct fts2ba61y_data *ts,
373 u8 *event, u8 tid)
374 {
375 u8 major = event[4];
376 u8 minor = event[5];
377 u8 z = FIELD_GET(FTS2BA61Y_MASK_Z, event[6]);
378
379 u16 x = (event[1] << 4) |
380 FIELD_GET(FTS2BA61Y_MASK_X_3_0, event[3]);
381 u16 y = (event[2] << 4) |
382 FIELD_GET(FTS2BA61Y_MASK_Y_3_0, event[3]);
383 u16 ttype = (FIELD_GET(FTS2BA61Y_MASK_TTYPE_3_2, event[6]) << 2) |
384 (FIELD_GET(FTS2BA61Y_MASK_TTYPE_1_0, event[7]) << 0);
385
386 if (ttype != FTS2BA61Y_TOUCHTYPE_NORMAL &&
387 ttype != FTS2BA61Y_TOUCHTYPE_PALM &&
388 ttype != FTS2BA61Y_TOUCHTYPE_WET &&
389 ttype != FTS2BA61Y_TOUCHTYPE_GLOVE)
390 return;
391
392 input_mt_slot(ts->input_dev, tid);
393 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);
394 input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x);
395 input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
396 input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, major);
397 input_report_abs(ts->input_dev, ABS_MT_TOUCH_MINOR, minor);
398 input_report_abs(ts->input_dev, ABS_MT_PRESSURE, z);
399
400 input_mt_sync_frame(ts->input_dev);
401 input_sync(ts->input_dev);
402 }
403
404 static void fts2ba61y_report_release(struct fts2ba61y_data *ts, u8 tid)
405 {
406 input_mt_slot(ts->input_dev, tid);
407 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);
408
409 input_mt_sync_frame(ts->input_dev);
410 input_sync(ts->input_dev);
411 }
412
413 static void fts2ba61y_handle_coordinates(struct fts2ba61y_data *ts, u8 *event)
414 {
415 u8 t_id = FIELD_GET(FTS2BA61Y_MASK_TID, event[0]);
416 u8 action = FIELD_GET(FTS2BA61Y_MASK_TCHSTA, event[0]);
417
418 if (t_id > ts->tx_count)
419 return;
420
421 switch (action) {
422 case FTS2BA61Y_COORDINATE_ACTION_PRESS:
423 case FTS2BA61Y_COORDINATE_ACTION_MOVE:
424 fts2ba61y_report_coordinates(ts, event, t_id);
425 break;
426
427 case FTS2BA61Y_COORDINATE_ACTION_RELEASE:
428 fts2ba61y_report_release(ts, t_id);
429 break;
430 }
431 }
432
433 static irqreturn_t fts2ba61y_irq_handler(int irq, void *handle)
434 {
435 struct fts2ba61y_data *ts = handle;
436 u8 buffer[FTS2BA61Y_EVENT_COUNT * FTS2BA61Y_EVENT_BUFF_SIZE];
437 u8 *event;
438 u8 event_id;
439 int n_events = 0;
440 int ret;
441
> 442 usleep(1);
443
444 ret = fts2ba61y_get_event(ts, buffer, &n_events);
445 if (ret < 0) {
446 dev_dbg(&ts->spi->dev, "failed to get event: %d", ret);
447 return IRQ_HANDLED;
448 }
449
450 for (int i = 0; i <= n_events; i++) {
451 event = &buffer[i * FTS2BA61Y_EVENT_BUFF_SIZE];
452 event_id = FIELD_GET(FTS2BA61Y_MASK_EVENT_ID, event[0]);
453
454 if (event_id == FTS2BA61Y_COORDINATE_EVENT)
455 fts2ba61y_handle_coordinates(ts, event);
456 }
457
458 return IRQ_HANDLED;
459 }
460
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Powered by blists - more mailing lists