Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: adc: ad9467: include two's complement in default mode

All supported drivers currently implicitly use two's complement mode.
Make this clear by declaring two's complement in the default
output mode. Calibration mode uses offset binary, so change the output
mode only when running the calibration or other test mode.

Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Tomas Melin and committed by
Jonathan Cameron
bac5e3d2 0b6a86a0

+25 -8
+25 -8
drivers/iio/adc/ad9467.c
··· 5 5 * Copyright 2012-2020 Analog Devices Inc. 6 6 */ 7 7 8 + #include <linux/bitfield.h> 8 9 #include <linux/bitmap.h> 9 10 #include <linux/bitops.h> 10 11 #include <linux/cleanup.h> ··· 73 72 #define AN877_ADC_OUTPUT_MODE_OFFSET_BINARY 0x0 74 73 #define AN877_ADC_OUTPUT_MODE_TWOS_COMPLEMENT 0x1 75 74 #define AN877_ADC_OUTPUT_MODE_GRAY_CODE 0x2 75 + #define AN877_ADC_OUTPUT_MODE_MASK GENMASK(1, 0) 76 76 77 77 /* AN877_ADC_REG_OUTPUT_PHASE */ 78 78 #define AN877_ADC_OUTPUT_EVEN_ODD_MODE_EN 0x20 ··· 87 85 */ 88 86 89 87 #define CHIPID_AD9211 0x06 90 - #define AD9211_DEF_OUTPUT_MODE 0x00 88 + #define AD9211_DEF_OUTPUT_MODE 0x01 91 89 #define AD9211_REG_VREF_MASK GENMASK(4, 0) 92 90 93 91 /* ··· 95 93 */ 96 94 97 95 #define CHIPID_AD9265 0x64 98 - #define AD9265_DEF_OUTPUT_MODE 0x40 96 + #define AD9265_DEF_OUTPUT_MODE 0x41 99 97 #define AD9265_REG_VREF_MASK 0xC0 100 98 101 99 /* ··· 103 101 */ 104 102 105 103 #define CHIPID_AD9434 0x6A 106 - #define AD9434_DEF_OUTPUT_MODE 0x00 104 + #define AD9434_DEF_OUTPUT_MODE 0x01 107 105 #define AD9434_REG_VREF_MASK 0xC0 108 106 109 107 /* ··· 111 109 */ 112 110 113 111 #define CHIPID_AD9467 0x50 114 - #define AD9467_DEF_OUTPUT_MODE 0x08 112 + #define AD9467_DEF_OUTPUT_MODE 0x09 115 113 #define AD9467_REG_VREF_MASK 0x0F 116 114 117 115 /* ··· 119 117 */ 120 118 121 119 #define CHIPID_AD9643 0x82 120 + #define AD9643_DEF_OUTPUT_MODE 0x01 122 121 #define AD9643_REG_VREF_MASK 0x1F 123 122 124 123 /* ··· 127 124 */ 128 125 129 126 #define CHIPID_AD9652 0xC1 127 + #define AD9652_DEF_OUTPUT_MODE 0x01 130 128 #define AD9652_REG_VREF_MASK 0xC0 131 129 132 130 /* ··· 135 131 */ 136 132 137 133 #define CHIPID_AD9649 0x6F 134 + #define AD9649_DEF_OUTPUT_MODE 0x01 138 135 #define AD9649_TEST_POINTS 8 139 136 140 137 #define AD9647_MAX_TEST_POINTS 32 ··· 466 461 .test_mask = BIT(AN877_ADC_TESTMODE_RAMP) | 467 462 GENMASK(AN877_ADC_TESTMODE_MIXED_BIT_FREQUENCY, AN877_ADC_TESTMODE_OFF), 468 463 .test_mask_len = AN877_ADC_TESTMODE_RAMP + 1, 464 + .default_output_mode = AD9643_DEF_OUTPUT_MODE, 469 465 .vref_mask = AD9643_REG_VREF_MASK, 470 466 .has_dco = true, 471 467 .has_dco_invert = true, ··· 485 479 .test_mask = GENMASK(AN877_ADC_TESTMODE_MIXED_BIT_FREQUENCY, 486 480 AN877_ADC_TESTMODE_OFF), 487 481 .test_mask_len = AN877_ADC_TESTMODE_MIXED_BIT_FREQUENCY + 1, 482 + .default_output_mode = AD9649_DEF_OUTPUT_MODE, 488 483 .has_dco = true, 489 484 .has_dco_invert = true, 490 485 .dco_en = AN877_ADC_DCO_DELAY_ENABLE, ··· 503 496 .test_mask = GENMASK(AN877_ADC_TESTMODE_ONE_ZERO_TOGGLE, 504 497 AN877_ADC_TESTMODE_OFF), 505 498 .test_mask_len = AN877_ADC_TESTMODE_ONE_ZERO_TOGGLE + 1, 499 + .default_output_mode = AD9652_DEF_OUTPUT_MODE, 506 500 .vref_mask = AD9652_REG_VREF_MASK, 507 501 .has_dco = true, 508 502 }; ··· 679 671 680 672 static int ad9647_calibrate_prepare(struct ad9467_state *st) 681 673 { 674 + unsigned int cmode; 682 675 unsigned int c; 683 676 int ret; 684 677 685 - ret = ad9467_outputmode_set(st, st->info->default_output_mode); 678 + cmode = st->info->default_output_mode; 679 + FIELD_MODIFY(AN877_ADC_OUTPUT_MODE_MASK, &cmode, 680 + AN877_ADC_OUTPUT_MODE_OFFSET_BINARY); 681 + ret = ad9467_outputmode_set(st, cmode); 686 682 if (ret) 687 683 return ret; 688 684 ··· 790 778 return ret; 791 779 } 792 780 793 - mode = st->info->default_output_mode | AN877_ADC_OUTPUT_MODE_TWOS_COMPLEMENT; 781 + mode = st->info->default_output_mode; 794 782 return ad9467_outputmode_set(st, mode); 795 783 } 796 784 ··· 1186 1174 if (ret) 1187 1175 return ret; 1188 1176 1189 - out_mode = st->info->default_output_mode | AN877_ADC_OUTPUT_MODE_TWOS_COMPLEMENT; 1177 + out_mode = st->info->default_output_mode; 1190 1178 ret = ad9467_outputmode_set(st, out_mode); 1191 1179 if (ret) 1192 1180 return ret; 1193 1181 } else { 1194 - ret = ad9467_outputmode_set(st, st->info->default_output_mode); 1182 + unsigned int cmode; 1183 + 1184 + cmode = st->info->default_output_mode; 1185 + FIELD_MODIFY(AN877_ADC_OUTPUT_MODE_MASK, &cmode, 1186 + AN877_ADC_OUTPUT_MODE_OFFSET_BINARY); 1187 + ret = ad9467_outputmode_set(st, cmode); 1195 1188 if (ret) 1196 1189 return ret; 1197 1190