drivers/iio/imu/adis16460.c

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

File Facts

System
Linux kernel
Corpus path
drivers/iio/imu/adis16460.c
Extension
.c
Size
11093 bytes
Lines
422
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

struct adis16460_chip_info {
	unsigned int num_channels;
	const struct iio_chan_spec *channels;
	unsigned int gyro_max_val;
	unsigned int gyro_max_scale;
	unsigned int accel_max_val;
	unsigned int accel_max_scale;
};

struct adis16460 {
	const struct adis16460_chip_info *chip_info;
	struct adis adis;
};

static int adis16460_show_serial_number(void *arg, u64 *val)
{
	struct adis16460 *adis16460 = arg;
	u16 serial;
	int ret;

	ret = adis_read_reg_16(&adis16460->adis, ADIS16460_REG_SERIAL_NUM,
		&serial);
	if (ret)
		return ret;

	*val = serial;

	return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(adis16460_serial_number_fops,
		adis16460_show_serial_number, NULL, "0x%.4llx\n");

static int adis16460_show_product_id(void *arg, u64 *val)
{
	struct adis16460 *adis16460 = arg;
	u16 prod_id;
	int ret;

	ret = adis_read_reg_16(&adis16460->adis, ADIS16460_REG_PROD_ID,
		&prod_id);
	if (ret)
		return ret;

	*val = prod_id;

	return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(adis16460_product_id_fops,
		adis16460_show_product_id, NULL, "%llu\n");

static int adis16460_show_flash_count(void *arg, u64 *val)
{
	struct adis16460 *adis16460 = arg;
	u32 flash_count;
	int ret;

	ret = adis_read_reg_32(&adis16460->adis, ADIS16460_REG_FLASH_CNT,
		&flash_count);
	if (ret)
		return ret;

	*val = flash_count;

	return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(adis16460_flash_count_fops,
		adis16460_show_flash_count, NULL, "%lld\n");

static void adis16460_debugfs_init(struct iio_dev *indio_dev)
{
	struct adis16460 *adis16460 = iio_priv(indio_dev);
	struct dentry *d = iio_get_debugfs_dentry(indio_dev);

	if (!IS_ENABLED(CONFIG_DEBUG_FS))
		return;

	debugfs_create_file_unsafe("serial_number", 0400,
			d, adis16460, &adis16460_serial_number_fops);
	debugfs_create_file_unsafe("product_id", 0400,
			d, adis16460, &adis16460_product_id_fops);
	debugfs_create_file_unsafe("flash_count", 0400,
			d, adis16460, &adis16460_flash_count_fops);
}

static int adis16460_set_freq(struct iio_dev *indio_dev, int val, int val2)
{
	struct adis16460 *st = iio_priv(indio_dev);
	int t;

	t =  val * 1000 + val2 / 1000;

Annotation

Implementation Notes