GNU Linux-libre 4.19.295-gnu1
[releases.git] / drivers / iio / dac / ti-dac082s085.c
1 /*
2  * ti-dac082s085.c - Texas Instruments 8/10/12-bit 2/4-channel DAC driver
3  *
4  * Copyright (C) 2017 KUNBUS GmbH
5  *
6  * http://www.ti.com/lit/ds/symlink/dac082s085.pdf
7  * http://www.ti.com/lit/ds/symlink/dac102s085.pdf
8  * http://www.ti.com/lit/ds/symlink/dac122s085.pdf
9  * http://www.ti.com/lit/ds/symlink/dac084s085.pdf
10  * http://www.ti.com/lit/ds/symlink/dac104s085.pdf
11  * http://www.ti.com/lit/ds/symlink/dac124s085.pdf
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License (version 2) as
15  * published by the Free Software Foundation.
16  */
17
18 #include <linux/iio/iio.h>
19 #include <linux/module.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/spi/spi.h>
22
23 enum { dual_8bit, dual_10bit, dual_12bit, quad_8bit, quad_10bit, quad_12bit };
24
25 struct ti_dac_spec {
26         u8 num_channels;
27         u8 resolution;
28 };
29
30 static const struct ti_dac_spec ti_dac_spec[] = {
31         [dual_8bit]  = { .num_channels = 2, .resolution = 8  },
32         [dual_10bit] = { .num_channels = 2, .resolution = 10 },
33         [dual_12bit] = { .num_channels = 2, .resolution = 12 },
34         [quad_8bit]  = { .num_channels = 4, .resolution = 8  },
35         [quad_10bit] = { .num_channels = 4, .resolution = 10 },
36         [quad_12bit] = { .num_channels = 4, .resolution = 12 },
37 };
38
39 /**
40  * struct ti_dac_chip - TI DAC chip
41  * @lock: protects write sequences
42  * @vref: regulator generating Vref
43  * @mesg: SPI message to perform a write
44  * @xfer: SPI transfer used by @mesg
45  * @val: cached value of each output
46  * @powerdown: whether the chip is powered down
47  * @powerdown_mode: selected by the user
48  * @resolution: resolution of the chip
49  * @buf: buffer for @xfer
50  */
51 struct ti_dac_chip {
52         struct mutex lock;
53         struct regulator *vref;
54         struct spi_message mesg;
55         struct spi_transfer xfer;
56         u16 val[4];
57         bool powerdown;
58         u8 powerdown_mode;
59         u8 resolution;
60         u8 buf[2] ____cacheline_aligned;
61 };
62
63 #define WRITE_NOT_UPDATE(chan)  (0x00 | (chan) << 6)
64 #define WRITE_AND_UPDATE(chan)  (0x10 | (chan) << 6)
65 #define WRITE_ALL_UPDATE         0x20
66 #define POWERDOWN(mode)         (0x30 | ((mode) + 1) << 6)
67
68 static int ti_dac_cmd(struct ti_dac_chip *ti_dac, u8 cmd, u16 val)
69 {
70         u8 shift = 12 - ti_dac->resolution;
71
72         ti_dac->buf[0] = cmd | (val >> (8 - shift));
73         ti_dac->buf[1] = (val << shift) & 0xff;
74         return spi_sync(ti_dac->mesg.spi, &ti_dac->mesg);
75 }
76
77 static const char * const ti_dac_powerdown_modes[] = {
78         "2.5kohm_to_gnd", "100kohm_to_gnd", "three_state",
79 };
80
81 static int ti_dac_get_powerdown_mode(struct iio_dev *indio_dev,
82                                      const struct iio_chan_spec *chan)
83 {
84         struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
85
86         return ti_dac->powerdown_mode;
87 }
88
89 static int ti_dac_set_powerdown_mode(struct iio_dev *indio_dev,
90                                      const struct iio_chan_spec *chan,
91                                      unsigned int mode)
92 {
93         struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
94         int ret = 0;
95
96         if (ti_dac->powerdown_mode == mode)
97                 return 0;
98
99         mutex_lock(&ti_dac->lock);
100         if (ti_dac->powerdown) {
101                 ret = ti_dac_cmd(ti_dac, POWERDOWN(mode), 0);
102                 if (ret)
103                         goto out;
104         }
105         ti_dac->powerdown_mode = mode;
106
107 out:
108         mutex_unlock(&ti_dac->lock);
109         return ret;
110 }
111
112 static const struct iio_enum ti_dac_powerdown_mode = {
113         .items = ti_dac_powerdown_modes,
114         .num_items = ARRAY_SIZE(ti_dac_powerdown_modes),
115         .get = ti_dac_get_powerdown_mode,
116         .set = ti_dac_set_powerdown_mode,
117 };
118
119 static ssize_t ti_dac_read_powerdown(struct iio_dev *indio_dev,
120                                      uintptr_t private,
121                                      const struct iio_chan_spec *chan,
122                                      char *buf)
123 {
124         struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
125
126         return sprintf(buf, "%d\n", ti_dac->powerdown);
127 }
128
129 static ssize_t ti_dac_write_powerdown(struct iio_dev *indio_dev,
130                                       uintptr_t private,
131                                       const struct iio_chan_spec *chan,
132                                       const char *buf, size_t len)
133 {
134         struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
135         bool powerdown;
136         int ret;
137
138         ret = strtobool(buf, &powerdown);
139         if (ret)
140                 return ret;
141
142         if (ti_dac->powerdown == powerdown)
143                 return len;
144
145         mutex_lock(&ti_dac->lock);
146         if (powerdown)
147                 ret = ti_dac_cmd(ti_dac, POWERDOWN(ti_dac->powerdown_mode), 0);
148         else
149                 ret = ti_dac_cmd(ti_dac, WRITE_AND_UPDATE(0), ti_dac->val[0]);
150         if (!ret)
151                 ti_dac->powerdown = powerdown;
152         mutex_unlock(&ti_dac->lock);
153
154         return ret ? ret : len;
155 }
156
157 static const struct iio_chan_spec_ext_info ti_dac_ext_info[] = {
158         {
159                 .name      = "powerdown",
160                 .read      = ti_dac_read_powerdown,
161                 .write     = ti_dac_write_powerdown,
162                 .shared    = IIO_SHARED_BY_TYPE,
163         },
164         IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE, &ti_dac_powerdown_mode),
165         IIO_ENUM_AVAILABLE("powerdown_mode", &ti_dac_powerdown_mode),
166         { },
167 };
168
169 #define TI_DAC_CHANNEL(chan) {                                  \
170         .type = IIO_VOLTAGE,                                    \
171         .channel = (chan),                                      \
172         .address = (chan),                                      \
173         .indexed = true,                                        \
174         .output = true,                                         \
175         .datasheet_name = (const char[]){ 'A' + (chan), 0 },    \
176         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),           \
177         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),   \
178         .ext_info = ti_dac_ext_info,                            \
179 }
180
181 static const struct iio_chan_spec ti_dac_channels[] = {
182         TI_DAC_CHANNEL(0),
183         TI_DAC_CHANNEL(1),
184         TI_DAC_CHANNEL(2),
185         TI_DAC_CHANNEL(3),
186 };
187
188 static int ti_dac_read_raw(struct iio_dev *indio_dev,
189                            struct iio_chan_spec const *chan,
190                            int *val, int *val2, long mask)
191 {
192         struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
193         int ret;
194
195         switch (mask) {
196         case IIO_CHAN_INFO_RAW:
197                 *val = ti_dac->val[chan->channel];
198                 ret = IIO_VAL_INT;
199                 break;
200
201         case IIO_CHAN_INFO_SCALE:
202                 ret = regulator_get_voltage(ti_dac->vref);
203                 if (ret < 0)
204                         return ret;
205
206                 *val = ret / 1000;
207                 *val2 = ti_dac->resolution;
208                 ret = IIO_VAL_FRACTIONAL_LOG2;
209                 break;
210
211         default:
212                 ret = -EINVAL;
213         }
214
215         return ret;
216 }
217
218 static int ti_dac_write_raw(struct iio_dev *indio_dev,
219                             struct iio_chan_spec const *chan,
220                             int val, int val2, long mask)
221 {
222         struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
223         int ret;
224
225         switch (mask) {
226         case IIO_CHAN_INFO_RAW:
227                 if (ti_dac->val[chan->channel] == val)
228                         return 0;
229
230                 if (val >= (1 << ti_dac->resolution) || val < 0)
231                         return -EINVAL;
232
233                 if (ti_dac->powerdown)
234                         return -EBUSY;
235
236                 mutex_lock(&ti_dac->lock);
237                 ret = ti_dac_cmd(ti_dac, WRITE_AND_UPDATE(chan->channel), val);
238                 if (!ret)
239                         ti_dac->val[chan->channel] = val;
240                 mutex_unlock(&ti_dac->lock);
241                 break;
242
243         default:
244                 ret = -EINVAL;
245         }
246
247         return ret;
248 }
249
250 static int ti_dac_write_raw_get_fmt(struct iio_dev *indio_dev,
251                                     struct iio_chan_spec const *chan, long mask)
252 {
253         return IIO_VAL_INT;
254 }
255
256 static const struct iio_info ti_dac_info = {
257         .read_raw          = ti_dac_read_raw,
258         .write_raw         = ti_dac_write_raw,
259         .write_raw_get_fmt = ti_dac_write_raw_get_fmt,
260 };
261
262 static int ti_dac_probe(struct spi_device *spi)
263 {
264         struct device *dev = &spi->dev;
265         const struct ti_dac_spec *spec;
266         struct ti_dac_chip *ti_dac;
267         struct iio_dev *indio_dev;
268         int ret;
269
270         indio_dev = devm_iio_device_alloc(dev, sizeof(*ti_dac));
271         if (!indio_dev)
272                 return -ENOMEM;
273
274         indio_dev->dev.parent = dev;
275         indio_dev->info = &ti_dac_info;
276         indio_dev->name = spi->modalias;
277         indio_dev->modes = INDIO_DIRECT_MODE;
278         indio_dev->channels = ti_dac_channels;
279         spi_set_drvdata(spi, indio_dev);
280
281         ti_dac = iio_priv(indio_dev);
282         ti_dac->xfer.tx_buf = &ti_dac->buf;
283         ti_dac->xfer.len = sizeof(ti_dac->buf);
284         spi_message_init_with_transfers(&ti_dac->mesg, &ti_dac->xfer, 1);
285         ti_dac->mesg.spi = spi;
286
287         spec = &ti_dac_spec[spi_get_device_id(spi)->driver_data];
288         indio_dev->num_channels = spec->num_channels;
289         ti_dac->resolution = spec->resolution;
290
291         ti_dac->vref = devm_regulator_get(dev, "vref");
292         if (IS_ERR(ti_dac->vref))
293                 return PTR_ERR(ti_dac->vref);
294
295         ret = regulator_enable(ti_dac->vref);
296         if (ret < 0)
297                 return ret;
298
299         mutex_init(&ti_dac->lock);
300
301         ret = ti_dac_cmd(ti_dac, WRITE_ALL_UPDATE, 0);
302         if (ret) {
303                 dev_err(dev, "failed to initialize outputs to 0\n");
304                 goto err;
305         }
306
307         ret = iio_device_register(indio_dev);
308         if (ret)
309                 goto err;
310
311         return 0;
312
313 err:
314         mutex_destroy(&ti_dac->lock);
315         regulator_disable(ti_dac->vref);
316         return ret;
317 }
318
319 static int ti_dac_remove(struct spi_device *spi)
320 {
321         struct iio_dev *indio_dev = spi_get_drvdata(spi);
322         struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
323
324         iio_device_unregister(indio_dev);
325         mutex_destroy(&ti_dac->lock);
326         regulator_disable(ti_dac->vref);
327
328         return 0;
329 }
330
331 #ifdef CONFIG_OF
332 static const struct of_device_id ti_dac_of_id[] = {
333         { .compatible = "ti,dac082s085" },
334         { .compatible = "ti,dac102s085" },
335         { .compatible = "ti,dac122s085" },
336         { .compatible = "ti,dac084s085" },
337         { .compatible = "ti,dac104s085" },
338         { .compatible = "ti,dac124s085" },
339         { }
340 };
341 MODULE_DEVICE_TABLE(of, ti_dac_of_id);
342 #endif
343
344 static const struct spi_device_id ti_dac_spi_id[] = {
345         { "dac082s085", dual_8bit  },
346         { "dac102s085", dual_10bit },
347         { "dac122s085", dual_12bit },
348         { "dac084s085", quad_8bit  },
349         { "dac104s085", quad_10bit },
350         { "dac124s085", quad_12bit },
351         { }
352 };
353 MODULE_DEVICE_TABLE(spi, ti_dac_spi_id);
354
355 static struct spi_driver ti_dac_driver = {
356         .driver = {
357                 .name           = "ti-dac082s085",
358                 .of_match_table = of_match_ptr(ti_dac_of_id),
359         },
360         .probe    = ti_dac_probe,
361         .remove   = ti_dac_remove,
362         .id_table = ti_dac_spi_id,
363 };
364 module_spi_driver(ti_dac_driver);
365
366 MODULE_AUTHOR("Lukas Wunner <lukas@wunner.de>");
367 MODULE_DESCRIPTION("Texas Instruments 8/10/12-bit 2/4-channel DAC driver");
368 MODULE_LICENSE("GPL v2");