drivers/iio/light/isl29028.c

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

File Facts

System
Linux kernel
Corpus path
drivers/iio/light/isl29028.c
Extension
.c
Size
16740 bytes
Lines
706
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 isl29028_prox_data {
	int sampling_int;
	int sampling_fract;
	int sleep_time;
};

static const struct isl29028_prox_data isl29028_prox_data[] = {
	{   1, 250000, 800 },
	{   2, 500000, 400 },
	{   5,      0, 200 },
	{  10,      0, 100 },
	{  13, 300000,  75 },
	{  20,      0,  50 },
	{  80,      0,  13 }, /*
			       * Note: Data sheet lists 12.5 ms sleep time.
			       * Round up a half millisecond for msleep().
			       */
	{ 100,  0,   0 }
};

enum isl29028_als_ir_mode {
	ISL29028_MODE_NONE = 0,
	ISL29028_MODE_ALS,
	ISL29028_MODE_IR,
};

struct isl29028_chip {
	struct mutex			lock;
	struct regmap			*regmap;
	int				prox_sampling_int;
	int				prox_sampling_frac;
	bool				enable_prox;
	int				lux_scale;
	enum isl29028_als_ir_mode	als_ir_mode;
};

static int isl29028_find_prox_sleep_index(int sampling_int, int sampling_fract)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(isl29028_prox_data); ++i) {
		if (isl29028_prox_data[i].sampling_int == sampling_int &&
		    isl29028_prox_data[i].sampling_fract == sampling_fract)
			return i;
	}

	return -EINVAL;
}

static int isl29028_set_proxim_sampling(struct isl29028_chip *chip,
					int sampling_int, int sampling_fract)
{
	struct device *dev = regmap_get_device(chip->regmap);
	int sleep_index, ret;

	sleep_index = isl29028_find_prox_sleep_index(sampling_int,
						     sampling_fract);
	if (sleep_index < 0)
		return sleep_index;

	ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
				 ISL29028_CONF_PROX_SLP_MASK,
				 sleep_index << ISL29028_CONF_PROX_SLP_SH);

	if (ret < 0) {
		dev_err(dev, "%s(): Error %d setting the proximity sampling\n",
			__func__, ret);
		return ret;
	}

	chip->prox_sampling_int = sampling_int;
	chip->prox_sampling_frac = sampling_fract;

	return ret;
}

static int isl29028_enable_proximity(struct isl29028_chip *chip)
{
	int prox_index, ret;

	ret = isl29028_set_proxim_sampling(chip, chip->prox_sampling_int,
					   chip->prox_sampling_frac);
	if (ret < 0)
		return ret;

	ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
				 ISL29028_CONF_PROX_EN_MASK,
				 ISL29028_CONF_PROX_EN);
	if (ret < 0)
		return ret;

Annotation

Implementation Notes