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 *b7079eeaSLorenzo Bianconi bool enabled; 61 e4a70e3eSLorenzo Bianconi u8 odr; 62 e4a70e3eSLorenzo Bianconi 63 e4a70e3eSLorenzo Bianconi const struct hts221_transfer_function *tf; 64 e4a70e3eSLorenzo Bianconi struct hts221_transfer_buffer tb; 65 e4a70e3eSLorenzo Bianconi }; 66 e4a70e3eSLorenzo Bianconi 67 *b7079eeaSLorenzo Bianconi extern const struct dev_pm_ops hts221_pm_ops; 68 *b7079eeaSLorenzo Bianconi 69 e4a70e3eSLorenzo Bianconi int hts221_config_drdy(struct hts221_hw *hw, bool enable); 70 e4a70e3eSLorenzo Bianconi int hts221_probe(struct iio_dev *iio_dev); 71 e4a70e3eSLorenzo Bianconi int hts221_power_on(struct hts221_hw *hw); 72 e4a70e3eSLorenzo Bianconi int hts221_power_off(struct hts221_hw *hw); 73 e4a70e3eSLorenzo Bianconi int hts221_allocate_buffers(struct hts221_hw *hw); 74 e4a70e3eSLorenzo Bianconi int hts221_allocate_trigger(struct hts221_hw *hw); 75 e4a70e3eSLorenzo Bianconi 76 e4a70e3eSLorenzo Bianconi #endif /* HTS221_H */ 77