Merge tag 'ceph-for-4.9-rc1' of git://github.com/ceph/ceph-client
[cascardo/linux.git] / drivers / iio / dac / ad8801.c
1 /*
2  * IIO DAC driver for Analog Devices AD8801 DAC
3  *
4  * Copyright (C) 2016 Gwenhael Goavec-Merou
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License, version 2, as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  */
15
16 #include <linux/iio/iio.h>
17 #include <linux/module.h>
18 #include <linux/regulator/consumer.h>
19 #include <linux/spi/spi.h>
20 #include <linux/sysfs.h>
21
22 #define AD8801_CFG_ADDR_OFFSET 8
23
24 enum ad8801_device_ids {
25         ID_AD8801,
26         ID_AD8803,
27 };
28
29 struct ad8801_state {
30         struct spi_device *spi;
31         unsigned char dac_cache[8]; /* Value write on each channel */
32         unsigned int vrefh_mv;
33         unsigned int vrefl_mv;
34         struct regulator *vrefh_reg;
35         struct regulator *vrefl_reg;
36
37         __be16 data ____cacheline_aligned;
38 };
39
40 static int ad8801_spi_write(struct ad8801_state *state,
41         u8 channel, unsigned char value)
42 {
43         state->data = cpu_to_be16((channel << AD8801_CFG_ADDR_OFFSET) | value);
44         return spi_write(state->spi, &state->data, sizeof(state->data));
45 }
46
47 static int ad8801_write_raw(struct iio_dev *indio_dev,
48         struct iio_chan_spec const *chan, int val, int val2, long mask)
49 {
50         struct ad8801_state *state = iio_priv(indio_dev);
51         int ret;
52
53         switch (mask) {
54         case IIO_CHAN_INFO_RAW:
55                 if (val >= 256 || val < 0)
56                         return -EINVAL;
57
58                 ret = ad8801_spi_write(state, chan->channel, val);
59                 if (ret == 0)
60                         state->dac_cache[chan->channel] = val;
61                 break;
62         default:
63                 ret = -EINVAL;
64         }
65
66         return ret;
67 }
68
69 static int ad8801_read_raw(struct iio_dev *indio_dev,
70         struct iio_chan_spec const *chan, int *val, int *val2, long info)
71 {
72         struct ad8801_state *state = iio_priv(indio_dev);
73
74         switch (info) {
75         case IIO_CHAN_INFO_RAW:
76                 *val = state->dac_cache[chan->channel];
77                 return IIO_VAL_INT;
78         case IIO_CHAN_INFO_SCALE:
79                 *val = state->vrefh_mv - state->vrefl_mv;
80                 *val2 = 8;
81                 return IIO_VAL_FRACTIONAL_LOG2;
82         case IIO_CHAN_INFO_OFFSET:
83                 *val = state->vrefl_mv;
84                 return IIO_VAL_INT;
85         default:
86                 return -EINVAL;
87         }
88
89         return -EINVAL;
90 }
91
92 static const struct iio_info ad8801_info = {
93         .read_raw = ad8801_read_raw,
94         .write_raw = ad8801_write_raw,
95         .driver_module = THIS_MODULE,
96 };
97
98 #define AD8801_CHANNEL(chan) {          \
99         .type = IIO_VOLTAGE,                    \
100         .indexed = 1,                           \
101         .output = 1,                            \
102         .channel = chan,                        \
103         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
104         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  \
105                 BIT(IIO_CHAN_INFO_OFFSET), \
106 }
107
108 static const struct iio_chan_spec ad8801_channels[] = {
109         AD8801_CHANNEL(0),
110         AD8801_CHANNEL(1),
111         AD8801_CHANNEL(2),
112         AD8801_CHANNEL(3),
113         AD8801_CHANNEL(4),
114         AD8801_CHANNEL(5),
115         AD8801_CHANNEL(6),
116         AD8801_CHANNEL(7),
117 };
118
119 static int ad8801_probe(struct spi_device *spi)
120 {
121         struct iio_dev *indio_dev;
122         struct ad8801_state *state;
123         const struct spi_device_id *id;
124         int ret;
125
126         indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*state));
127         if (indio_dev == NULL)
128                 return -ENOMEM;
129
130         state = iio_priv(indio_dev);
131         state->spi = spi;
132         id = spi_get_device_id(spi);
133
134         state->vrefh_reg = devm_regulator_get(&spi->dev, "vrefh");
135         if (IS_ERR(state->vrefh_reg)) {
136                 dev_err(&spi->dev, "Vrefh regulator not specified\n");
137                 return PTR_ERR(state->vrefh_reg);
138         }
139
140         ret = regulator_enable(state->vrefh_reg);
141         if (ret) {
142                 dev_err(&spi->dev, "Failed to enable vrefh regulator: %d\n",
143                                 ret);
144                 return ret;
145         }
146
147         ret = regulator_get_voltage(state->vrefh_reg);
148         if (ret < 0) {
149                 dev_err(&spi->dev, "Failed to read vrefh regulator: %d\n",
150                                 ret);
151                 goto error_disable_vrefh_reg;
152         }
153         state->vrefh_mv = ret / 1000;
154
155         if (id->driver_data == ID_AD8803) {
156                 state->vrefl_reg = devm_regulator_get(&spi->dev, "vrefl");
157                 if (IS_ERR(state->vrefl_reg)) {
158                         dev_err(&spi->dev, "Vrefl regulator not specified\n");
159                         ret = PTR_ERR(state->vrefl_reg);
160                         goto error_disable_vrefh_reg;
161                 }
162
163                 ret = regulator_enable(state->vrefl_reg);
164                 if (ret) {
165                         dev_err(&spi->dev, "Failed to enable vrefl regulator: %d\n",
166                                         ret);
167                         goto error_disable_vrefh_reg;
168                 }
169
170                 ret = regulator_get_voltage(state->vrefl_reg);
171                 if (ret < 0) {
172                         dev_err(&spi->dev, "Failed to read vrefl regulator: %d\n",
173                                         ret);
174                         goto error_disable_vrefl_reg;
175                 }
176                 state->vrefl_mv = ret / 1000;
177         } else {
178                 state->vrefl_mv = 0;
179                 state->vrefl_reg = NULL;
180         }
181
182         spi_set_drvdata(spi, indio_dev);
183         indio_dev->dev.parent = &spi->dev;
184         indio_dev->info = &ad8801_info;
185         indio_dev->modes = INDIO_DIRECT_MODE;
186         indio_dev->channels = ad8801_channels;
187         indio_dev->num_channels = ARRAY_SIZE(ad8801_channels);
188         indio_dev->name = id->name;
189
190         ret = iio_device_register(indio_dev);
191         if (ret) {
192                 dev_err(&spi->dev, "Failed to register iio device: %d\n",
193                                 ret);
194                 goto error_disable_vrefl_reg;
195         }
196
197         return 0;
198
199 error_disable_vrefl_reg:
200         if (state->vrefl_reg)
201                 regulator_disable(state->vrefl_reg);
202 error_disable_vrefh_reg:
203         regulator_disable(state->vrefh_reg);
204         return ret;
205 }
206
207 static int ad8801_remove(struct spi_device *spi)
208 {
209         struct iio_dev *indio_dev = spi_get_drvdata(spi);
210         struct ad8801_state *state = iio_priv(indio_dev);
211
212         iio_device_unregister(indio_dev);
213         if (state->vrefl_reg)
214                 regulator_disable(state->vrefl_reg);
215         regulator_disable(state->vrefh_reg);
216
217         return 0;
218 }
219
220 static const struct spi_device_id ad8801_ids[] = {
221         {"ad8801", ID_AD8801},
222         {"ad8803", ID_AD8803},
223         {}
224 };
225 MODULE_DEVICE_TABLE(spi, ad8801_ids);
226
227 static struct spi_driver ad8801_driver = {
228         .driver = {
229                 .name   = "ad8801",
230         },
231         .probe          = ad8801_probe,
232         .remove         = ad8801_remove,
233         .id_table       = ad8801_ids,
234 };
235 module_spi_driver(ad8801_driver);
236
237 MODULE_AUTHOR("Gwenhael Goavec-Merou <gwenhael.goavec-merou@trabucayre.com>");
238 MODULE_DESCRIPTION("Analog Devices AD8801/AD8803 DAC");
239 MODULE_LICENSE("GPL v2");