linux/drivers/iio/chemical/scd30.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _SCD30_H
   3#define _SCD30_H
   4
   5#include <linux/completion.h>
   6#include <linux/device.h>
   7#include <linux/mutex.h>
   8#include <linux/pm.h>
   9#include <linux/regulator/consumer.h>
  10#include <linux/types.h>
  11
  12struct scd30_state;
  13
  14enum scd30_cmd {
  15        /* start continuous measurement with pressure compensation */
  16        CMD_START_MEAS,
  17        /* stop continuous measurement */
  18        CMD_STOP_MEAS,
  19        /* set/get measurement interval */
  20        CMD_MEAS_INTERVAL,
  21        /* check whether new measurement is ready */
  22        CMD_MEAS_READY,
  23        /* get measurement */
  24        CMD_READ_MEAS,
  25        /* turn on/off automatic self calibration */
  26        CMD_ASC,
  27        /* set/get forced recalibration value */
  28        CMD_FRC,
  29        /* set/get temperature offset */
  30        CMD_TEMP_OFFSET,
  31        /* get firmware version */
  32        CMD_FW_VERSION,
  33        /* reset sensor */
  34        CMD_RESET,
  35        /*
  36         * Command for altitude compensation was omitted intentionally because
  37         * the same can be achieved by means of CMD_START_MEAS which takes
  38         * pressure above the sea level as an argument.
  39         */
  40};
  41
  42#define SCD30_MEAS_COUNT 3
  43
  44typedef int (*scd30_command_t)(struct scd30_state *state, enum scd30_cmd cmd, u16 arg,
  45                               void *response, int size);
  46
  47struct scd30_state {
  48        /* serialize access to the device */
  49        struct mutex lock;
  50        struct device *dev;
  51        struct regulator *vdd;
  52        struct completion meas_ready;
  53        /*
  54         * priv pointer is solely for serdev driver private data. We keep it
  55         * here because driver_data inside dev has been already used for iio and
  56         * struct serdev_device doesn't have one.
  57         */
  58        void *priv;
  59        int irq;
  60        /*
  61         * no way to retrieve current ambient pressure compensation value from
  62         * the sensor so keep one around
  63         */
  64        u16 pressure_comp;
  65        u16 meas_interval;
  66        int meas[SCD30_MEAS_COUNT];
  67
  68        scd30_command_t command;
  69};
  70
  71int scd30_suspend(struct device *dev);
  72int scd30_resume(struct device *dev);
  73
  74static __maybe_unused SIMPLE_DEV_PM_OPS(scd30_pm_ops, scd30_suspend, scd30_resume);
  75
  76int scd30_probe(struct device *dev, int irq, const char *name, void *priv, scd30_command_t command);
  77
  78#endif
  79