- patches.arch/x86_mce_intel_decode_physical_address.patch:
[linux-flexiantxendom0-3.2.10.git] / drivers / staging / iio / adc / max1363.h
index c112fbe..72cf367 100644 (file)
  * @numvals:   The number of values returned by a single scan
  */
 struct max1363_mode {
-       const char      *name;
        int8_t          conf;
-       int             numvals;
+       long            modemask;
 };
 
-#define MAX1363_MODE_SINGLE(_num) {                                    \
-               .name = #_num,                                          \
-                       .conf = MAX1363_CHANNEL_SEL(_num)               \
+#define MAX1363_MODE_SINGLE(_num, _mask) {                             \
+               .conf = MAX1363_CHANNEL_SEL(_num)                       \
                        | MAX1363_CONFIG_SCAN_SINGLE_1                  \
                        | MAX1363_CONFIG_SE,                            \
-                       .numvals = 1,                                   \
+                       .modemask = _mask,                              \
                        }
 
-#define MAX1363_MODE_SINGLE_TIMES_8(_num) {                            \
-               .name = #_num"x8",                                      \
-                       .conf = MAX1363_CHANNEL_SEL(_num)               \
-                       | MAX1363_CONFIG_SCAN_SINGLE_8                  \
-                       | MAX1363_CONFIG_SE,                            \
-                       .numvals = 8,                                   \
-                       }
-
-#define MAX1363_MODE_SCAN_TO_CHANNEL(_num) {                           \
-               .name = "0..."#_num,                                    \
-                       .conf = MAX1363_CHANNEL_SEL(_num)               \
+#define MAX1363_MODE_SCAN_TO_CHANNEL(_num, _mask) {                    \
+               .conf = MAX1363_CHANNEL_SEL(_num)                       \
                        | MAX1363_CONFIG_SCAN_TO_CS                     \
                        | MAX1363_CONFIG_SE,                            \
-                       .numvals = _num + 1,                            \
+                       .modemask = _mask,                              \
                        }
 
 
 /* note not available for max1363 hence naming */
-#define MAX1236_MODE_SCAN_MID_TO_CHANNEL(_mid, _num) {                 \
-               .name = #_mid"..."#_num,                                \
-                       .conf = MAX1363_CHANNEL_SEL(_num)               \
+#define MAX1236_MODE_SCAN_MID_TO_CHANNEL(_mid, _num, _mask) {          \
+               .conf = MAX1363_CHANNEL_SEL(_num)                       \
                        | MAX1236_SCAN_MID_TO_CHANNEL                   \
                        | MAX1363_CONFIG_SE,                            \
-                       .numvals = _num - _mid + 1                      \
+                       .modemask = _mask                               \
 }
 
-#define MAX1363_MODE_DIFF_SINGLE(_nump, _numm) {                       \
-               .name = #_nump"-"#_numm,                                \
-                       .conf = MAX1363_CHANNEL_SEL(_nump)              \
+#define MAX1363_MODE_DIFF_SINGLE(_nump, _numm, _mask) {                        \
+               .conf = MAX1363_CHANNEL_SEL(_nump)                      \
                        | MAX1363_CONFIG_SCAN_SINGLE_1                  \
                        | MAX1363_CONFIG_DE,                            \
-                       .numvals = 1,                                   \
-                       }
-
-#define MAX1363_MODE_DIFF_SINGLE_TIMES_8(_nump, _numm) {               \
-               .name = #_nump"-"#_numm,                                \
-                       .conf = MAX1363_CHANNEL_SEL(_nump)              \
-                       | MAX1363_CONFIG_SCAN_SINGLE_8                  \
-                       | MAX1363_CONFIG_DE,                            \
-                       .numvals = 1,                                   \
+                       .modemask = _mask                               \
                        }
 
 /* Can't think how to automate naming so specify for now */
-#define MAX1363_MODE_DIFF_SCAN_TO_CHANNEL_NAMED(_name, _num, _numvals) { \
-               .name = #_name,                                         \
-                       .conf = MAX1363_CHANNEL_SEL(_num)               \
+#define MAX1363_MODE_DIFF_SCAN_TO_CHANNEL(_num, _numvals, _mask) { \
+               .conf = MAX1363_CHANNEL_SEL(_num)                       \
                        | MAX1363_CONFIG_SCAN_TO_CS                     \
                        | MAX1363_CONFIG_DE,                            \
-                       .numvals = _numvals,                            \
+                       .modemask = _mask                               \
                        }
 
 /* note only available for max1363 hence naming */
-#define MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL_NAMED(_name, _num, _numvals) { \
-    .name = #_name,                                                    \
-                       .conf = MAX1363_CHANNEL_SEL(_num)               \
+#define MAX1236_MODE_DIFF_SCAN_MID_TO_CHANNEL(_num, _numvals, _mask) { \
+               .conf = MAX1363_CHANNEL_SEL(_num)                       \
                        | MAX1236_SCAN_MID_TO_CHANNEL                   \
                        | MAX1363_CONFIG_SE,                            \
-                       .numvals = _numvals,                            \
+                       .modemask = _mask                               \
 }
 
 /* Not currently handled */
@@ -158,35 +135,43 @@ struct max1363_mode {
  * clear what all the various options actually do. Alternative suggestions
  * that don't require user to have intimate knowledge of the chip welcomed.
  */
+enum max1363_channels {
+       max1363_in0, max1363_in1, max1363_in2, max1363_in3,
+       max1363_in4, max1363_in5, max1363_in6, max1363_in7,
+       max1363_in8, max1363_in9, max1363_in10, max1363_in11,
+
+       max1363_in0min1, max1363_in2min3,
+       max1363_in4min5, max1363_in6min7,
+       max1363_in8min9, max1363_in10min11,
+
+       max1363_in1min0, max1363_in3min2,
+       max1363_in5min4, max1363_in7min6,
+       max1363_in9min8, max1363_in11min10,
+       };
 
 /* This must be maintained along side the max1363_mode_table in max1363_core */
 enum max1363_modes {
        /* Single read of a single channel */
        _s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
-       /* Eight reads of a single channel */
-       se0, se1, se2, se3, se4, se5, se6, se7, se8, se9, se10, se11,
-       /* Scan to channel */
-       s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
-       s0to7, s0to8, s0to9, s0to10, s0to11,
        /* Differential single read */
        d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
        d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
-       /* Differential single read 8 times */
-       de0m1, de2m3, de4m5, de6m7, de8m9, de10m11,
-       de1m0, de3m2, de5m4, de7m6, de9m8, de11m10,
-       /* Differential scan to channel */
-       d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11,
-       d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10,
-       /* Scan mid to channel max123{6-9} only */
-       s2to3, s6to7, s6to8, s6to9, s6to10, s6to11,
-       /* Differential scan mid to channel */
-       s6m7to8m9, s6m7to10m11, s7m6to9m8, s7m6to11m10,
+       /* Scan to channel and mid to channel where overlapping */
+       s0to1, s0to2, s2to3, s0to3, s0to4, s0to5, s0to6,
+       s6to7, s0to7, s6to8, s0to8, s6to9,
+       s0to9, s6to10, s0to10, s6to11, s0to11,
+       /* Differential scan to channel and mid to channel where overlapping */
+       d0m1to2m3, d0m1to4m5, d0m1to6m7, d6m7to8m9,
+       d0m1to8m9, d6m7to10m11, d0m1to10m11, d1m0to3m2,
+       d1m0to5m4, d1m0to7m6, d7m6to9m8, d1m0to9m8,
+       d7m6to11m10, d1m0to11m10,
 };
 
 /**
  * struct max1363_chip_info - chip specifc information
  * @name:              indentification string for chip
  * @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
  * @mode_list:         array of available scan modes
@@ -196,11 +181,14 @@ enum max1363_modes {
 struct max1363_chip_info {
        const char                      *name;
        u8                              num_inputs;
+       u8                              bits;
        u16                             int_vref_mv;
        bool                            monitor_mode;
        const enum max1363_modes        *mode_list;
        int                             num_modes;
        enum max1363_modes              default_mode;
+       struct attribute_group          *dev_attrs;
+       struct attribute_group          *scan_attrs;
 };
 
 
@@ -212,6 +200,7 @@ struct max1363_chip_info {
  * @configbyte:                cache of current device config byte
  * @chip_info:         chip model specific constants, available modes etc
  * @current_mode:      the scan mode of this chip
+ * @requestedmask:     a valid requested set of channels
  * @poll_work:         bottom half of polling interrupt handler
  * @protect_ring:      used to ensure only one polling bh running at a time
  * @reg:               supply regulator
@@ -223,16 +212,21 @@ struct max1363_state {
        char                            configbyte;
        const struct max1363_chip_info  *chip_info;
        const struct max1363_mode       *current_mode;
+       u32                             requestedmask;
        struct work_struct              poll_work;
        atomic_t                        protect_ring;
        struct iio_trigger              *trig;
        struct regulator                *reg;
 };
+
+const struct max1363_mode
+*max1363_match_mode(u32 mask, const struct max1363_chip_info *ci);
+
+int max1363_set_scan_mode(struct max1363_state *st);
+
 #ifdef CONFIG_MAX1363_RING_BUFFER
 
-ssize_t max1363_scan_from_ring(struct device *dev,
-                              struct device_attribute *attr,
-                              char *buf);
+int max1363_single_channel_from_ring(long mask, struct max1363_state *st);
 int max1363_register_ring_funcs_and_init(struct iio_dev *indio_dev);
 void max1363_ring_cleanup(struct iio_dev *indio_dev);
 
@@ -250,14 +244,12 @@ static inline int max1363_initialize_ring(struct iio_ring_buffer *ring)
        return 0;
 };
 
-
-static inline ssize_t max1363_scan_from_ring(struct device *dev,
-                                            struct device_attribute *attr,
-                                            char *buf)
+int max1363_single_channel_from_ring(long mask, struct max1363_state *st)
 {
-       return 0;
+       return -EINVAL;
 };
 
+
 static inline int
 max1363_register_ring_funcs_and_init(struct iio_dev *indio_dev)
 {