drivers/iio/light/veml6040.c

Source file repositories/reference/linux-study-clean/drivers/iio/light/veml6040.c

File Facts

System
Linux kernel
Corpus path
drivers/iio/light/veml6040.c
Extension
.c
Size
7118 bytes
Lines
281
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 veml6040_data {
	struct i2c_client *client;
	struct regmap *regmap;
};

static const struct regmap_config veml6040_regmap_config = {
	.name = "veml6040_regmap",
	.reg_bits = 8,
	.val_bits = 16,
	.max_register = VEML6040_REG_W,
	.val_format_endian = REGMAP_ENDIAN_LITTLE,
};

static int veml6040_read_raw(struct iio_dev *indio_dev,
			     struct iio_chan_spec const *chan, int *val,
			     int *val2, long mask)
{
	int ret, reg, it_index;
	struct veml6040_data *data = iio_priv(indio_dev);
	struct regmap *regmap = data->regmap;
	struct device *dev = &data->client->dev;

	switch (mask) {
	case IIO_CHAN_INFO_RAW:
		ret = regmap_read(regmap, chan->address, &reg);
		if (ret) {
			dev_err(dev, "Data read failed: %d\n", ret);
			return ret;
		}
		*val = reg;
		return IIO_VAL_INT;

	case IIO_CHAN_INFO_INT_TIME:
		ret = regmap_read(regmap, VEML6040_CONF_REG, &reg);
		if (ret) {
			dev_err(dev, "Data read failed: %d\n", ret);
			return ret;
		}
		it_index = FIELD_GET(VEML6040_CONF_IT_MSK, reg);
		if (it_index >= ARRAY_SIZE(veml6040_it_ms)) {
			dev_err(dev, "Invalid Integration Time Set");
			return -EINVAL;
		}
		*val = veml6040_it_ms[it_index];
		return IIO_VAL_INT;

	default:
		return -EINVAL;
	}
}

static int veml6040_write_raw(struct iio_dev *indio_dev,
			      struct iio_chan_spec const *chan, int val,
			      int val2, long mask)
{
	struct veml6040_data *data = iio_priv(indio_dev);

	switch (mask) {
	case IIO_CHAN_INFO_INT_TIME:
		for (int i = 0; i < ARRAY_SIZE(veml6040_it_ms); i++) {
			if (veml6040_it_ms[i] != val)
				continue;

			return regmap_update_bits(data->regmap,
					VEML6040_CONF_REG,
					VEML6040_CONF_IT_MSK,
					FIELD_PREP(VEML6040_CONF_IT_MSK, i));
		}
		return -EINVAL;
	default:
		return -EINVAL;
	}
}

static int veml6040_read_avail(struct iio_dev *indio_dev,
			       struct iio_chan_spec const *chan,
			       const int **vals, int *type, int *length,
			       long mask)
{
	switch (mask) {
	case IIO_CHAN_INFO_INT_TIME:
		*length = ARRAY_SIZE(veml6040_it_ms);
		*vals = veml6040_it_ms;
		*type = IIO_VAL_INT;
		return IIO_AVAIL_LIST;

	default:
		return -EINVAL;
	}
}

Annotation

Implementation Notes