Linux 6.9-rc1
[linux-2.6-microblaze.git] / drivers / iio / chemical / scd4x.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Sensirion SCD4X carbon dioxide sensor i2c driver
4  *
5  * Copyright (C) 2021 Protonic Holland
6  * Author: Roan van Dijk <roan@protonic.nl>
7  *
8  * I2C slave address: 0x62
9  *
10  * Datasheets:
11  * https://www.sensirion.com/file/datasheet_scd4x
12  */
13
14 #include <asm/unaligned.h>
15 #include <linux/crc8.h>
16 #include <linux/delay.h>
17 #include <linux/device.h>
18 #include <linux/i2c.h>
19 #include <linux/iio/buffer.h>
20 #include <linux/iio/iio.h>
21 #include <linux/iio/sysfs.h>
22 #include <linux/iio/trigger.h>
23 #include <linux/iio/trigger_consumer.h>
24 #include <linux/iio/triggered_buffer.h>
25 #include <linux/iio/types.h>
26 #include <linux/kernel.h>
27 #include <linux/mutex.h>
28 #include <linux/string.h>
29 #include <linux/sysfs.h>
30 #include <linux/types.h>
31
32 #define SCD4X_CRC8_POLYNOMIAL 0x31
33 #define SCD4X_TIMEOUT_ERR 1000
34 #define SCD4X_READ_BUF_SIZE 9
35 #define SCD4X_COMMAND_BUF_SIZE 2
36 #define SCD4X_WRITE_BUF_SIZE 5
37 #define SCD4X_FRC_MIN_PPM 0
38 #define SCD4X_FRC_MAX_PPM 2000
39 #define SCD4X_PRESSURE_COMP_MIN_MBAR 700
40 #define SCD4X_PRESSURE_COMP_MAX_MBAR 1200
41 #define SCD4X_READY_MASK 0x01
42
43 /*Commands SCD4X*/
44 enum scd4x_cmd {
45         CMD_START_MEAS          = 0x21b1,
46         CMD_READ_MEAS           = 0xec05,
47         CMD_STOP_MEAS           = 0x3f86,
48         CMD_SET_TEMP_OFFSET     = 0x241d,
49         CMD_GET_TEMP_OFFSET     = 0x2318,
50         CMD_SET_AMB_PRESSURE    = 0xe000,
51         CMD_GET_AMB_PRESSURE    = 0xe000,
52         CMD_FRC                 = 0x362f,
53         CMD_SET_ASC             = 0x2416,
54         CMD_GET_ASC             = 0x2313,
55         CMD_GET_DATA_READY      = 0xe4b8,
56 };
57
58 enum scd4x_channel_idx {
59         SCD4X_CO2,
60         SCD4X_TEMP,
61         SCD4X_HR,
62 };
63
64 struct scd4x_state {
65         struct i2c_client *client;
66         /* maintain access to device, to prevent concurrent reads/writes */
67         struct mutex lock;
68         struct regulator *vdd;
69 };
70
71 DECLARE_CRC8_TABLE(scd4x_crc8_table);
72
73 static int scd4x_i2c_xfer(struct scd4x_state *state, char *txbuf, int txsize,
74                                 char *rxbuf, int rxsize)
75 {
76         struct i2c_client *client = state->client;
77         int ret;
78
79         ret = i2c_master_send(client, txbuf, txsize);
80
81         if (ret < 0)
82                 return ret;
83         if (ret != txsize)
84                 return -EIO;
85
86         if (rxsize == 0)
87                 return 0;
88
89         ret = i2c_master_recv(client, rxbuf, rxsize);
90         if (ret < 0)
91                 return ret;
92         if (ret != rxsize)
93                 return -EIO;
94
95         return 0;
96 }
97
98 static int scd4x_send_command(struct scd4x_state *state, enum scd4x_cmd cmd)
99 {
100         char buf[SCD4X_COMMAND_BUF_SIZE];
101         int ret;
102
103         /*
104          * Measurement needs to be stopped before sending commands.
105          * Except stop and start command.
106          */
107         if ((cmd != CMD_STOP_MEAS) && (cmd != CMD_START_MEAS)) {
108
109                 ret = scd4x_send_command(state, CMD_STOP_MEAS);
110                 if (ret)
111                         return ret;
112
113                 /* execution time for stopping measurement */
114                 msleep_interruptible(500);
115         }
116
117         put_unaligned_be16(cmd, buf);
118         ret = scd4x_i2c_xfer(state, buf, 2, buf, 0);
119         if (ret)
120                 return ret;
121
122         if ((cmd != CMD_STOP_MEAS) && (cmd != CMD_START_MEAS)) {
123                 ret = scd4x_send_command(state, CMD_START_MEAS);
124                 if (ret)
125                         return ret;
126         }
127
128         return 0;
129 }
130
131 static int scd4x_read(struct scd4x_state *state, enum scd4x_cmd cmd,
132                         void *response, int response_sz)
133 {
134         struct i2c_client *client = state->client;
135         char buf[SCD4X_READ_BUF_SIZE];
136         char *rsp = response;
137         int i, ret;
138         char crc;
139
140         /*
141          * Measurement needs to be stopped before sending commands.
142          * Except for reading measurement and data ready command.
143          */
144         if ((cmd != CMD_GET_DATA_READY) && (cmd != CMD_READ_MEAS) &&
145             (cmd != CMD_GET_AMB_PRESSURE)) {
146                 ret = scd4x_send_command(state, CMD_STOP_MEAS);
147                 if (ret)
148                         return ret;
149
150                 /* execution time for stopping measurement */
151                 msleep_interruptible(500);
152         }
153
154         /* CRC byte for every 2 bytes of data */
155         response_sz += response_sz / 2;
156
157         put_unaligned_be16(cmd, buf);
158         ret = scd4x_i2c_xfer(state, buf, 2, buf, response_sz);
159         if (ret)
160                 return ret;
161
162         for (i = 0; i < response_sz; i += 3) {
163                 crc = crc8(scd4x_crc8_table, buf + i, 2, CRC8_INIT_VALUE);
164                 if (crc != buf[i + 2]) {
165                         dev_err(&client->dev, "CRC error\n");
166                         return -EIO;
167                 }
168
169                 *rsp++ = buf[i];
170                 *rsp++ = buf[i + 1];
171         }
172
173         /* start measurement */
174         if ((cmd != CMD_GET_DATA_READY) && (cmd != CMD_READ_MEAS) &&
175             (cmd != CMD_GET_AMB_PRESSURE)) {
176                 ret = scd4x_send_command(state, CMD_START_MEAS);
177                 if (ret)
178                         return ret;
179         }
180
181         return 0;
182 }
183
184 static int scd4x_write(struct scd4x_state *state, enum scd4x_cmd cmd, uint16_t arg)
185 {
186         char buf[SCD4X_WRITE_BUF_SIZE];
187         int ret;
188         char crc;
189
190         put_unaligned_be16(cmd, buf);
191         put_unaligned_be16(arg, buf + 2);
192
193         crc = crc8(scd4x_crc8_table, buf + 2, 2, CRC8_INIT_VALUE);
194         buf[4] = crc;
195
196         /* measurement needs to be stopped before sending commands */
197         if (cmd != CMD_SET_AMB_PRESSURE) {
198                 ret = scd4x_send_command(state, CMD_STOP_MEAS);
199                 if (ret)
200                         return ret;
201         }
202
203         /* execution time */
204         msleep_interruptible(500);
205
206         ret = scd4x_i2c_xfer(state, buf, SCD4X_WRITE_BUF_SIZE, buf, 0);
207         if (ret)
208                 return ret;
209
210         /* start measurement, except for forced calibration command */
211         if ((cmd != CMD_FRC) && (cmd != CMD_SET_AMB_PRESSURE)) {
212                 ret = scd4x_send_command(state, CMD_START_MEAS);
213                 if (ret)
214                         return ret;
215         }
216
217         return 0;
218 }
219
220 static int scd4x_write_and_fetch(struct scd4x_state *state, enum scd4x_cmd cmd,
221                                 uint16_t arg, void *response, int response_sz)
222 {
223         struct i2c_client *client = state->client;
224         char buf[SCD4X_READ_BUF_SIZE];
225         char *rsp = response;
226         int i, ret;
227         char crc;
228
229         ret = scd4x_write(state, CMD_FRC, arg);
230         if (ret)
231                 goto err;
232
233         /* execution time */
234         msleep_interruptible(400);
235
236         /* CRC byte for every 2 bytes of data */
237         response_sz += response_sz / 2;
238
239         ret = i2c_master_recv(client, buf, response_sz);
240         if (ret < 0)
241                 goto err;
242         if (ret != response_sz) {
243                 ret = -EIO;
244                 goto err;
245         }
246
247         for (i = 0; i < response_sz; i += 3) {
248                 crc = crc8(scd4x_crc8_table, buf + i, 2, CRC8_INIT_VALUE);
249                 if (crc != buf[i + 2]) {
250                         dev_err(&client->dev, "CRC error\n");
251                         ret = -EIO;
252                         goto err;
253                 }
254
255                 *rsp++ = buf[i];
256                 *rsp++ = buf[i + 1];
257         }
258
259         return scd4x_send_command(state, CMD_START_MEAS);
260
261 err:
262         /*
263          * on error try to start the measurement,
264          * puts sensor back into continuous measurement
265          */
266         scd4x_send_command(state, CMD_START_MEAS);
267
268         return ret;
269 }
270
271 static int scd4x_read_meas(struct scd4x_state *state, uint16_t *meas)
272 {
273         int i, ret;
274         __be16 buf[3];
275
276         ret = scd4x_read(state, CMD_READ_MEAS, buf, sizeof(buf));
277         if (ret)
278                 return ret;
279
280         for (i = 0; i < ARRAY_SIZE(buf); i++)
281                 meas[i] = be16_to_cpu(buf[i]);
282
283         return 0;
284 }
285
286 static int scd4x_wait_meas_poll(struct scd4x_state *state)
287 {
288         struct i2c_client *client = state->client;
289         int tries = 6;
290         int ret;
291
292         do {
293                 __be16 bval;
294                 uint16_t val;
295
296                 ret = scd4x_read(state, CMD_GET_DATA_READY, &bval, sizeof(bval));
297                 if (ret)
298                         return -EIO;
299                 val = be16_to_cpu(bval);
300
301                 /* new measurement available */
302                 if (val & 0x7FF)
303                         return 0;
304
305                 msleep_interruptible(1000);
306         } while (--tries);
307
308         /* try to start sensor on timeout */
309         ret = scd4x_send_command(state, CMD_START_MEAS);
310         if (ret)
311                 dev_err(&client->dev, "failed to start measurement: %d\n", ret);
312
313         return -ETIMEDOUT;
314 }
315
316 static int scd4x_read_poll(struct scd4x_state *state, uint16_t *buf)
317 {
318         int ret;
319
320         ret = scd4x_wait_meas_poll(state);
321         if (ret)
322                 return ret;
323
324         return scd4x_read_meas(state, buf);
325 }
326
327 static int scd4x_read_channel(struct scd4x_state *state, int chan)
328 {
329         int ret;
330         uint16_t buf[3];
331
332         ret = scd4x_read_poll(state, buf);
333         if (ret)
334                 return ret;
335
336         return buf[chan];
337 }
338
339 static int scd4x_read_raw(struct iio_dev *indio_dev,
340                         struct iio_chan_spec const *chan, int *val,
341                         int *val2, long mask)
342 {
343         struct scd4x_state *state = iio_priv(indio_dev);
344         int ret;
345         __be16 tmp;
346
347         switch (mask) {
348         case IIO_CHAN_INFO_RAW:
349                 if (chan->output) {
350                         mutex_lock(&state->lock);
351                         ret = scd4x_read(state, CMD_GET_AMB_PRESSURE, &tmp, sizeof(tmp));
352                         mutex_unlock(&state->lock);
353
354                         if (ret)
355                                 return ret;
356
357                         *val = be16_to_cpu(tmp);
358                         return IIO_VAL_INT;
359                 }
360
361                 ret = iio_device_claim_direct_mode(indio_dev);
362                 if (ret)
363                         return ret;
364
365                 mutex_lock(&state->lock);
366                 ret = scd4x_read_channel(state, chan->address);
367                 mutex_unlock(&state->lock);
368
369                 iio_device_release_direct_mode(indio_dev);
370                 if (ret < 0)
371                         return ret;
372
373                 *val = ret;
374                 return IIO_VAL_INT;
375         case IIO_CHAN_INFO_SCALE:
376                 if (chan->type == IIO_CONCENTRATION) {
377                         *val = 0;
378                         *val2 = 100;
379                         return IIO_VAL_INT_PLUS_MICRO;
380                 } else if (chan->type == IIO_TEMP) {
381                         *val = 175000;
382                         *val2 = 65536;
383                         return IIO_VAL_FRACTIONAL;
384                 } else if (chan->type == IIO_HUMIDITYRELATIVE) {
385                         *val = 100000;
386                         *val2 = 65536;
387                         return IIO_VAL_FRACTIONAL;
388                 }
389                 return -EINVAL;
390         case IIO_CHAN_INFO_OFFSET:
391                 *val = -16852;
392                 *val2 = 114286;
393                 return IIO_VAL_INT_PLUS_MICRO;
394         case IIO_CHAN_INFO_CALIBBIAS:
395                 mutex_lock(&state->lock);
396                 ret = scd4x_read(state, CMD_GET_TEMP_OFFSET, &tmp, sizeof(tmp));
397                 mutex_unlock(&state->lock);
398                 if (ret)
399                         return ret;
400
401                 *val = be16_to_cpu(tmp);
402
403                 return IIO_VAL_INT;
404         default:
405                 return -EINVAL;
406         }
407 }
408
409 static const int scd4x_pressure_calibbias_available[] = {
410         SCD4X_PRESSURE_COMP_MIN_MBAR, 1, SCD4X_PRESSURE_COMP_MAX_MBAR,
411 };
412
413 static int scd4x_read_avail(struct iio_dev *indio_dev, struct iio_chan_spec const *chan,
414                             const int **vals, int *type, int *length, long mask)
415 {
416         switch (mask) {
417         case IIO_CHAN_INFO_RAW:
418                 *vals = scd4x_pressure_calibbias_available;
419                 *type = IIO_VAL_INT;
420
421                 return IIO_AVAIL_RANGE;
422         }
423
424         return -EINVAL;
425 }
426
427
428 static int scd4x_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan,
429                                 int val, int val2, long mask)
430 {
431         struct scd4x_state *state = iio_priv(indio_dev);
432         int ret = 0;
433
434         switch (mask) {
435         case IIO_CHAN_INFO_CALIBBIAS:
436                 mutex_lock(&state->lock);
437                 ret = scd4x_write(state, CMD_SET_TEMP_OFFSET, val);
438                 mutex_unlock(&state->lock);
439
440                 return ret;
441         case IIO_CHAN_INFO_RAW:
442                 switch (chan->type) {
443                 case IIO_PRESSURE:
444                         if (val < SCD4X_PRESSURE_COMP_MIN_MBAR ||
445                             val > SCD4X_PRESSURE_COMP_MAX_MBAR)
446                                 return -EINVAL;
447
448                         mutex_lock(&state->lock);
449                         ret = scd4x_write(state, CMD_SET_AMB_PRESSURE, val);
450                         mutex_unlock(&state->lock);
451
452                         return ret;
453                 default:
454                         return -EINVAL;
455                 }
456         default:
457                 return -EINVAL;
458         }
459 }
460
461 static ssize_t calibration_auto_enable_show(struct device *dev,
462                         struct device_attribute *attr, char *buf)
463 {
464         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
465         struct scd4x_state *state = iio_priv(indio_dev);
466         int ret;
467         __be16 bval;
468         u16 val;
469
470         mutex_lock(&state->lock);
471         ret = scd4x_read(state, CMD_GET_ASC, &bval, sizeof(bval));
472         mutex_unlock(&state->lock);
473         if (ret) {
474                 dev_err(dev, "failed to read automatic calibration");
475                 return ret;
476         }
477
478         val = (be16_to_cpu(bval) & SCD4X_READY_MASK) ? 1 : 0;
479
480         return sysfs_emit(buf, "%d\n", val);
481 }
482
483 static ssize_t calibration_auto_enable_store(struct device *dev,
484                                         struct device_attribute *attr,
485                                         const char *buf, size_t len)
486 {
487         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
488         struct scd4x_state *state = iio_priv(indio_dev);
489         bool val;
490         int ret;
491         uint16_t value;
492
493         ret = kstrtobool(buf, &val);
494         if (ret)
495                 return ret;
496
497         value = val;
498
499         mutex_lock(&state->lock);
500         ret = scd4x_write(state, CMD_SET_ASC, value);
501         mutex_unlock(&state->lock);
502         if (ret)
503                 dev_err(dev, "failed to set automatic calibration");
504
505         return ret ?: len;
506 }
507
508 static ssize_t calibration_forced_value_store(struct device *dev,
509                                         struct device_attribute *attr,
510                                         const char *buf, size_t len)
511 {
512         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
513         struct scd4x_state *state = iio_priv(indio_dev);
514         uint16_t val, arg;
515         int ret;
516
517         ret = kstrtou16(buf, 0, &arg);
518         if (ret)
519                 return ret;
520
521         if (arg < SCD4X_FRC_MIN_PPM || arg > SCD4X_FRC_MAX_PPM)
522                 return -EINVAL;
523
524         mutex_lock(&state->lock);
525         ret = scd4x_write_and_fetch(state, CMD_FRC, arg, &val, sizeof(val));
526         mutex_unlock(&state->lock);
527
528         if (ret)
529                 return ret;
530
531         if (val == 0xff) {
532                 dev_err(dev, "forced calibration has failed");
533                 return -EINVAL;
534         }
535
536         return len;
537 }
538
539 static IIO_DEVICE_ATTR_RW(calibration_auto_enable, 0);
540 static IIO_DEVICE_ATTR_WO(calibration_forced_value, 0);
541
542 static IIO_CONST_ATTR(calibration_forced_value_available,
543                __stringify([SCD4X_FRC_MIN_PPM 1 SCD4X_FRC_MAX_PPM]));
544
545 static struct attribute *scd4x_attrs[] = {
546         &iio_dev_attr_calibration_auto_enable.dev_attr.attr,
547         &iio_dev_attr_calibration_forced_value.dev_attr.attr,
548         &iio_const_attr_calibration_forced_value_available.dev_attr.attr,
549         NULL
550 };
551
552 static const struct attribute_group scd4x_attr_group = {
553         .attrs = scd4x_attrs,
554 };
555
556 static const struct iio_info scd4x_info = {
557         .attrs = &scd4x_attr_group,
558         .read_raw = scd4x_read_raw,
559         .write_raw = scd4x_write_raw,
560         .read_avail = scd4x_read_avail,
561 };
562
563 static const struct iio_chan_spec scd4x_channels[] = {
564         {
565                 /*
566                  * this channel is special in a sense we are pretending that
567                  * sensor is able to change measurement chamber pressure but in
568                  * fact we're just setting pressure compensation value
569                  */
570                 .type = IIO_PRESSURE,
571                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
572                 .info_mask_separate_available = BIT(IIO_CHAN_INFO_RAW),
573                 .output = 1,
574                 .scan_index = -1,
575         },
576         {
577                 .type = IIO_CONCENTRATION,
578                 .channel2 = IIO_MOD_CO2,
579                 .modified = 1,
580                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
581                                         BIT(IIO_CHAN_INFO_SCALE),
582                 .address = SCD4X_CO2,
583                 .scan_index = SCD4X_CO2,
584                 .scan_type = {
585                         .sign = 'u',
586                         .realbits = 16,
587                         .storagebits = 16,
588                         .endianness = IIO_BE,
589                 },
590         },
591         {
592                 .type = IIO_TEMP,
593                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
594                                         BIT(IIO_CHAN_INFO_SCALE) |
595                                         BIT(IIO_CHAN_INFO_OFFSET) |
596                                         BIT(IIO_CHAN_INFO_CALIBBIAS),
597                 .address = SCD4X_TEMP,
598                 .scan_index = SCD4X_TEMP,
599                 .scan_type = {
600                         .sign = 'u',
601                         .realbits = 16,
602                         .storagebits = 16,
603                         .endianness = IIO_BE,
604                 },
605         },
606         {
607                 .type = IIO_HUMIDITYRELATIVE,
608                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
609                                         BIT(IIO_CHAN_INFO_SCALE),
610                 .address = SCD4X_HR,
611                 .scan_index = SCD4X_HR,
612                 .scan_type = {
613                         .sign = 'u',
614                         .realbits = 16,
615                         .storagebits = 16,
616                         .endianness = IIO_BE,
617                 },
618         },
619 };
620
621 static int scd4x_suspend(struct device *dev)
622 {
623         struct iio_dev *indio_dev = dev_get_drvdata(dev);
624         struct scd4x_state *state  = iio_priv(indio_dev);
625         int ret;
626
627         ret = scd4x_send_command(state, CMD_STOP_MEAS);
628         if (ret)
629                 return ret;
630
631         return regulator_disable(state->vdd);
632 }
633
634 static int scd4x_resume(struct device *dev)
635 {
636         struct iio_dev *indio_dev = dev_get_drvdata(dev);
637         struct scd4x_state *state = iio_priv(indio_dev);
638         int ret;
639
640         ret = regulator_enable(state->vdd);
641         if (ret)
642                 return ret;
643
644         return scd4x_send_command(state, CMD_START_MEAS);
645 }
646
647 static DEFINE_SIMPLE_DEV_PM_OPS(scd4x_pm_ops, scd4x_suspend, scd4x_resume);
648
649 static void scd4x_stop_meas(void *state)
650 {
651         scd4x_send_command(state, CMD_STOP_MEAS);
652 }
653
654 static void scd4x_disable_regulator(void *data)
655 {
656         struct scd4x_state *state = data;
657
658         regulator_disable(state->vdd);
659 }
660
661 static irqreturn_t scd4x_trigger_handler(int irq, void *p)
662 {
663         struct iio_poll_func *pf = p;
664         struct iio_dev *indio_dev = pf->indio_dev;
665         struct scd4x_state *state = iio_priv(indio_dev);
666         struct {
667                 uint16_t data[3];
668                 int64_t ts __aligned(8);
669         } scan;
670         int ret;
671
672         memset(&scan, 0, sizeof(scan));
673         mutex_lock(&state->lock);
674         ret = scd4x_read_poll(state, scan.data);
675         mutex_unlock(&state->lock);
676         if (ret)
677                 goto out;
678
679         iio_push_to_buffers_with_timestamp(indio_dev, &scan, iio_get_time_ns(indio_dev));
680 out:
681         iio_trigger_notify_done(indio_dev->trig);
682         return IRQ_HANDLED;
683 }
684
685 static int scd4x_probe(struct i2c_client *client)
686 {
687         static const unsigned long scd4x_scan_masks[] = { 0x07, 0x00 };
688         struct device *dev = &client->dev;
689         struct iio_dev *indio_dev;
690         struct scd4x_state *state;
691         int ret;
692
693         indio_dev = devm_iio_device_alloc(dev, sizeof(*state));
694         if (!indio_dev)
695                 return -ENOMEM;
696
697         state = iio_priv(indio_dev);
698         mutex_init(&state->lock);
699         state->client = client;
700         crc8_populate_msb(scd4x_crc8_table, SCD4X_CRC8_POLYNOMIAL);
701
702         indio_dev->info = &scd4x_info;
703         indio_dev->name = client->name;
704         indio_dev->channels = scd4x_channels;
705         indio_dev->num_channels = ARRAY_SIZE(scd4x_channels);
706         indio_dev->modes = INDIO_DIRECT_MODE;
707         indio_dev->available_scan_masks = scd4x_scan_masks;
708
709         state->vdd = devm_regulator_get(dev, "vdd");
710         if (IS_ERR(state->vdd))
711                 return dev_err_probe(dev, PTR_ERR(state->vdd), "failed to get regulator\n");
712
713         ret = regulator_enable(state->vdd);
714         if (ret)
715                 return ret;
716
717         ret = devm_add_action_or_reset(dev, scd4x_disable_regulator, state);
718         if (ret)
719                 return ret;
720
721         ret = scd4x_send_command(state, CMD_STOP_MEAS);
722         if (ret) {
723                 dev_err(dev, "failed to stop measurement: %d\n", ret);
724                 return ret;
725         }
726
727         /* execution time */
728         msleep_interruptible(500);
729
730         ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, scd4x_trigger_handler, NULL);
731         if (ret)
732                 return ret;
733
734         ret = scd4x_send_command(state, CMD_START_MEAS);
735         if (ret) {
736                 dev_err(dev, "failed to start measurement: %d\n", ret);
737                 return ret;
738         }
739
740         ret = devm_add_action_or_reset(dev, scd4x_stop_meas, state);
741         if (ret)
742                 return ret;
743
744         return devm_iio_device_register(dev, indio_dev);
745 }
746
747 static const struct of_device_id scd4x_dt_ids[] = {
748         { .compatible = "sensirion,scd40" },
749         { .compatible = "sensirion,scd41" },
750         { }
751 };
752 MODULE_DEVICE_TABLE(of, scd4x_dt_ids);
753
754 static struct i2c_driver scd4x_i2c_driver = {
755         .driver = {
756                 .name = KBUILD_MODNAME,
757                 .of_match_table = scd4x_dt_ids,
758                 .pm = pm_sleep_ptr(&scd4x_pm_ops),
759         },
760         .probe = scd4x_probe,
761 };
762 module_i2c_driver(scd4x_i2c_driver);
763
764 MODULE_AUTHOR("Roan van Dijk <roan@protonic.nl>");
765 MODULE_DESCRIPTION("Sensirion SCD4X carbon dioxide sensor core driver");
766 MODULE_LICENSE("GPL v2");