drivers/iio/adc/adi-axi-adc.c
Source file repositories/reference/linux-study-clean/drivers/iio/adc/adi-axi-adc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/iio/adc/adi-axi-adc.c- Extension
.c- Size
- 23633 bytes
- Lines
- 814
- Domain
- Driver Families
- Bucket
- drivers/iio
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/adi-axi-common.hlinux/bitfield.hlinux/cleanup.hlinux/clk.hlinux/err.hlinux/io.hlinux/delay.hlinux/mod_devicetable.hlinux/module.hlinux/mutex.hlinux/platform_device.hlinux/property.hlinux/regmap.hlinux/slab.hlinux/iio/backend.hlinux/iio/buffer-dmaengine.hlinux/iio/buffer.hlinux/iio/iio.had7606_bus_iface.h
Detected Declarations
struct axi_adc_infostruct adi_axi_adc_statefunction axi_adc_enablefunction axi_adc_disablefunction axi_adc_data_format_setfunction axi_adc_data_sample_triggerfunction axi_adc_iodelays_setfunction axi_adc_test_pattern_setfunction axi_adc_oversampling_ratio_setfunction axi_adc_read_chan_statusfunction axi_adc_chan_statusfunction axi_adc_debugfs_print_chan_statusfunction axi_adc_chan_enablefunction axi_adc_chan_disablefunction axi_adc_interface_type_getfunction axi_adc_ad485x_data_size_setfunction axi_adc_ad485x_oversampling_ratio_setfunction axi_adc_ad408x_filter_type_setfunction axi_adc_ad408x_interface_data_alignfunction axi_adc_num_lanes_setfunction axi_adc_raw_writefunction axi_adc_raw_readfunction ad7606_bus_reg_readfunction ad7606_bus_reg_writefunction axi_adc_free_bufferfunction axi_adc_reg_accessfunction axi_adc_child_removefunction axi_adc_create_platform_devicefunction adi_axi_adc_probefunction device_for_each_child_node_scoped
Annotated Snippet
struct axi_adc_info {
unsigned int version;
const struct iio_backend_info *backend_info;
bool has_child_nodes;
const void *pdata;
unsigned int pdata_sz;
};
struct adi_axi_adc_state {
const struct axi_adc_info *info;
struct regmap *regmap;
struct device *dev;
/* lock to protect multiple accesses to the device registers */
struct mutex lock;
};
static int axi_adc_enable(struct iio_backend *back)
{
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
unsigned int __val;
int ret;
guard(mutex)(&st->lock);
ret = regmap_set_bits(st->regmap, ADI_AXI_REG_RSTN,
ADI_AXI_REG_RSTN_MMCM_RSTN);
if (ret)
return ret;
/*
* Make sure the DRP (Dynamic Reconfiguration Port) is locked. Not all
* designs really use it but if they don't we still get the lock bit
* set. So let's do it all the time so the code is generic.
*/
ret = regmap_read_poll_timeout(st->regmap, ADI_AXI_ADC_REG_DRP_STATUS,
__val, __val & ADI_AXI_ADC_DRP_LOCKED,
100, 1000);
if (ret)
return ret;
return regmap_set_bits(st->regmap, ADI_AXI_REG_RSTN,
ADI_AXI_REG_RSTN_RSTN | ADI_AXI_REG_RSTN_MMCM_RSTN);
}
static void axi_adc_disable(struct iio_backend *back)
{
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
guard(mutex)(&st->lock);
regmap_write(st->regmap, ADI_AXI_REG_RSTN, 0);
}
static int axi_adc_data_format_set(struct iio_backend *back, unsigned int chan,
const struct iio_backend_data_fmt *data)
{
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
u32 val;
if (!data->enable)
return regmap_clear_bits(st->regmap,
ADI_AXI_REG_CHAN_CTRL(chan),
ADI_AXI_REG_CHAN_CTRL_FMT_EN);
val = FIELD_PREP(ADI_AXI_REG_CHAN_CTRL_FMT_EN, true);
if (data->sign_extend)
val |= FIELD_PREP(ADI_AXI_REG_CHAN_CTRL_FMT_SIGNEXT, true);
if (data->type == IIO_BACKEND_OFFSET_BINARY)
val |= FIELD_PREP(ADI_AXI_REG_CHAN_CTRL_FMT_TYPE, true);
return regmap_update_bits(st->regmap, ADI_AXI_REG_CHAN_CTRL(chan),
ADI_AXI_REG_CHAN_CTRL_FMT_MASK, val);
}
static int axi_adc_data_sample_trigger(struct iio_backend *back,
enum iio_backend_sample_trigger trigger)
{
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
switch (trigger) {
case IIO_BACKEND_SAMPLE_TRIGGER_EDGE_RISING:
return regmap_clear_bits(st->regmap, ADI_AXI_ADC_REG_CTRL,
ADI_AXI_ADC_CTRL_DDR_EDGESEL_MASK);
case IIO_BACKEND_SAMPLE_TRIGGER_EDGE_FALLING:
return regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CTRL,
ADI_AXI_ADC_CTRL_DDR_EDGESEL_MASK);
default:
return -EINVAL;
}
}
static int axi_adc_iodelays_set(struct iio_backend *back, unsigned int lane,
Annotation
- Immediate include surface: `linux/adi-axi-common.h`, `linux/bitfield.h`, `linux/cleanup.h`, `linux/clk.h`, `linux/err.h`, `linux/io.h`, `linux/delay.h`, `linux/mod_devicetable.h`.
- Detected declarations: `struct axi_adc_info`, `struct adi_axi_adc_state`, `function axi_adc_enable`, `function axi_adc_disable`, `function axi_adc_data_format_set`, `function axi_adc_data_sample_trigger`, `function axi_adc_iodelays_set`, `function axi_adc_test_pattern_set`, `function axi_adc_oversampling_ratio_set`, `function axi_adc_read_chan_status`.
- Atlas domain: Driver Families / drivers/iio.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.