Commit c2b7720a authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Jonathan Cameron

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: default avatarLars-Peter Clausen <lars@metafoo.de>
Tested-by: default avatarAnand Ashok Dumbre <anandash@xilinx.com>
Reviewed-by: default avatarAnand Ashok Dumbre <anandash@xilinx.com>
Link: https://lore.kernel.org/r/20200922134624.13191-2-lars@metafoo.deSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent d0dc4c80
...@@ -1228,8 +1228,15 @@ config XILINX_XADC ...@@ -1228,8 +1228,15 @@ config XILINX_XADC
select IIO_BUFFER select IIO_BUFFER
select IIO_TRIGGERED_BUFFER select IIO_TRIGGERED_BUFFER
help help
Say yes here to have support for the Xilinx XADC. The driver does support Say yes here to have support for the Xilinx 7 Series XADC or
both the ZYNQ interface to the XADC as well as the AXI-XADC interface. UltraScale/UltraScale+ System Management Wizard.
For the 7 Series the driver does support both the ZYNQ interface
to the XADC as well as the AXI-XADC interface.
The driver also support the Xilinx System Management Wizard IP core
that can be used to access the System Monitor ADC on the Xilinx
UltraScale and UltraScale+ FPGAs.
The driver can also be build as a module. If so, the module will be called The driver can also be build as a module. If so, the module will be called
xilinx-xadc. xilinx-xadc.
......
This diff is collapsed.
...@@ -155,9 +155,6 @@ int xadc_write_event_config(struct iio_dev *indio_dev, ...@@ -155,9 +155,6 @@ int xadc_write_event_config(struct iio_dev *indio_dev,
return ret; return ret;
} }
/* Register value is msb aligned, the lower 4 bits are ignored */
#define XADC_THRESHOLD_VALUE_SHIFT 4
int xadc_read_event_value(struct iio_dev *indio_dev, int xadc_read_event_value(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan, enum iio_event_type type, const struct iio_chan_spec *chan, enum iio_event_type type,
enum iio_event_direction dir, enum iio_event_info info, enum iio_event_direction dir, enum iio_event_info info,
...@@ -177,7 +174,8 @@ int xadc_read_event_value(struct iio_dev *indio_dev, ...@@ -177,7 +174,8 @@ int xadc_read_event_value(struct iio_dev *indio_dev,
return -EINVAL; return -EINVAL;
} }
*val >>= XADC_THRESHOLD_VALUE_SHIFT; /* MSB aligned */
*val >>= 16 - chan->scan_type.realbits;
return IIO_VAL_INT; return IIO_VAL_INT;
} }
...@@ -191,7 +189,8 @@ int xadc_write_event_value(struct iio_dev *indio_dev, ...@@ -191,7 +189,8 @@ int xadc_write_event_value(struct iio_dev *indio_dev,
struct xadc *xadc = iio_priv(indio_dev); struct xadc *xadc = iio_priv(indio_dev);
int ret = 0; int ret = 0;
val <<= XADC_THRESHOLD_VALUE_SHIFT; /* MSB aligned */
val <<= 16 - chan->scan_type.realbits;
if (val < 0 || val > 0xffff) if (val < 0 || val > 0xffff)
return -EINVAL; return -EINVAL;
......
...@@ -70,6 +70,11 @@ struct xadc { ...@@ -70,6 +70,11 @@ struct xadc {
int irq; int irq;
}; };
enum xadc_type {
XADC_TYPE_S7, /* Series 7 */
XADC_TYPE_US, /* UltraScale and UltraScale+ */
};
struct xadc_ops { struct xadc_ops {
int (*read)(struct xadc *xadc, unsigned int reg, uint16_t *val); int (*read)(struct xadc *xadc, unsigned int reg, uint16_t *val);
int (*write)(struct xadc *xadc, unsigned int reg, uint16_t val); int (*write)(struct xadc *xadc, unsigned int reg, uint16_t val);
...@@ -80,6 +85,7 @@ struct xadc_ops { ...@@ -80,6 +85,7 @@ struct xadc_ops {
irqreturn_t (*interrupt_handler)(int irq, void *devid); irqreturn_t (*interrupt_handler)(int irq, void *devid);
unsigned int flags; unsigned int flags;
enum xadc_type type;
}; };
static inline int _xadc_read_adc_reg(struct xadc *xadc, unsigned int reg, static inline int _xadc_read_adc_reg(struct xadc *xadc, unsigned int reg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment