Lines Matching +full:calibration +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0
3 * Senseair Sunrise 006-0-0007 CO2 sensor driver.
8 * - controllable EN pin
9 * - single-shot operations using the nDRY pin.
10 * - ABC/target calibration
34 * The calibration timeout is not characterized in the datasheet.
54 union i2c_smbus_data data = { }; in sunrise_regmap_read() local
58 return -EINVAL; in sunrise_regmap_read()
60 data.block[0] = val_size; in sunrise_regmap_read()
69 __i2c_smbus_xfer(client->adapter, client->addr, in sunrise_regmap_read()
70 sunrise->ignore_nak ? I2C_M_IGNORE_NAK : 0, in sunrise_regmap_read()
71 I2C_SMBUS_WRITE, 0, I2C_SMBUS_BYTE_DATA, &data); in sunrise_regmap_read()
75 ret = __i2c_smbus_xfer(client->adapter, client->addr, client->flags, in sunrise_regmap_read()
77 I2C_SMBUS_I2C_BLOCK_DATA, &data); in sunrise_regmap_read()
81 memcpy(val_buf, &data.block[1], data.block[0]); in sunrise_regmap_read()
90 union i2c_smbus_data data = { }; in sunrise_regmap_write() local
94 return -EINVAL; in sunrise_regmap_write()
95 count--; in sunrise_regmap_write()
97 data.block[0] = count; in sunrise_regmap_write()
98 memcpy(&data.block[1], (u8 *)val_buf + 1, count); in sunrise_regmap_write()
100 __i2c_smbus_xfer(client->adapter, client->addr, in sunrise_regmap_write()
101 sunrise->ignore_nak ? I2C_M_IGNORE_NAK : 0, in sunrise_regmap_write()
102 I2C_SMBUS_WRITE, 0, I2C_SMBUS_BYTE_DATA, &data); in sunrise_regmap_write()
106 return __i2c_smbus_xfer(client->adapter, client->addr, client->flags, in sunrise_regmap_write()
108 I2C_SMBUS_I2C_BLOCK_DATA, &data); in sunrise_regmap_write()
118 const struct i2c_client *client = sunrise->client; in sunrise_read_byte()
119 const struct device *dev = &client->dev; in sunrise_read_byte()
123 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_read_byte()
124 ret = regmap_read(sunrise->regmap, reg, &val); in sunrise_read_byte()
125 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_read_byte()
136 const struct i2c_client *client = sunrise->client; in sunrise_read_word()
137 const struct device *dev = &client->dev; in sunrise_read_word()
141 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_read_word()
142 ret = regmap_bulk_read(sunrise->regmap, reg, &be_val, sizeof(be_val)); in sunrise_read_word()
143 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_read_word()
156 const struct i2c_client *client = sunrise->client; in sunrise_write_byte()
157 const struct device *dev = &client->dev; in sunrise_write_byte()
160 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_write_byte()
161 ret = regmap_write(sunrise->regmap, reg, val); in sunrise_write_byte()
162 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_write_byte()
169 static int sunrise_write_word(struct sunrise_dev *sunrise, u8 reg, u16 data) in sunrise_write_word() argument
171 const struct i2c_client *client = sunrise->client; in sunrise_write_word()
172 const struct device *dev = &client->dev; in sunrise_write_word()
173 __be16 be_data = cpu_to_be16(data); in sunrise_write_word()
176 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_write_word()
177 ret = regmap_bulk_write(sunrise->regmap, reg, &be_data, sizeof(be_data)); in sunrise_write_word()
178 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); in sunrise_write_word()
185 /* Trigger a calibration cycle. */
210 const struct sunrise_calib_data *data) in sunrise_calibrate() argument
215 /* Reset the calibration status reg. */ in sunrise_calibrate()
220 /* Write a calibration command and poll the calibration status bit. */ in sunrise_calibrate()
221 ret = sunrise_write_word(sunrise, SUNRISE_CALIBRATION_COMMAND_REG, data->cmd); in sunrise_calibrate()
225 dev_dbg(&sunrise->client->dev, "%s in progress\n", data->name); in sunrise_calibrate()
228 * Calibration takes several seconds, so the sleep time between reads in sunrise_calibrate()
231 return read_poll_timeout(sunrise_read_byte, status, status & data->bit, in sunrise_calibrate()
252 mutex_lock(&sunrise->lock); in sunrise_cal_factory_write()
254 mutex_unlock(&sunrise->lock); in sunrise_cal_factory_write()
277 mutex_lock(&sunrise->lock); in sunrise_cal_background_write()
279 mutex_unlock(&sunrise->lock); in sunrise_cal_background_write()
330 mutex_lock(&sunrise->lock); in sunrise_error_status_read()
333 mutex_unlock(&sunrise->lock); in sunrise_error_status_read()
342 buf[len - 1] = '\n'; in sunrise_error_status_read()
344 mutex_unlock(&sunrise->lock); in sunrise_error_status_read()
350 /* Calibration triggers. */
403 switch (chan->type) { in sunrise_read_raw()
405 mutex_lock(&sunrise->lock); in sunrise_read_raw()
408 mutex_unlock(&sunrise->lock); in sunrise_read_raw()
417 mutex_lock(&sunrise->lock); in sunrise_read_raw()
420 mutex_unlock(&sunrise->lock); in sunrise_read_raw()
429 return -EINVAL; in sunrise_read_raw()
433 switch (chan->type) { in sunrise_read_raw()
437 * (percentage). The chip CO2 reading range is [400 - in sunrise_read_raw()
438 * 5000] ppm which corresponds to [0,004 - 0,5] %. in sunrise_read_raw()
450 return -EINVAL; in sunrise_read_raw()
454 return -EINVAL; in sunrise_read_raw()
477 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA | in sunrise_probe()
479 dev_err(&client->dev, in sunrise_probe()
481 return -EOPNOTSUPP; in sunrise_probe()
484 iio_dev = devm_iio_device_alloc(&client->dev, sizeof(*sunrise)); in sunrise_probe()
486 return -ENOMEM; in sunrise_probe()
489 sunrise->client = client; in sunrise_probe()
490 mutex_init(&sunrise->lock); in sunrise_probe()
494 sunrise->regmap = devm_regmap_init(&client->dev, &sunrise_regmap_bus, in sunrise_probe()
496 if (IS_ERR(sunrise->regmap)) { in sunrise_probe()
497 dev_err(&client->dev, "Failed to initialize regmap\n"); in sunrise_probe()
498 return PTR_ERR(sunrise->regmap); in sunrise_probe()
506 if (i2c_check_functionality(client->adapter, I2C_FUNC_PROTOCOL_MANGLING)) in sunrise_probe()
507 sunrise->ignore_nak = true; in sunrise_probe()
509 iio_dev->info = &sunrise_info; in sunrise_probe()
510 iio_dev->name = DRIVER_NAME; in sunrise_probe()
511 iio_dev->channels = sunrise_channels; in sunrise_probe()
512 iio_dev->num_channels = ARRAY_SIZE(sunrise_channels); in sunrise_probe()
513 iio_dev->modes = INDIO_DIRECT_MODE; in sunrise_probe()
515 return devm_iio_device_register(&client->dev, iio_dev); in sunrise_probe()
519 { .compatible = "senseair,sunrise-006-0-0007" },
534 MODULE_DESCRIPTION("Senseair Sunrise 006-0-0007 CO2 sensor IIO driver");