Re: [PATCH v4 2/2] iio: humidity: Add support for ENS210

From: kernel test robot
Date: Sat Jul 20 2024 - 05:30:33 EST


Hi Joshua,

kernel test robot noticed the following build warnings:

[auto build test WARNING on 1ebab783647a9e3bf357002d5c4ff060c8474a0a]

url: https://github.com/intel-lab-lkp/linux/commits/Joshua-Felmeden/dt-bindings-iio-humidity-add-ENS210-sensor-family/20240719-210648
base: 1ebab783647a9e3bf357002d5c4ff060c8474a0a
patch link: https://lore.kernel.org/r/20240719-ens21x-v4-2-6044e48a376a%40thegoodpenguin.co.uk
patch subject: [PATCH v4 2/2] iio: humidity: Add support for ENS210
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20240720/202407201729.dZc0rJ8y-lkp@xxxxxxxxx/config)
compiler: sh4-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240720/202407201729.dZc0rJ8y-lkp@xxxxxxxxx/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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202407201729.dZc0rJ8y-lkp@xxxxxxxxx/

All warnings (new ones prefixed by >>):

In file included from include/linux/device.h:15,
from include/linux/acpi.h:14,
from include/linux/i2c.h:13,
from drivers/iio/humidity/ens210.c:19:
drivers/iio/humidity/ens210.c: In function 'ens210_probe':
>> drivers/iio/humidity/ens210.c:251:25: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'unsigned int' [-Wformat=]
251 | "Part ID does not match (0x%04x != 0x%04lx)\n", part_id,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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:160:58: note: in expansion of macro 'dev_fmt'
160 | dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/iio/humidity/ens210.c:250:17: note: in expansion of macro 'dev_info'
250 | dev_info(&client->dev,
| ^~~~~~~~
drivers/iio/humidity/ens210.c:251:66: note: format string is defined here
251 | "Part ID does not match (0x%04x != 0x%04lx)\n", part_id,
| ~~~~^
| |
| long unsigned int
| %04x
>> drivers/iio/humidity/ens210.c:200:37: warning: unused variable 'id' [-Wunused-variable]
200 | const struct i2c_device_id *id = i2c_client_get_device_id(client);
| ^~
--
>> drivers/iio/humidity/ens210.c:83: warning: Function parameter or struct member 'chip_info' not described in 'ens210_data'
>> drivers/iio/humidity/ens210.c:83: warning: Excess struct member 'res_index' description in 'ens210_data'


vim +251 drivers/iio/humidity/ens210.c

72
73 /**
74 * struct ens210_data - Humidity/Temperature sensor device structure
75 * @client: i2c client
76 * @lock: lock protecting the i2c conversion
77 * @res_index: index to selected sensor resolution
78 */
79 struct ens210_data {
80 struct i2c_client *client;
81 const struct ens210_chip_info *chip_info;
82 struct mutex lock;
> 83 };
84
85 /* calculate 17-bit crc7 */
86 static u8 ens210_crc7(u32 val)
87 {
88 __be32 val_be = (cpu_to_be32(val & 0x1ffff) >> 0x8);
89
90 return crc7_be(0xde, (u8 *)&val_be, 3) >> 1;
91 }
92
93 static int ens210_get_measurement(struct iio_dev *indio_dev, bool temp, int *val)
94 {
95 u32 regval;
96 u8 regval_le[3];
97 int ret;
98 struct ens210_data *data = iio_priv(indio_dev);
99
100 /* assert read */
101 ret = i2c_smbus_write_byte_data(data->client, ENS210_REG_SENS_START,
102 temp ? ENS210_SENS_START_T_START :
103 ENS210_SENS_START_H_START);
104 if (ret)
105 return ret;
106
107 /* wait for conversion to be ready */
108 msleep(data->chip_info->conv_time_msec);
109
110 ret = i2c_smbus_read_byte_data(data->client,
111 ENS210_REG_SENS_STAT);
112 if (ret < 0)
113 return ret;
114
115 /* perform read */
116 ret = i2c_smbus_read_i2c_block_data(
117 data->client, temp ? ENS210_REG_T_VAL : ENS210_REG_H_VAL, 3,
118 (u8 *)&regval_le);
119 if (ret < 0) {
120 dev_err(&data->client->dev, "failed to read register");
121 return -EIO;
122 } else if (ret != 3) {
123 dev_err(&indio_dev->dev, "expected 3 bytes, received %d\n", ret);
124 return -EIO;
125 }
126
127 regval = get_unaligned_le24(regval_le);
128 if (ens210_crc7(regval) != ((regval >> 17) & 0x7f)) {
129 /* crc fail */
130 dev_err(&indio_dev->dev, "ens invalid crc\n");
131 return -EIO;
132 }
133
134 *val = regval & 0xffff;
135 return IIO_VAL_INT;
136 }
137
138 static int ens210_read_raw(struct iio_dev *indio_dev,
139 struct iio_chan_spec const *channel, int *val,
140 int *val2, long mask)
141 {
142 struct ens210_data *data = iio_priv(indio_dev);
143 int ret = -EINVAL;
144
145 switch (mask) {
146 case IIO_CHAN_INFO_RAW:
147 scoped_guard(mutex, &data->lock) {
148 ret = ens210_get_measurement(
149 indio_dev, channel->type == IIO_TEMP, val);
150 if (ret)
151 return ret;
152 return IIO_VAL_INT;
153 }
154 return ret;
155 case IIO_CHAN_INFO_SCALE:
156 if (channel->type == IIO_TEMP) {
157 *val = 15;
158 *val2 = 625000;
159 } else {
160 *val = 1;
161 *val2 = 953125;
162 }
163 return IIO_VAL_INT_PLUS_MICRO;
164 case IIO_CHAN_INFO_OFFSET:
165 if (channel->type == IIO_TEMP) {
166 *val = -17481;
167 *val2 = 600000;
168 ret = IIO_VAL_INT_PLUS_MICRO;
169 break;
170 }
171 *val = 0;
172 return IIO_VAL_INT;
173 default:
174 return -EINVAL;
175 }
176 return ret;
177 }
178
179 static const struct iio_chan_spec ens210_channels[] = {
180 {
181 .type = IIO_TEMP,
182 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
183 BIT(IIO_CHAN_INFO_SCALE) |
184 BIT(IIO_CHAN_INFO_OFFSET),
185 },
186 {
187 .type = IIO_HUMIDITYRELATIVE,
188 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
189 BIT(IIO_CHAN_INFO_SCALE) |
190 BIT(IIO_CHAN_INFO_OFFSET),
191 }
192 };
193
194 static const struct iio_info ens210_info = {
195 .read_raw = ens210_read_raw,
196 };
197
198 static int ens210_probe(struct i2c_client *client)
199 {
> 200 const struct i2c_device_id *id = i2c_client_get_device_id(client);
201 struct ens210_data *data;
202 struct iio_dev *indio_dev;
203 uint16_t part_id;
204 int ret;
205
206 if (!i2c_check_functionality(client->adapter,
207 I2C_FUNC_SMBUS_WRITE_BYTE_DATA |
208 I2C_FUNC_SMBUS_WRITE_BYTE |
209 I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
210 dev_err_probe(&client->dev, -EOPNOTSUPP,
211 "adapter does not support some i2c transactions\n");
212 return -EOPNOTSUPP;
213 }
214
215 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
216 if (!indio_dev)
217 return -ENOMEM;
218
219 data = iio_priv(indio_dev);
220 i2c_set_clientdata(client, indio_dev);
221 data->client = client;
222 mutex_init(&data->lock);
223 data->chip_info = i2c_get_match_data(client);
224
225 ret = devm_regulator_get_enable(&client->dev, "vdd");
226 if (ret)
227 return ret;
228
229 /* reset device */
230 ret = i2c_smbus_write_byte_data(client, ENS210_REG_SYS_CTRL,
231 ENS210_SYS_CTRL_SYS_RESET);
232 if (ret)
233 return ret;
234
235 /* wait for device to become active */
236 usleep_range(4000, 5000);
237
238 /* disable low power mode */
239 ret = i2c_smbus_write_byte_data(client, ENS210_REG_SYS_CTRL, 0x00);
240 if (ret)
241 return ret;
242
243 /* wait for device to finish */
244 usleep_range(4000, 5000);
245
246 /* get part_id */
247 part_id = i2c_smbus_read_word_data(client, ENS210_REG_PART_ID);
248
249 if (part_id != data->chip_info->part_id) {
> 250 dev_info(&client->dev,
> 251 "Part ID does not match (0x%04x != 0x%04lx)\n", part_id,
252 data->chip_info->part_id);
253 }
254
255 /* reenable low power */
256 ret = i2c_smbus_write_byte_data(client, ENS210_REG_SYS_CTRL,
257 ENS210_SYS_CTRL_LOW_POWER_ENABLE);
258 if (ret)
259 return ret;
260
261 indio_dev->name = data->chip_info->name;
262 indio_dev->modes = INDIO_DIRECT_MODE;
263 indio_dev->channels = ens210_channels;
264 indio_dev->num_channels = ARRAY_SIZE(ens210_channels);
265 indio_dev->info = &ens210_info;
266
267 return devm_iio_device_register(&client->dev, indio_dev);
268 }
269

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki