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

iio: imu: adis16400: Use separate structures rather than an array for chip info

Change the adis16400 driver to use individual chip info structures
instead of an array. This reduces the verbosity of the code. Also, the
data is now const as it should have been in the first place.

Signed-off-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250628-iio-const-data-17-v1-1-a215ebb653ec@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

David Lechner and committed by
Jonathan Cameron
2ef920e0 00a468c9

+153 -161
+153 -161
drivers/iio/imu/adis16400.c
··· 170 170 * that must be enabled together 171 171 **/ 172 172 struct adis16400_state { 173 - struct adis16400_chip_info *variant; 173 + const struct adis16400_chip_info *variant; 174 174 int filt_int; 175 175 176 176 struct adis adis; ··· 288 288 debugfs_create_file_unsafe("flash_count", 0400, 289 289 d, st, &adis16400_flash_count_fops); 290 290 } 291 - 292 - enum adis16400_chip_variant { 293 - ADIS16300, 294 - ADIS16334, 295 - ADIS16350, 296 - ADIS16360, 297 - ADIS16362, 298 - ADIS16364, 299 - ADIS16367, 300 - ADIS16400, 301 - ADIS16445, 302 - ADIS16448, 303 - }; 304 291 305 292 static int adis16334_get_freq(struct adis16400_state *st) 306 293 { ··· 971 984 .self_test_ms = 45, 972 985 }; 973 986 974 - static struct adis16400_chip_info adis16400_chips[] = { 975 - [ADIS16300] = { 976 - .channels = adis16300_channels, 977 - .num_channels = ARRAY_SIZE(adis16300_channels), 978 - .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 979 - ADIS16400_HAS_SERIAL_NUMBER, 980 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 981 - .accel_scale_micro = 5884, 982 - .temp_scale_nano = 140000000, /* 0.14 C */ 983 - .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */ 984 - .set_freq = adis16400_set_freq, 985 - .get_freq = adis16400_get_freq, 986 - .adis_data = ADIS16400_DATA(&adis16300_timeouts, 18), 987 - }, 988 - [ADIS16334] = { 989 - .channels = adis16334_channels, 990 - .num_channels = ARRAY_SIZE(adis16334_channels), 991 - .flags = ADIS16400_HAS_PROD_ID | ADIS16400_NO_BURST | 992 - ADIS16400_HAS_SERIAL_NUMBER, 993 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 994 - .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */ 995 - .temp_scale_nano = 67850000, /* 0.06785 C */ 996 - .temp_offset = 25000000 / 67850, /* 25 C = 0x00 */ 997 - .set_freq = adis16334_set_freq, 998 - .get_freq = adis16334_get_freq, 999 - .adis_data = ADIS16400_DATA(&adis16334_timeouts, 0), 1000 - }, 1001 - [ADIS16350] = { 1002 - .channels = adis16350_channels, 1003 - .num_channels = ARRAY_SIZE(adis16350_channels), 1004 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(73260), /* 0.07326 deg/s */ 1005 - .accel_scale_micro = IIO_G_TO_M_S_2(2522), /* 0.002522 g */ 1006 - .temp_scale_nano = 145300000, /* 0.1453 C */ 1007 - .temp_offset = 25000000 / 145300, /* 25 C = 0x00 */ 1008 - .flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE, 1009 - .set_freq = adis16400_set_freq, 1010 - .get_freq = adis16400_get_freq, 1011 - .adis_data = ADIS16400_DATA(&adis16300_timeouts, 0), 1012 - }, 1013 - [ADIS16360] = { 1014 - .channels = adis16350_channels, 1015 - .num_channels = ARRAY_SIZE(adis16350_channels), 1016 - .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1017 - ADIS16400_HAS_SERIAL_NUMBER, 1018 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1019 - .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ 1020 - .temp_scale_nano = 136000000, /* 0.136 C */ 1021 - .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1022 - .set_freq = adis16400_set_freq, 1023 - .get_freq = adis16400_get_freq, 1024 - .adis_data = ADIS16400_DATA(&adis16300_timeouts, 28), 1025 - }, 1026 - [ADIS16362] = { 1027 - .channels = adis16350_channels, 1028 - .num_channels = ARRAY_SIZE(adis16350_channels), 1029 - .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1030 - ADIS16400_HAS_SERIAL_NUMBER, 1031 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1032 - .accel_scale_micro = IIO_G_TO_M_S_2(333), /* 0.333 mg */ 1033 - .temp_scale_nano = 136000000, /* 0.136 C */ 1034 - .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1035 - .set_freq = adis16400_set_freq, 1036 - .get_freq = adis16400_get_freq, 1037 - .adis_data = ADIS16400_DATA(&adis16362_timeouts, 28), 1038 - }, 1039 - [ADIS16364] = { 1040 - .channels = adis16350_channels, 1041 - .num_channels = ARRAY_SIZE(adis16350_channels), 1042 - .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1043 - ADIS16400_HAS_SERIAL_NUMBER, 1044 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1045 - .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */ 1046 - .temp_scale_nano = 136000000, /* 0.136 C */ 1047 - .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1048 - .set_freq = adis16400_set_freq, 1049 - .get_freq = adis16400_get_freq, 1050 - .adis_data = ADIS16400_DATA(&adis16362_timeouts, 28), 1051 - }, 1052 - [ADIS16367] = { 1053 - .channels = adis16350_channels, 1054 - .num_channels = ARRAY_SIZE(adis16350_channels), 1055 - .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1056 - ADIS16400_HAS_SERIAL_NUMBER, 1057 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(2000), /* 0.2 deg/s */ 1058 - .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ 1059 - .temp_scale_nano = 136000000, /* 0.136 C */ 1060 - .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1061 - .set_freq = adis16400_set_freq, 1062 - .get_freq = adis16400_get_freq, 1063 - .adis_data = ADIS16400_DATA(&adis16300_timeouts, 28), 1064 - }, 1065 - [ADIS16400] = { 1066 - .channels = adis16400_channels, 1067 - .num_channels = ARRAY_SIZE(adis16400_channels), 1068 - .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE, 1069 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1070 - .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ 1071 - .temp_scale_nano = 140000000, /* 0.14 C */ 1072 - .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */ 1073 - .set_freq = adis16400_set_freq, 1074 - .get_freq = adis16400_get_freq, 1075 - .adis_data = ADIS16400_DATA(&adis16400_timeouts, 24), 1076 - }, 1077 - [ADIS16445] = { 1078 - .channels = adis16445_channels, 1079 - .num_channels = ARRAY_SIZE(adis16445_channels), 1080 - .flags = ADIS16400_HAS_PROD_ID | 1081 - ADIS16400_HAS_SERIAL_NUMBER | 1082 - ADIS16400_BURST_DIAG_STAT, 1083 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */ 1084 - .accel_scale_micro = IIO_G_TO_M_S_2(250), /* 1/4000 g */ 1085 - .temp_scale_nano = 73860000, /* 0.07386 C */ 1086 - .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */ 1087 - .set_freq = adis16334_set_freq, 1088 - .get_freq = adis16334_get_freq, 1089 - .adis_data = ADIS16400_DATA(&adis16445_timeouts, 16), 1090 - }, 1091 - [ADIS16448] = { 1092 - .channels = adis16448_channels, 1093 - .num_channels = ARRAY_SIZE(adis16448_channels), 1094 - .flags = ADIS16400_HAS_PROD_ID | 1095 - ADIS16400_HAS_SERIAL_NUMBER | 1096 - ADIS16400_BURST_DIAG_STAT, 1097 - .gyro_scale_micro = IIO_DEGREE_TO_RAD(40000), /* 0.04 deg/s */ 1098 - .accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */ 1099 - .temp_scale_nano = 73860000, /* 0.07386 C */ 1100 - .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */ 1101 - .set_freq = adis16334_set_freq, 1102 - .get_freq = adis16334_get_freq, 1103 - .adis_data = ADIS16400_DATA(&adis16448_timeouts, 24), 1104 - } 987 + static const struct adis16400_chip_info adis16300_chip_info = { 988 + .channels = adis16300_channels, 989 + .num_channels = ARRAY_SIZE(adis16300_channels), 990 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 991 + ADIS16400_HAS_SERIAL_NUMBER, 992 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 993 + .accel_scale_micro = 5884, 994 + .temp_scale_nano = 140000000, /* 0.14 C */ 995 + .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */ 996 + .set_freq = adis16400_set_freq, 997 + .get_freq = adis16400_get_freq, 998 + .adis_data = ADIS16400_DATA(&adis16300_timeouts, 18), 999 + }; 1000 + 1001 + static const struct adis16400_chip_info adis16334_chip_info = { 1002 + .channels = adis16334_channels, 1003 + .num_channels = ARRAY_SIZE(adis16334_channels), 1004 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_NO_BURST | 1005 + ADIS16400_HAS_SERIAL_NUMBER, 1006 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1007 + .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */ 1008 + .temp_scale_nano = 67850000, /* 0.06785 C */ 1009 + .temp_offset = 25000000 / 67850, /* 25 C = 0x00 */ 1010 + .set_freq = adis16334_set_freq, 1011 + .get_freq = adis16334_get_freq, 1012 + .adis_data = ADIS16400_DATA(&adis16334_timeouts, 0), 1013 + }; 1014 + 1015 + static const struct adis16400_chip_info adis16350_chip_info = { 1016 + .channels = adis16350_channels, 1017 + .num_channels = ARRAY_SIZE(adis16350_channels), 1018 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(73260), /* 0.07326 deg/s */ 1019 + .accel_scale_micro = IIO_G_TO_M_S_2(2522), /* 0.002522 g */ 1020 + .temp_scale_nano = 145300000, /* 0.1453 C */ 1021 + .temp_offset = 25000000 / 145300, /* 25 C = 0x00 */ 1022 + .flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE, 1023 + .set_freq = adis16400_set_freq, 1024 + .get_freq = adis16400_get_freq, 1025 + .adis_data = ADIS16400_DATA(&adis16300_timeouts, 0), 1026 + }; 1027 + 1028 + static const struct adis16400_chip_info adis16360_chip_info = { 1029 + .channels = adis16350_channels, 1030 + .num_channels = ARRAY_SIZE(adis16350_channels), 1031 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1032 + ADIS16400_HAS_SERIAL_NUMBER, 1033 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1034 + .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ 1035 + .temp_scale_nano = 136000000, /* 0.136 C */ 1036 + .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1037 + .set_freq = adis16400_set_freq, 1038 + .get_freq = adis16400_get_freq, 1039 + .adis_data = ADIS16400_DATA(&adis16300_timeouts, 28), 1040 + }; 1041 + 1042 + static const struct adis16400_chip_info adis16362_chip_info = { 1043 + .channels = adis16350_channels, 1044 + .num_channels = ARRAY_SIZE(adis16350_channels), 1045 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1046 + ADIS16400_HAS_SERIAL_NUMBER, 1047 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1048 + .accel_scale_micro = IIO_G_TO_M_S_2(333), /* 0.333 mg */ 1049 + .temp_scale_nano = 136000000, /* 0.136 C */ 1050 + .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1051 + .set_freq = adis16400_set_freq, 1052 + .get_freq = adis16400_get_freq, 1053 + .adis_data = ADIS16400_DATA(&adis16362_timeouts, 28), 1054 + }; 1055 + 1056 + static const struct adis16400_chip_info adis16364_chip_info = { 1057 + .channels = adis16350_channels, 1058 + .num_channels = ARRAY_SIZE(adis16350_channels), 1059 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1060 + ADIS16400_HAS_SERIAL_NUMBER, 1061 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1062 + .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */ 1063 + .temp_scale_nano = 136000000, /* 0.136 C */ 1064 + .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1065 + .set_freq = adis16400_set_freq, 1066 + .get_freq = adis16400_get_freq, 1067 + .adis_data = ADIS16400_DATA(&adis16362_timeouts, 28), 1068 + }; 1069 + 1070 + static const struct adis16400_chip_info adis16367_chip_info = { 1071 + .channels = adis16350_channels, 1072 + .num_channels = ARRAY_SIZE(adis16350_channels), 1073 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE | 1074 + ADIS16400_HAS_SERIAL_NUMBER, 1075 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(2000), /* 0.2 deg/s */ 1076 + .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ 1077 + .temp_scale_nano = 136000000, /* 0.136 C */ 1078 + .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ 1079 + .set_freq = adis16400_set_freq, 1080 + .get_freq = adis16400_get_freq, 1081 + .adis_data = ADIS16400_DATA(&adis16300_timeouts, 28), 1082 + }; 1083 + 1084 + static const struct adis16400_chip_info adis16400_chip_info = { 1085 + .channels = adis16400_channels, 1086 + .num_channels = ARRAY_SIZE(adis16400_channels), 1087 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE, 1088 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ 1089 + .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ 1090 + .temp_scale_nano = 140000000, /* 0.14 C */ 1091 + .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */ 1092 + .set_freq = adis16400_set_freq, 1093 + .get_freq = adis16400_get_freq, 1094 + .adis_data = ADIS16400_DATA(&adis16400_timeouts, 24), 1095 + }; 1096 + 1097 + static const struct adis16400_chip_info adis16445_chip_info = { 1098 + .channels = adis16445_channels, 1099 + .num_channels = ARRAY_SIZE(adis16445_channels), 1100 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SERIAL_NUMBER | 1101 + ADIS16400_BURST_DIAG_STAT, 1102 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */ 1103 + .accel_scale_micro = IIO_G_TO_M_S_2(250), /* 1/4000 g */ 1104 + .temp_scale_nano = 73860000, /* 0.07386 C */ 1105 + .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */ 1106 + .set_freq = adis16334_set_freq, 1107 + .get_freq = adis16334_get_freq, 1108 + .adis_data = ADIS16400_DATA(&adis16445_timeouts, 16), 1109 + }; 1110 + 1111 + static const struct adis16400_chip_info adis16448_chip_info = { 1112 + .channels = adis16448_channels, 1113 + .num_channels = ARRAY_SIZE(adis16448_channels), 1114 + .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SERIAL_NUMBER | 1115 + ADIS16400_BURST_DIAG_STAT, 1116 + .gyro_scale_micro = IIO_DEGREE_TO_RAD(40000), /* 0.04 deg/s */ 1117 + .accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */ 1118 + .temp_scale_nano = 73860000, /* 0.07386 C */ 1119 + .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */ 1120 + .set_freq = adis16334_set_freq, 1121 + .get_freq = adis16334_get_freq, 1122 + .adis_data = ADIS16400_DATA(&adis16448_timeouts, 24), 1105 1123 }; 1106 1124 1107 1125 static const struct iio_info adis16400_info = { ··· 1149 1157 st = iio_priv(indio_dev); 1150 1158 1151 1159 /* setup the industrialio driver allocated elements */ 1152 - st->variant = &adis16400_chips[spi_get_device_id(spi)->driver_data]; 1160 + st->variant = spi_get_device_match_data(spi); 1153 1161 indio_dev->name = spi_get_device_id(spi)->name; 1154 1162 indio_dev->channels = st->variant->channels; 1155 1163 indio_dev->num_channels = st->variant->num_channels; ··· 1189 1197 } 1190 1198 1191 1199 static const struct spi_device_id adis16400_id[] = { 1192 - {"adis16300", ADIS16300}, 1193 - {"adis16305", ADIS16300}, 1194 - {"adis16334", ADIS16334}, 1195 - {"adis16350", ADIS16350}, 1196 - {"adis16354", ADIS16350}, 1197 - {"adis16355", ADIS16350}, 1198 - {"adis16360", ADIS16360}, 1199 - {"adis16362", ADIS16362}, 1200 - {"adis16364", ADIS16364}, 1201 - {"adis16365", ADIS16360}, 1202 - {"adis16367", ADIS16367}, 1203 - {"adis16400", ADIS16400}, 1204 - {"adis16405", ADIS16400}, 1205 - {"adis16445", ADIS16445}, 1206 - {"adis16448", ADIS16448}, 1200 + { "adis16300", (kernel_ulong_t)&adis16300_chip_info }, 1201 + { "adis16305", (kernel_ulong_t)&adis16300_chip_info }, 1202 + { "adis16334", (kernel_ulong_t)&adis16334_chip_info }, 1203 + { "adis16350", (kernel_ulong_t)&adis16350_chip_info }, 1204 + { "adis16354", (kernel_ulong_t)&adis16350_chip_info }, 1205 + { "adis16355", (kernel_ulong_t)&adis16350_chip_info }, 1206 + { "adis16360", (kernel_ulong_t)&adis16360_chip_info }, 1207 + { "adis16362", (kernel_ulong_t)&adis16362_chip_info }, 1208 + { "adis16364", (kernel_ulong_t)&adis16364_chip_info }, 1209 + { "adis16365", (kernel_ulong_t)&adis16360_chip_info }, 1210 + { "adis16367", (kernel_ulong_t)&adis16367_chip_info }, 1211 + { "adis16400", (kernel_ulong_t)&adis16400_chip_info }, 1212 + { "adis16405", (kernel_ulong_t)&adis16400_chip_info }, 1213 + { "adis16445", (kernel_ulong_t)&adis16445_chip_info }, 1214 + { "adis16448", (kernel_ulong_t)&adis16448_chip_info }, 1207 1215 { } 1208 1216 }; 1209 1217 MODULE_DEVICE_TABLE(spi, adis16400_id);