// SPDX-License-Identifier: GPL-2.0
/*
* Bosch BME680 - Temperature, Pressure, Humidity & Gas Sensor
*
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
* Copyright (C) 2018 Himanshu Jha <himanshujha199640@gmail.com>
*
* Datasheet:
* https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME680-DS001-00.pdf
*/
#include <linux/bitfield.h>
#include <linux/cleanup.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/log2.h>
#include <linux/module.h>
#include <linux/pm.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/iio/buffer.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
#include <linux/unaligned.h>
#include "bme680.h"
/* 1st set of calibration data */
enum {
/* Temperature calib indexes */
T2_LSB = 0,
T3 = 2,
/* Pressure calib indexes */
P1_LSB = 4,
P2_LSB = 6,
P3 = 8,
P4_LSB = 10,
P5_LSB = 12,
P7 = 14,
P6 = 15,
P8_LSB = 18,
P9_LSB = 20,
P10 = 22,
};
/* 2nd set of calibration data */
enum {
/* Humidity calib indexes */
H2_MSB = 0,
H1_LSB = 1,
H3 = 3,
H4 = 4,
H5 = 5,
H6 = 6,
H7 = 7,
/* Stray T1 calib index */
T1_LSB = 8,
/* Gas heater calib indexes */
GH2_LSB = 10,
GH1 = 12,
GH3 = 13,
};
/* 3rd set of calibration data */
enum {
RES_HEAT_VAL = 0,
RES_HEAT_RANGE = 2,
RANGE_SW_ERR = 4,
};
struct bme680_calib {
u16 par_t1;
s16 par_t2;
s8 par_t3;
u16 par_p1;
s16 par_p2;
s8 par_p3;
s16 par_p4;
s16 par_p5;
s8 par_p6;
s8 par_p7;
s16 par_p8;
s16 par_p9;
u8 par_p10;
u16 par_h1;
u16 par_h2;
s8 par_h3;
s8 par_h4;
s8 par_h5;
u8 par_h6;
s8 par_h7;
s8 par_gh1;
s16 par_gh2;
s8 par_gh3;
u8 res_heat_range;
s8 res_heat_val;
s8 range_sw_err;
};
/* values of CTRL_MEAS register */
enum bme680_op_mode {
BME680_MODE_SLEEP = 0,
BME680_MODE_FORCED = 1,
};
enum bme680_scan {
BME680_TEMP,
BME680_PRESS,
BME680_HUMID,
BME680_GAS,
};
st