forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/iio/dac/ad5755.c
....@@ -1,9 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * AD5755, AD5755-1, AD5757, AD5735, AD5737 Digital to analog converters driver
34 *
45 * Copyright 2012 Analog Devices Inc.
5
- *
6
- * Licensed under the GPL-2.
76 */
87
98 #include <linux/device.h>
....@@ -83,6 +82,7 @@
8382 * @pwr_down: bitmask which contains hether a channel is powered down or not
8483 * @ctrl: software shadow of the channel ctrl registers
8584 * @channels: iio channel spec for the device
85
+ * @lock: lock to protect the data buffer during SPI ops
8686 * @data: spi transfer buffers
8787 */
8888 struct ad5755_state {
....@@ -91,6 +91,7 @@
9191 unsigned int pwr_down;
9292 unsigned int ctrl[AD5755_NUM_CHANNELS];
9393 struct iio_chan_spec channels[AD5755_NUM_CHANNELS];
94
+ struct mutex lock;
9495
9596 /*
9697 * DMA (thus cache coherency maintenance) requires the
....@@ -175,11 +176,12 @@
175176 static int ad5755_write(struct iio_dev *indio_dev, unsigned int reg,
176177 unsigned int val)
177178 {
179
+ struct ad5755_state *st = iio_priv(indio_dev);
178180 int ret;
179181
180
- mutex_lock(&indio_dev->mlock);
182
+ mutex_lock(&st->lock);
181183 ret = ad5755_write_unlocked(indio_dev, reg, val);
182
- mutex_unlock(&indio_dev->mlock);
184
+ mutex_unlock(&st->lock);
183185
184186 return ret;
185187 }
....@@ -187,11 +189,12 @@
187189 static int ad5755_write_ctrl(struct iio_dev *indio_dev, unsigned int channel,
188190 unsigned int reg, unsigned int val)
189191 {
192
+ struct ad5755_state *st = iio_priv(indio_dev);
190193 int ret;
191194
192
- mutex_lock(&indio_dev->mlock);
195
+ mutex_lock(&st->lock);
193196 ret = ad5755_write_ctrl_unlocked(indio_dev, channel, reg, val);
194
- mutex_unlock(&indio_dev->mlock);
197
+ mutex_unlock(&st->lock);
195198
196199 return ret;
197200 }
....@@ -212,7 +215,7 @@
212215 },
213216 };
214217
215
- mutex_lock(&indio_dev->mlock);
218
+ mutex_lock(&st->lock);
216219
217220 st->data[0].d32 = cpu_to_be32(AD5755_READ_FLAG | (addr << 16));
218221 st->data[1].d32 = cpu_to_be32(AD5755_NOOP);
....@@ -221,7 +224,7 @@
221224 if (ret >= 0)
222225 ret = be32_to_cpu(st->data[1].d32) & 0xffff;
223226
224
- mutex_unlock(&indio_dev->mlock);
227
+ mutex_unlock(&st->lock);
225228
226229 return ret;
227230 }
....@@ -247,7 +250,7 @@
247250 struct ad5755_state *st = iio_priv(indio_dev);
248251 unsigned int mask = BIT(channel);
249252
250
- mutex_lock(&indio_dev->mlock);
253
+ mutex_lock(&st->lock);
251254
252255 if ((bool)(st->pwr_down & mask) == pwr_down)
253256 goto out_unlock;
....@@ -267,7 +270,7 @@
267270 }
268271
269272 out_unlock:
270
- mutex_unlock(&indio_dev->mlock);
273
+ mutex_unlock(&st->lock);
271274
272275 return 0;
273276 }
....@@ -632,10 +635,9 @@
632635 }
633636 }
634637
635
- if (i == ARRAY_SIZE(ad5755_dcdc_freq_table)) {
638
+ if (i == ARRAY_SIZE(ad5755_dcdc_freq_table))
636639 dev_err(dev,
637
- "adi,dc-dc-freq out of range selecting 410kHz");
638
- }
640
+ "adi,dc-dc-freq out of range selecting 410kHz\n");
639641 }
640642
641643 pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
....@@ -646,17 +648,16 @@
646648 break;
647649 }
648650 }
649
- if (i == ARRAY_SIZE(ad5755_dcdc_maxv_table)) {
651
+ if (i == ARRAY_SIZE(ad5755_dcdc_maxv_table))
650652 dev_err(dev,
651
- "adi,dc-dc-maxv out of range selecting 23V");
652
- }
653
+ "adi,dc-dc-maxv out of range selecting 23V\n");
653654 }
654655
655656 devnr = 0;
656657 for_each_child_of_node(np, pp) {
657658 if (devnr >= AD5755_NUM_CHANNELS) {
658659 dev_err(dev,
659
- "There is to many channels defined in DT\n");
660
+ "There are too many channels defined in DT\n");
660661 goto error_out;
661662 }
662663
....@@ -682,11 +683,10 @@
682683 break;
683684 }
684685 }
685
- if (i == ARRAY_SIZE(ad5755_slew_rate_table)) {
686
+ if (i == ARRAY_SIZE(ad5755_slew_rate_table))
686687 dev_err(dev,
687
- "channel %d slew rate out of range selecting 64kHz",
688
+ "channel %d slew rate out of range selecting 64kHz\n",
688689 devnr);
689
- }
690690
691691 pdata->dac[devnr].slew.step_size = AD5755_SLEW_STEP_SIZE_1;
692692 for (i = 0; i < ARRAY_SIZE(ad5755_slew_step_table); i++) {
....@@ -696,11 +696,10 @@
696696 break;
697697 }
698698 }
699
- if (i == ARRAY_SIZE(ad5755_slew_step_table)) {
699
+ if (i == ARRAY_SIZE(ad5755_slew_step_table))
700700 dev_err(dev,
701
- "channel %d slew step size out of range selecting 1 LSB",
701
+ "channel %d slew step size out of range selecting 1 LSB\n",
702702 devnr);
703
- }
704703 } else {
705704 pdata->dac[devnr].slew.enable = false;
706705 pdata->dac[devnr].slew.rate = AD5755_SLEW_RATE_64k;
....@@ -745,12 +744,13 @@
745744 st->spi = spi;
746745 st->pwr_down = 0xf;
747746
748
- indio_dev->dev.parent = &spi->dev;
749747 indio_dev->name = spi_get_device_id(spi)->name;
750748 indio_dev->info = &ad5755_info;
751749 indio_dev->modes = INDIO_DIRECT_MODE;
752750 indio_dev->num_channels = AD5755_NUM_CHANNELS;
753751
752
+ mutex_init(&st->lock);
753
+
754754 if (spi->dev.of_node)
755755 pdata = ad5755_parse_dt(&spi->dev);
756756 else