Lines Matching +full:voc +full:- +full:sensor

1 // SPDX-License-Identifier: GPL-2.0+
3 * vz89x.c - Support for SGX Sensortech MiCS VZ89X VOC sensors
5 * Copyright (C) 2015-2018
93 .scan_index = -1,
123 .scan_index = -1,
152 if (data->buffer[VZ89X_VOC_SHORT_IDX] == 0) in vz89x_measurement_is_valid()
155 return !!(data->buffer[data->chip->read_size - 1] > 0); in vz89x_measurement_is_valid()
158 /* VZ89TE device has a modified CRC-8 two complement check */
164 for (i = 0; i < (data->chip->read_size - 1); i++) { in vz89te_measurement_is_valid()
165 sum = crc + data->buffer[i]; in vz89te_measurement_is_valid()
170 return !((0xff - crc) == data->buffer[data->chip->read_size - 1]); in vz89te_measurement_is_valid()
175 const struct vz89x_chip_data *chip = data->chip; in vz89x_i2c_xfer()
176 struct i2c_client *client = data->client; in vz89x_i2c_xfer()
181 msg[0].addr = client->addr; in vz89x_i2c_xfer()
182 msg[0].flags = client->flags; in vz89x_i2c_xfer()
183 msg[0].len = chip->write_size; in vz89x_i2c_xfer()
186 msg[1].addr = client->addr; in vz89x_i2c_xfer()
187 msg[1].flags = client->flags | I2C_M_RD; in vz89x_i2c_xfer()
188 msg[1].len = chip->read_size; in vz89x_i2c_xfer()
189 msg[1].buf = (char *) &data->buffer; in vz89x_i2c_xfer()
191 ret = i2c_transfer(client->adapter, msg, 2); in vz89x_i2c_xfer()
198 struct i2c_client *client = data->client; in vz89x_smbus_xfer()
206 for (i = 0; i < data->chip->read_size; i++) { in vz89x_smbus_xfer()
210 data->buffer[i] = ret; in vz89x_smbus_xfer()
218 const struct vz89x_chip_data *chip = data->chip; in vz89x_get_measurement()
221 /* sensor can only be polled once a second max per datasheet */ in vz89x_get_measurement()
222 if (!time_after(jiffies, data->last_update + HZ)) in vz89x_get_measurement()
223 return data->is_valid ? 0 : -EAGAIN; in vz89x_get_measurement()
225 data->is_valid = false; in vz89x_get_measurement()
226 data->last_update = jiffies; in vz89x_get_measurement()
228 ret = data->xfer(data, chip->cmd); in vz89x_get_measurement()
232 ret = chip->valid(data); in vz89x_get_measurement()
234 return -EAGAIN; in vz89x_get_measurement()
236 data->is_valid = true; in vz89x_get_measurement()
245 u8 *tmp = &data->buffer[chan->address]; in vz89x_get_resistance_reading()
247 switch (chan->scan_type.endianness) { in vz89x_get_resistance_reading()
255 return -EINVAL; in vz89x_get_resistance_reading()
266 int ret = -EINVAL; in vz89x_read_raw()
270 mutex_lock(&data->lock); in vz89x_read_raw()
272 mutex_unlock(&data->lock); in vz89x_read_raw()
277 switch (chan->type) { in vz89x_read_raw()
279 *val = data->buffer[chan->address]; in vz89x_read_raw()
287 return -EINVAL; in vz89x_read_raw()
291 switch (chan->type) { in vz89x_read_raw()
296 return -EINVAL; in vz89x_read_raw()
300 switch (chan->channel2) { in vz89x_read_raw()
306 *val = -13; in vz89x_read_raw()
309 return -EINVAL; in vz89x_read_raw()
353 struct device *dev = &client->dev; in vz89x_probe()
359 return -ENOMEM; in vz89x_probe()
362 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in vz89x_probe()
363 data->xfer = vz89x_i2c_xfer; in vz89x_probe()
364 else if (i2c_check_functionality(client->adapter, in vz89x_probe()
366 data->xfer = vz89x_smbus_xfer; in vz89x_probe()
368 return -EOPNOTSUPP; in vz89x_probe()
370 data->chip = i2c_get_match_data(client); in vz89x_probe()
373 data->client = client; in vz89x_probe()
374 data->last_update = jiffies - HZ; in vz89x_probe()
375 mutex_init(&data->lock); in vz89x_probe()
377 indio_dev->info = &vz89x_info; in vz89x_probe()
378 indio_dev->name = dev_name(dev); in vz89x_probe()
379 indio_dev->modes = INDIO_DIRECT_MODE; in vz89x_probe()
381 indio_dev->channels = data->chip->channels; in vz89x_probe()
382 indio_dev->num_channels = data->chip->num_channels; in vz89x_probe()
405 MODULE_DESCRIPTION("SGX Sensortech MiCS VZ89X VOC sensors");