drivers/iio/adc/ad7124.c
Source file repositories/reference/linux-study-clean/drivers/iio/adc/ad7124.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/iio/adc/ad7124.c- Extension
.c- Size
- 46999 bytes
- Lines
- 1707
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bitfield.hlinux/bitops.hlinux/cleanup.hlinux/clk.hlinux/clk-provider.hlinux/debugfs.hlinux/delay.hlinux/device.hlinux/err.hlinux/interrupt.hlinux/kernel.hlinux/kfifo.hlinux/minmax.hlinux/module.hlinux/mod_devicetable.hlinux/property.hlinux/regulator/consumer.hlinux/spi/spi.hlinux/sprintf.hlinux/units.hlinux/iio/iio.hlinux/iio/adc/ad_sigma_delta.hlinux/iio/sysfs.h
Detected Declarations
struct ad7124_chip_infostruct ad7124_channel_configstruct ad7124_channelstruct ad7124_stateenum ad7124_ref_selenum ad7124_power_modeenum ad7124_filter_typefunction ad7124_find_closest_matchfunction ad7124_spi_write_maskfunction ad7124_set_modefunction ad7124_get_fclk_hzfunction ad7124_get_fs_factorfunction ad7124_get_fadc_divisorfunction ad7124_set_channel_odrfunction ad7124_get_3db_filter_factorfunction ad7124_init_config_vreffunction ad7124_config_equalfunction ad7124_write_configfunction ad7124_request_config_slotfunction ad7124_release_config_slotfunction ad7124_prepare_readfunction ad7124_set_channelfunction ad7124_append_statusfunction ad7124_disable_onefunction ad7124_disable_allfunction ad7124_read_availfunction ad7124_read_rawfunction ad7124_write_rawfunction ad7124_reg_accessfunction ad7124_update_scan_modefunction ad7124_soft_resetfunction ad7124_check_chip_idfunction ad7124_syscalib_lockedfunction ad7124_write_syscalibfunction ad7124_set_syscalib_modefunction ad7124_get_syscalib_modefunction ad7124_set_filter_type_attrfunction ad7124_get_filter_type_attrfunction ad7124_valid_input_selectfunction ad7124_parse_channel_configfunction device_for_each_child_node_scopedfunction ad7124_setupfunction device_property_presentfunction __ad7124_calibrate_allfunction ad7124_calibrate_allfunction ad_sd_calibratefunction ad7124_reg_disablefunction ad7124_debugfs_init
Annotated Snippet
struct ad7124_chip_info {
const char *name;
unsigned int chip_id;
unsigned int num_inputs;
};
enum ad7124_filter_type {
AD7124_FILTER_TYPE_SINC3,
AD7124_FILTER_TYPE_SINC3_PF1,
AD7124_FILTER_TYPE_SINC3_PF2,
AD7124_FILTER_TYPE_SINC3_PF3,
AD7124_FILTER_TYPE_SINC3_PF4,
AD7124_FILTER_TYPE_SINC3_REJ60,
AD7124_FILTER_TYPE_SINC3_SINC1,
AD7124_FILTER_TYPE_SINC4,
AD7124_FILTER_TYPE_SINC4_REJ60,
AD7124_FILTER_TYPE_SINC4_SINC1,
};
struct ad7124_channel_config {
unsigned int cfg_slot;
unsigned int requested_odr;
unsigned int requested_odr_micro;
/*
* Following fields are used to compare for equality. If you
* make adaptations in it, you most likely also have to adapt
* ad7124_config_equal(), too.
*/
struct_group(config_props,
enum ad7124_ref_sel refsel;
bool bipolar;
bool buf_positive;
bool buf_negative;
unsigned int vref_mv;
unsigned int pga_bits;
unsigned int odr_sel_bits;
enum ad7124_filter_type filter_type;
unsigned int calibration_offset;
unsigned int calibration_gain;
);
};
struct ad7124_channel {
struct ad7124_channel_config cfg;
unsigned int ain;
unsigned int slot;
u8 syscalib_mode;
};
struct ad7124_state {
const struct ad7124_chip_info *chip_info;
struct ad_sigma_delta sd;
struct ad7124_channel *channels;
struct regulator *vref[4];
u32 clk_hz;
unsigned int adc_control;
unsigned int num_channels;
struct mutex cfgs_lock; /* lock for configs access */
u8 cfg_slot_use_count[AD7124_MAX_CONFIGS];
/*
* Stores the power-on reset value for the GAIN(x) registers which are
* needed for measurements at gain 1 (i.e. CONFIG(x).PGA == 0)
*/
unsigned int gain_default;
bool enable_single_cycle;
};
static const struct ad7124_chip_info ad7124_4_chip_info = {
.name = "ad7124-4",
.chip_id = AD7124_ID_DEVICE_ID_AD7124_4,
.num_inputs = 8,
};
static const struct ad7124_chip_info ad7124_8_chip_info = {
.name = "ad7124-8",
.chip_id = AD7124_ID_DEVICE_ID_AD7124_8,
.num_inputs = 16,
};
static int ad7124_find_closest_match(const int *array,
unsigned int size, int val)
{
int i, idx;
unsigned int diff_new, diff_old;
diff_old = U32_MAX;
idx = 0;
for (i = 0; i < size; i++) {
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/bitops.h`, `linux/cleanup.h`, `linux/clk.h`, `linux/clk-provider.h`, `linux/debugfs.h`, `linux/delay.h`, `linux/device.h`.
- Detected declarations: `struct ad7124_chip_info`, `struct ad7124_channel_config`, `struct ad7124_channel`, `struct ad7124_state`, `enum ad7124_ref_sel`, `enum ad7124_power_mode`, `enum ad7124_filter_type`, `function ad7124_find_closest_match`, `function ad7124_spi_write_mask`, `function ad7124_set_mode`.
- Atlas domain: Driver Families / drivers/iio.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.