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_ */
104