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: ad7173: add support for additional models

Add support for Analog Devices AD7172-2, AD7175-8, AD7177-2.

Signed-off-by: Dumitru Ceclan <mitrutzceclan@gmail.com>
Link: https://lore.kernel.org/r/20240306110956.13167-4-mitrutzceclan@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Dumitru Ceclan and committed by
Jonathan Cameron
37ae8381 39331052

+80 -6
+80 -6
drivers/iio/adc/ad7173.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0+ 2 2 /* 3 - * AD7172-2/AD7173-8/AD7175-2/AD7176-2 SPI ADC driver 3 + * AD717x family SPI ADC driver 4 + * 5 + * Supported devices: 6 + * AD7172-2/AD7172-4/AD7173-8/AD7175-2 7 + * AD7175-8/AD7176-2/AD7177-2 8 + * 4 9 * Copyright (C) 2015, 2024 Analog Devices, Inc. 5 10 */ 6 11 ··· 69 64 #define AD7172_2_ID 0x00d0 70 65 #define AD7175_ID 0x0cd0 71 66 #define AD7176_ID 0x0c90 67 + #define AD7175_2_ID 0x0cd0 68 + #define AD7172_4_ID 0x2050 72 69 #define AD7173_ID 0x30d0 70 + #define AD7175_8_ID 0x3cd0 71 + #define AD7177_ID 0x4fd0 73 72 #define AD7173_ID_MASK GENMASK(15, 4) 74 73 75 74 #define AD7173_ADC_MODE_REF_EN BIT(15) ··· 119 110 #define AD7173_SETUP_REF_SEL_EXT_REF 0x0 120 111 #define AD7173_VOLTAGE_INT_REF_uV 2500000 121 112 #define AD7173_TEMP_SENSIIVITY_uV_per_C 477 113 + #define AD7177_ODR_START_VALUE 0x07 122 114 123 115 #define AD7173_FILTER_ODR0_MASK GENMASK(5, 0) 124 116 #define AD7173_MAX_CONFIGS 8 125 117 126 118 enum ad7173_ids { 127 119 ID_AD7172_2, 120 + ID_AD7172_4, 128 121 ID_AD7173_8, 129 122 ID_AD7175_2, 123 + ID_AD7175_8, 130 124 ID_AD7176_2, 125 + ID_AD7177_2, 131 126 }; 132 127 133 128 struct ad7173_device_info { 134 129 const unsigned int *sinc5_data_rates; 135 130 unsigned int num_sinc5_data_rates; 131 + unsigned int odr_start_value; 136 132 unsigned int num_channels; 137 133 unsigned int num_configs; 138 134 unsigned int num_inputs; ··· 145 131 unsigned int id; 146 132 char *name; 147 133 bool has_temp; 134 + bool has_int_ref; 135 + bool has_ref2; 148 136 u8 num_gpios; 149 137 }; 150 138 ··· 212 196 .num_configs = 4, 213 197 .num_gpios = 2, 214 198 .has_temp = true, 199 + .has_int_ref = true, 200 + .clock = 2 * HZ_PER_MHZ, 201 + .sinc5_data_rates = ad7173_sinc5_data_rates, 202 + .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 203 + }, 204 + [ID_AD7172_4] = { 205 + .id = AD7172_4_ID, 206 + .num_inputs = 9, 207 + .num_channels = 8, 208 + .num_configs = 8, 209 + .num_gpios = 4, 210 + .has_temp = false, 211 + .has_ref2 = true, 215 212 .clock = 2 * HZ_PER_MHZ, 216 213 .sinc5_data_rates = ad7173_sinc5_data_rates, 217 214 .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), ··· 237 208 .num_configs = 8, 238 209 .num_gpios = 4, 239 210 .has_temp = true, 211 + .has_int_ref = true, 212 + .has_ref2 = true, 240 213 .clock = 2 * HZ_PER_MHZ, 241 214 .sinc5_data_rates = ad7173_sinc5_data_rates, 242 215 .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 243 216 }, 244 217 [ID_AD7175_2] = { 245 218 .name = "ad7175-2", 246 - .id = AD7175_ID, 219 + .id = AD7175_2_ID, 247 220 .num_inputs = 5, 248 221 .num_channels = 4, 249 222 .num_configs = 4, 250 223 .num_gpios = 2, 251 224 .has_temp = true, 225 + .has_int_ref = true, 226 + .clock = 16 * HZ_PER_MHZ, 227 + .sinc5_data_rates = ad7175_sinc5_data_rates, 228 + .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 229 + }, 230 + [ID_AD7175_8] = { 231 + .id = AD7175_8_ID, 232 + .num_inputs = 17, 233 + .num_channels = 16, 234 + .num_configs = 8, 235 + .num_gpios = 4, 236 + .has_temp = true, 237 + .has_int_ref = true, 238 + .has_ref2 = true, 252 239 .clock = 16 * HZ_PER_MHZ, 253 240 .sinc5_data_rates = ad7175_sinc5_data_rates, 254 241 .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), ··· 277 232 .num_configs = 4, 278 233 .num_gpios = 2, 279 234 .has_temp = false, 235 + .has_int_ref = true, 280 236 .clock = 16 * HZ_PER_MHZ, 237 + .sinc5_data_rates = ad7175_sinc5_data_rates, 238 + .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 239 + }, 240 + [ID_AD7177_2] = { 241 + .id = AD7177_ID, 242 + .num_inputs = 5, 243 + .num_channels = 4, 244 + .num_configs = 4, 245 + .num_gpios = 2, 246 + .has_temp = true, 247 + .has_int_ref = true, 248 + .clock = 16 * HZ_PER_MHZ, 249 + .odr_start_value = AD7177_ODR_START_VALUE, 281 250 .sinc5_data_rates = ad7175_sinc5_data_rates, 282 251 .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 283 252 }, ··· 715 656 switch (info) { 716 657 case IIO_CHAN_INFO_SAMP_FREQ: 717 658 freq = val * MILLI + val2 / MILLI; 718 - for (i = 0; i < st->info->num_sinc5_data_rates - 1; i++) 659 + for (i = st->info->odr_start_value; i < st->info->num_sinc5_data_rates - 1; i++) 719 660 if (freq >= st->info->sinc5_data_rates[i]) 720 661 break; 721 662 ··· 967 908 else 968 909 ref_sel = ret; 969 910 970 - if (ref_sel == AD7173_SETUP_REF_SEL_EXT_REF2 && 971 - st->info->id != AD7173_ID) { 911 + if (ref_sel == AD7173_SETUP_REF_SEL_INT_REF && 912 + !st->info->has_int_ref) { 972 913 fwnode_handle_put(child); 973 914 return dev_err_probe(dev, -EINVAL, 974 - "External reference 2 is only available on ad7173-8\n"); 915 + "Internal reference is not available on current model.\n"); 916 + } 917 + 918 + if (ref_sel == AD7173_SETUP_REF_SEL_EXT_REF2 && !st->info->has_ref2) { 919 + fwnode_handle_put(child); 920 + return dev_err_probe(dev, -EINVAL, 921 + "External reference 2 is not available on current model.\n"); 975 922 } 976 923 977 924 ret = ad7173_get_ref_voltage_milli(st, ref_sel); ··· 1145 1080 static const struct of_device_id ad7173_of_match[] = { 1146 1081 { .compatible = "adi,ad7172-2", 1147 1082 .data = &ad7173_device_info[ID_AD7172_2]}, 1083 + { .compatible = "adi,ad7172-4", 1084 + .data = &ad7173_device_info[ID_AD7172_4]}, 1148 1085 { .compatible = "adi,ad7173-8", 1149 1086 .data = &ad7173_device_info[ID_AD7173_8]}, 1150 1087 { .compatible = "adi,ad7175-2", 1151 1088 .data = &ad7173_device_info[ID_AD7175_2]}, 1089 + { .compatible = "adi,ad7175-8", 1090 + .data = &ad7173_device_info[ID_AD7175_8]}, 1152 1091 { .compatible = "adi,ad7176-2", 1153 1092 .data = &ad7173_device_info[ID_AD7176_2]}, 1093 + { .compatible = "adi,ad7177-2", 1094 + .data = &ad7173_device_info[ID_AD7177_2]}, 1154 1095 { } 1155 1096 }; 1156 1097 MODULE_DEVICE_TABLE(of, ad7173_of_match); 1157 1098 1158 1099 static const struct spi_device_id ad7173_id_table[] = { 1159 1100 { "ad7172-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7172_2]}, 1101 + { "ad7172-4", (kernel_ulong_t)&ad7173_device_info[ID_AD7172_4]}, 1160 1102 { "ad7173-8", (kernel_ulong_t)&ad7173_device_info[ID_AD7173_8]}, 1161 1103 { "ad7175-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7175_2]}, 1104 + { "ad7175-8", (kernel_ulong_t)&ad7173_device_info[ID_AD7175_8]}, 1162 1105 { "ad7176-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7176_2]}, 1106 + { "ad7177-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7177_2]}, 1163 1107 { } 1164 1108 }; 1165 1109 MODULE_DEVICE_TABLE(spi, ad7173_id_table);