Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.9-rc5 316 lines 9.5 kB view raw
1/* 2 * STMicroelectronics sensors library driver 3 * 4 * Copyright 2012-2013 STMicroelectronics Inc. 5 * 6 * Denis Ciocca <denis.ciocca@st.com> 7 * 8 * Licensed under the GPL-2. 9 */ 10 11#ifndef ST_SENSORS_H 12#define ST_SENSORS_H 13 14#include <linux/i2c.h> 15#include <linux/spi/spi.h> 16#include <linux/irqreturn.h> 17#include <linux/iio/trigger.h> 18#include <linux/bitops.h> 19#include <linux/regulator/consumer.h> 20 21#include <linux/platform_data/st_sensors_pdata.h> 22 23#define ST_SENSORS_TX_MAX_LENGTH 2 24#define ST_SENSORS_RX_MAX_LENGTH 6 25 26#define ST_SENSORS_ODR_LIST_MAX 10 27#define ST_SENSORS_FULLSCALE_AVL_MAX 10 28 29#define ST_SENSORS_NUMBER_ALL_CHANNELS 4 30#define ST_SENSORS_ENABLE_ALL_AXIS 0x07 31#define ST_SENSORS_SCAN_X 0 32#define ST_SENSORS_SCAN_Y 1 33#define ST_SENSORS_SCAN_Z 2 34#define ST_SENSORS_DEFAULT_POWER_ON_VALUE 0x01 35#define ST_SENSORS_DEFAULT_POWER_OFF_VALUE 0x00 36#define ST_SENSORS_DEFAULT_WAI_ADDRESS 0x0f 37#define ST_SENSORS_DEFAULT_AXIS_ADDR 0x20 38#define ST_SENSORS_DEFAULT_AXIS_MASK 0x07 39#define ST_SENSORS_DEFAULT_AXIS_N_BIT 3 40#define ST_SENSORS_DEFAULT_STAT_ADDR 0x27 41 42#define ST_SENSORS_MAX_NAME 17 43#define ST_SENSORS_MAX_4WAI 7 44 45#define ST_SENSORS_LSM_CHANNELS(device_type, mask, index, mod, \ 46 ch2, s, endian, rbits, sbits, addr) \ 47{ \ 48 .type = device_type, \ 49 .modified = mod, \ 50 .info_mask_separate = mask, \ 51 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 52 .scan_index = index, \ 53 .channel2 = ch2, \ 54 .address = addr, \ 55 .scan_type = { \ 56 .sign = s, \ 57 .realbits = rbits, \ 58 .shift = sbits - rbits, \ 59 .storagebits = sbits, \ 60 .endianness = endian, \ 61 }, \ 62} 63 64#define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL() \ 65 IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \ 66 st_sensors_sysfs_sampling_frequency_avail) 67 68#define ST_SENSORS_DEV_ATTR_SCALE_AVAIL(name) \ 69 IIO_DEVICE_ATTR(name, S_IRUGO, \ 70 st_sensors_sysfs_scale_avail, NULL , 0); 71 72struct st_sensor_odr_avl { 73 unsigned int hz; 74 u8 value; 75}; 76 77struct st_sensor_odr { 78 u8 addr; 79 u8 mask; 80 struct st_sensor_odr_avl odr_avl[ST_SENSORS_ODR_LIST_MAX]; 81}; 82 83struct st_sensor_power { 84 u8 addr; 85 u8 mask; 86 u8 value_off; 87 u8 value_on; 88}; 89 90struct st_sensor_axis { 91 u8 addr; 92 u8 mask; 93}; 94 95struct st_sensor_fullscale_avl { 96 unsigned int num; 97 u8 value; 98 unsigned int gain; 99 unsigned int gain2; 100}; 101 102struct st_sensor_fullscale { 103 u8 addr; 104 u8 mask; 105 struct st_sensor_fullscale_avl fs_avl[ST_SENSORS_FULLSCALE_AVL_MAX]; 106}; 107 108/** 109 * struct st_sensor_bdu - ST sensor device block data update 110 * @addr: address of the register. 111 * @mask: mask to write the block data update flag. 112 */ 113struct st_sensor_bdu { 114 u8 addr; 115 u8 mask; 116}; 117 118/** 119 * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt 120 * @addr: address of the register. 121 * @mask_int1: mask to enable/disable IRQ on INT1 pin. 122 * @mask_int2: mask to enable/disable IRQ on INT2 pin. 123 * @addr_ihl: address to enable/disable active low on the INT lines. 124 * @mask_ihl: mask to enable/disable active low on the INT lines. 125 * @addr_od: address to enable/disable Open Drain on the INT lines. 126 * @mask_od: mask to enable/disable Open Drain on the INT lines. 127 * @addr_stat_drdy: address to read status of DRDY (data ready) interrupt 128 * struct ig1 - represents the Interrupt Generator 1 of sensors. 129 * @en_addr: address of the enable ig1 register. 130 * @en_mask: mask to write the on/off value for enable. 131 */ 132struct st_sensor_data_ready_irq { 133 u8 addr; 134 u8 mask_int1; 135 u8 mask_int2; 136 u8 addr_ihl; 137 u8 mask_ihl; 138 u8 addr_od; 139 u8 mask_od; 140 u8 addr_stat_drdy; 141 struct { 142 u8 en_addr; 143 u8 en_mask; 144 } ig1; 145}; 146 147/** 148 * struct st_sensor_transfer_buffer - ST sensor device I/O buffer 149 * @buf_lock: Mutex to protect rx and tx buffers. 150 * @tx_buf: Buffer used by SPI transfer function to send data to the sensors. 151 * This buffer is used to avoid DMA not-aligned issue. 152 * @rx_buf: Buffer used by SPI transfer to receive data from sensors. 153 * This buffer is used to avoid DMA not-aligned issue. 154 */ 155struct st_sensor_transfer_buffer { 156 struct mutex buf_lock; 157 u8 rx_buf[ST_SENSORS_RX_MAX_LENGTH]; 158 u8 tx_buf[ST_SENSORS_TX_MAX_LENGTH] ____cacheline_aligned; 159}; 160 161/** 162 * struct st_sensor_transfer_function - ST sensor device I/O function 163 * @read_byte: Function used to read one byte. 164 * @write_byte: Function used to write one byte. 165 * @read_multiple_byte: Function used to read multiple byte. 166 */ 167struct st_sensor_transfer_function { 168 int (*read_byte) (struct st_sensor_transfer_buffer *tb, 169 struct device *dev, u8 reg_addr, u8 *res_byte); 170 int (*write_byte) (struct st_sensor_transfer_buffer *tb, 171 struct device *dev, u8 reg_addr, u8 data); 172 int (*read_multiple_byte) (struct st_sensor_transfer_buffer *tb, 173 struct device *dev, u8 reg_addr, int len, u8 *data, 174 bool multiread_bit); 175}; 176 177/** 178 * struct st_sensor_settings - ST specific sensor settings 179 * @wai: Contents of WhoAmI register. 180 * @wai_addr: The address of WhoAmI register. 181 * @sensors_supported: List of supported sensors by struct itself. 182 * @ch: IIO channels for the sensor. 183 * @odr: Output data rate register and ODR list available. 184 * @pw: Power register of the sensor. 185 * @enable_axis: Enable one or more axis of the sensor. 186 * @fs: Full scale register and full scale list available. 187 * @bdu: Block data update register. 188 * @drdy_irq: Data ready register of the sensor. 189 * @multi_read_bit: Use or not particular bit for [I2C/SPI] multi-read. 190 * @bootime: samples to discard when sensor passing from power-down to power-up. 191 */ 192struct st_sensor_settings { 193 u8 wai; 194 u8 wai_addr; 195 char sensors_supported[ST_SENSORS_MAX_4WAI][ST_SENSORS_MAX_NAME]; 196 struct iio_chan_spec *ch; 197 int num_ch; 198 struct st_sensor_odr odr; 199 struct st_sensor_power pw; 200 struct st_sensor_axis enable_axis; 201 struct st_sensor_fullscale fs; 202 struct st_sensor_bdu bdu; 203 struct st_sensor_data_ready_irq drdy_irq; 204 bool multi_read_bit; 205 unsigned int bootime; 206}; 207 208/** 209 * struct st_sensor_data - ST sensor device status 210 * @dev: Pointer to instance of struct device (I2C or SPI). 211 * @trig: The trigger in use by the core driver. 212 * @sensor_settings: Pointer to the specific sensor settings in use. 213 * @current_fullscale: Maximum range of measure by the sensor. 214 * @vdd: Pointer to sensor's Vdd power supply 215 * @vdd_io: Pointer to sensor's Vdd-IO power supply 216 * @enabled: Status of the sensor (false->off, true->on). 217 * @multiread_bit: Use or not particular bit for [I2C/SPI] multiread. 218 * @buffer_data: Data used by buffer part. 219 * @odr: Output data rate of the sensor [Hz]. 220 * num_data_channels: Number of data channels used in buffer. 221 * @drdy_int_pin: Redirect DRDY on pin 1 (1) or pin 2 (2). 222 * @int_pin_open_drain: Set the interrupt/DRDY to open drain. 223 * @get_irq_data_ready: Function to get the IRQ used for data ready signal. 224 * @tf: Transfer function structure used by I/O operations. 225 * @tb: Transfer buffers and mutex used by I/O operations. 226 * @edge_irq: the IRQ triggers on edges and need special handling. 227 * @hw_irq_trigger: if we're using the hardware interrupt on the sensor. 228 * @hw_timestamp: Latest timestamp from the interrupt handler, when in use. 229 */ 230struct st_sensor_data { 231 struct device *dev; 232 struct iio_trigger *trig; 233 struct st_sensor_settings *sensor_settings; 234 struct st_sensor_fullscale_avl *current_fullscale; 235 struct regulator *vdd; 236 struct regulator *vdd_io; 237 238 bool enabled; 239 bool multiread_bit; 240 241 char *buffer_data; 242 243 unsigned int odr; 244 unsigned int num_data_channels; 245 246 u8 drdy_int_pin; 247 bool int_pin_open_drain; 248 249 unsigned int (*get_irq_data_ready) (struct iio_dev *indio_dev); 250 251 const struct st_sensor_transfer_function *tf; 252 struct st_sensor_transfer_buffer tb; 253 254 bool edge_irq; 255 bool hw_irq_trigger; 256 s64 hw_timestamp; 257}; 258 259#ifdef CONFIG_IIO_BUFFER 260irqreturn_t st_sensors_trigger_handler(int irq, void *p); 261#endif 262 263#ifdef CONFIG_IIO_TRIGGER 264int st_sensors_allocate_trigger(struct iio_dev *indio_dev, 265 const struct iio_trigger_ops *trigger_ops); 266 267void st_sensors_deallocate_trigger(struct iio_dev *indio_dev); 268int st_sensors_validate_device(struct iio_trigger *trig, 269 struct iio_dev *indio_dev); 270#else 271static inline int st_sensors_allocate_trigger(struct iio_dev *indio_dev, 272 const struct iio_trigger_ops *trigger_ops) 273{ 274 return 0; 275} 276static inline void st_sensors_deallocate_trigger(struct iio_dev *indio_dev) 277{ 278 return; 279} 280#define st_sensors_validate_device NULL 281#endif 282 283int st_sensors_init_sensor(struct iio_dev *indio_dev, 284 struct st_sensors_platform_data *pdata); 285 286int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable); 287 288int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable); 289 290int st_sensors_power_enable(struct iio_dev *indio_dev); 291 292void st_sensors_power_disable(struct iio_dev *indio_dev); 293 294int st_sensors_debugfs_reg_access(struct iio_dev *indio_dev, 295 unsigned reg, unsigned writeval, 296 unsigned *readval); 297 298int st_sensors_set_odr(struct iio_dev *indio_dev, unsigned int odr); 299 300int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable); 301 302int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale); 303 304int st_sensors_read_info_raw(struct iio_dev *indio_dev, 305 struct iio_chan_spec const *ch, int *val); 306 307int st_sensors_check_device_support(struct iio_dev *indio_dev, 308 int num_sensors_list, const struct st_sensor_settings *sensor_settings); 309 310ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, 311 struct device_attribute *attr, char *buf); 312 313ssize_t st_sensors_sysfs_scale_avail(struct device *dev, 314 struct device_attribute *attr, char *buf); 315 316#endif /* ST_SENSORS_H */