]> Pileus Git - ~andy/linux/blob - drivers/staging/iio/dac/ad5446.h
Merge tag 'rpmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[~andy/linux] / 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 MODE_PWRDWN_1k          0x1
29 #define MODE_PWRDWN_100k        0x2
30 #define MODE_PWRDWN_TRISTATE    0x3
31
32 /**
33  * struct ad5446_state - driver instance specific data
34  * @spi:                spi_device
35  * @chip_info:          chip model specific constants, available modes etc
36  * @reg:                supply regulator
37  * @poll_work:          bottom half of polling interrupt handler
38  * @vref_mv:            actual reference voltage used
39  * @xfer:               default spi transfer
40  * @msg:                default spi message
41  * @data:               spi transmit buffer
42  */
43
44 struct ad5446_state {
45         struct spi_device               *spi;
46         const struct ad5446_chip_info   *chip_info;
47         struct regulator                *reg;
48         struct work_struct              poll_work;
49         unsigned short                  vref_mv;
50         unsigned                        cached_val;
51         unsigned                        pwr_down_mode;
52         unsigned                        pwr_down;
53         struct spi_transfer             xfer;
54         struct spi_message              msg;
55         union {
56                 unsigned short          d16;
57                 unsigned char           d24[3];
58         } data;
59 };
60
61 /**
62  * struct ad5446_chip_info - chip specific information
63  * @channel:            channel spec for the DAC
64  * @int_vref_mv:        AD5620/40/60: the internal reference voltage
65  * @store_sample:       chip specific helper function to store the datum
66  * @store_sample:       chip specific helper function to store the powerpown cmd
67  */
68
69 struct ad5446_chip_info {
70         struct iio_chan_spec    channel;
71         u16                     int_vref_mv;
72         void (*store_sample)    (struct ad5446_state *st, unsigned val);
73         void (*store_pwr_down)  (struct ad5446_state *st, unsigned mode);
74 };
75
76 /**
77  * ad5446_supported_device_ids:
78  * The AD5620/40/60 parts are available in different fixed internal reference
79  * voltage options. The actual part numbers may look differently
80  * (and a bit cryptic), however this style is used to make clear which
81  * parts are supported here.
82  */
83
84 enum ad5446_supported_device_ids {
85         ID_AD5444,
86         ID_AD5446,
87         ID_AD5541A,
88         ID_AD5542A,
89         ID_AD5543,
90         ID_AD5512A,
91         ID_AD5553,
92         ID_AD5601,
93         ID_AD5611,
94         ID_AD5621,
95         ID_AD5620_2500,
96         ID_AD5620_1250,
97         ID_AD5640_2500,
98         ID_AD5640_1250,
99         ID_AD5660_2500,
100         ID_AD5660_1250,
101 };
102
103 #endif /* IIO_DAC_AD5446_H_ */