Lines Matching +full:co2 +full:- +full:sensor
1 // SPDX-License-Identifier: GPL-2.0-only
3 * ccs811.c - Support for AMS CCS811 VOC Sensor
7 * Datasheet: ams.com/content/download/951091/2269479/CCS811_DS000459_3-00.pdf
48 * Value of FW_MODE bit of STATUS register describes the sensor's state:
67 __be16 co2;
93 .scan_index = -1,
98 .scan_index = -1,
130 * The CCS811 powers-up in boot mode. A setup write to CCS811_APP_START will
131 * transition the sensor to application mode.
146 return -EIO;
158 dev_err(&client->dev, "Application failed to start. Sensor is still in boot mode.\n");
159 return -EIO;
179 if (!data->wakeup_gpio)
182 gpiod_set_value(data->wakeup_gpio, enable);
197 while (tries-- > 0) {
198 ret = i2c_smbus_read_byte_data(data->client, CCS811_STATUS);
207 return -EIO;
209 ret = i2c_smbus_read_i2c_block_data(data->client,
211 (char *)&data->buffer);
229 mutex_lock(&data->lock);
232 mutex_unlock(&data->lock);
237 switch (chan->type) {
239 *val = be16_to_cpu(data->buffer.raw_data) &
244 *val = be16_to_cpu(data->buffer.raw_data) >> 10;
248 switch (chan->channel2) {
250 *val = be16_to_cpu(data->buffer.co2);
254 *val = be16_to_cpu(data->buffer.voc);
258 ret = -EINVAL;
262 ret = -EINVAL;
264 mutex_unlock(&data->lock);
270 switch (chan->type) {
280 switch (chan->channel2) {
290 return -EINVAL;
293 return -EINVAL;
296 return -EINVAL;
311 ret = i2c_smbus_read_byte_data(data->client, CCS811_MEAS_MODE);
320 data->drdy_trig_on = state;
322 return i2c_smbus_write_byte_data(data->client, CCS811_MEAS_MODE, ret);
332 struct iio_dev *indio_dev = pf->indio_dev;
334 struct i2c_client *client = data->client;
338 sizeof(data->scan.channels),
339 (u8 *)data->scan.channels);
341 dev_err(&client->dev, "cannot read sensor data\n");
345 iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
349 iio_trigger_notify_done(indio_dev->trig);
359 if (data->drdy_trig_on)
360 iio_trigger_poll(data->drdy_trig);
370 reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
393 dev_err(&client->dev, "Failed to reset sensor\n");
411 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE
414 return -EOPNOTSUPP;
416 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
418 return -ENOMEM;
422 data->client = client;
424 data->wakeup_gpio = devm_gpiod_get_optional(&client->dev, "wakeup",
426 if (IS_ERR(data->wakeup_gpio))
427 return PTR_ERR(data->wakeup_gpio);
445 dev_err(&client->dev, "hardware id doesn't match CCS81x\n");
447 return -ENODEV;
457 dev_err(&client->dev, "no CCS811 sensor\n");
459 return -ENODEV;
470 mutex_init(&data->lock);
472 indio_dev->name = id->name;
473 indio_dev->info = &ccs811_info;
474 indio_dev->modes = INDIO_DIRECT_MODE;
476 indio_dev->channels = ccs811_channels;
477 indio_dev->num_channels = ARRAY_SIZE(ccs811_channels);
479 if (client->irq > 0) {
480 ret = devm_request_threaded_irq(&client->dev, client->irq,
487 dev_err(&client->dev, "irq request error %d\n", -ret);
491 data->drdy_trig = devm_iio_trigger_alloc(&client->dev,
492 "%s-dev%d",
493 indio_dev->name,
495 if (!data->drdy_trig) {
496 ret = -ENOMEM;
500 data->drdy_trig->ops = &ccs811_trigger_ops;
501 iio_trigger_set_drvdata(data->drdy_trig, indio_dev);
502 ret = iio_trigger_register(data->drdy_trig);
506 indio_dev->trig = iio_trigger_get(data->drdy_trig);
513 dev_err(&client->dev, "triggered buffer setup failed\n");
519 dev_err(&client->dev, "unable to register iio device\n");
527 if (data->drdy_trig)
528 iio_trigger_unregister(data->drdy_trig);
543 if (data->drdy_trig)
544 iio_trigger_unregister(data->drdy_trig);
549 dev_warn(&client->dev, "Failed to power down device (%pe)\n",
577 MODULE_DESCRIPTION("CCS811 volatile organic compounds sensor");