drivers/iio/imu/bmi270/bmi270_core.c
Source file repositories/reference/linux-study-clean/drivers/iio/imu/bmi270/bmi270_core.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/iio/imu/bmi270/bmi270_core.c- Extension
.c- Size
- 42207 bytes
- Lines
- 1665
- Domain
- Driver Families
- Bucket
- drivers/iio
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- 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/bitfield.hlinux/firmware.hlinux/i2c.hlinux/module.hlinux/mutex.hlinux/regmap.hlinux/units.hlinux/iio/events.hlinux/iio/iio.hlinux/iio/sysfs.hlinux/iio/trigger.hlinux/iio/triggered_buffer.hlinux/iio/trigger_consumer.hbmi270.h
Detected Declarations
struct bmi270_datastruct bmi270_scalestruct bmi270_odrstruct bmi270_scale_itemstruct bmi270_odr_itemstruct bmi270_feature_regenum bmi270_irq_pinenum bmi270_scanenum bmi270_sensor_typeenum bmi270_feature_reg_idfunction bmi270_write_feature_regfunction bmi270_read_feature_regfunction bmi270_update_feature_regfunction bmi270_enable_stepsfunction bmi270_read_stepsfunction bmi270_int_map_regfunction bmi270_step_wtrmrk_enfunction bmi270_motion_regfunction bmi270_anymotion_event_enfunction bmi270_nomotion_event_enfunction bmi270_set_scalefunction bmi270_get_scalefunction bmi270_set_odrfunction bmi270_get_odrfunction bmi270_irq_thread_handlerfunction scoped_guardfunction bmi270_data_rdy_trigger_set_statefunction bmi270_trigger_handlerfunction bmi270_get_datafunction bmi270_read_rawfunction bmi270_write_rawfunction bmi270_read_availfunction in_accel_value_available_showfunction bmi270_write_event_configfunction bmi270_read_event_configfunction bmi270_write_event_valuefunction bmi270_read_event_valuefunction BITfunction bmi270_int_pin_configfunction bmi270_trigger_probefunction bmi270_validate_chip_idfunction bmi270_write_calibration_datafunction bmi270_configure_imufunction bmi270_chip_initfunction bmi270_core_probefunction bmi270_core_runtime_suspendfunction bmi270_core_runtime_resume
Annotated Snippet
struct bmi270_data {
struct device *dev;
struct regmap *regmap;
const struct bmi270_chip_info *chip_info;
enum bmi270_irq_pin irq_pin;
struct iio_trigger *trig;
/* Protect device's private data from concurrent access */
struct mutex mutex;
bool steps_enabled;
/*
* Where IIO_DMA_MINALIGN may be larger than 8 bytes, align to
* that to ensure a DMA safe buffer.
*/
struct {
__le16 channels[6];
aligned_s64 timestamp;
} buffer __aligned(IIO_DMA_MINALIGN);
/*
* Variable to access feature registers. It can be accessed concurrently
* with the 'buffer' variable
*/
__le16 regval __aligned(IIO_DMA_MINALIGN);
};
enum bmi270_scan {
BMI270_SCAN_ACCEL_X,
BMI270_SCAN_ACCEL_Y,
BMI270_SCAN_ACCEL_Z,
BMI270_SCAN_GYRO_X,
BMI270_SCAN_GYRO_Y,
BMI270_SCAN_GYRO_Z,
BMI270_SCAN_TIMESTAMP,
};
static const unsigned long bmi270_avail_scan_masks[] = {
(BIT(BMI270_SCAN_ACCEL_X) |
BIT(BMI270_SCAN_ACCEL_Y) |
BIT(BMI270_SCAN_ACCEL_Z) |
BIT(BMI270_SCAN_GYRO_X) |
BIT(BMI270_SCAN_GYRO_Y) |
BIT(BMI270_SCAN_GYRO_Z)),
0
};
const struct bmi270_chip_info bmi260_chip_info = {
.name = "bmi260",
.chip_id = BMI260_CHIP_ID_VAL,
.fw_name = BMI260_INIT_DATA_FILE,
};
EXPORT_SYMBOL_NS_GPL(bmi260_chip_info, "IIO_BMI270");
const struct bmi270_chip_info bmi270_chip_info = {
.name = "bmi270",
.chip_id = BMI270_CHIP_ID_VAL,
.fw_name = BMI270_INIT_DATA_FILE,
};
EXPORT_SYMBOL_NS_GPL(bmi270_chip_info, "IIO_BMI270");
enum bmi270_sensor_type {
BMI270_ACCEL = 0,
BMI270_GYRO,
BMI270_TEMP,
};
struct bmi270_scale {
int scale;
int uscale;
};
struct bmi270_odr {
int odr;
int uodr;
};
static const struct bmi270_scale bmi270_accel_scale[] = {
{ 0, 598 },
{ 0, 1197 },
{ 0, 2394 },
{ 0, 4788 },
};
static const struct bmi270_scale bmi270_gyro_scale[] = {
{ 0, 1065 },
{ 0, 532 },
{ 0, 266 },
{ 0, 133 },
{ 0, 66 },
};
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/firmware.h`, `linux/i2c.h`, `linux/module.h`, `linux/mutex.h`, `linux/regmap.h`, `linux/units.h`, `linux/iio/events.h`.
- Detected declarations: `struct bmi270_data`, `struct bmi270_scale`, `struct bmi270_odr`, `struct bmi270_scale_item`, `struct bmi270_odr_item`, `struct bmi270_feature_reg`, `enum bmi270_irq_pin`, `enum bmi270_scan`, `enum bmi270_sensor_type`, `enum bmi270_feature_reg_id`.
- Atlas domain: Driver Families / drivers/iio.
- Implementation status: integration 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.