drivers/iio/imu/adis16550.c

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

File Facts

System
Linux kernel
Corpus path
drivers/iio/imu/adis16550.c
Extension
.c
Size
30568 bytes
Lines
1148
Domain
Driver Families
Bucket
drivers/iio
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern 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

static const struct file_operations adis16550_firmware_revision_fops = {
	.open = simple_open,
	.read = adis16550_show_firmware_revision,
	.llseek = default_llseek,
	.owner = THIS_MODULE,
};

static ssize_t adis16550_show_firmware_date(struct file *file,
					    char __user *userbuf,
					    size_t count, loff_t *ppos)
{
	struct adis16550 *st = file->private_data;
	char buf[12];
	size_t len;
	u32 date;
	int ret;

	ret = adis_read_reg_32(&st->adis, ADIS16550_REG_FW_DATE, &date);
	if (ret)
		return ret;

	len = scnprintf(buf, sizeof(buf), "%.2x-%.2x-%.4x\n", date & 0xff,
			(date >> 8) & 0xff, date >> 16);

	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
}

static const struct file_operations adis16550_firmware_date_fops = {
	.open = simple_open,
	.read = adis16550_show_firmware_date,
	.llseek = default_llseek,
	.owner = THIS_MODULE,
};

static int adis16550_show_serial_number(void *arg, u64 *val)
{
	struct adis16550 *st = arg;
	u32 serial;
	int ret;

	ret = adis_read_reg_32(&st->adis, ADIS16550_REG_SERIAL_NUM, &serial);
	if (ret)
		return ret;

	*val = serial;

	return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(adis16550_serial_number_fops,
			 adis16550_show_serial_number, NULL, "0x%.8llx\n");

static int adis16550_show_product_id(void *arg, u64 *val)
{
	struct adis16550 *st = arg;
	u16 prod_id;
	int ret;

	ret = adis_read_reg_16(&st->adis, ADIS16550_REG_PROD_ID, &prod_id);
	if (ret)
		return ret;

	*val = prod_id;

	return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(adis16550_product_id_fops,
			 adis16550_show_product_id, NULL, "%llu\n");

static int adis16550_show_flash_count(void *arg, u64 *val)
{
	struct adis16550 *st = arg;
	u16 flash_count;
	int ret;

	ret = adis_read_reg_16(&st->adis, ADIS16550_REG_FLASH_CNT, &flash_count);
	if (ret)
		return ret;

	*val = flash_count;

	return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(adis16550_flash_count_fops,
			 adis16550_show_flash_count, NULL, "%lld\n");

static void adis16550_debugfs_init(struct iio_dev *indio_dev)
{
	struct adis16550 *st = iio_priv(indio_dev);
	struct dentry *d = iio_get_debugfs_dentry(indio_dev);

Annotation

Implementation Notes