1*e4a70e3eSLorenzo Bianconi /* 2*e4a70e3eSLorenzo Bianconi * STMicroelectronics hts221 sensor driver 3*e4a70e3eSLorenzo Bianconi * 4*e4a70e3eSLorenzo Bianconi * Copyright 2016 STMicroelectronics Inc. 5*e4a70e3eSLorenzo Bianconi * 6*e4a70e3eSLorenzo Bianconi * Lorenzo Bianconi <lorenzo.bianconi@st.com> 7*e4a70e3eSLorenzo Bianconi * 8*e4a70e3eSLorenzo Bianconi * Licensed under the GPL-2. 9*e4a70e3eSLorenzo Bianconi */ 10*e4a70e3eSLorenzo Bianconi 11*e4a70e3eSLorenzo Bianconi #ifndef HTS221_H 12*e4a70e3eSLorenzo Bianconi #define HTS221_H 13*e4a70e3eSLorenzo Bianconi 14*e4a70e3eSLorenzo Bianconi #define HTS221_DEV_NAME "hts221" 15*e4a70e3eSLorenzo Bianconi 16*e4a70e3eSLorenzo Bianconi #include <linux/iio/iio.h> 17*e4a70e3eSLorenzo Bianconi 18*e4a70e3eSLorenzo Bianconi #define HTS221_RX_MAX_LENGTH 8 19*e4a70e3eSLorenzo Bianconi #define HTS221_TX_MAX_LENGTH 8 20*e4a70e3eSLorenzo Bianconi 21*e4a70e3eSLorenzo Bianconi #define HTS221_DATA_SIZE 2 22*e4a70e3eSLorenzo Bianconi 23*e4a70e3eSLorenzo Bianconi struct hts221_transfer_buffer { 24*e4a70e3eSLorenzo Bianconi u8 rx_buf[HTS221_RX_MAX_LENGTH]; 25*e4a70e3eSLorenzo Bianconi u8 tx_buf[HTS221_TX_MAX_LENGTH] ____cacheline_aligned; 26*e4a70e3eSLorenzo Bianconi }; 27*e4a70e3eSLorenzo Bianconi 28*e4a70e3eSLorenzo Bianconi struct hts221_transfer_function { 29*e4a70e3eSLorenzo Bianconi int (*read)(struct device *dev, u8 addr, int len, u8 *data); 30*e4a70e3eSLorenzo Bianconi int (*write)(struct device *dev, u8 addr, int len, u8 *data); 31*e4a70e3eSLorenzo Bianconi }; 32*e4a70e3eSLorenzo Bianconi 33*e4a70e3eSLorenzo Bianconi #define HTS221_AVG_DEPTH 8 34*e4a70e3eSLorenzo Bianconi struct hts221_avg_avl { 35*e4a70e3eSLorenzo Bianconi u16 avg; 36*e4a70e3eSLorenzo Bianconi u8 val; 37*e4a70e3eSLorenzo Bianconi }; 38*e4a70e3eSLorenzo Bianconi 39*e4a70e3eSLorenzo Bianconi enum hts221_sensor_type { 40*e4a70e3eSLorenzo Bianconi HTS221_SENSOR_H, 41*e4a70e3eSLorenzo Bianconi HTS221_SENSOR_T, 42*e4a70e3eSLorenzo Bianconi HTS221_SENSOR_MAX, 43*e4a70e3eSLorenzo Bianconi }; 44*e4a70e3eSLorenzo Bianconi 45*e4a70e3eSLorenzo Bianconi struct hts221_sensor { 46*e4a70e3eSLorenzo Bianconi u8 cur_avg_idx; 47*e4a70e3eSLorenzo Bianconi int slope, b_gen; 48*e4a70e3eSLorenzo Bianconi }; 49*e4a70e3eSLorenzo Bianconi 50*e4a70e3eSLorenzo Bianconi struct hts221_hw { 51*e4a70e3eSLorenzo Bianconi const char *name; 52*e4a70e3eSLorenzo Bianconi struct device *dev; 53*e4a70e3eSLorenzo Bianconi 54*e4a70e3eSLorenzo Bianconi struct mutex lock; 55*e4a70e3eSLorenzo Bianconi struct iio_trigger *trig; 56*e4a70e3eSLorenzo Bianconi int irq; 57*e4a70e3eSLorenzo Bianconi 58*e4a70e3eSLorenzo Bianconi struct hts221_sensor sensors[HTS221_SENSOR_MAX]; 59*e4a70e3eSLorenzo Bianconi 60*e4a70e3eSLorenzo Bianconi u8 odr; 61*e4a70e3eSLorenzo Bianconi 62*e4a70e3eSLorenzo Bianconi const struct hts221_transfer_function *tf; 63*e4a70e3eSLorenzo Bianconi struct hts221_transfer_buffer tb; 64*e4a70e3eSLorenzo Bianconi }; 65*e4a70e3eSLorenzo Bianconi 66*e4a70e3eSLorenzo Bianconi int hts221_config_drdy(struct hts221_hw *hw, bool enable); 67*e4a70e3eSLorenzo Bianconi int hts221_probe(struct iio_dev *iio_dev); 68*e4a70e3eSLorenzo Bianconi int hts221_power_on(struct hts221_hw *hw); 69*e4a70e3eSLorenzo Bianconi int hts221_power_off(struct hts221_hw *hw); 70*e4a70e3eSLorenzo Bianconi int hts221_allocate_buffers(struct hts221_hw *hw); 71*e4a70e3eSLorenzo Bianconi int hts221_allocate_trigger(struct hts221_hw *hw); 72*e4a70e3eSLorenzo Bianconi 73*e4a70e3eSLorenzo Bianconi #endif /* HTS221_H */ 74