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

iio: xilinx-xadc: Add basic support for Ultrascale System Monitor

The xilinx-xadc IIO driver currently has support for the XADC in the Xilinx
7 series FPGAs. The system-monitor is the equivalent to the XADC in the
Xilinx UltraScale and UltraScale+ FPGAs.

The IP designers did a good job at maintaining backwards compatibility and
only minor changes are required to add basic support for the system-monitor
core.

The non backwards compatible changes are:
* Register map offset was moved from 0x200 to 0x400
* Only one ADC compared to two in the XADC
* 10 bit ADC instead of 12 bit ADC
* Two of the channels monitor different supplies

Add the necessary logic to accommodate these changes to support the
system-monitor in the XADC driver.

Note that this patch does not include support for some new features found
in the system-monitor like additional alarms, user supply monitoring and
secondary system-monitor access. This might be added at a later time.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Tested-by: Anand Ashok Dumbre <anandash@xilinx.com>
Reviewed-by: Anand Ashok Dumbre <anandash@xilinx.com>
Link: https://lore.kernel.org/r/20200922134624.13191-2-lars@metafoo.de
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Lars-Peter Clausen and committed by
Jonathan Cameron
c2b7720a d0dc4c80

+171 -58
+9 -2
drivers/iio/adc/Kconfig
··· 1228 1228 select IIO_BUFFER 1229 1229 select IIO_TRIGGERED_BUFFER 1230 1230 help 1231 - Say yes here to have support for the Xilinx XADC. The driver does support 1232 - both the ZYNQ interface to the XADC as well as the AXI-XADC interface. 1231 + Say yes here to have support for the Xilinx 7 Series XADC or 1232 + UltraScale/UltraScale+ System Management Wizard. 1233 + 1234 + For the 7 Series the driver does support both the ZYNQ interface 1235 + to the XADC as well as the AXI-XADC interface. 1236 + 1237 + The driver also support the Xilinx System Management Wizard IP core 1238 + that can be used to access the System Monitor ADC on the Xilinx 1239 + UltraScale and UltraScale+ FPGAs. 1233 1240 1234 1241 The driver can also be build as a module. If so, the module will be called 1235 1242 xilinx-xadc.
+152 -51
drivers/iio/adc/xilinx-xadc-core.c
··· 92 92 #define XADC_AXI_REG_GIER 0x5c 93 93 #define XADC_AXI_REG_IPISR 0x60 94 94 #define XADC_AXI_REG_IPIER 0x68 95 - #define XADC_AXI_ADC_REG_OFFSET 0x200 95 + 96 + /* 7 Series */ 97 + #define XADC_7S_AXI_ADC_REG_OFFSET 0x200 98 + 99 + /* UltraScale */ 100 + #define XADC_US_AXI_ADC_REG_OFFSET 0x400 96 101 97 102 #define XADC_AXI_RESET_MAGIC 0xa 98 103 #define XADC_AXI_GIER_ENABLE BIT(31) ··· 452 447 .get_dclk_rate = xadc_zynq_get_dclk_rate, 453 448 .interrupt_handler = xadc_zynq_interrupt_handler, 454 449 .update_alarm = xadc_zynq_update_alarm, 450 + .type = XADC_TYPE_S7, 451 + }; 452 + 453 + static const unsigned int xadc_axi_reg_offsets[] = { 454 + [XADC_TYPE_S7] = XADC_7S_AXI_ADC_REG_OFFSET, 455 + [XADC_TYPE_US] = XADC_US_AXI_ADC_REG_OFFSET, 455 456 }; 456 457 457 458 static int xadc_axi_read_adc_reg(struct xadc *xadc, unsigned int reg, ··· 465 454 { 466 455 uint32_t val32; 467 456 468 - xadc_read_reg(xadc, XADC_AXI_ADC_REG_OFFSET + reg * 4, &val32); 457 + xadc_read_reg(xadc, xadc_axi_reg_offsets[xadc->ops->type] + reg * 4, 458 + &val32); 469 459 *val = val32 & 0xffff; 470 460 471 461 return 0; ··· 475 463 static int xadc_axi_write_adc_reg(struct xadc *xadc, unsigned int reg, 476 464 uint16_t val) 477 465 { 478 - xadc_write_reg(xadc, XADC_AXI_ADC_REG_OFFSET + reg * 4, val); 466 + xadc_write_reg(xadc, xadc_axi_reg_offsets[xadc->ops->type] + reg * 4, 467 + val); 479 468 480 469 return 0; 481 470 } ··· 554 541 return clk_get_rate(xadc->clk); 555 542 } 556 543 557 - static const struct xadc_ops xadc_axi_ops = { 544 + static const struct xadc_ops xadc_7s_axi_ops = { 558 545 .read = xadc_axi_read_adc_reg, 559 546 .write = xadc_axi_write_adc_reg, 560 547 .setup = xadc_axi_setup, ··· 562 549 .update_alarm = xadc_axi_update_alarm, 563 550 .interrupt_handler = xadc_axi_interrupt_handler, 564 551 .flags = XADC_FLAGS_BUFFERED, 552 + .type = XADC_TYPE_S7, 553 + }; 554 + 555 + static const struct xadc_ops xadc_us_axi_ops = { 556 + .read = xadc_axi_read_adc_reg, 557 + .write = xadc_axi_write_adc_reg, 558 + .setup = xadc_axi_setup, 559 + .get_dclk_rate = xadc_axi_get_dclk, 560 + .update_alarm = xadc_axi_update_alarm, 561 + .interrupt_handler = xadc_axi_interrupt_handler, 562 + .flags = XADC_FLAGS_BUFFERED, 563 + .type = XADC_TYPE_US, 565 564 }; 566 565 567 566 static int _xadc_update_adc_reg(struct xadc *xadc, unsigned int reg, ··· 757 732 { 758 733 uint16_t val; 759 734 735 + /* 736 + * As per datasheet the power-down bits are don't care in the 737 + * UltraScale, but as per reality setting the power-down bit for the 738 + * non-existing ADC-B powers down the main ADC, so just return and don't 739 + * do anything. 740 + */ 741 + if (xadc->ops->type == XADC_TYPE_US) 742 + return 0; 743 + 760 744 /* Powerdown the ADC-B when it is not needed. */ 761 745 switch (seq_mode) { 762 746 case XADC_CONF1_SEQ_SIMULTANEOUS: ··· 784 750 static int xadc_get_seq_mode(struct xadc *xadc, unsigned long scan_mode) 785 751 { 786 752 unsigned int aux_scan_mode = scan_mode >> 16; 753 + 754 + /* UltraScale has only one ADC and supports only continuous mode */ 755 + if (xadc->ops->type == XADC_TYPE_US) 756 + return XADC_CONF1_SEQ_CONTINUOUS; 787 757 788 758 if (xadc->external_mux_mode == XADC_EXTERNAL_MUX_DUAL) 789 759 return XADC_CONF1_SEQ_SIMULTANEOUS; ··· 901 863 struct iio_chan_spec const *chan, int *val, int *val2, long info) 902 864 { 903 865 struct xadc *xadc = iio_priv(indio_dev); 866 + unsigned int bits = chan->scan_type.realbits; 904 867 uint16_t val16; 905 868 int ret; 906 869 ··· 913 874 if (ret < 0) 914 875 return ret; 915 876 916 - val16 >>= 4; 877 + val16 >>= chan->scan_type.shift; 917 878 if (chan->scan_type.sign == 'u') 918 879 *val = val16; 919 880 else 920 - *val = sign_extend32(val16, 11); 881 + *val = sign_extend32(val16, bits - 1); 921 882 922 883 return IIO_VAL_INT; 923 884 case IIO_CHAN_INFO_SCALE: 924 885 switch (chan->type) { 925 886 case IIO_VOLTAGE: 926 - /* V = (val * 3.0) / 4096 */ 887 + /* V = (val * 3.0) / 2**bits */ 927 888 switch (chan->address) { 928 889 case XADC_REG_VCCINT: 929 890 case XADC_REG_VCCAUX: ··· 939 900 *val = 1000; 940 901 break; 941 902 } 942 - *val2 = 12; 903 + *val2 = chan->scan_type.realbits; 943 904 return IIO_VAL_FRACTIONAL_LOG2; 944 905 case IIO_TEMP: 945 - /* Temp in C = (val * 503.975) / 4096 - 273.15 */ 906 + /* Temp in C = (val * 503.975) / 2**bits - 273.15 */ 946 907 *val = 503975; 947 - *val2 = 12; 908 + *val2 = bits; 948 909 return IIO_VAL_FRACTIONAL_LOG2; 949 910 default: 950 911 return -EINVAL; 951 912 } 952 913 case IIO_CHAN_INFO_OFFSET: 953 914 /* Only the temperature channel has an offset */ 954 - *val = -((273150 << 12) / 503975); 915 + *val = -((273150 << bits) / 503975); 955 916 return IIO_VAL_INT; 956 917 case IIO_CHAN_INFO_SAMP_FREQ: 957 918 ret = xadc_read_samplerate(xadc); ··· 1040 1001 }, 1041 1002 }; 1042 1003 1043 - #define XADC_CHAN_TEMP(_chan, _scan_index, _addr) { \ 1004 + #define XADC_CHAN_TEMP(_chan, _scan_index, _addr, _bits) { \ 1044 1005 .type = IIO_TEMP, \ 1045 1006 .indexed = 1, \ 1046 1007 .channel = (_chan), \ ··· 1054 1015 .scan_index = (_scan_index), \ 1055 1016 .scan_type = { \ 1056 1017 .sign = 'u', \ 1057 - .realbits = 12, \ 1018 + .realbits = (_bits), \ 1058 1019 .storagebits = 16, \ 1059 - .shift = 4, \ 1020 + .shift = 16 - (_bits), \ 1060 1021 .endianness = IIO_CPU, \ 1061 1022 }, \ 1062 1023 } 1063 1024 1064 - #define XADC_CHAN_VOLTAGE(_chan, _scan_index, _addr, _ext, _alarm) { \ 1025 + #define XADC_CHAN_VOLTAGE(_chan, _scan_index, _addr, _bits, _ext, _alarm) { \ 1065 1026 .type = IIO_VOLTAGE, \ 1066 1027 .indexed = 1, \ 1067 1028 .channel = (_chan), \ ··· 1074 1035 .scan_index = (_scan_index), \ 1075 1036 .scan_type = { \ 1076 1037 .sign = ((_addr) == XADC_REG_VREFN) ? 's' : 'u', \ 1077 - .realbits = 12, \ 1038 + .realbits = (_bits), \ 1078 1039 .storagebits = 16, \ 1079 - .shift = 4, \ 1040 + .shift = 16 - (_bits), \ 1080 1041 .endianness = IIO_CPU, \ 1081 1042 }, \ 1082 1043 .extend_name = _ext, \ 1083 1044 } 1084 1045 1085 - static const struct iio_chan_spec xadc_channels[] = { 1086 - XADC_CHAN_TEMP(0, 8, XADC_REG_TEMP), 1087 - XADC_CHAN_VOLTAGE(0, 9, XADC_REG_VCCINT, "vccint", true), 1088 - XADC_CHAN_VOLTAGE(1, 10, XADC_REG_VCCAUX, "vccaux", true), 1089 - XADC_CHAN_VOLTAGE(2, 14, XADC_REG_VCCBRAM, "vccbram", true), 1090 - XADC_CHAN_VOLTAGE(3, 5, XADC_REG_VCCPINT, "vccpint", true), 1091 - XADC_CHAN_VOLTAGE(4, 6, XADC_REG_VCCPAUX, "vccpaux", true), 1092 - XADC_CHAN_VOLTAGE(5, 7, XADC_REG_VCCO_DDR, "vccoddr", true), 1093 - XADC_CHAN_VOLTAGE(6, 12, XADC_REG_VREFP, "vrefp", false), 1094 - XADC_CHAN_VOLTAGE(7, 13, XADC_REG_VREFN, "vrefn", false), 1095 - XADC_CHAN_VOLTAGE(8, 11, XADC_REG_VPVN, NULL, false), 1096 - XADC_CHAN_VOLTAGE(9, 16, XADC_REG_VAUX(0), NULL, false), 1097 - XADC_CHAN_VOLTAGE(10, 17, XADC_REG_VAUX(1), NULL, false), 1098 - XADC_CHAN_VOLTAGE(11, 18, XADC_REG_VAUX(2), NULL, false), 1099 - XADC_CHAN_VOLTAGE(12, 19, XADC_REG_VAUX(3), NULL, false), 1100 - XADC_CHAN_VOLTAGE(13, 20, XADC_REG_VAUX(4), NULL, false), 1101 - XADC_CHAN_VOLTAGE(14, 21, XADC_REG_VAUX(5), NULL, false), 1102 - XADC_CHAN_VOLTAGE(15, 22, XADC_REG_VAUX(6), NULL, false), 1103 - XADC_CHAN_VOLTAGE(16, 23, XADC_REG_VAUX(7), NULL, false), 1104 - XADC_CHAN_VOLTAGE(17, 24, XADC_REG_VAUX(8), NULL, false), 1105 - XADC_CHAN_VOLTAGE(18, 25, XADC_REG_VAUX(9), NULL, false), 1106 - XADC_CHAN_VOLTAGE(19, 26, XADC_REG_VAUX(10), NULL, false), 1107 - XADC_CHAN_VOLTAGE(20, 27, XADC_REG_VAUX(11), NULL, false), 1108 - XADC_CHAN_VOLTAGE(21, 28, XADC_REG_VAUX(12), NULL, false), 1109 - XADC_CHAN_VOLTAGE(22, 29, XADC_REG_VAUX(13), NULL, false), 1110 - XADC_CHAN_VOLTAGE(23, 30, XADC_REG_VAUX(14), NULL, false), 1111 - XADC_CHAN_VOLTAGE(24, 31, XADC_REG_VAUX(15), NULL, false), 1046 + /* 7 Series */ 1047 + #define XADC_7S_CHAN_TEMP(_chan, _scan_index, _addr) \ 1048 + XADC_CHAN_TEMP(_chan, _scan_index, _addr, 12) 1049 + #define XADC_7S_CHAN_VOLTAGE(_chan, _scan_index, _addr, _ext, _alarm) \ 1050 + XADC_CHAN_VOLTAGE(_chan, _scan_index, _addr, 12, _ext, _alarm) 1051 + 1052 + static const struct iio_chan_spec xadc_7s_channels[] = { 1053 + XADC_7S_CHAN_TEMP(0, 8, XADC_REG_TEMP), 1054 + XADC_7S_CHAN_VOLTAGE(0, 9, XADC_REG_VCCINT, "vccint", true), 1055 + XADC_7S_CHAN_VOLTAGE(1, 10, XADC_REG_VCCAUX, "vccaux", true), 1056 + XADC_7S_CHAN_VOLTAGE(2, 14, XADC_REG_VCCBRAM, "vccbram", true), 1057 + XADC_7S_CHAN_VOLTAGE(3, 5, XADC_REG_VCCPINT, "vccpint", true), 1058 + XADC_7S_CHAN_VOLTAGE(4, 6, XADC_REG_VCCPAUX, "vccpaux", true), 1059 + XADC_7S_CHAN_VOLTAGE(5, 7, XADC_REG_VCCO_DDR, "vccoddr", true), 1060 + XADC_7S_CHAN_VOLTAGE(6, 12, XADC_REG_VREFP, "vrefp", false), 1061 + XADC_7S_CHAN_VOLTAGE(7, 13, XADC_REG_VREFN, "vrefn", false), 1062 + XADC_7S_CHAN_VOLTAGE(8, 11, XADC_REG_VPVN, NULL, false), 1063 + XADC_7S_CHAN_VOLTAGE(9, 16, XADC_REG_VAUX(0), NULL, false), 1064 + XADC_7S_CHAN_VOLTAGE(10, 17, XADC_REG_VAUX(1), NULL, false), 1065 + XADC_7S_CHAN_VOLTAGE(11, 18, XADC_REG_VAUX(2), NULL, false), 1066 + XADC_7S_CHAN_VOLTAGE(12, 19, XADC_REG_VAUX(3), NULL, false), 1067 + XADC_7S_CHAN_VOLTAGE(13, 20, XADC_REG_VAUX(4), NULL, false), 1068 + XADC_7S_CHAN_VOLTAGE(14, 21, XADC_REG_VAUX(5), NULL, false), 1069 + XADC_7S_CHAN_VOLTAGE(15, 22, XADC_REG_VAUX(6), NULL, false), 1070 + XADC_7S_CHAN_VOLTAGE(16, 23, XADC_REG_VAUX(7), NULL, false), 1071 + XADC_7S_CHAN_VOLTAGE(17, 24, XADC_REG_VAUX(8), NULL, false), 1072 + XADC_7S_CHAN_VOLTAGE(18, 25, XADC_REG_VAUX(9), NULL, false), 1073 + XADC_7S_CHAN_VOLTAGE(19, 26, XADC_REG_VAUX(10), NULL, false), 1074 + XADC_7S_CHAN_VOLTAGE(20, 27, XADC_REG_VAUX(11), NULL, false), 1075 + XADC_7S_CHAN_VOLTAGE(21, 28, XADC_REG_VAUX(12), NULL, false), 1076 + XADC_7S_CHAN_VOLTAGE(22, 29, XADC_REG_VAUX(13), NULL, false), 1077 + XADC_7S_CHAN_VOLTAGE(23, 30, XADC_REG_VAUX(14), NULL, false), 1078 + XADC_7S_CHAN_VOLTAGE(24, 31, XADC_REG_VAUX(15), NULL, false), 1079 + }; 1080 + 1081 + /* UltraScale */ 1082 + #define XADC_US_CHAN_TEMP(_chan, _scan_index, _addr) \ 1083 + XADC_CHAN_TEMP(_chan, _scan_index, _addr, 10) 1084 + #define XADC_US_CHAN_VOLTAGE(_chan, _scan_index, _addr, _ext, _alarm) \ 1085 + XADC_CHAN_VOLTAGE(_chan, _scan_index, _addr, 10, _ext, _alarm) 1086 + 1087 + static const struct iio_chan_spec xadc_us_channels[] = { 1088 + XADC_US_CHAN_TEMP(0, 8, XADC_REG_TEMP), 1089 + XADC_US_CHAN_VOLTAGE(0, 9, XADC_REG_VCCINT, "vccint", true), 1090 + XADC_US_CHAN_VOLTAGE(1, 10, XADC_REG_VCCAUX, "vccaux", true), 1091 + XADC_US_CHAN_VOLTAGE(2, 14, XADC_REG_VCCBRAM, "vccbram", true), 1092 + XADC_US_CHAN_VOLTAGE(3, 5, XADC_REG_VCCPINT, "vccpsintlp", true), 1093 + XADC_US_CHAN_VOLTAGE(4, 6, XADC_REG_VCCPAUX, "vccpsintfp", true), 1094 + XADC_US_CHAN_VOLTAGE(5, 7, XADC_REG_VCCO_DDR, "vccpsaux", true), 1095 + XADC_US_CHAN_VOLTAGE(6, 12, XADC_REG_VREFP, "vrefp", false), 1096 + XADC_US_CHAN_VOLTAGE(7, 13, XADC_REG_VREFN, "vrefn", false), 1097 + XADC_US_CHAN_VOLTAGE(8, 11, XADC_REG_VPVN, NULL, false), 1098 + XADC_US_CHAN_VOLTAGE(9, 16, XADC_REG_VAUX(0), NULL, false), 1099 + XADC_US_CHAN_VOLTAGE(10, 17, XADC_REG_VAUX(1), NULL, false), 1100 + XADC_US_CHAN_VOLTAGE(11, 18, XADC_REG_VAUX(2), NULL, false), 1101 + XADC_US_CHAN_VOLTAGE(12, 19, XADC_REG_VAUX(3), NULL, false), 1102 + XADC_US_CHAN_VOLTAGE(13, 20, XADC_REG_VAUX(4), NULL, false), 1103 + XADC_US_CHAN_VOLTAGE(14, 21, XADC_REG_VAUX(5), NULL, false), 1104 + XADC_US_CHAN_VOLTAGE(15, 22, XADC_REG_VAUX(6), NULL, false), 1105 + XADC_US_CHAN_VOLTAGE(16, 23, XADC_REG_VAUX(7), NULL, false), 1106 + XADC_US_CHAN_VOLTAGE(17, 24, XADC_REG_VAUX(8), NULL, false), 1107 + XADC_US_CHAN_VOLTAGE(18, 25, XADC_REG_VAUX(9), NULL, false), 1108 + XADC_US_CHAN_VOLTAGE(19, 26, XADC_REG_VAUX(10), NULL, false), 1109 + XADC_US_CHAN_VOLTAGE(20, 27, XADC_REG_VAUX(11), NULL, false), 1110 + XADC_US_CHAN_VOLTAGE(21, 28, XADC_REG_VAUX(12), NULL, false), 1111 + XADC_US_CHAN_VOLTAGE(22, 29, XADC_REG_VAUX(13), NULL, false), 1112 + XADC_US_CHAN_VOLTAGE(23, 30, XADC_REG_VAUX(14), NULL, false), 1113 + XADC_US_CHAN_VOLTAGE(24, 31, XADC_REG_VAUX(15), NULL, false), 1112 1114 }; 1113 1115 1114 1116 static const struct iio_info xadc_info = { ··· 1163 1083 }; 1164 1084 1165 1085 static const struct of_device_id xadc_of_match_table[] = { 1166 - { .compatible = "xlnx,zynq-xadc-1.00.a", (void *)&xadc_zynq_ops }, 1167 - { .compatible = "xlnx,axi-xadc-1.00.a", (void *)&xadc_axi_ops }, 1086 + { 1087 + .compatible = "xlnx,zynq-xadc-1.00.a", 1088 + .data = &xadc_zynq_ops 1089 + }, { 1090 + .compatible = "xlnx,axi-xadc-1.00.a", 1091 + .data = &xadc_7s_axi_ops 1092 + }, { 1093 + .compatible = "xlnx,system-management-wiz-1.3", 1094 + .data = &xadc_us_axi_ops 1095 + }, 1168 1096 { }, 1169 1097 }; 1170 1098 MODULE_DEVICE_TABLE(of, xadc_of_match_table); ··· 1182 1094 { 1183 1095 struct device *dev = indio_dev->dev.parent; 1184 1096 struct xadc *xadc = iio_priv(indio_dev); 1097 + const struct iio_chan_spec *channel_templates; 1185 1098 struct iio_chan_spec *channels, *chan; 1186 1099 struct device_node *chan_node, *child; 1100 + unsigned int max_channels; 1187 1101 unsigned int num_channels; 1188 1102 const char *external_mux; 1189 1103 u32 ext_mux_chan; ··· 1226 1136 1227 1137 *conf |= XADC_CONF0_MUX | XADC_CONF0_CHAN(ext_mux_chan); 1228 1138 } 1229 - 1230 - channels = devm_kmemdup(dev, xadc_channels, 1231 - sizeof(xadc_channels), GFP_KERNEL); 1139 + if (xadc->ops->type == XADC_TYPE_S7) { 1140 + channel_templates = xadc_7s_channels; 1141 + max_channels = ARRAY_SIZE(xadc_7s_channels); 1142 + } else { 1143 + channel_templates = xadc_us_channels; 1144 + max_channels = ARRAY_SIZE(xadc_us_channels); 1145 + } 1146 + channels = devm_kmemdup(dev, channel_templates, 1147 + sizeof(channels[0]) * max_channels, GFP_KERNEL); 1232 1148 if (!channels) 1233 1149 return -ENOMEM; 1234 1150 ··· 1244 1148 chan_node = of_get_child_by_name(np, "xlnx,channels"); 1245 1149 if (chan_node) { 1246 1150 for_each_child_of_node(chan_node, child) { 1247 - if (num_channels >= ARRAY_SIZE(xadc_channels)) { 1151 + if (num_channels >= max_channels) { 1248 1152 of_node_put(child); 1249 1153 break; 1250 1154 } ··· 1279 1183 1280 1184 return 0; 1281 1185 } 1186 + 1187 + static const char * const xadc_type_names[] = { 1188 + [XADC_TYPE_S7] = "xadc", 1189 + [XADC_TYPE_US] = "xilinx-system-monitor", 1190 + }; 1282 1191 1283 1192 static int xadc_probe(struct platform_device *pdev) 1284 1193 { ··· 1323 1222 if (IS_ERR(xadc->base)) 1324 1223 return PTR_ERR(xadc->base); 1325 1224 1326 - indio_dev->name = "xadc"; 1225 + indio_dev->name = xadc_type_names[xadc->ops->type]; 1327 1226 indio_dev->modes = INDIO_DIRECT_MODE; 1328 1227 indio_dev->info = &xadc_info; 1329 1228
+4 -5
drivers/iio/adc/xilinx-xadc-events.c
··· 155 155 return ret; 156 156 } 157 157 158 - /* Register value is msb aligned, the lower 4 bits are ignored */ 159 - #define XADC_THRESHOLD_VALUE_SHIFT 4 160 - 161 158 int xadc_read_event_value(struct iio_dev *indio_dev, 162 159 const struct iio_chan_spec *chan, enum iio_event_type type, 163 160 enum iio_event_direction dir, enum iio_event_info info, ··· 174 177 return -EINVAL; 175 178 } 176 179 177 - *val >>= XADC_THRESHOLD_VALUE_SHIFT; 180 + /* MSB aligned */ 181 + *val >>= 16 - chan->scan_type.realbits; 178 182 179 183 return IIO_VAL_INT; 180 184 } ··· 189 191 struct xadc *xadc = iio_priv(indio_dev); 190 192 int ret = 0; 191 193 192 - val <<= XADC_THRESHOLD_VALUE_SHIFT; 194 + /* MSB aligned */ 195 + val <<= 16 - chan->scan_type.realbits; 193 196 194 197 if (val < 0 || val > 0xffff) 195 198 return -EINVAL;
+6
drivers/iio/adc/xilinx-xadc.h
··· 70 70 int irq; 71 71 }; 72 72 73 + enum xadc_type { 74 + XADC_TYPE_S7, /* Series 7 */ 75 + XADC_TYPE_US, /* UltraScale and UltraScale+ */ 76 + }; 77 + 73 78 struct xadc_ops { 74 79 int (*read)(struct xadc *xadc, unsigned int reg, uint16_t *val); 75 80 int (*write)(struct xadc *xadc, unsigned int reg, uint16_t val); ··· 85 80 irqreturn_t (*interrupt_handler)(int irq, void *devid); 86 81 87 82 unsigned int flags; 83 + enum xadc_type type; 88 84 }; 89 85 90 86 static inline int _xadc_read_adc_reg(struct xadc *xadc, unsigned int reg,