drivers/iio/proximity/irsd200.c
Source file repositories/reference/linux-study-clean/drivers/iio/proximity/irsd200.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/iio/proximity/irsd200.c- Extension
.c- Size
- 23132 bytes
- Lines
- 956
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/unaligned.hlinux/bitfield.hlinux/i2c.hlinux/module.hlinux/regmap.hlinux/string_choices.hlinux/iio/buffer.hlinux/iio/events.hlinux/iio/iio.hlinux/iio/trigger.hlinux/iio/trigger_consumer.hlinux/iio/triggered_buffer.hlinux/iio/types.h
Detected Declarations
struct irsd200_dataenum irsd200_regfieldfunction irsd200_setupfunction irsd200_read_thresholdfunction irsd200_write_thresholdfunction irsd200_read_datafunction irsd200_read_data_ratefunction irsd200_write_data_ratefunction irsd200_read_timerfunction irsd200_write_timerfunction irsd200_read_nr_countfunction irsd200_write_nr_countfunction irsd200_read_lp_filterfunction irsd200_write_lp_filterfunction irsd200_read_hp_filterfunction irsd200_write_hp_filterfunction irsd200_read_rawfunction irsd200_read_availfunction irsd200_write_rawfunction irsd200_read_eventfunction irsd200_write_eventfunction irsd200_read_event_configfunction irsd200_write_event_configfunction irsd200_irq_threadfunction irsd200_trigger_handlerfunction irsd200_set_trigger_statefunction irsd200_probe
Annotated Snippet
struct irsd200_data {
struct regmap *regmap;
struct regmap_field *regfields[IRS_REGF_MAX];
struct device *dev;
};
static int irsd200_setup(struct irsd200_data *data)
{
unsigned int val;
int ret;
/* Disable all interrupt sources. */
ret = regmap_write(data->regmap, IRS_REG_INTR, 0);
if (ret) {
dev_err(data->dev, "Could not set interrupt sources (%d)\n",
ret);
return ret;
}
/* Set operation to active. */
ret = regmap_write(data->regmap, IRS_REG_OP, IRS_OP_ACTIVE);
if (ret) {
dev_err(data->dev, "Could not set operation mode (%d)\n", ret);
return ret;
}
/* Clear threshold count. */
ret = regmap_read(data->regmap, IRS_REG_COUNT, &val);
if (ret) {
dev_err(data->dev, "Could not clear threshold count (%d)\n",
ret);
return ret;
}
/* Clear status. */
ret = regmap_write(data->regmap, IRS_REG_STATUS, 0x0f);
if (ret) {
dev_err(data->dev, "Could not clear status (%d)\n", ret);
return ret;
}
return 0;
}
static int irsd200_read_threshold(struct irsd200_data *data,
enum iio_event_direction dir, int *val)
{
unsigned int regval;
unsigned int reg;
int scale;
int ret;
/* Set quantization scale. */
if (dir == IIO_EV_DIR_RISING) {
scale = IRS_THR_QUANT_SCALE;
reg = IRS_REG_THR_HI;
} else if (dir == IIO_EV_DIR_FALLING) {
scale = -IRS_THR_QUANT_SCALE;
reg = IRS_REG_THR_LO;
} else {
return -EINVAL;
}
ret = regmap_read(data->regmap, reg, ®val);
if (ret) {
dev_err(data->dev, "Could not read threshold (%d)\n", ret);
return ret;
}
*val = ((int)regval) * scale;
return 0;
}
static int irsd200_write_threshold(struct irsd200_data *data,
enum iio_event_direction dir, int val)
{
unsigned int regval;
unsigned int reg;
int scale;
int ret;
/* Set quantization scale. */
if (dir == IIO_EV_DIR_RISING) {
if (val < 0)
return -ERANGE;
scale = IRS_THR_QUANT_SCALE;
reg = IRS_REG_THR_HI;
} else if (dir == IIO_EV_DIR_FALLING) {
Annotation
- Immediate include surface: `linux/unaligned.h`, `linux/bitfield.h`, `linux/i2c.h`, `linux/module.h`, `linux/regmap.h`, `linux/string_choices.h`, `linux/iio/buffer.h`, `linux/iio/events.h`.
- Detected declarations: `struct irsd200_data`, `enum irsd200_regfield`, `function irsd200_setup`, `function irsd200_read_threshold`, `function irsd200_write_threshold`, `function irsd200_read_data`, `function irsd200_read_data_rate`, `function irsd200_write_data_rate`, `function irsd200_read_timer`, `function irsd200_write_timer`.
- Atlas domain: Driver Families / drivers/iio.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.