Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[pandora-kernel.git] / drivers / staging / iio / dac / ad5446.h
1 /*
2  * AD5446 SPI DAC driver
3  *
4  * Copyright 2010 Analog Devices Inc.
5  *
6  * Licensed under the GPL-2 or later.
7  */
8 #ifndef IIO_DAC_AD5446_H_
9 #define IIO_DAC_AD5446_H_
10
11 /* DAC Control Bits */
12
13 #define AD5446_LOAD             (0x0 << 14) /* Load and update */
14 #define AD5446_SDO_DIS          (0x1 << 14) /* Disable SDO */
15 #define AD5446_NOP              (0x2 << 14) /* No operation */
16 #define AD5446_CLK_RISING       (0x3 << 14) /* Clock data on rising edge */
17
18 #define AD5620_LOAD             (0x0 << 14) /* Load and update Norm Operation*/
19 #define AD5620_PWRDWN_1k        (0x1 << 14) /* Power-down: 1kOhm to GND */
20 #define AD5620_PWRDWN_100k      (0x2 << 14) /* Power-down: 100kOhm to GND */
21 #define AD5620_PWRDWN_TRISTATE  (0x3 << 14) /* Power-down: Three-state */
22
23 #define AD5660_LOAD             (0x0 << 16) /* Load and update Norm Operation*/
24 #define AD5660_PWRDWN_1k        (0x1 << 16) /* Power-down: 1kOhm to GND */
25 #define AD5660_PWRDWN_100k      (0x2 << 16) /* Power-down: 100kOhm to GND */
26 #define AD5660_PWRDWN_TRISTATE  (0x3 << 16) /* Power-down: Three-state */
27
28 #define RES_MASK(bits)  ((1 << (bits)) - 1)
29
30 #define MODE_PWRDWN_1k          0x1
31 #define MODE_PWRDWN_100k        0x2
32 #define MODE_PWRDWN_TRISTATE    0x3
33
34 /**
35  * struct ad5446_state - driver instance specific data
36  * @spi:                spi_device
37  * @chip_info:          chip model specific constants, available modes etc
38  * @reg:                supply regulator
39  * @poll_work:          bottom half of polling interrupt handler
40  * @vref_mv:            actual reference voltage used
41  * @xfer:               default spi transfer
42  * @msg:                default spi message
43  * @data:               spi transmit buffer
44  */
45
46 struct ad5446_state {
47         struct spi_device               *spi;
48         const struct ad5446_chip_info   *chip_info;
49         struct regulator                *reg;
50         struct work_struct              poll_work;
51         unsigned short                  vref_mv;
52         unsigned                        cached_val;
53         unsigned                        pwr_down_mode;
54         unsigned                        pwr_down;
55         struct spi_transfer             xfer;
56         struct spi_message              msg;
57         union {
58                 unsigned short          d16;
59                 unsigned char           d24[3];
60         } data;
61 };
62
63 /**
64  * struct ad5446_chip_info - chip specific information
65  * @bits:               accuracy of the DAC in bits
66  * @storagebits:        number of bits written to the DAC
67  * @left_shift:         number of bits the datum must be shifted
68  * @int_vref_mv:        AD5620/40/60: the internal reference voltage
69  * @store_sample:       chip specific helper function to store the datum
70  * @store_sample:       chip specific helper function to store the powerpown cmd
71  */
72
73 struct ad5446_chip_info {
74         u8                      bits;
75         u8                      storagebits;
76         u8                      left_shift;
77         u16                     int_vref_mv;
78         void (*store_sample)    (struct ad5446_state *st, unsigned val);
79         void (*store_pwr_down)  (struct ad5446_state *st, unsigned mode);
80 };
81
82 /**
83  * ad5446_supported_device_ids:
84  * The AD5620/40/60 parts are available in different fixed internal reference
85  * voltage options. The actual part numbers may look differently
86  * (and a bit cryptic), however this style is used to make clear which
87  * parts are supported here.
88  */
89
90 enum ad5446_supported_device_ids {
91         ID_AD5444,
92         ID_AD5446,
93         ID_AD5541A,
94         ID_AD5542A,
95         ID_AD5543,
96         ID_AD5512A,
97         ID_AD5553,
98         ID_AD5601,
99         ID_AD5611,
100         ID_AD5621,
101         ID_AD5620_2500,
102         ID_AD5620_1250,
103         ID_AD5640_2500,
104         ID_AD5640_1250,
105         ID_AD5660_2500,
106         ID_AD5660_1250,
107 };
108
109 #endif /* IIO_DAC_AD5446_H_ */