drivers/iio/gyro/adis16260.c

Source file repositories/reference/linux-study-clean/drivers/iio/gyro/adis16260.c

File Facts

System
Linux kernel
Corpus path
drivers/iio/gyro/adis16260.c
Extension
.c
Size
13146 bytes
Lines
437
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 adis16260_chip_info {
	unsigned int gyro_max_val;
	unsigned int gyro_max_scale;
	const struct iio_chan_spec *channels;
	unsigned int num_channels;
};

struct adis16260 {
	const struct adis16260_chip_info *info;

	struct adis adis;
};

enum adis16260_type {
	ADIS16251,
	ADIS16260,
	ADIS16266,
};

static const struct iio_chan_spec adis16260_channels[] = {
	ADIS_GYRO_CHAN(X, ADIS16260_GYRO_OUT, ADIS16260_SCAN_GYRO,
		BIT(IIO_CHAN_INFO_CALIBBIAS) |
		BIT(IIO_CHAN_INFO_CALIBSCALE),
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 14),
	ADIS_INCLI_CHAN(X, ADIS16260_ANGL_OUT, ADIS16260_SCAN_ANGL, 0,
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 14),
	ADIS_TEMP_CHAN(ADIS16260_TEMP_OUT, ADIS16260_SCAN_TEMP,
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 12),
	ADIS_SUPPLY_CHAN(ADIS16260_SUPPLY_OUT, ADIS16260_SCAN_SUPPLY,
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 12),
	ADIS_AUX_ADC_CHAN(ADIS16260_AUX_ADC, ADIS16260_SCAN_AUX_ADC,
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 12),
	IIO_CHAN_SOFT_TIMESTAMP(5),
};

static const struct iio_chan_spec adis16266_channels[] = {
	ADIS_GYRO_CHAN(X, ADIS16260_GYRO_OUT, ADIS16260_SCAN_GYRO,
		BIT(IIO_CHAN_INFO_CALIBBIAS) |
		BIT(IIO_CHAN_INFO_CALIBSCALE),
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 14),
	ADIS_TEMP_CHAN(ADIS16260_TEMP_OUT, ADIS16260_SCAN_TEMP,
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 12),
	ADIS_SUPPLY_CHAN(ADIS16260_SUPPLY_OUT, ADIS16260_SCAN_SUPPLY,
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 12),
	ADIS_AUX_ADC_CHAN(ADIS16260_AUX_ADC, ADIS16260_SCAN_AUX_ADC,
		BIT(IIO_CHAN_INFO_SAMP_FREQ), 12),
	IIO_CHAN_SOFT_TIMESTAMP(4),
};

static const struct adis16260_chip_info adis16260_chip_info_table[] = {
	[ADIS16251] = {
		.gyro_max_scale = 80,
		.gyro_max_val = IIO_RAD_TO_DEGREE(4368),
		.channels = adis16260_channels,
		.num_channels = ARRAY_SIZE(adis16260_channels),
	},
	[ADIS16260] = {
		.gyro_max_scale = 320,
		.gyro_max_val = IIO_RAD_TO_DEGREE(4368),
		.channels = adis16260_channels,
		.num_channels = ARRAY_SIZE(adis16260_channels),
	},
	[ADIS16266] = {
		.gyro_max_scale = 14000,
		.gyro_max_val = IIO_RAD_TO_DEGREE(3357),
		.channels = adis16266_channels,
		.num_channels = ARRAY_SIZE(adis16266_channels),
	},
};

/* Power down the device */
static int adis16260_stop_device(struct iio_dev *indio_dev)
{
	struct adis16260 *adis16260 = iio_priv(indio_dev);
	int ret;
	u16 val = ADIS16260_SLP_CNT_POWER_OFF;

	ret = adis_write_reg_16(&adis16260->adis, ADIS16260_SLP_CNT, val);
	if (ret)
		dev_err(&indio_dev->dev, "problem with turning device off: SLP_CNT");

	return ret;
}

static const u8 adis16260_addresses[][2] = {
	[ADIS16260_SCAN_GYRO] = { ADIS16260_GYRO_OFF, ADIS16260_GYRO_SCALE },
};

static int adis16260_read_raw(struct iio_dev *indio_dev,
			      struct iio_chan_spec const *chan,

Annotation

Implementation Notes