drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c

Source file repositories/reference/linux-study-clean/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c

File Facts

System
Linux kernel
Corpus path
drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c
Extension
.c
Size
8746 bytes
Lines
333
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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (result) {
			dev_err(regmap_get_device(st->map), "failed to ack interrupt\n");
			return IRQ_HANDLED;
		}

		/* handle WoM event */
		if (st->chip_config.wom_en && (int_status & wom_bits)) {
			ev_code = IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
						     IIO_EV_TYPE_ROC, IIO_EV_DIR_RISING);
			iio_push_event(indio_dev, ev_code, st->it_timestamp);
		}
	}

data_ready_interrupt:
	/* handle raw data interrupt */
	if (int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT) {
		indio_dev->pollfunc->timestamp = st->it_timestamp;
		iio_trigger_poll_nested(st->trig);
	}

	return IRQ_HANDLED;
}

int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev, int irq_type)
{
	int ret;
	struct inv_mpu6050_state *st = iio_priv(indio_dev);

	st->trig = devm_iio_trigger_alloc(&indio_dev->dev,
					  "%s-dev%d",
					  indio_dev->name,
					  iio_device_id(indio_dev));
	if (!st->trig)
		return -ENOMEM;

	irq_type |= IRQF_ONESHOT;
	ret = devm_request_threaded_irq(&indio_dev->dev, st->irq,
					&inv_mpu6050_interrupt_timestamp,
					&inv_mpu6050_interrupt_handle,
					irq_type, "inv_mpu", indio_dev);
	if (ret)
		return ret;

	st->trig->dev.parent = regmap_get_device(st->map);
	st->trig->ops = &inv_mpu_trigger_ops;
	iio_trigger_set_drvdata(st->trig, indio_dev);

	ret = devm_iio_trigger_register(&indio_dev->dev, st->trig);
	if (ret)
		return ret;

	indio_dev->trig = iio_trigger_get(st->trig);

	return 0;
}

Annotation

Implementation Notes