Lines Matching +full:scan +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0+
3 * hdc100x.c - Support for the TI HDC100x temperature + humidity sensors
17 #include <linux/delay.h>
49 } scan; member
128 .scan_index = -1,
137 int tmp = (~mask & data->config) | val; in hdc100x_update_config()
140 ret = i2c_smbus_write_word_swapped(data->client, in hdc100x_update_config()
143 data->config = tmp; in hdc100x_update_config()
151 int ret = -EINVAL; in hdc100x_set_it_time()
160 data->adc_int_us[chan] = val2; in hdc100x_set_it_time()
171 struct i2c_client *client = data->client; in hdc100x_get_measurement()
172 int delay = data->adc_int_us[chan->address] + 1*USEC_PER_MSEC; in hdc100x_get_measurement() local
177 ret = i2c_smbus_write_byte(client, chan->address); in hdc100x_get_measurement()
179 dev_err(&client->dev, "cannot start measurement"); in hdc100x_get_measurement()
184 usleep_range(delay, delay + 1000); in hdc100x_get_measurement()
187 ret = i2c_master_recv(data->client, (char *)&val, sizeof(val)); in hdc100x_get_measurement()
189 dev_err(&client->dev, "cannot read sensor data\n"); in hdc100x_get_measurement()
197 return !!(data->config & HDC100X_REG_CONFIG_HEATER_EN); in hdc100x_get_heater_status()
210 guard(mutex)(&data->lock); in hdc100x_read_raw()
211 if (chan->type == IIO_CURRENT) { in hdc100x_read_raw()
216 return -EBUSY; in hdc100x_read_raw()
227 *val2 = data->adc_int_us[chan->address]; in hdc100x_read_raw()
230 if (chan->type == IIO_TEMP) { in hdc100x_read_raw()
241 *val = -15887; in hdc100x_read_raw()
245 return -EINVAL; in hdc100x_read_raw()
258 return -EINVAL; in hdc100x_write_raw()
260 guard(mutex)(&data->lock); in hdc100x_write_raw()
261 return hdc100x_set_it_time(data, chan->address, val2); in hdc100x_write_raw()
264 if (chan->type != IIO_CURRENT || val2 != 0) in hdc100x_write_raw()
265 return -EINVAL; in hdc100x_write_raw()
267 guard(mutex)(&data->lock); in hdc100x_write_raw()
272 return -EINVAL; in hdc100x_write_raw()
281 guard(mutex)(&data->lock); in hdc100x_buffer_postenable()
290 guard(mutex)(&data->lock); in hdc100x_buffer_predisable()
302 struct iio_dev *indio_dev = pf->indio_dev; in hdc100x_trigger_handler()
304 struct i2c_client *client = data->client; in hdc100x_trigger_handler()
305 int delay = data->adc_int_us[0] + data->adc_int_us[1] + 2*USEC_PER_MSEC; in hdc100x_trigger_handler() local
309 mutex_lock(&data->lock); in hdc100x_trigger_handler()
312 dev_err(&client->dev, "cannot start measurement\n"); in hdc100x_trigger_handler()
315 usleep_range(delay, delay + 1000); in hdc100x_trigger_handler()
317 ret = i2c_master_recv(client, (u8 *)data->scan.channels, 4); in hdc100x_trigger_handler()
319 dev_err(&client->dev, "cannot read sensor data\n"); in hdc100x_trigger_handler()
323 iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, in hdc100x_trigger_handler()
326 mutex_unlock(&data->lock); in hdc100x_trigger_handler()
327 iio_trigger_notify_done(indio_dev->trig); in hdc100x_trigger_handler()
344 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA | in hdc100x_probe()
346 return -EOPNOTSUPP; in hdc100x_probe()
348 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in hdc100x_probe()
350 return -ENOMEM; in hdc100x_probe()
354 data->client = client; in hdc100x_probe()
355 mutex_init(&data->lock); in hdc100x_probe()
357 indio_dev->name = dev_name(&client->dev); in hdc100x_probe()
358 indio_dev->modes = INDIO_DIRECT_MODE; in hdc100x_probe()
359 indio_dev->info = &hdc100x_info; in hdc100x_probe()
361 indio_dev->channels = hdc100x_channels; in hdc100x_probe()
362 indio_dev->num_channels = ARRAY_SIZE(hdc100x_channels); in hdc100x_probe()
363 indio_dev->available_scan_masks = hdc100x_scan_masks; in hdc100x_probe()
370 ret = devm_iio_triggered_buffer_setup(&client->dev, in hdc100x_probe()
375 dev_err(&client->dev, "iio triggered buffer setup failed\n"); in hdc100x_probe()
379 return devm_iio_device_register(&client->dev, indio_dev); in hdc100x_probe()