forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/iio/adc/ad_sigma_delta.c
....@@ -1,10 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Support code for Analog Devices Sigma-Delta ADCs
34 *
45 * Copyright 2012 Analog Devices Inc.
56 * Author: Lars-Peter Clausen <lars@metafoo.de>
6
- *
7
- * Licensed under the GPL-2.
87 */
98
109 #include <linux/interrupt.h>
....@@ -58,7 +57,7 @@
5857 int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
5958 unsigned int size, unsigned int val)
6059 {
61
- uint8_t *data = sigma_delta->data;
60
+ uint8_t *data = sigma_delta->tx_buf;
6261 struct spi_transfer t = {
6362 .tx_buf = data,
6463 .len = size + 1,
....@@ -71,9 +70,7 @@
7170
7271 switch (size) {
7372 case 3:
74
- data[1] = val >> 16;
75
- data[2] = val >> 8;
76
- data[3] = val;
73
+ put_unaligned_be24(val, &data[1]);
7774 break;
7875 case 2:
7976 put_unaligned_be16(val, &data[1]);
....@@ -102,7 +99,7 @@
10299 static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta,
103100 unsigned int reg, unsigned int size, uint8_t *val)
104101 {
105
- uint8_t *data = sigma_delta->data;
102
+ uint8_t *data = sigma_delta->tx_buf;
106103 int ret;
107104 struct spi_transfer t[] = {
108105 {
....@@ -149,24 +146,22 @@
149146 {
150147 int ret;
151148
152
- ret = ad_sd_read_reg_raw(sigma_delta, reg, size, sigma_delta->data);
149
+ ret = ad_sd_read_reg_raw(sigma_delta, reg, size, sigma_delta->rx_buf);
153150 if (ret < 0)
154151 goto out;
155152
156153 switch (size) {
157154 case 4:
158
- *val = get_unaligned_be32(sigma_delta->data);
155
+ *val = get_unaligned_be32(sigma_delta->rx_buf);
159156 break;
160157 case 3:
161
- *val = (sigma_delta->data[0] << 16) |
162
- (sigma_delta->data[1] << 8) |
163
- sigma_delta->data[2];
158
+ *val = get_unaligned_be24(sigma_delta->rx_buf);
164159 break;
165160 case 2:
166
- *val = get_unaligned_be16(sigma_delta->data);
161
+ *val = get_unaligned_be16(sigma_delta->rx_buf);
167162 break;
168163 case 1:
169
- *val = sigma_delta->data[0];
164
+ *val = sigma_delta->rx_buf[0];
170165 break;
171166 default:
172167 ret = -EINVAL;
....@@ -206,7 +201,7 @@
206201 }
207202 EXPORT_SYMBOL_GPL(ad_sd_reset);
208203
209
-static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
204
+int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
210205 unsigned int mode, unsigned int channel)
211206 {
212207 int ret;
....@@ -243,6 +238,7 @@
243238
244239 return ret;
245240 }
241
+EXPORT_SYMBOL_GPL(ad_sd_calibrate);
246242
247243 /**
248244 * ad_sd_calibrate_all() - Performs channel calibration
....@@ -281,12 +277,13 @@
281277 {
282278 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
283279 unsigned int sample, raw_sample;
280
+ unsigned int data_reg;
284281 int ret = 0;
285282
286
- if (iio_buffer_enabled(indio_dev))
287
- return -EBUSY;
283
+ ret = iio_device_claim_direct_mode(indio_dev);
284
+ if (ret)
285
+ return ret;
288286
289
- mutex_lock(&indio_dev->mlock);
290287 ad_sigma_delta_set_channel(sigma_delta, chan->address);
291288
292289 spi_bus_lock(sigma_delta->spi->master);
....@@ -306,7 +303,12 @@
306303 if (ret < 0)
307304 goto out;
308305
309
- ret = ad_sd_read_reg(sigma_delta, AD_SD_REG_DATA,
306
+ if (sigma_delta->info->data_reg != 0)
307
+ data_reg = sigma_delta->info->data_reg;
308
+ else
309
+ data_reg = AD_SD_REG_DATA;
310
+
311
+ ret = ad_sd_read_reg(sigma_delta, data_reg,
310312 DIV_ROUND_UP(chan->scan_type.realbits + chan->scan_type.shift, 8),
311313 &raw_sample);
312314
....@@ -320,7 +322,7 @@
320322 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
321323 sigma_delta->bus_locked = false;
322324 spi_bus_unlock(sigma_delta->spi->master);
323
- mutex_unlock(&indio_dev->mlock);
325
+ iio_device_release_direct_mode(indio_dev);
324326
325327 if (ret)
326328 return ret;
....@@ -343,16 +345,12 @@
343345 unsigned int channel;
344346 int ret;
345347
346
- ret = iio_triggered_buffer_postenable(indio_dev);
347
- if (ret < 0)
348
- return ret;
349
-
350348 channel = find_first_bit(indio_dev->active_scan_mask,
351349 indio_dev->masklength);
352350 ret = ad_sigma_delta_set_channel(sigma_delta,
353351 indio_dev->channels[channel].address);
354352 if (ret)
355
- goto err_predisable;
353
+ return ret;
356354
357355 spi_bus_lock(sigma_delta->spi->master);
358356 sigma_delta->bus_locked = true;
....@@ -369,7 +367,6 @@
369367
370368 err_unlock:
371369 spi_bus_unlock(sigma_delta->spi->master);
372
-err_predisable:
373370
374371 return ret;
375372 }
....@@ -398,28 +395,29 @@
398395 struct iio_poll_func *pf = p;
399396 struct iio_dev *indio_dev = pf->indio_dev;
400397 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
398
+ uint8_t *data = sigma_delta->rx_buf;
401399 unsigned int reg_size;
402
- uint8_t data[16];
403
- int ret;
404
-
405
- memset(data, 0x00, 16);
400
+ unsigned int data_reg;
406401
407402 reg_size = indio_dev->channels[0].scan_type.realbits +
408403 indio_dev->channels[0].scan_type.shift;
409404 reg_size = DIV_ROUND_UP(reg_size, 8);
410405
406
+ if (sigma_delta->info->data_reg != 0)
407
+ data_reg = sigma_delta->info->data_reg;
408
+ else
409
+ data_reg = AD_SD_REG_DATA;
410
+
411411 switch (reg_size) {
412412 case 4:
413413 case 2:
414414 case 1:
415
- ret = ad_sd_read_reg_raw(sigma_delta, AD_SD_REG_DATA,
416
- reg_size, &data[0]);
415
+ ad_sd_read_reg_raw(sigma_delta, data_reg, reg_size, &data[0]);
417416 break;
418417 case 3:
419418 /* We store 24 bit samples in a 32 bit word. Keep the upper
420419 * byte set to zero. */
421
- ret = ad_sd_read_reg_raw(sigma_delta, AD_SD_REG_DATA,
422
- reg_size, &data[1]);
420
+ ad_sd_read_reg_raw(sigma_delta, data_reg, reg_size, &data[1]);
423421 break;
424422 }
425423
....@@ -434,7 +432,6 @@
434432
435433 static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = {
436434 .postenable = &ad_sd_buffer_postenable,
437
- .predisable = &iio_triggered_buffer_predisable,
438435 .postdisable = &ad_sd_buffer_postdisable,
439436 .validate_scan_mask = &iio_validate_scan_mask_onehot,
440437 };
....@@ -489,7 +486,7 @@
489486
490487 ret = request_irq(sigma_delta->spi->irq,
491488 ad_sd_data_rdy_trig_poll,
492
- IRQF_TRIGGER_LOW,
489
+ sigma_delta->info->irq_flags,
493490 indio_dev->name,
494491 sigma_delta);
495492 if (ret)