forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/iio/adc/ad7793.c
....@@ -1,9 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * AD7785/AD7792/AD7793/AD7794/AD7795 SPI ADC driver
34 *
45 * Copyright 2011-2012 Analog Devices Inc.
5
- *
6
- * Licensed under the GPL-2.
76 */
87
98 #include <linux/interrupt.h>
....@@ -207,6 +206,7 @@
207206 .has_registers = true,
208207 .addr_shift = 3,
209208 .read_mask = BIT(6),
209
+ .irq_flags = IRQF_TRIGGER_FALLING,
210210 };
211211
212212 static const struct ad_sd_calib_data ad7793_calib_arr[6] = {
....@@ -355,29 +355,28 @@
355355 static IIO_CONST_ATTR_NAMED(sampling_frequency_available_ad7797,
356356 sampling_frequency_available, "123 62 50 33 17 16 12 10 8 6 4");
357357
358
-static ssize_t ad7793_show_scale_available(struct device *dev,
359
- struct device_attribute *attr, char *buf)
358
+static int ad7793_read_avail(struct iio_dev *indio_dev,
359
+ struct iio_chan_spec const *chan,
360
+ const int **vals, int *type, int *length,
361
+ long mask)
360362 {
361
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
362363 struct ad7793_state *st = iio_priv(indio_dev);
363
- int i, len = 0;
364364
365
- for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++)
366
- len += sprintf(buf + len, "%d.%09u ", st->scale_avail[i][0],
367
- st->scale_avail[i][1]);
365
+ switch (mask) {
366
+ case IIO_CHAN_INFO_SCALE:
367
+ *vals = (int *)st->scale_avail;
368
+ *type = IIO_VAL_INT_PLUS_NANO;
369
+ /* Values are stored in a 2D matrix */
370
+ *length = ARRAY_SIZE(st->scale_avail) * 2;
368371
369
- len += sprintf(buf + len, "\n");
370
-
371
- return len;
372
+ return IIO_AVAIL_LIST;
373
+ default:
374
+ return -EINVAL;
375
+ }
372376 }
373
-
374
-static IIO_DEVICE_ATTR_NAMED(in_m_in_scale_available,
375
- in_voltage-voltage_scale_available, S_IRUGO,
376
- ad7793_show_scale_available, NULL, 0);
377377
378378 static struct attribute *ad7793_attributes[] = {
379379 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
380
- &iio_dev_attr_in_m_in_scale_available.dev_attr.attr,
381380 NULL
382381 };
383382
....@@ -535,6 +534,7 @@
535534 .read_raw = &ad7793_read_raw,
536535 .write_raw = &ad7793_write_raw,
537536 .write_raw_get_fmt = &ad7793_write_raw_get_fmt,
537
+ .read_avail = ad7793_read_avail,
538538 .attrs = &ad7793_attribute_group,
539539 .validate_trigger = ad_sd_validate_trigger,
540540 };
....@@ -547,47 +547,113 @@
547547 .validate_trigger = ad_sd_validate_trigger,
548548 };
549549
550
+#define __AD7793_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
551
+ _storagebits, _shift, _extend_name, _type, _mask_type_av, _mask_all) \
552
+ { \
553
+ .type = (_type), \
554
+ .differential = (_channel2 == -1 ? 0 : 1), \
555
+ .indexed = 1, \
556
+ .channel = (_channel1), \
557
+ .channel2 = (_channel2), \
558
+ .address = (_address), \
559
+ .extend_name = (_extend_name), \
560
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
561
+ BIT(IIO_CHAN_INFO_OFFSET), \
562
+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
563
+ .info_mask_shared_by_type_available = (_mask_type_av), \
564
+ .info_mask_shared_by_all = _mask_all, \
565
+ .scan_index = (_si), \
566
+ .scan_type = { \
567
+ .sign = 'u', \
568
+ .realbits = (_bits), \
569
+ .storagebits = (_storagebits), \
570
+ .shift = (_shift), \
571
+ .endianness = IIO_BE, \
572
+ }, \
573
+ }
574
+
575
+#define AD7793_DIFF_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
576
+ _storagebits, _shift) \
577
+ __AD7793_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
578
+ _storagebits, _shift, NULL, IIO_VOLTAGE, \
579
+ BIT(IIO_CHAN_INFO_SCALE), \
580
+ BIT(IIO_CHAN_INFO_SAMP_FREQ))
581
+
582
+#define AD7793_SHORTED_CHANNEL(_si, _channel, _address, _bits, \
583
+ _storagebits, _shift) \
584
+ __AD7793_CHANNEL(_si, _channel, _channel, _address, _bits, \
585
+ _storagebits, _shift, "shorted", IIO_VOLTAGE, \
586
+ BIT(IIO_CHAN_INFO_SCALE), \
587
+ BIT(IIO_CHAN_INFO_SAMP_FREQ))
588
+
589
+#define AD7793_TEMP_CHANNEL(_si, _address, _bits, _storagebits, _shift) \
590
+ __AD7793_CHANNEL(_si, 0, -1, _address, _bits, \
591
+ _storagebits, _shift, NULL, IIO_TEMP, \
592
+ 0, \
593
+ BIT(IIO_CHAN_INFO_SAMP_FREQ))
594
+
595
+#define AD7793_SUPPLY_CHANNEL(_si, _channel, _address, _bits, _storagebits, \
596
+ _shift) \
597
+ __AD7793_CHANNEL(_si, _channel, -1, _address, _bits, \
598
+ _storagebits, _shift, "supply", IIO_VOLTAGE, \
599
+ 0, \
600
+ BIT(IIO_CHAN_INFO_SAMP_FREQ))
601
+
602
+#define AD7797_DIFF_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
603
+ _storagebits, _shift) \
604
+ __AD7793_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
605
+ _storagebits, _shift, NULL, IIO_VOLTAGE, \
606
+ 0, \
607
+ BIT(IIO_CHAN_INFO_SAMP_FREQ))
608
+
609
+#define AD7797_SHORTED_CHANNEL(_si, _channel, _address, _bits, \
610
+ _storagebits, _shift) \
611
+ __AD7793_CHANNEL(_si, _channel, _channel, _address, _bits, \
612
+ _storagebits, _shift, "shorted", IIO_VOLTAGE, \
613
+ 0, \
614
+ BIT(IIO_CHAN_INFO_SAMP_FREQ))
615
+
550616 #define DECLARE_AD7793_CHANNELS(_name, _b, _sb, _s) \
551617 const struct iio_chan_spec _name##_channels[] = { \
552
- AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), (_s)), \
553
- AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), (_s)), \
554
- AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), (_s)), \
555
- AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), (_s)), \
556
- AD_SD_TEMP_CHANNEL(4, AD7793_CH_TEMP, (_b), (_sb), (_s)), \
557
- AD_SD_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), (_s)), \
618
+ AD7793_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), (_s)), \
619
+ AD7793_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), (_s)), \
620
+ AD7793_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), (_s)), \
621
+ AD7793_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), (_s)), \
622
+ AD7793_TEMP_CHANNEL(4, AD7793_CH_TEMP, (_b), (_sb), (_s)), \
623
+ AD7793_SUPPLY_CHANNEL(5, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), (_s)), \
558624 IIO_CHAN_SOFT_TIMESTAMP(6), \
559625 }
560626
561627 #define DECLARE_AD7795_CHANNELS(_name, _b, _sb) \
562628 const struct iio_chan_spec _name##_channels[] = { \
563
- AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
564
- AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
565
- AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
566
- AD_SD_DIFF_CHANNEL(3, 3, 3, AD7795_CH_AIN4P_AIN4M, (_b), (_sb), 0), \
567
- AD_SD_DIFF_CHANNEL(4, 4, 4, AD7795_CH_AIN5P_AIN5M, (_b), (_sb), 0), \
568
- AD_SD_DIFF_CHANNEL(5, 5, 5, AD7795_CH_AIN6P_AIN6M, (_b), (_sb), 0), \
569
- AD_SD_SHORTED_CHANNEL(6, 0, AD7795_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
570
- AD_SD_TEMP_CHANNEL(7, AD7793_CH_TEMP, (_b), (_sb), 0), \
571
- AD_SD_SUPPLY_CHANNEL(8, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
629
+ AD7793_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
630
+ AD7793_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
631
+ AD7793_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
632
+ AD7793_DIFF_CHANNEL(3, 3, 3, AD7795_CH_AIN4P_AIN4M, (_b), (_sb), 0), \
633
+ AD7793_DIFF_CHANNEL(4, 4, 4, AD7795_CH_AIN5P_AIN5M, (_b), (_sb), 0), \
634
+ AD7793_DIFF_CHANNEL(5, 5, 5, AD7795_CH_AIN6P_AIN6M, (_b), (_sb), 0), \
635
+ AD7793_SHORTED_CHANNEL(6, 0, AD7795_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
636
+ AD7793_TEMP_CHANNEL(7, AD7793_CH_TEMP, (_b), (_sb), 0), \
637
+ AD7793_SUPPLY_CHANNEL(8, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
572638 IIO_CHAN_SOFT_TIMESTAMP(9), \
573639 }
574640
575641 #define DECLARE_AD7797_CHANNELS(_name, _b, _sb) \
576642 const struct iio_chan_spec _name##_channels[] = { \
577
- AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
578
- AD_SD_SHORTED_CHANNEL(1, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
579
- AD_SD_TEMP_CHANNEL(2, AD7793_CH_TEMP, (_b), (_sb), 0), \
580
- AD_SD_SUPPLY_CHANNEL(3, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
643
+ AD7797_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
644
+ AD7797_SHORTED_CHANNEL(1, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
645
+ AD7793_TEMP_CHANNEL(2, AD7793_CH_TEMP, (_b), (_sb), 0), \
646
+ AD7793_SUPPLY_CHANNEL(3, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
581647 IIO_CHAN_SOFT_TIMESTAMP(4), \
582648 }
583649
584650 #define DECLARE_AD7799_CHANNELS(_name, _b, _sb) \
585651 const struct iio_chan_spec _name##_channels[] = { \
586
- AD_SD_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
587
- AD_SD_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
588
- AD_SD_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
589
- AD_SD_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
590
- AD_SD_SUPPLY_CHANNEL(4, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
652
+ AD7793_DIFF_CHANNEL(0, 0, 0, AD7793_CH_AIN1P_AIN1M, (_b), (_sb), 0), \
653
+ AD7793_DIFF_CHANNEL(1, 1, 1, AD7793_CH_AIN2P_AIN2M, (_b), (_sb), 0), \
654
+ AD7793_DIFF_CHANNEL(2, 2, 2, AD7793_CH_AIN3P_AIN3M, (_b), (_sb), 0), \
655
+ AD7793_SHORTED_CHANNEL(3, 0, AD7793_CH_AIN1M_AIN1M, (_b), (_sb), 0), \
656
+ AD7793_SUPPLY_CHANNEL(4, 3, AD7793_CH_AVDD_MONITOR, (_b), (_sb), 0), \
591657 IIO_CHAN_SOFT_TIMESTAMP(5), \
592658 }
593659
....@@ -753,8 +819,6 @@
753819
754820 spi_set_drvdata(spi, indio_dev);
755821
756
- indio_dev->dev.parent = &spi->dev;
757
- indio_dev->dev.of_node = spi->dev.of_node;
758822 indio_dev->name = spi_get_device_id(spi)->name;
759823 indio_dev->modes = INDIO_DIRECT_MODE;
760824 indio_dev->channels = st->chip_info->channels;
....@@ -823,6 +887,6 @@
823887 };
824888 module_spi_driver(ad7793_driver);
825889
826
-MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
890
+MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
827891 MODULE_DESCRIPTION("Analog Devices AD7793 and similar ADCs");
828892 MODULE_LICENSE("GPL v2");