drivers/iio/accel/bma400_core.c

Source file repositories/reference/linux-study-clean/drivers/iio/accel/bma400_core.c

File Facts

System
Linux kernel
Corpus path
drivers/iio/accel/bma400_core.c
Extension
.c
Size
45872 bytes
Lines
1810
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct bma400_sample_freq {
	int hz;
	int uhz;
};

enum bma400_activity {
	BMA400_STILL,
	BMA400_WALKING,
	BMA400_RUNNING,
};

struct bma400_data {
	struct device *dev;
	struct regmap *regmap;
	struct mutex mutex; /* data register lock */
	struct iio_mount_matrix orientation;
	enum bma400_power_mode power_mode;
	struct bma400_sample_freq sample_freq;
	int oversampling_ratio;
	int scale;
	struct iio_trigger *trig;
	int steps_enabled;
	bool step_event_en;
	bool activity_event_en;
	unsigned int generic_event_en;
	unsigned int tap_event_en_bitmask;
	/* Correct time stamp alignment */
	struct {
		__le16 buff[3];
		u8 temperature;
		aligned_s64 ts;
	} buffer __aligned(IIO_DMA_MINALIGN);
	__le16 status;
	__be16 duration;
};

struct bma400_genintr_info {
	enum bma400_generic_intr genintr;
	unsigned int intrmask;
	enum iio_event_direction dir;
	enum bma400_detect_criterion detect_mode;
};

/* Lookup struct for determining GEN1/GEN2 based on dir */
static const struct bma400_genintr_info bma400_genintrs[] = {
	[IIO_EV_DIR_RISING] = {
		.genintr = BMA400_GEN1_INTR,
		.intrmask = BMA400_INT_CONFIG0_GEN1_MASK,
		.dir = IIO_EV_DIR_RISING,
		.detect_mode = BMA400_DETECT_ACTIVITY,
	},
	[IIO_EV_DIR_FALLING] = {
		.genintr = BMA400_GEN2_INTR,
		.intrmask = BMA400_INT_CONFIG0_GEN2_MASK,
		.dir = IIO_EV_DIR_FALLING,
		.detect_mode = BMA400_DETECT_INACTIVITY,
	}
};

static inline const struct bma400_genintr_info *
get_bma400_genintr_info(enum iio_event_direction dir)
{
	switch (dir) {
	case IIO_EV_DIR_RISING:
	case IIO_EV_DIR_FALLING:
		return &bma400_genintrs[dir];
	default:
		return NULL;
	};
}

static bool bma400_is_writable_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
	case BMA400_CHIP_ID_REG:
	case BMA400_ERR_REG:
	case BMA400_STATUS_REG:
	case BMA400_ACC_X_LSB_REG:
	case BMA400_ACC_X_MSB_REG:
	case BMA400_ACC_Y_LSB_REG:
	case BMA400_ACC_Y_MSB_REG:
	case BMA400_ACC_Z_LSB_REG:
	case BMA400_ACC_Z_MSB_REG:
	case BMA400_SENSOR_TIME0_REG:
	case BMA400_SENSOR_TIME1_REG:
	case BMA400_SENSOR_TIME2_REG:
	case BMA400_EVENT_REG:
	case BMA400_INT_STAT0_REG:
	case BMA400_INT_STAT1_REG:
	case BMA400_INT_STAT2_REG:

Annotation

Implementation Notes