Message ID | 20241114231002.98595-16-l.rubusch@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | iio: accel: adxl345: add FIFO operating with IRQ triggered watermark events | expand |
Hi Lothar, kernel test robot noticed the following build warnings: [auto build test WARNING on jic23-iio/togreg] [also build test WARNING on linus/master v6.12-rc7 next-20241115] [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/Lothar-Rubusch/iio-accel-adxl345-fix-comment-on-probe/20241115-190245 base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg patch link: https://lore.kernel.org/r/20241114231002.98595-16-l.rubusch%40gmail.com patch subject: [PATCH 15/22] iio: accel: adxl345: reset the FIFO on error config: arc-randconfig-r052-20241117 (https://download.01.org/0day-ci/archive/20241117/202411170855.sbBnXXo4-lkp@intel.com/config) compiler: arc-elf-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241117/202411170855.sbBnXXo4-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@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202411170855.sbBnXXo4-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/iio/accel/adxl345_core.c:383:6: warning: no previous prototype for 'adxl345_empty_fifo' [-Wmissing-prototypes] 383 | void adxl345_empty_fifo(struct adxl34x_state *st) | ^~~~~~~~~~~~~~~~~~ vim +/adxl345_empty_fifo +383 drivers/iio/accel/adxl345_core.c 376 377 /** 378 * Empty the fifo. This is needed also in case of overflow or error handling. 379 * Read out all remaining elements and reset the fifo_entries counter. 380 * 381 * @st: The instance to the state object of the sensor. 382 */ > 383 void adxl345_empty_fifo(struct adxl34x_state *st) 384 { 385 int regval; 386 int fifo_entries; 387 388 /* In case the HW is not "clean" just read out remaining elements */ 389 adxl345_get_fifo_entries(st, &fifo_entries); 390 if (fifo_entries > 0) 391 adxl345_read_fifo_elements(st, fifo_entries); 392 393 /* Reset the INT_SOURCE register by reading the register */ 394 regmap_read(st->regmap, ADXL345_REG_INT_SOURCE, ®val); 395 } 396
Hi Lothar, kernel test robot noticed the following build warnings: [auto build test WARNING on jic23-iio/togreg] [also build test WARNING on linus/master v6.12-rc7 next-20241115] [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/Lothar-Rubusch/iio-accel-adxl345-fix-comment-on-probe/20241115-190245 base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg patch link: https://lore.kernel.org/r/20241114231002.98595-16-l.rubusch%40gmail.com patch subject: [PATCH 15/22] iio: accel: adxl345: reset the FIFO on error config: arm-randconfig-002-20241117 (https://download.01.org/0day-ci/archive/20241117/202411171552.BWbWLHpL-lkp@intel.com/config) compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 592c0fe55f6d9a811028b5f3507be91458ab2713) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241117/202411171552.BWbWLHpL-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@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202411171552.BWbWLHpL-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/iio/accel/adxl345_core.c:383:6: warning: no previous prototype for function 'adxl345_empty_fifo' [-Wmissing-prototypes] 383 | void adxl345_empty_fifo(struct adxl34x_state *st) | ^ drivers/iio/accel/adxl345_core.c:383:1: note: declare 'static' if the function is not intended to be used outside of this translation unit 383 | void adxl345_empty_fifo(struct adxl34x_state *st) | ^ | static 1 warning generated. vim +/adxl345_empty_fifo +383 drivers/iio/accel/adxl345_core.c 376 377 /** 378 * Empty the fifo. This is needed also in case of overflow or error handling. 379 * Read out all remaining elements and reset the fifo_entries counter. 380 * 381 * @st: The instance to the state object of the sensor. 382 */ > 383 void adxl345_empty_fifo(struct adxl34x_state *st) 384 { 385 int regval; 386 int fifo_entries; 387 388 /* In case the HW is not "clean" just read out remaining elements */ 389 adxl345_get_fifo_entries(st, &fifo_entries); 390 if (fifo_entries > 0) 391 adxl345_read_fifo_elements(st, fifo_entries); 392 393 /* Reset the INT_SOURCE register by reading the register */ 394 regmap_read(st->regmap, ADXL345_REG_INT_SOURCE, ®val); 395 } 396
Hi Lothar, kernel test robot noticed the following build warnings: [auto build test WARNING on jic23-iio/togreg] [also build test WARNING on linus/master v6.12-rc7 next-20241115] [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/Lothar-Rubusch/iio-accel-adxl345-fix-comment-on-probe/20241115-190245 base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg patch link: https://lore.kernel.org/r/20241114231002.98595-16-l.rubusch%40gmail.com patch subject: [PATCH 15/22] iio: accel: adxl345: reset the FIFO on error config: x86_64-randconfig-121-20241117 (https://download.01.org/0day-ci/archive/20241117/202411172311.p8Krv6kq-lkp@intel.com/config) compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241117/202411172311.p8Krv6kq-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@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202411172311.p8Krv6kq-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/iio/accel/adxl345_core.c:383:6: sparse: sparse: symbol 'adxl345_empty_fifo' was not declared. Should it be static? vim +/adxl345_empty_fifo +383 drivers/iio/accel/adxl345_core.c 376 377 /** 378 * Empty the fifo. This is needed also in case of overflow or error handling. 379 * Read out all remaining elements and reset the fifo_entries counter. 380 * 381 * @st: The instance to the state object of the sensor. 382 */ > 383 void adxl345_empty_fifo(struct adxl34x_state *st) 384 { 385 int regval; 386 int fifo_entries; 387 388 /* In case the HW is not "clean" just read out remaining elements */ 389 adxl345_get_fifo_entries(st, &fifo_entries); 390 if (fifo_entries > 0) 391 adxl345_read_fifo_elements(st, fifo_entries); 392 393 /* Reset the INT_SOURCE register by reading the register */ 394 regmap_read(st->regmap, ADXL345_REG_INT_SOURCE, ®val); 395 } 396
diff --git a/drivers/iio/accel/adxl345_core.c b/drivers/iio/accel/adxl345_core.c index 57bca112ea..ece28825fb 100644 --- a/drivers/iio/accel/adxl345_core.c +++ b/drivers/iio/accel/adxl345_core.c @@ -344,6 +344,56 @@ static int adxl345_get_fifo_entries(struct adxl34x_state *st, int *fifo_entries) return 0; } +/** + * Read fifo_entries number of elements into *st + * + * It is recommended that a multiple-byte read of all registers be + * performed to prevent a change in data between reads of sequential + * registers. + * That is to read out the data registers X0, X1, Y0, Y1, Z0, Z1 at once. + * + * @st: The instance of the state object of this sensor. + * @fifo_entries: The number of lines in the FIFO referred to as fifo_entry, + * a fifo_entry has 3 elements for X, Y and Z direction of 2 bytes each. + */ +static int adxl345_read_fifo_elements(struct adxl34x_state *st, int fifo_entries) +{ + size_t count, ndirs = 3; + int i, ret; + + count = 2 * ndirs; /* 2 byte per direction */ + for (i = 0; i < fifo_entries; i++) { + ret = regmap_noinc_read(st->regmap, ADXL345_REG_XYZ_BASE, + st->fifo_buf + (i * count / 2), count); + if (ret) { + pr_warn("%s(): regmap_noinc_read() failed\n", __func__); + return -EFAULT; + } + } + + return 0; +} + +/** + * Empty the fifo. This is needed also in case of overflow or error handling. + * Read out all remaining elements and reset the fifo_entries counter. + * + * @st: The instance to the state object of the sensor. + */ +void adxl345_empty_fifo(struct adxl34x_state *st) +{ + int regval; + int fifo_entries; + + /* In case the HW is not "clean" just read out remaining elements */ + adxl345_get_fifo_entries(st, &fifo_entries); + if (fifo_entries > 0) + adxl345_read_fifo_elements(st, fifo_entries); + + /* Reset the INT_SOURCE register by reading the register */ + regmap_read(st->regmap, ADXL345_REG_INT_SOURCE, ®val); +} + static const struct iio_buffer_setup_ops adxl345_buffer_ops = { }; @@ -390,30 +440,34 @@ static irqreturn_t adxl345_trigger_handler(int irq, void *p) ret = adxl345_get_status(st, &int_stat); if (ret < 0) - goto done; + goto err; /* Ignore already read event by reissued too fast */ if (int_stat == 0x0) - goto done; + goto err; /* evaluation */ if (int_stat & ADXL345_INT_OVERRUN) { pr_debug("%s(): OVERRUN event detected\n", __func__); - goto done; + goto err; } if (int_stat & (ADXL345_INT_DATA_READY | ADXL345_INT_WATERMARK)) { pr_debug("%s(): WATERMARK or DATA_READY event detected\n", __func__); if (adxl345_get_fifo_entries(st, &fifo_entries) < 0) - goto done; - } - goto done; -done: + goto err; - if (indio_dev) iio_trigger_notify_done(indio_dev->trig); + } + goto done; +err: + iio_trigger_notify_done(indio_dev->trig); + adxl345_empty_fifo(st); + return IRQ_NONE; + +done: return IRQ_HANDLED; }
Add a function to empty the FIFO and reset the INT_SOURCE register. Reading out is used to reset the fifo again. For cleanup also a read on the INT_SOURCE register is needed to allow the adxl345 to issue interrupts again. Without clearing the fields no further interrupts will happen. Signed-off-by: Lothar Rubusch <l.rubusch@gmail.com> --- drivers/iio/accel/adxl345_core.c | 70 ++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 8 deletions(-)