drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c

Source file repositories/reference/linux-study-clean/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c

File Facts

System
Linux kernel
Corpus path
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
Extension
.c
Size
68731 bytes
Lines
3020
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

if (val < 0) {
			err = val;
		} else {
			sensor->odr = val;
			sensor->hwfifo_odr_mHz = val;
		}
		break;
	}
	default:
		err = -EINVAL;
		break;
	}

	iio_device_release_direct(iio_dev);

	return err;
}

static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw,
				  enum st_lsm6dsx_event_id event, int axis,
				  bool state)
{
	const struct st_lsm6dsx_event_src *src;
	unsigned int data;
	int err;
	u8 old_enable, new_enable;

	if (!hw->irq_routing)
		return -ENOTSUPP;

	/* Enable/disable event interrupt */
	src = &hw->settings->event_settings.sources[event];
	if (src->enable_axis_reg) {
		u8 enable_mask;

		switch (axis) {
		case IIO_MOD_X:
			enable_mask = src->enable_x_mask;
			break;
		case IIO_MOD_Y:
			enable_mask = src->enable_y_mask;
			break;
		case IIO_MOD_Z:
			enable_mask = src->enable_z_mask;
			break;
		default:
			enable_mask = 0;
		}
		if (enable_mask) {
			data = ST_LSM6DSX_SHIFT_VAL(state, enable_mask);
			err = st_lsm6dsx_update_bits_locked(hw,
							    src->enable_axis_reg,
							    enable_mask, data);
			if (err < 0)
				return err;
		}
	}

	/*
	 * If the set of axes for which the event source is enabled does not
	 * change from empty to non-empty or vice versa, there is nothing else
	 * to do.
	 */
	old_enable = hw->enable_event[event];
	new_enable = state ? (old_enable | BIT(axis)) :
			     (old_enable & ~BIT(axis));
	if (!old_enable == !new_enable)
		return 0;

	data = ST_LSM6DSX_SHIFT_VAL(state, src->enable_mask);
	return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing,
					     src->enable_mask, data);
}

static enum st_lsm6dsx_event_id
st_lsm6dsx_get_event_id(enum iio_event_type type)
{
	switch (type) {
	case IIO_EV_TYPE_THRESH:
		return ST_LSM6DSX_EVENT_WAKEUP;
	case IIO_EV_TYPE_GESTURE:
		return ST_LSM6DSX_EVENT_TAP;
	default:
		return ST_LSM6DSX_EVENT_MAX;
	}
}

static const struct st_lsm6dsx_reg *
st_lsm6dsx_get_event_reg(struct st_lsm6dsx_hw *hw,
			 enum st_lsm6dsx_event_id event,

Annotation

Implementation Notes