iio: adc: adi-axi-adc: implement backend debugfs interface
Implement debugfs options to read/write registers and print the channel status into a buffer (so we may know better the cause for errors) . Signed-off-by: Nuno Sa <nuno.sa@analog.com> Link: https://patch.msgid.link/20240802-dev-iio-backend-add-debugfs-v2-6-4cb62852f0d0@analog.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
232cca61cf
commit
c031fee042
@ -61,6 +61,10 @@
|
|||||||
|
|
||||||
#define ADI_AXI_ADC_REG_CHAN_STATUS(c) (0x0404 + (c) * 0x40)
|
#define ADI_AXI_ADC_REG_CHAN_STATUS(c) (0x0404 + (c) * 0x40)
|
||||||
#define ADI_AXI_ADC_CHAN_STAT_PN_MASK GENMASK(2, 1)
|
#define ADI_AXI_ADC_CHAN_STAT_PN_MASK GENMASK(2, 1)
|
||||||
|
/* out of sync */
|
||||||
|
#define ADI_AXI_ADC_CHAN_STAT_PN_OOS BIT(1)
|
||||||
|
/* spurious out of sync */
|
||||||
|
#define ADI_AXI_ADC_CHAN_STAT_PN_ERR BIT(2)
|
||||||
|
|
||||||
#define ADI_AXI_ADC_REG_CHAN_CTRL_3(c) (0x0418 + (c) * 0x40)
|
#define ADI_AXI_ADC_REG_CHAN_CTRL_3(c) (0x0418 + (c) * 0x40)
|
||||||
#define ADI_AXI_ADC_CHAN_PN_SEL_MASK GENMASK(19, 16)
|
#define ADI_AXI_ADC_CHAN_PN_SEL_MASK GENMASK(19, 16)
|
||||||
@ -246,6 +250,30 @@ static int axi_adc_chan_status(struct iio_backend *back, unsigned int chan,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int axi_adc_debugfs_print_chan_status(struct iio_backend *back,
|
||||||
|
unsigned int chan, char *buf,
|
||||||
|
size_t len)
|
||||||
|
{
|
||||||
|
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
|
||||||
|
u32 val;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = axi_adc_read_chan_status(st, chan, &val);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PN_ERR is cleared in case out of sync is set. Hence, no point in
|
||||||
|
* checking both bits.
|
||||||
|
*/
|
||||||
|
if (val & ADI_AXI_ADC_CHAN_STAT_PN_OOS)
|
||||||
|
return scnprintf(buf, len, "CH%u: Out of Sync.\n", chan);
|
||||||
|
if (val & ADI_AXI_ADC_CHAN_STAT_PN_ERR)
|
||||||
|
return scnprintf(buf, len, "CH%u: Spurious Out of Sync.\n", chan);
|
||||||
|
|
||||||
|
return scnprintf(buf, len, "CH%u: OK.\n", chan);
|
||||||
|
}
|
||||||
|
|
||||||
static int axi_adc_chan_enable(struct iio_backend *back, unsigned int chan)
|
static int axi_adc_chan_enable(struct iio_backend *back, unsigned int chan)
|
||||||
{
|
{
|
||||||
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
|
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
|
||||||
@ -280,6 +308,17 @@ static void axi_adc_free_buffer(struct iio_backend *back,
|
|||||||
iio_dmaengine_buffer_free(buffer);
|
iio_dmaengine_buffer_free(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int axi_adc_reg_access(struct iio_backend *back, unsigned int reg,
|
||||||
|
unsigned int writeval, unsigned int *readval)
|
||||||
|
{
|
||||||
|
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
|
||||||
|
|
||||||
|
if (readval)
|
||||||
|
return regmap_read(st->regmap, reg, readval);
|
||||||
|
|
||||||
|
return regmap_write(st->regmap, reg, writeval);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct regmap_config axi_adc_regmap_config = {
|
static const struct regmap_config axi_adc_regmap_config = {
|
||||||
.val_bits = 32,
|
.val_bits = 32,
|
||||||
.reg_bits = 32,
|
.reg_bits = 32,
|
||||||
@ -298,6 +337,8 @@ static const struct iio_backend_ops adi_axi_adc_ops = {
|
|||||||
.iodelay_set = axi_adc_iodelays_set,
|
.iodelay_set = axi_adc_iodelays_set,
|
||||||
.test_pattern_set = axi_adc_test_pattern_set,
|
.test_pattern_set = axi_adc_test_pattern_set,
|
||||||
.chan_status = axi_adc_chan_status,
|
.chan_status = axi_adc_chan_status,
|
||||||
|
.debugfs_reg_access = iio_backend_debugfs_ptr(axi_adc_reg_access),
|
||||||
|
.debugfs_print_chan_status = iio_backend_debugfs_ptr(axi_adc_debugfs_print_chan_status),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct iio_backend_info adi_axi_adc_generic = {
|
static const struct iio_backend_info adi_axi_adc_generic = {
|
||||||
|
Loading…
Reference in New Issue
Block a user