drivers/iio/pressure/abp060mg.c
Source file repositories/reference/linux-study-clean/drivers/iio/pressure/abp060mg.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/iio/pressure/abp060mg.c- Extension
.c- Size
- 8002 bytes
- Lines
- 266
- 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/delay.hlinux/device.hlinux/err.hlinux/i2c.hlinux/io.hlinux/kernel.hlinux/module.hlinux/iio/iio.h
Detected Declarations
struct abp_configstruct abp_stateenum abp_variantfunction abp060mg_get_measurementfunction abp060mg_read_rawfunction abp060mg_init_devicefunction abp060mg_probe
Annotated Snippet
struct abp_config {
int min;
int max;
};
static const struct abp_config abp_config[] = {
/* mbar & kPa variants */
[ABP006KG] = { .min = 0, .max = 6000 },
[ABP010KG] = { .min = 0, .max = 10000 },
[ABP016KG] = { .min = 0, .max = 16000 },
[ABP025KG] = { .min = 0, .max = 25000 },
[ABP040KG] = { .min = 0, .max = 40000 },
[ABP060KG] = { .min = 0, .max = 60000 },
[ABP100KG] = { .min = 0, .max = 100000 },
[ABP160KG] = { .min = 0, .max = 160000 },
[ABP250KG] = { .min = 0, .max = 250000 },
[ABP400KG] = { .min = 0, .max = 400000 },
[ABP600KG] = { .min = 0, .max = 600000 },
[ABP001GG] = { .min = 0, .max = 1000000 },
[ABP006KD] = { .min = -6000, .max = 6000 },
[ABP010KD] = { .min = -10000, .max = 10000 },
[ABP016KD] = { .min = -16000, .max = 16000 },
[ABP025KD] = { .min = -25000, .max = 25000 },
[ABP040KD] = { .min = -40000, .max = 40000 },
[ABP060KD] = { .min = -60000, .max = 60000 },
[ABP100KD] = { .min = -100000, .max = 100000 },
[ABP160KD] = { .min = -160000, .max = 160000 },
[ABP250KD] = { .min = -250000, .max = 250000 },
[ABP400KD] = { .min = -400000, .max = 400000 },
/* psi variants (1 psi ~ 6895 Pa) */
[ABP001PG] = { .min = 0, .max = 6985 },
[ABP005PG] = { .min = 0, .max = 34474 },
[ABP015PG] = { .min = 0, .max = 103421 },
[ABP030PG] = { .min = 0, .max = 206843 },
[ABP060PG] = { .min = 0, .max = 413686 },
[ABP100PG] = { .min = 0, .max = 689476 },
[ABP150PG] = { .min = 0, .max = 1034214 },
[ABP001PD] = { .min = -6895, .max = 6895 },
[ABP005PD] = { .min = -34474, .max = 34474 },
[ABP015PD] = { .min = -103421, .max = 103421 },
[ABP030PD] = { .min = -206843, .max = 206843 },
[ABP060PD] = { .min = -413686, .max = 413686 },
};
struct abp_state {
struct i2c_client *client;
struct mutex lock;
/*
* bus-dependent MEASURE_REQUEST length.
* If no SMBUS_QUICK support, need to send dummy byte
*/
int mreq_len;
/* model-dependent values (calculated on probe) */
int scale;
int offset;
};
static const struct iio_chan_spec abp060mg_channels[] = {
{
.type = IIO_PRESSURE,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
BIT(IIO_CHAN_INFO_OFFSET) | BIT(IIO_CHAN_INFO_SCALE),
},
};
static int abp060mg_get_measurement(struct abp_state *state, int *val)
{
struct i2c_client *client = state->client;
__be16 buf[2];
u16 pressure;
int ret;
buf[0] = 0;
ret = i2c_master_send(client, (u8 *)&buf, state->mreq_len);
if (ret < 0)
return ret;
msleep_interruptible(ABP060MG_RESP_TIME_MS);
ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
if (ret < 0)
return ret;
pressure = be16_to_cpu(buf[0]);
if (pressure & ABP060MG_ERROR_MASK)
return -EIO;
if (pressure < ABP060MG_MIN_COUNTS || pressure > ABP060MG_MAX_COUNTS)
Annotation
- Immediate include surface: `linux/delay.h`, `linux/device.h`, `linux/err.h`, `linux/i2c.h`, `linux/io.h`, `linux/kernel.h`, `linux/module.h`, `linux/iio/iio.h`.
- Detected declarations: `struct abp_config`, `struct abp_state`, `enum abp_variant`, `function abp060mg_get_measurement`, `function abp060mg_read_raw`, `function abp060mg_init_device`, `function abp060mg_probe`.
- 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.