hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/drivers/iio/dac/ti-dac5571.c
....@@ -1,28 +1,24 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * ti-dac5571.c - Texas Instruments 8/10/12-bit 1/4-channel DAC driver
34 *
45 * Copyright (C) 2018 Prevas A/S
56 *
6
- * http://www.ti.com/lit/ds/symlink/dac5571.pdf
7
- * http://www.ti.com/lit/ds/symlink/dac6571.pdf
8
- * http://www.ti.com/lit/ds/symlink/dac7571.pdf
9
- * http://www.ti.com/lit/ds/symlink/dac5574.pdf
10
- * http://www.ti.com/lit/ds/symlink/dac6574.pdf
11
- * http://www.ti.com/lit/ds/symlink/dac7574.pdf
12
- * http://www.ti.com/lit/ds/symlink/dac5573.pdf
13
- * http://www.ti.com/lit/ds/symlink/dac6573.pdf
14
- * http://www.ti.com/lit/ds/symlink/dac7573.pdf
15
- *
16
- * This program is free software; you can redistribute it and/or modify
17
- * it under the terms of the GNU General Public License (version 2) as
18
- * published by the Free Software Foundation.
7
+ * https://www.ti.com/lit/ds/symlink/dac5571.pdf
8
+ * https://www.ti.com/lit/ds/symlink/dac6571.pdf
9
+ * https://www.ti.com/lit/ds/symlink/dac7571.pdf
10
+ * https://www.ti.com/lit/ds/symlink/dac5574.pdf
11
+ * https://www.ti.com/lit/ds/symlink/dac6574.pdf
12
+ * https://www.ti.com/lit/ds/symlink/dac7574.pdf
13
+ * https://www.ti.com/lit/ds/symlink/dac5573.pdf
14
+ * https://www.ti.com/lit/ds/symlink/dac6573.pdf
15
+ * https://www.ti.com/lit/ds/symlink/dac7573.pdf
1916 */
2017
2118 #include <linux/iio/iio.h>
2219 #include <linux/i2c.h>
2320 #include <linux/module.h>
24
-#include <linux/of_device.h>
25
-#include <linux/of.h>
21
+#include <linux/mod_devicetable.h>
2622 #include <linux/regulator/consumer.h>
2723
2824 enum chip_id {
....@@ -50,8 +46,8 @@
5046 struct mutex lock;
5147 struct regulator *vref;
5248 u16 val[4];
53
- bool powerdown;
54
- u8 powerdown_mode;
49
+ bool powerdown[4];
50
+ u8 powerdown_mode[4];
5551 struct dac5571_spec const *spec;
5652 int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
5753 int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
....@@ -128,7 +124,7 @@
128124 {
129125 struct dac5571_data *data = iio_priv(indio_dev);
130126
131
- return data->powerdown_mode;
127
+ return data->powerdown_mode[chan->channel];
132128 }
133129
134130 static int dac5571_set_powerdown_mode(struct iio_dev *indio_dev,
....@@ -138,17 +134,17 @@
138134 struct dac5571_data *data = iio_priv(indio_dev);
139135 int ret = 0;
140136
141
- if (data->powerdown_mode == mode)
137
+ if (data->powerdown_mode[chan->channel] == mode)
142138 return 0;
143139
144140 mutex_lock(&data->lock);
145
- if (data->powerdown) {
141
+ if (data->powerdown[chan->channel]) {
146142 ret = data->dac5571_pwrdwn(data, chan->channel,
147143 DAC5571_POWERDOWN(mode));
148144 if (ret)
149145 goto out;
150146 }
151
- data->powerdown_mode = mode;
147
+ data->powerdown_mode[chan->channel] = mode;
152148
153149 out:
154150 mutex_unlock(&data->lock);
....@@ -170,7 +166,7 @@
170166 {
171167 struct dac5571_data *data = iio_priv(indio_dev);
172168
173
- return sprintf(buf, "%d\n", data->powerdown);
169
+ return sprintf(buf, "%d\n", data->powerdown[chan->channel]);
174170 }
175171
176172 static ssize_t dac5571_write_powerdown(struct iio_dev *indio_dev,
....@@ -186,19 +182,20 @@
186182 if (ret)
187183 return ret;
188184
189
- if (data->powerdown == powerdown)
185
+ if (data->powerdown[chan->channel] == powerdown)
190186 return len;
191187
192188 mutex_lock(&data->lock);
193189 if (powerdown)
194190 ret = data->dac5571_pwrdwn(data, chan->channel,
195
- DAC5571_POWERDOWN(data->powerdown_mode));
191
+ DAC5571_POWERDOWN(data->powerdown_mode[chan->channel]));
196192 else
197
- ret = data->dac5571_cmd(data, chan->channel, data->val[0]);
193
+ ret = data->dac5571_cmd(data, chan->channel,
194
+ data->val[chan->channel]);
198195 if (ret)
199196 goto out;
200197
201
- data->powerdown = powerdown;
198
+ data->powerdown[chan->channel] = powerdown;
202199
203200 out:
204201 mutex_unlock(&data->lock);
....@@ -212,9 +209,9 @@
212209 .name = "powerdown",
213210 .read = dac5571_read_powerdown,
214211 .write = dac5571_write_powerdown,
215
- .shared = IIO_SHARED_BY_TYPE,
212
+ .shared = IIO_SEPARATE,
216213 },
217
- IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE, &dac5571_powerdown_mode),
214
+ IIO_ENUM("powerdown_mode", IIO_SEPARATE, &dac5571_powerdown_mode),
218215 IIO_ENUM_AVAILABLE("powerdown_mode", &dac5571_powerdown_mode),
219216 {},
220217 };
....@@ -279,7 +276,7 @@
279276 if (val >= (1 << data->spec->resolution) || val < 0)
280277 return -EINVAL;
281278
282
- if (data->powerdown)
279
+ if (data->powerdown[chan->channel])
283280 return -EBUSY;
284281
285282 mutex_lock(&data->lock);
....@@ -324,8 +321,6 @@
324321 i2c_set_clientdata(client, indio_dev);
325322 data->client = client;
326323
327
- indio_dev->dev.parent = dev;
328
- indio_dev->dev.of_node = client->dev.of_node;
329324 indio_dev->info = &dac5571_info;
330325 indio_dev->name = id->name;
331326 indio_dev->modes = INDIO_DIRECT_MODE;
....@@ -389,7 +384,6 @@
389384 return 0;
390385 }
391386
392
-#ifdef CONFIG_OF
393387 static const struct of_device_id dac5571_of_id[] = {
394388 {.compatible = "ti,dac5571"},
395389 {.compatible = "ti,dac6571"},
....@@ -403,7 +397,6 @@
403397 {}
404398 };
405399 MODULE_DEVICE_TABLE(of, dac5571_of_id);
406
-#endif
407400
408401 static const struct i2c_device_id dac5571_id[] = {
409402 {"dac5571", single_8bit},
....@@ -422,6 +415,7 @@
422415 static struct i2c_driver dac5571_driver = {
423416 .driver = {
424417 .name = "ti-dac5571",
418
+ .of_match_table = dac5571_of_id,
425419 },
426420 .probe = dac5571_probe,
427421 .remove = dac5571_remove,
....@@ -429,6 +423,6 @@
429423 };
430424 module_i2c_driver(dac5571_driver);
431425
432
-MODULE_AUTHOR("Sean Nyekjaer <sean.nyekjaer@prevas.dk>");
426
+MODULE_AUTHOR("Sean Nyekjaer <sean@geanix.dk>");
433427 MODULE_DESCRIPTION("Texas Instruments 8/10/12-bit 1/4-channel DAC driver");
434428 MODULE_LICENSE("GPL v2");