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: imu: adis16480.c: Add delta angle and delta velocity channels

Add support for delta angle and delta velocity raw readings to
adis16480 driver.
The following devices do not support delta readings in burst mode:
ADIS16375, ADIS16480, ADIS16485, ADIS16488, ADIS16490, ADIS16495-1,
ADIS16495-2, ADIS16495-3, ADIS16497-1, ADIS16497-2, ADIS16497-3, thus
they cannot be retrieved via the buffer interface.
For these devices, the delta measurements are retrieved by performing
normal register readings and are made available through the raw
attributes of the specific channels.

Signed-off-by: Ramona Gradinariu <ramona.gradinariu@analog.com>
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20240528142409.239187-3-ramona.gradinariu@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Ramona Gradinariu and committed by
Jonathan Cameron
196f5406 8c0a438f

+70 -2
+70 -2
drivers/iio/imu/adis16480.c
··· 140 140 unsigned int accel_max_val; 141 141 unsigned int accel_max_scale; 142 142 unsigned int temp_scale; 143 + unsigned int deltang_max_val; 144 + unsigned int deltvel_max_val; 143 145 unsigned int int_clk; 144 146 unsigned int max_dec_rate; 145 147 const unsigned int *filter_freqs; ··· 447 445 ADIS16480_SCAN_MAGN_Z, 448 446 ADIS16480_SCAN_BARO, 449 447 ADIS16480_SCAN_TEMP, 448 + ADIS16480_SCAN_DELTANG_X, 449 + ADIS16480_SCAN_DELTANG_Y, 450 + ADIS16480_SCAN_DELTANG_Z, 451 + ADIS16480_SCAN_DELTVEL_X, 452 + ADIS16480_SCAN_DELTVEL_Y, 453 + ADIS16480_SCAN_DELTVEL_Z, 450 454 }; 451 455 452 456 static const unsigned int adis16480_calibbias_regs[] = { ··· 696 688 *val = 131; /* 1310mbar = 131 kPa */ 697 689 *val2 = 32767 << 16; 698 690 return IIO_VAL_FRACTIONAL; 691 + case IIO_DELTA_ANGL: 692 + *val = st->chip_info->deltang_max_val; 693 + *val2 = 31; 694 + return IIO_VAL_FRACTIONAL_LOG2; 695 + case IIO_DELTA_VELOCITY: 696 + *val = st->chip_info->deltvel_max_val; 697 + *val2 = 31; 698 + return IIO_VAL_FRACTIONAL_LOG2; 699 699 default: 700 700 return -EINVAL; 701 701 } ··· 777 761 BIT(IIO_CHAN_INFO_CALIBSCALE), \ 778 762 32) 779 763 764 + #define ADIS16480_DELTANG_CHANNEL(_mod) \ 765 + ADIS16480_MOD_CHANNEL(IIO_DELTA_ANGL, IIO_MOD_ ## _mod, \ 766 + ADIS16480_REG_ ## _mod ## _DELTAANG_OUT, ADIS16480_SCAN_DELTANG_ ## _mod, \ 767 + 0, 32) 768 + 769 + #define ADIS16480_DELTANG_CHANNEL_NO_SCAN(_mod) \ 770 + ADIS16480_MOD_CHANNEL(IIO_DELTA_ANGL, IIO_MOD_ ## _mod, \ 771 + ADIS16480_REG_ ## _mod ## _DELTAANG_OUT, -1, 0, 32) 772 + 773 + #define ADIS16480_DELTVEL_CHANNEL(_mod) \ 774 + ADIS16480_MOD_CHANNEL(IIO_DELTA_VELOCITY, IIO_MOD_ ## _mod, \ 775 + ADIS16480_REG_ ## _mod ## _DELTAVEL_OUT, ADIS16480_SCAN_DELTVEL_ ## _mod, \ 776 + 0, 32) 777 + 778 + #define ADIS16480_DELTVEL_CHANNEL_NO_SCAN(_mod) \ 779 + ADIS16480_MOD_CHANNEL(IIO_DELTA_VELOCITY, IIO_MOD_ ## _mod, \ 780 + ADIS16480_REG_ ## _mod ## _DELTAVEL_OUT, -1, 0, 32) 781 + 780 782 #define ADIS16480_MAGN_CHANNEL(_mod) \ 781 783 ADIS16480_MOD_CHANNEL(IIO_MAGN, IIO_MOD_ ## _mod, \ 782 784 ADIS16480_REG_ ## _mod ## _MAGN_OUT, ADIS16480_SCAN_MAGN_ ## _mod, \ ··· 850 816 ADIS16480_MAGN_CHANNEL(Z), 851 817 ADIS16480_PRESSURE_CHANNEL(), 852 818 ADIS16480_TEMP_CHANNEL(), 853 - IIO_CHAN_SOFT_TIMESTAMP(11) 819 + IIO_CHAN_SOFT_TIMESTAMP(11), 820 + ADIS16480_DELTANG_CHANNEL_NO_SCAN(X), 821 + ADIS16480_DELTANG_CHANNEL_NO_SCAN(Y), 822 + ADIS16480_DELTANG_CHANNEL_NO_SCAN(Z), 823 + ADIS16480_DELTVEL_CHANNEL_NO_SCAN(X), 824 + ADIS16480_DELTVEL_CHANNEL_NO_SCAN(Y), 825 + ADIS16480_DELTVEL_CHANNEL_NO_SCAN(Z), 854 826 }; 855 827 856 828 static const struct iio_chan_spec adis16485_channels[] = { ··· 867 827 ADIS16480_ACCEL_CHANNEL(Y), 868 828 ADIS16480_ACCEL_CHANNEL(Z), 869 829 ADIS16480_TEMP_CHANNEL(), 870 - IIO_CHAN_SOFT_TIMESTAMP(7) 830 + IIO_CHAN_SOFT_TIMESTAMP(7), 831 + ADIS16480_DELTANG_CHANNEL_NO_SCAN(X), 832 + ADIS16480_DELTANG_CHANNEL_NO_SCAN(Y), 833 + ADIS16480_DELTANG_CHANNEL_NO_SCAN(Z), 834 + ADIS16480_DELTVEL_CHANNEL_NO_SCAN(X), 835 + ADIS16480_DELTVEL_CHANNEL_NO_SCAN(Y), 836 + ADIS16480_DELTVEL_CHANNEL_NO_SCAN(Z), 871 837 }; 872 838 873 839 enum adis16480_variant { ··· 984 938 .accel_max_val = IIO_M_S_2_TO_G(21973 << 16), 985 939 .accel_max_scale = 18, 986 940 .temp_scale = 5650, /* 5.65 milli degree Celsius */ 941 + .deltang_max_val = IIO_DEGREE_TO_RAD(180), 942 + .deltvel_max_val = 100, 987 943 .int_clk = 2460000, 988 944 .max_dec_rate = 2048, 989 945 .has_sleep_cnt = true, ··· 1000 952 .accel_max_val = IIO_M_S_2_TO_G(12500 << 16), 1001 953 .accel_max_scale = 10, 1002 954 .temp_scale = 5650, /* 5.65 milli degree Celsius */ 955 + .deltang_max_val = IIO_DEGREE_TO_RAD(720), 956 + .deltvel_max_val = 200, 1003 957 .int_clk = 2460000, 1004 958 .max_dec_rate = 2048, 1005 959 .has_sleep_cnt = true, ··· 1016 966 .accel_max_val = IIO_M_S_2_TO_G(20000 << 16), 1017 967 .accel_max_scale = 5, 1018 968 .temp_scale = 5650, /* 5.65 milli degree Celsius */ 969 + .deltang_max_val = IIO_DEGREE_TO_RAD(720), 970 + .deltvel_max_val = 50, 1019 971 .int_clk = 2460000, 1020 972 .max_dec_rate = 2048, 1021 973 .has_sleep_cnt = true, ··· 1032 980 .accel_max_val = IIO_M_S_2_TO_G(22500 << 16), 1033 981 .accel_max_scale = 18, 1034 982 .temp_scale = 5650, /* 5.65 milli degree Celsius */ 983 + .deltang_max_val = IIO_DEGREE_TO_RAD(720), 984 + .deltvel_max_val = 200, 1035 985 .int_clk = 2460000, 1036 986 .max_dec_rate = 2048, 1037 987 .has_sleep_cnt = true, ··· 1048 994 .accel_max_val = IIO_M_S_2_TO_G(16000 << 16), 1049 995 .accel_max_scale = 8, 1050 996 .temp_scale = 14285, /* 14.285 milli degree Celsius */ 997 + .deltang_max_val = IIO_DEGREE_TO_RAD(720), 998 + .deltvel_max_val = 200, 1051 999 .int_clk = 4250000, 1052 1000 .max_dec_rate = 4250, 1053 1001 .filter_freqs = adis16495_def_filter_freqs, ··· 1064 1008 .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), 1065 1009 .accel_max_scale = 8, 1066 1010 .temp_scale = 12500, /* 12.5 milli degree Celsius */ 1011 + .deltang_max_val = IIO_DEGREE_TO_RAD(360), 1012 + .deltvel_max_val = 100, 1067 1013 .int_clk = 4250000, 1068 1014 .max_dec_rate = 4250, 1069 1015 .filter_freqs = adis16495_def_filter_freqs, ··· 1083 1025 .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), 1084 1026 .accel_max_scale = 8, 1085 1027 .temp_scale = 12500, /* 12.5 milli degree Celsius */ 1028 + .deltang_max_val = IIO_DEGREE_TO_RAD(720), 1029 + .deltvel_max_val = 100, 1086 1030 .int_clk = 4250000, 1087 1031 .max_dec_rate = 4250, 1088 1032 .filter_freqs = adis16495_def_filter_freqs, ··· 1102 1042 .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), 1103 1043 .accel_max_scale = 8, 1104 1044 .temp_scale = 12500, /* 12.5 milli degree Celsius */ 1045 + .deltang_max_val = IIO_DEGREE_TO_RAD(2160), 1046 + .deltvel_max_val = 100, 1105 1047 .int_clk = 4250000, 1106 1048 .max_dec_rate = 4250, 1107 1049 .filter_freqs = adis16495_def_filter_freqs, ··· 1121 1059 .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), 1122 1060 .accel_max_scale = 40, 1123 1061 .temp_scale = 12500, /* 12.5 milli degree Celsius */ 1062 + .deltang_max_val = IIO_DEGREE_TO_RAD(360), 1063 + .deltvel_max_val = 400, 1124 1064 .int_clk = 4250000, 1125 1065 .max_dec_rate = 4250, 1126 1066 .filter_freqs = adis16495_def_filter_freqs, ··· 1140 1076 .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), 1141 1077 .accel_max_scale = 40, 1142 1078 .temp_scale = 12500, /* 12.5 milli degree Celsius */ 1079 + .deltang_max_val = IIO_DEGREE_TO_RAD(720), 1080 + .deltvel_max_val = 400, 1143 1081 .int_clk = 4250000, 1144 1082 .max_dec_rate = 4250, 1145 1083 .filter_freqs = adis16495_def_filter_freqs, ··· 1159 1093 .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), 1160 1094 .accel_max_scale = 40, 1161 1095 .temp_scale = 12500, /* 12.5 milli degree Celsius */ 1096 + .deltang_max_val = IIO_DEGREE_TO_RAD(2160), 1097 + .deltvel_max_val = 400, 1162 1098 .int_clk = 4250000, 1163 1099 .max_dec_rate = 4250, 1164 1100 .filter_freqs = adis16495_def_filter_freqs,