18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _SCD30_H 38c2ecf20Sopenharmony_ci#define _SCD30_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/completion.h> 68c2ecf20Sopenharmony_ci#include <linux/device.h> 78c2ecf20Sopenharmony_ci#include <linux/mutex.h> 88c2ecf20Sopenharmony_ci#include <linux/pm.h> 98c2ecf20Sopenharmony_ci#include <linux/regulator/consumer.h> 108c2ecf20Sopenharmony_ci#include <linux/types.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistruct scd30_state; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cienum scd30_cmd { 158c2ecf20Sopenharmony_ci /* start continuous measurement with pressure compensation */ 168c2ecf20Sopenharmony_ci CMD_START_MEAS, 178c2ecf20Sopenharmony_ci /* stop continuous measurement */ 188c2ecf20Sopenharmony_ci CMD_STOP_MEAS, 198c2ecf20Sopenharmony_ci /* set/get measurement interval */ 208c2ecf20Sopenharmony_ci CMD_MEAS_INTERVAL, 218c2ecf20Sopenharmony_ci /* check whether new measurement is ready */ 228c2ecf20Sopenharmony_ci CMD_MEAS_READY, 238c2ecf20Sopenharmony_ci /* get measurement */ 248c2ecf20Sopenharmony_ci CMD_READ_MEAS, 258c2ecf20Sopenharmony_ci /* turn on/off automatic self calibration */ 268c2ecf20Sopenharmony_ci CMD_ASC, 278c2ecf20Sopenharmony_ci /* set/get forced recalibration value */ 288c2ecf20Sopenharmony_ci CMD_FRC, 298c2ecf20Sopenharmony_ci /* set/get temperature offset */ 308c2ecf20Sopenharmony_ci CMD_TEMP_OFFSET, 318c2ecf20Sopenharmony_ci /* get firmware version */ 328c2ecf20Sopenharmony_ci CMD_FW_VERSION, 338c2ecf20Sopenharmony_ci /* reset sensor */ 348c2ecf20Sopenharmony_ci CMD_RESET, 358c2ecf20Sopenharmony_ci /* 368c2ecf20Sopenharmony_ci * Command for altitude compensation was omitted intentionally because 378c2ecf20Sopenharmony_ci * the same can be achieved by means of CMD_START_MEAS which takes 388c2ecf20Sopenharmony_ci * pressure above the sea level as an argument. 398c2ecf20Sopenharmony_ci */ 408c2ecf20Sopenharmony_ci}; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define SCD30_MEAS_COUNT 3 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_citypedef int (*scd30_command_t)(struct scd30_state *state, enum scd30_cmd cmd, u16 arg, 458c2ecf20Sopenharmony_ci void *response, int size); 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistruct scd30_state { 488c2ecf20Sopenharmony_ci /* serialize access to the device */ 498c2ecf20Sopenharmony_ci struct mutex lock; 508c2ecf20Sopenharmony_ci struct device *dev; 518c2ecf20Sopenharmony_ci struct regulator *vdd; 528c2ecf20Sopenharmony_ci struct completion meas_ready; 538c2ecf20Sopenharmony_ci /* 548c2ecf20Sopenharmony_ci * priv pointer is solely for serdev driver private data. We keep it 558c2ecf20Sopenharmony_ci * here because driver_data inside dev has been already used for iio and 568c2ecf20Sopenharmony_ci * struct serdev_device doesn't have one. 578c2ecf20Sopenharmony_ci */ 588c2ecf20Sopenharmony_ci void *priv; 598c2ecf20Sopenharmony_ci int irq; 608c2ecf20Sopenharmony_ci /* 618c2ecf20Sopenharmony_ci * no way to retrieve current ambient pressure compensation value from 628c2ecf20Sopenharmony_ci * the sensor so keep one around 638c2ecf20Sopenharmony_ci */ 648c2ecf20Sopenharmony_ci u16 pressure_comp; 658c2ecf20Sopenharmony_ci u16 meas_interval; 668c2ecf20Sopenharmony_ci int meas[SCD30_MEAS_COUNT]; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci scd30_command_t command; 698c2ecf20Sopenharmony_ci}; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ciint scd30_suspend(struct device *dev); 728c2ecf20Sopenharmony_ciint scd30_resume(struct device *dev); 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistatic __maybe_unused SIMPLE_DEV_PM_OPS(scd30_pm_ops, scd30_suspend, scd30_resume); 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ciint scd30_probe(struct device *dev, int irq, const char *name, void *priv, scd30_command_t command); 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci#endif 79