Lines Matching refs:data

41 #define SGP_VERS_PRODUCT(data)	((((data)->feature_set) & 0xf000) >> 12)
42 #define SGP_VERS_RESERVED(data) ((((data)->feature_set) & 0x0800) >> 11)
43 #define SGP_VERS_GEN(data) ((((data)->feature_set) & 0x0600) >> 9)
44 #define SGP_VERS_ENG_BIT(data) ((((data)->feature_set) & 0x0100) >> 8)
45 #define SGP_VERS_MAJOR(data) ((((data)->feature_set) & 0x00e0) >> 5)
46 #define SGP_VERS_MINOR(data) (((data)->feature_set) & 0x001f)
195 * sgp_verify_buffer() - verify the checksums of the data buffer words
197 * @data: SGP data
198 * @buf: Raw data buffer
199 * @word_count: Num data words stored in the buffer, excluding CRC bytes
203 static int sgp_verify_buffer(const struct sgp_data *data,
215 dev_err(&data->client->dev, "CRC error\n");
224 * sgp_read_cmd() - reads data from sensor after issuing a command
225 * The caller must hold data->data_lock for the duration of the call.
226 * @data: SGP data
228 * @buf: Raw data buffer to use
230 * @duration_us: Time taken to sensor to take a reading and data to be ready.
234 static int sgp_read_cmd(struct sgp_data *data, enum sgp_cmd cmd,
239 struct i2c_client *client = data->client;
258 return sgp_verify_buffer(data, buf, word_count);
263 * The caller must hold data->data_lock for the duration of the call.
264 * @data: SGP data
270 static int sgp_measure_iaq(struct sgp_data *data)
273 /* data contains default values */
274 bool default_vals = !time_after(jiffies, data->iaq_init_start_jiffies +
275 data->iaq_defval_skip_jiffies);
277 ret = sgp_read_cmd(data, data->measure_iaq_cmd, &data->iaq_buffer,
282 data->iaq_buffer_state = IAQ_BUFFER_DEFAULT_VALS;
287 data->iaq_buffer_state = IAQ_BUFFER_VALID;
292 static void sgp_iaq_thread_sleep_until(const struct sgp_data *data,
299 if (kthread_should_stop() || data->iaq_init_start_jiffies == 0)
306 struct sgp_data *data = (struct sgp_data *)p;
311 mutex_lock(&data->data_lock);
312 if (data->iaq_init_start_jiffies == 0) {
313 ret = sgp_read_cmd(data, data->iaq_init_cmd, NULL, 0,
317 data->iaq_init_start_jiffies = jiffies;
320 ret = sgp_measure_iaq(data);
322 dev_warn(&data->client->dev,
326 next_update_jiffies = jiffies + data->measure_interval_jiffies;
327 mutex_unlock(&data->data_lock);
328 sgp_iaq_thread_sleep_until(data, next_update_jiffies);
338 struct sgp_data *data = iio_priv(indio_dev);
344 mutex_lock(&data->data_lock);
345 if (data->iaq_buffer_state != IAQ_BUFFER_VALID) {
346 mutex_unlock(&data->data_lock);
349 words = data->iaq_buffer.raw_words;
366 mutex_unlock(&data->data_lock);
369 mutex_lock(&data->data_lock);
371 if (data->iaq_buffer_state == IAQ_BUFFER_EMPTY)
375 words = data->iaq_buffer.raw_words;
377 ret = sgp_read_cmd(data, data->measure_gas_signals_cmd,
378 &data->buffer, SGP_MEASUREMENT_LEN,
380 words = data->buffer.raw_words;
383 mutex_unlock(&data->data_lock);
401 mutex_unlock(&data->data_lock);
410 static int sgp_check_compat(struct sgp_data *data,
413 struct device *dev = &data->client->dev;
419 generation = SGP_VERS_GEN(data);
426 product = SGP_VERS_PRODUCT(data);
433 if (SGP_VERS_RESERVED(data))
437 if (SGP_VERS_ENG_BIT(data))
453 major = SGP_VERS_MAJOR(data);
454 minor = SGP_VERS_MINOR(data);
465 static void sgp_init(struct sgp_data *data)
467 data->iaq_init_cmd = SGP_CMD_IAQ_INIT;
468 data->iaq_init_start_jiffies = 0;
469 data->iaq_buffer_state = IAQ_BUFFER_EMPTY;
470 switch (SGP_VERS_PRODUCT(data)) {
472 data->measure_interval_jiffies = SGP30_MEASURE_INTERVAL_HZ * HZ;
473 data->measure_iaq_cmd = SGP_CMD_IAQ_MEASURE;
474 data->measure_gas_signals_cmd = SGP30_CMD_MEASURE_SIGNAL;
475 data->product_id = SGP30;
476 data->iaq_defval_skip_jiffies = 15 * HZ;
479 data->measure_interval_jiffies = SGPC3_MEASURE_INTERVAL_HZ * HZ;
480 data->measure_iaq_cmd = SGPC3_CMD_MEASURE_RAW;
481 data->measure_gas_signals_cmd = SGPC3_CMD_MEASURE_RAW;
482 data->product_id = SGPC3;
483 data->iaq_defval_skip_jiffies =
484 43 * data->measure_interval_jiffies;
494 { .compatible = "sensirion,sgp30", .data = (void *)SGP30 },
495 { .compatible = "sensirion,sgpc3", .data = (void *)SGPC3 },
504 struct sgp_data *data;
508 indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
517 data = iio_priv(indio_dev);
519 data->client = client;
521 mutex_init(&data->data_lock);
523 /* get feature set version and write it to client data */
524 ret = sgp_read_cmd(data, SGP_CMD_GET_FEATURE_SET, &data->buffer, 1,
529 data->feature_set = be16_to_cpu(data->buffer.raw_words[0].value);
531 ret = sgp_check_compat(data, product_id);
541 sgp_init(data);
549 data->iaq_thread = kthread_run(sgp_iaq_threadfn, data,
550 "%s-iaq", data->client->name);
558 struct sgp_data *data = iio_priv(indio_dev);
560 if (data->iaq_thread)
561 kthread_stop(data->iaq_thread);