Hi Andreas, kernel test robot noticed the following build warnings: [auto build test WARNING on e0ee50101346ca9cef52da75e3fb4380c27c042a] url: https://github.com/intel-lab-lkp/linux/commits/Andreas-Klinger/dt-bindings-iio-pressure-Support-Honeywell-mprls0025pa-sensor/20230421-040254 base: e0ee50101346ca9cef52da75e3fb4380c27c042a patch link: https://lore.kernel.org/r/ZEGZ7VMrqaPNzhwj%40arbad patch subject: [PATCH v3 2/3] iio: pressure: Honeywell mprls0025pa pressure sensor config: sparc-allyesconfig (https://download.01.org/0day-ci/archive/20230421/202304210512.5qdqDRgd-lkp@xxxxxxxxx/config) compiler: sparc64-linux-gcc (GCC) 12.1.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/intel-lab-lkp/linux/commit/3d6a7eae49611392fb6f7563dcb71b74f12a0a78 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Andreas-Klinger/dt-bindings-iio-pressure-Support-Honeywell-mprls0025pa-sensor/20230421-040254 git checkout 3d6a7eae49611392fb6f7563dcb71b74f12a0a78 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc SHELL=/bin/bash drivers/iio/pressure/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@xxxxxxxxx> | Link: https://lore.kernel.org/oe-kbuild-all/202304210512.5qdqDRgd-lkp@xxxxxxxxx/ All warnings (new ones prefixed by >>): In file included from include/linux/device.h:15, from include/linux/acpi.h:15, from include/linux/i2c.h:13, from drivers/iio/pressure/mprls0025pa.c:17: drivers/iio/pressure/mprls0025pa.c: In function 'mpr_read_pressure': >> drivers/iio/pressure/mprls0025pa.c:169:30: warning: format '%d' expects argument of type 'int', but argument 4 has type 'long unsigned int' [-Wformat=] 169 | dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(wdata)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap' 110 | _p_func(dev, fmt, ##__VA_ARGS__); \ | ^~~ include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt' 144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~~~~~ drivers/iio/pressure/mprls0025pa.c:169:17: note: in expansion of macro 'dev_err' 169 | dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(wdata)); | ^~~~~~~ drivers/iio/pressure/mprls0025pa.c:169:70: note: format string is defined here 169 | dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(wdata)); | ~^ | | | int | %ld drivers/iio/pressure/mprls0025pa.c:208:30: warning: format '%d' expects argument of type 'int', but argument 4 has type 'long unsigned int' [-Wformat=] 208 | dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(buf)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap' 110 | _p_func(dev, fmt, ##__VA_ARGS__); \ | ^~~ include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt' 144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~~~~~ drivers/iio/pressure/mprls0025pa.c:208:17: note: in expansion of macro 'dev_err' 208 | dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(buf)); | ^~~~~~~ drivers/iio/pressure/mprls0025pa.c:208:70: note: format string is defined here 208 | dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(buf)); | ~^ | | | int | %ld vim +169 drivers/iio/pressure/mprls0025pa.c > 17 #include <linux/i2c.h> 18 #include <linux/module.h> 19 #include <linux/mod_devicetable.h> 20 #include <linux/device.h> 21 #include <linux/gpio/consumer.h> 22 #include <linux/regulator/consumer.h> 23 #include <linux/math64.h> 24 25 #include <asm/unaligned.h> 26 27 #include <linux/iio/iio.h> 28 #include <linux/iio/buffer.h> 29 #include <linux/iio/triggered_buffer.h> 30 #include <linux/iio/trigger_consumer.h> 31 32 /* bits in i2c status byte */ 33 #define MPR_I2C_POWER BIT(6) /* device is powered */ 34 #define MPR_I2C_BUSY BIT(5) /* device is busy */ 35 #define MPR_I2C_MEMORY BIT(2) /* integrity test passed */ 36 #define MPR_I2C_MATH BIT(0) /* internal math saturation */ 37 38 #define MPR_NANO_PART 1000000000LL 39 40 /* 41 * _INPUT interface: 42 * Calculation formular from the datasheet: 43 * pressure = (press_cnt - outputmin) * scale + pmin 44 * with: 45 * * pressure - measured pressure in Pascal 46 * * press_cnt - raw value read from sensor 47 * * pmin - minimum pressure range value of sensor (data->pmin) 48 * * pmax - maximum pressure range value of sensor (data->pmax) 49 * * outputmin - minimum numerical range raw value delivered by sensor (MPR_OUT_MIN) 50 * * outputmax - maximum numerical range raw value delivered by sensor (MPR_OUT_MAX) 51 * * scale - (pmax - pmin) / (outputmax - outputmin) 52 * 53 * _RAW interface: 54 * pressure = (raw + offset) * scale 55 * --> need to adjust offset for fitting into _RAW interface 56 * Values for _RAW interface: 57 * * raw - press_cnt 58 * * scale - (pmax - pmin) / (outputmax - outputmin) 59 * * offset - (-1 * outputmin) - pmin / scale 60 * note: With all sensors from the datasheet pmin = 0 which reduces the offset to 61 * (-1 * outputmin) 62 */ 63 64 /* 65 * transfer function A: 10% to 90% of 2^24 66 * transfer function B: 2.5% to 22.5% of 2^24 67 * transfer function C: 20% to 80% of 2^24 68 */ 69 enum mpr_func_id { 70 MPR_FUNCTION_A, 71 MPR_FUNCTION_B, 72 MPR_FUNCTION_C, 73 }; 74 75 struct mpr_func_spec { 76 u32 output_min; 77 u32 output_max; 78 }; 79 80 static const struct mpr_func_spec mpr_func_spec[] = { 81 [MPR_FUNCTION_A] = {.output_min = 1677722, .output_max = 15099494}, 82 [MPR_FUNCTION_B] = {.output_min = 419430, .output_max = 3774874}, 83 [MPR_FUNCTION_C] = {.output_min = 3355443, .output_max = 13421773}, 84 }; 85 86 struct mpr_chan { 87 s32 pres; /* pressure value */ 88 s64 ts; /* timestamp */ 89 }; 90 91 struct mpr_data { 92 struct i2c_client *client; 93 struct mutex lock; /* i2c transactions */ 94 u32 pmin; /* minimal pressure in pascal */ 95 u32 pmax; /* maximal pressure in pascal */ 96 u32 function; /* transfer function */ 97 u32 outmin; /* minimal numerical range raw value from sensor */ 98 u32 outmax; /* maximal numerical range raw value from sensor */ 99 int scale; /* int part of scale */ 100 int scale2; /* nano part of scale */ 101 int offset; /* int part of offset */ 102 int offset2; /* nano part of offset */ 103 struct gpio_desc *gpiod_reset; /* reset */ 104 int irq; /* end of conversion interrupt */ 105 struct completion completion; /* handshake from irq to read */ 106 struct mpr_chan chan; /* channel values for buffered mode */ 107 struct regulator *vdd; /* optional external voltage regulator */ 108 }; 109 110 static const struct iio_chan_spec mpr_channels[] = { 111 { 112 .type = IIO_PRESSURE, 113 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 114 BIT(IIO_CHAN_INFO_SCALE) | 115 BIT(IIO_CHAN_INFO_OFFSET), 116 .scan_index = 0, 117 .scan_type = { 118 .sign = 's', 119 .realbits = 32, 120 .storagebits = 32, 121 .endianness = IIO_CPU, 122 }, 123 }, 124 IIO_CHAN_SOFT_TIMESTAMP(1), 125 }; 126 127 static void mpr_reset(struct mpr_data *data) 128 { 129 if (data->gpiod_reset) { 130 gpiod_set_value(data->gpiod_reset, 0); 131 udelay(10); 132 gpiod_set_value(data->gpiod_reset, 1); 133 } 134 } 135 136 /** 137 * mpr_read_pressure() - Read pressure value from sensor via I2C 138 * @data: Pointer to private data struct. 139 * @press: Output value read from sensor. 140 * 141 * Reading from the sensor by sending and receiving I2C telegrams. 142 * 143 * If there is an end of conversion (EOC) interrupt registered the function waits for a maximum of 144 * one second for the interrupt. 145 * 146 * Context: The function can sleep and data->lock should be held when calling it. 147 * Return: 148 * * 0 - OK, the pressure value could be read 149 * * -ETIMEDOUT - Timeout while waiting for the EOC interrupt or busy flag is still set after nloops 150 * attempts of reading 151 */ 152 static int mpr_read_pressure(struct mpr_data *data, s32 *press) 153 { 154 struct device *dev = &data->client->dev; 155 int ret, i; 156 u8 wdata[] = {0xAA, 0x00, 0x00}; 157 s32 status; 158 int nloops = 10; 159 u8 buf[5]; 160 161 reinit_completion(&data->completion); 162 163 ret = i2c_master_send(data->client, wdata, sizeof(wdata)); 164 if (ret < 0) { 165 dev_err(dev, "error while writing ret: %d\n", ret); 166 return ret; 167 } 168 if (ret != sizeof(wdata)) { > 169 dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(wdata)); 170 return -EIO; 171 } 172 173 if (data->irq > 0) { 174 ret = wait_for_completion_timeout(&data->completion, HZ); 175 if (!ret) { 176 dev_err(dev, "timeout while waiting for eoc interrupt\n"); 177 return -ETIMEDOUT; 178 } 179 } else { 180 /* wait until status indicates data is ready */ 181 for (i = 0; i < nloops; i++) { 182 /* 183 * datasheet only says to wait at least 5 ms for the data but leave the 184 * maximum response time open 185 * --> let's try it nloops (10) times which seems to be quite long 186 */ 187 usleep_range(5000, 10000); 188 status = i2c_smbus_read_byte(data->client); 189 if (status < 0) { 190 dev_err(dev, "error while reading, status: %d\n", status); 191 return status; 192 } 193 if (!(status & MPR_I2C_BUSY)) 194 break; 195 } 196 if (i == nloops) { 197 dev_err(dev, "timeout while reading\n"); 198 return -ETIMEDOUT; 199 } 200 } 201 202 ret = i2c_master_recv(data->client, buf, sizeof(buf)); 203 if (ret < 0) { 204 dev_err(dev, "error in i2c_master_recv ret: %d\n", ret); 205 return ret; 206 } 207 if (ret != sizeof(buf)) { 208 dev_err(dev, "received size doesn't fit - ret: %d / %d\n", ret, sizeof(buf)); 209 return -EIO; 210 } 211 212 if (buf[0] & MPR_I2C_BUSY) { 213 /* it should never be the case that status still indicates business */ 214 dev_err(dev, "data still not ready: %08x\n", buf[0]); 215 return -ETIMEDOUT; 216 } 217 218 *press = get_unaligned_be24(&buf[1]); 219 220 dev_dbg(dev, "received: %*ph cnt: %d\n", ret, buf, *press); 221 222 return 0; 223 } 224 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests