/* * Copyright (C) 2010 Michael Hennerich, Analog Devices Inc. * Copyright (C) 2008-2010 Jonathan Cameron * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * ad799x.h */ #ifndef _AD799X_H_ #define _AD799X_H_ #define AD799X_CHANNEL_SHIFT 4 #define AD799X_STORAGEBITS 16 /* * AD7991, AD7995 and AD7999 defines */ #define AD7991_REF_SEL 0x08 #define AD7991_FLTR 0x04 #define AD7991_BIT_TRIAL_DELAY 0x02 #define AD7991_SAMPLE_DELAY 0x01 /* * AD7992, AD7993, AD7994, AD7997 and AD7998 defines */ #define AD7998_FLTR 0x08 #define AD7998_ALERT_EN 0x04 #define AD7998_BUSY_ALERT 0x02 #define AD7998_BUSY_ALERT_POL 0x01 #define AD7998_CONV_RES_REG 0x0 #define AD7998_ALERT_STAT_REG 0x1 #define AD7998_CONF_REG 0x2 #define AD7998_CYCLE_TMR_REG 0x3 #define AD7998_DATALOW_CH1_REG 0x4 #define AD7998_DATAHIGH_CH1_REG 0x5 #define AD7998_HYST_CH1_REG 0x6 #define AD7998_DATALOW_CH2_REG 0x7 #define AD7998_DATAHIGH_CH2_REG 0x8 #define AD7998_HYST_CH2_REG 0x9 #define AD7998_DATALOW_CH3_REG 0xA #define AD7998_DATAHIGH_CH3_REG 0xB #define AD7998_HYST_CH3_REG 0xC #define AD7998_DATALOW_CH4_REG 0xD #define AD7998_DATAHIGH_CH4_REG 0xE #define AD7998_HYST_CH4_REG 0xF #define AD7998_CYC_MASK 0x7 #define AD7998_CYC_DIS 0x0 #define AD7998_CYC_TCONF_32 0x1 #define AD7998_CYC_TCONF_64 0x2 #define AD7998_CYC_TCONF_128 0x3 #define AD7998_CYC_TCONF_256 0x4 #define AD7998_CYC_TCONF_512 0x5 #define AD7998_CYC_TCONF_1024 0x6 #define AD7998_CYC_TCONF_2048 0x7 #define AD7998_ALERT_STAT_CLEAR 0xFF /* * AD7997 and AD7997 defines */ #define AD7997_8_READ_SINGLE 0x80 #define AD7997_8_READ_SEQUENCE 0x70 enum { ad7991, ad7995, ad7999, ad7992, ad7993, ad7994, ad7997, ad7998 }; struct ad799x_state; /** * struct ad799x_chip_info - chip specifc information * @num_inputs: number of physical inputs on chip * @bits: accuracy of the adc in bits * @int_vref_mv: the internal reference voltage * @monitor_mode: whether the chip supports monitor interrupts * @default_config: device default configuration * @dev_attrs: pointer to the device attribute group * @scan_attrs: pointer to the scan element attribute group * @event_attrs: pointer to the monitor event attribute group * @ad799x_set_scan_mode: function pointer to the device specific mode function */ struct ad799x_chip_info { u8 num_inputs; u8 bits; u8 storagebits; char sign; u16 int_vref_mv; bool monitor_mode; u16 default_config; struct attribute_group *dev_attrs; struct attribute_group *scan_attrs; struct attribute_group *event_attrs; int (*ad799x_set_scan_mode) (struct ad799x_state *st, unsigned mask); }; struct ad799x_state { struct iio_dev *indio_dev; struct i2c_client *client; const struct ad799x_chip_info *chip_info; struct work_struct poll_work; struct work_struct work_thresh; atomic_t protect_ring; struct iio_trigger *trig; struct regulator *reg; s64 last_timestamp; u16 int_vref_mv; unsigned id; char *name; u16 config; }; /* * TODO: struct ad799x_platform_data needs to go into include/linux/iio */ struct ad799x_platform_data { u16 vref_mv; }; int ad799x_set_scan_mode(struct ad799x_state *st, unsigned mask); #ifdef CONFIG_AD799X_RING_BUFFER int ad799x_single_channel_from_ring(struct ad799x_state *st, long mask); int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev); void ad799x_ring_cleanup(struct iio_dev *indio_dev); #else /* CONFIG_AD799X_RING_BUFFER */ int ad799x_single_channel_from_ring(struct ad799x_state *st, long mask) { return -EINVAL; } static inline int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev) { return 0; } static inline void ad799x_ring_cleanup(struct iio_dev *indio_dev) { } #endif /* CONFIG_AD799X_RING_BUFFER */ #endif /* _AD799X_H_ */