drivers/iio/adc/ad799x.c

Source file repositories/reference/linux-study-clean/drivers/iio/adc/ad799x.c

File Facts

System
Linux kernel
Corpus path
drivers/iio/adc/ad799x.c
Extension
.c
Size
22994 bytes
Lines
976
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 ad799x_chip_config {
	const struct iio_chan_spec	channel[9];
	u16				default_config;
	const struct iio_info		*info;
};

/**
 * struct ad799x_chip_info - chip specific information
 * @num_channels:	number of channels
 * @noirq_config:	device configuration w/o IRQ
 * @irq_config:		device configuration w/IRQ
 * @has_vref:		device supports external reference voltage
 */
struct ad799x_chip_info {
	int				num_channels;
	const struct ad799x_chip_config	noirq_config;
	const struct ad799x_chip_config	irq_config;
	bool has_vref;
};

struct ad799x_state {
	struct i2c_client		*client;
	const struct ad799x_chip_config	*chip_config;
	struct regulator		*reg;
	struct regulator		*vref;
	/* lock to protect against multiple access to the device */
	struct mutex			lock;
	unsigned int			id;
	u16				config;

	u8				*rx_buf;
	unsigned int			transfer_size;
};

static int ad799x_write_config(struct ad799x_state *st, u16 val)
{
	switch (st->id) {
	case ad7997:
	case ad7998:
		return i2c_smbus_write_word_swapped(st->client, AD7998_CONF_REG,
			val);
	case ad7992:
	case ad7993:
	case ad7994:
		return i2c_smbus_write_byte_data(st->client, AD7998_CONF_REG,
			val);
	default:
		/* Will be written when doing a conversion */
		st->config = val;
		return 0;
	}
}

static int ad799x_read_config(struct ad799x_state *st)
{
	switch (st->id) {
	case ad7997:
	case ad7998:
		return i2c_smbus_read_word_swapped(st->client, AD7998_CONF_REG);
	case ad7992:
	case ad7993:
	case ad7994:
		return i2c_smbus_read_byte_data(st->client, AD7998_CONF_REG);
	default:
		/* No readback support */
		return st->config;
	}
}

static int ad799x_update_config(struct ad799x_state *st, u16 config)
{
	int ret;

	ret = ad799x_write_config(st, config);
	if (ret < 0)
		return ret;
	ret = ad799x_read_config(st);
	if (ret < 0)
		return ret;
	st->config = ret;

	return 0;
}

static irqreturn_t ad799x_trigger_handler(int irq, void *p)
{
	struct iio_poll_func *pf = p;
	struct iio_dev *indio_dev = pf->indio_dev;
	struct ad799x_state *st = iio_priv(indio_dev);
	int b_sent;

Annotation

Implementation Notes