File Index
Files and directories
Sign in
FILE

veml6046x00.c

File preview with syntax highlighting.

linux-6.19.14/drivers/iio/light/veml6046x00.c C
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * VEML6046X00 High Accuracy RGBIR Color Sensor
   4 *
   5 * Copyright (c) 2025 Andreas Klinger <ak@it-klinger.de>
   6 */
   7
   8#include <linux/array_size.h>
   9#include <linux/bitfield.h>
  10#include <linux/bits.h>
  11#include <linux/dev_printk.h>
  12#include <linux/err.h>
  13#include <linux/i2c.h>
  14#include <linux/interrupt.h>
  15#include <linux/module.h>
  16#include <linux/mod_devicetable.h>
  17#include <linux/pm_runtime.h>
  18#include <linux/regmap.h>
  19#include <linux/time.h>
  20#include <linux/types.h>
  21#include <linux/units.h>
  22
  23#include <asm/byteorder.h>
  24
  25#include <linux/iio/iio.h>
  26#include <linux/iio/trigger_consumer.h>
  27#include <linux/iio/triggered_buffer.h>
  28
  29/*
  30 * Device registers
  31 * Those which are accessed as bulk io are omitted
  32 */
  33#define VEML6046X00_REG_CONF0       0x00
  34#define VEML6046X00_REG_CONF1       0x01
  35#define VEML6046X00_REG_THDH        0x04
  36#define VEML6046X00_REG_THDL        0x06
  37#define VEML6046X00_REG_R           0x10
  38#define VEML6046X00_REG_G           0x12
  39#define VEML6046X00_REG_B           0x14
  40#define VEML6046X00_REG_IR          0x16
  41#define VEML6046X00_REG_ID          0x18
  42#define VEML6046X00_REG_INT         0x1A
  43#define VEML6046X00_REG_INT_H       0x1B
  44
  45/* Bit masks for specific functionality */
  46#define VEML6046X00_CONF0_ON_0      BIT(0)
  47#define VEML6046X00_CONF0_INT       BIT(1)
  48#define VEML6046X00_CONF0_AF_TRIG   BIT(2)
  49#define VEML6046X00_CONF0_AF        BIT(3)
  50#define VEML6046X00_CONF0_IT        GENMASK(6, 4)
  51#define VEML6046X00_CONF1_CAL       BIT(0)
  52#define VEML6046X00_CONF1_PERS      GENMASK(2, 1)
  53#define VEML6046X00_CONF1_GAIN      GENMASK(4, 3)
  54#define VEML6046X00_CONF1_PD_D2     BIT(6)
  55#define VEML6046X00_CONF1_ON_1      BIT(7)
  56#define VEML6046X00_INT_TH_H        BIT(1)
  57#define VEML6046X00_INT_TH_L        BIT(2)
  58#define VEML6046X00_INT_DRDY        BIT(3)
  59#define VEML6046X00_INT_MASK						       \
  60	(VEML6046X00_INT_TH_H | VEML6046X00_INT_TH_L | VEML6046X00_INT_DRDY)
  61
  62#define	VEML6046X00_GAIN_1          0x0
  63#define	VEML6046X00_GAIN_2          0x1
  64#define	VEML6046X00_GAIN_0_66       0x2
  65#define	VEML6046X00_GAIN_0_5        0x3
  66
  67#define VEML6046X00_PD_2_2          0x0
  68#define VEML6046X00_PD_1_2          BIT(6)
  69
  70/* Autosuspend delay */
  71#define VEML6046X00_AUTOSUSPEND_MS  (3 * MSEC_PER_SEC)
  72
  73enum veml6046x00_scan {
  74	VEML6046X00_SCAN_R,
  75	VEML6046X00_SCAN_G,
  76	VEML6046X00_SCAN_B,
  77	VEML6046X00_SCAN_IR,
  78	VEML6046X00_SCAN_TIMESTAMP,
  79};
  80
  81/**
  82 * struct veml6046x00_rf - Regmap field of configuration registers.
  83 * @int_en:	Interrupt enable of green channel.
  84 * @mode:	Mode of operation.
  85 *		Driver uses always Active force mode.
  86 * @trig:	Trigger to be set in active force mode for starting
  87 *		measurement.
  88 * @it:		Integration time.
  89 * @pers:	Persistense - Number of threshold crossing for triggering
  90 *		interrupt.
  91 */
  92struct veml6046x00_rf {
  93	struct regmap_field *int_en;
  94	struct regmap_field *mode;
  95	struct regmap_field *trig;
  96	struct regmap_field *it;
  97	struct regmap_field *pers;
  98};
  99
 100/**
 101 * struct veml6046x00_data - Private data of driver.
 102 * @regmap:	Regmap definition of sensor.
 103 * @trig:	Industrial-IO trigger.
 104 * @rf:		Regmap field of configuration.
 105 */
 106struct veml6046x00_data {
 107	struct regmap *regmap;
 108	struct iio_trigger *trig;
 109	struct veml6046x00_rf rf;
 110};
 111
 112/**
 113 * DOC: Valid integration times (IT)
 114 *
 115 * static const int veml6046x00_it contains the array with valid IT.
 116 *
 117 * Register value to be read or written in regmap_field it on veml6046x00 is
 118 * identical with array index.
 119 * This means there is no separate translation table between valid integration
 120 * times and register values needed. The index of the array is identical with
 121 * the register value.
 122 *
 123 * The array is in the form as expected by the callback of the sysfs attribute
 124 * integration_time_available (IIO_CHAN_INFO_INT_TIME). So there is no
 125 * additional conversion needed.
 126 */
 127static const int veml6046x00_it[][2] = {
 128	{ 0, 3125 },
 129	{ 0, 6250 },
 130	{ 0, 12500 },
 131	{ 0, 25000 },
 132	{ 0, 50000 },
 133	{ 0, 100000 },
 134	{ 0, 200000 },
 135	{ 0, 400000 },
 136};
 137
 138/**
 139 * DOC: Handling of gain and photodiode size (PD)
 140 *
 141 * Gains here in the driver are not exactly the same as in the datasheet of the
 142 * sensor. The gain in the driver is a combination of the gain of the sensor
 143 * with the photodiode size (PD).
 144 * The following combinations are possible:
 145 *   gain(driver) = gain(sensor) * PD
 146 *           0.25 = x0.5  * 1/2
 147 *           0.33 = x0.66 * 1/2
 148 *           0.5  = x0.5  * 2/2
 149 *           0.66 = x0.66 * 2/2
 150 *           1    = x1    * 2/2
 151 *           2    = x2    * 2/2
 152 */
 153
 154/**
 155 * struct veml6046x00_gain_pd - Translation of gain and photodiode size (PD).
 156 * @gain_sen:	Gain used in the sensor as described in the datasheet of the
 157 *		sensor
 158 * @pd:		Photodiode size in the sensor
 159 *
 160 * This is the translation table from the gain used in the driver (and also used
 161 * by the userspace interface in sysfs) to the gain and PD used in the sensor
 162 * hardware.
 163 *
 164 * There are six gain values visible to the user (0.25 .. 2) which translate to
 165 * two different gains in the sensor hardware (x0.5 .. x2) and two PD (1/2 and
 166 * 2/2). Theoretical are there eight combinations, but gain values 0.5 and 1 are
 167 * doubled and therefore the combination with the larger PD (2/2) is taken as
 168 * more photodiode cells are supposed to deliver a more precise result.
 169 */
 170struct veml6046x00_gain_pd {
 171	unsigned int gain_sen;
 172	unsigned int pd;
 173};
 174
 175static const struct veml6046x00_gain_pd veml6046x00_gain_pd[] = {
 176	{ .gain_sen = VEML6046X00_GAIN_0_5, .pd = VEML6046X00_PD_1_2 },
 177	{ .gain_sen = VEML6046X00_GAIN_0_66, .pd = VEML6046X00_PD_1_2 },
 178	{ .gain_sen = VEML6046X00_GAIN_0_5, .pd = VEML6046X00_PD_2_2 },
 179	{ .gain_sen = VEML6046X00_GAIN_0_66, .pd = VEML6046X00_PD_2_2 },
 180	{ .gain_sen = VEML6046X00_GAIN_1, .pd = VEML6046X00_PD_2_2 },
 181	{ .gain_sen = VEML6046X00_GAIN_2, .pd = VEML6046X00_PD_2_2 },
 182};
 183
 184/**
 185 * DOC: Factors for calculation of lux
 186 *
 187 * static const int veml6046x00_it_gains contains the factors for calculation of
 188 * lux.
 189 *
 190 * Depending on the set up integration time (IT), gain and photodiode size (PD)
 191 * the measured raw values are different if the light is constant. As the gain
 192 * and PD are already coupled in the driver (see &struct veml6046x00_gain_pd)
 193 * there are two dimensions remaining: IT and gain(driver).
 194 *
 195 * The array of available factors for a certain IT are grouped together in the
 196 * same form as expected by the callback of scale_available
 197 * (IIO_CHAN_INFO_SCALE).
 198 *
 199 * Factors for lux / raw count are taken directly from the datasheet.
 200 */
 201static const int veml6046x00_it_gains[][6][2] = {
 202	/* integration time: 3.125 ms */
 203	{
 204		{ 5, 376000 },	/* gain: x0.25 */
 205		{ 4,  72700 },	/* gain: x0.33 */
 206		{ 2, 688000 },	/* gain: x0.5 */
 207		{ 2,  36400 },	/* gain: x0.66 */
 208		{ 1, 344000 },	/* gain: x1 */
 209		{ 0, 672000 },	/* gain: x2 */
 210	},
 211	/* integration time: 6.25 ms */
 212	{
 213		{ 2, 688000 },	/* gain: x0.25 */
 214		{ 2,  36350 },	/* gain: x0.33 */
 215		{ 1, 344000 },	/* gain: x0.5 */
 216		{ 1,  18200 },	/* gain: x0.66 */
 217		{ 0, 672000 },	/* gain: x1 */
 218		{ 0, 336000 },	/* gain: x2 */
 219	},
 220	/* integration time: 12.5 ms */
 221	{
 222		{ 1, 344000 },	/* gain: x0.25 */
 223		{ 1,  18175 },	/* gain: x0.33 */
 224		{ 0, 672000 },	/* gain: x0.5 */
 225		{ 0, 509100 },	/* gain: x0.66 */
 226		{ 0, 336000 },	/* gain: x1 */
 227		{ 0, 168000 },	/* gain: x2 */
 228	},
 229	/* integration time: 25 ms */
 230	{
 231		{ 0, 672000 },	/* gain: x0.25 */
 232		{ 0, 509087 },	/* gain: x0.33 */
 233		{ 0, 336000 },	/* gain: x0.5 */
 234		{ 0, 254550 },	/* gain: x0.66 */
 235		{ 0, 168000 },	/* gain: x1 */
 236		{ 0,  84000 },	/* gain: x2 */
 237	},
 238	/* integration time: 50 ms */
 239	{
 240		{ 0, 336000 },	/* gain: x0.25 */
 241		{ 0, 254543 },	/* gain: x0.33 */
 242		{ 0, 168000 },	/* gain: x0.5 */
 243		{ 0, 127275 },	/* gain: x0.66 */
 244		{ 0,  84000 },	/* gain: x1 */
 245		{ 0,  42000 },	/* gain: x2 */
 246	},
 247	/* integration time: 100 ms */
 248	{
 249		{ 0, 168000 },	/* gain: x0.25 */
 250		{ 0, 127271 },	/* gain: x0.33 */
 251		{ 0,  84000 },	/* gain: x0.5 */
 252		{ 0,  63637 },	/* gain: x0.66 */
 253		{ 0,  42000 },	/* gain: x1 */
 254		{ 0,  21000 },	/* gain: x2 */
 255	},
 256	/* integration time: 200 ms */
 257	{
 258		{ 0,  84000 },	/* gain: x0.25 */
 259		{ 0,  63635 },	/* gain: x0.33 */
 260		{ 0,  42000 },	/* gain: x0.5 */
 261		{ 0,  31818 },	/* gain: x0.66 */
 262		{ 0,  21000 },	/* gain: x1 */
 263		{ 0,  10500 },	/* gain: x2 */
 264	},
 265	/* integration time: 400 ms */
 266	{
 267		{ 0,  42000 },	/* gain: x0.25 */
 268		{ 0,  31817 },	/* gain: x0.33 */
 269		{ 0,  21000 },	/* gain: x0.5 */
 270		{ 0,  15909 },	/* gain: x0.66 */
 271		{ 0,  10500 },	/* gain: x1 */
 272		{ 0,   5250 },	/* gain: x2 */
 273	},
 274};
 275
 276/*
 277 * Two bits (RGB_ON_0 and RGB_ON_1) must be cleared to power on the device.
 278 */
 279static int veml6046x00_power_on(struct veml6046x00_data *data)
 280{
 281	int ret;
 282	struct device *dev = regmap_get_device(data->regmap);
 283
 284	ret = regmap_clear_bits(data->regmap, VEML6046X00_REG_CONF0,
 285				VEML6046X00_CONF0_ON_0);
 286	if (ret) {
 287		dev_err(dev, "Failed to set bit for power on %d\n", ret);
 288		return ret;
 289	}
 290
 291	return regmap_clear_bits(data->regmap, VEML6046X00_REG_CONF1,
 292				 VEML6046X00_CONF1_ON_1);
 293}
 294
 295/*
 296 * Two bits (RGB_ON_0 and RGB_ON_1) must be set to power off the device.
 297 */
 298static int veml6046x00_shutdown(struct veml6046x00_data *data)
 299{
 300	int ret;
 301	struct device *dev = regmap_get_device(data->regmap);
 302
 303	ret = regmap_set_bits(data->regmap, VEML6046X00_REG_CONF0,
 304			      VEML6046X00_CONF0_ON_0);
 305	if (ret) {
 306		dev_err(dev, "Failed to set bit for shutdown %d\n", ret);
 307		return ret;
 308	}
 309
 310	return regmap_set_bits(data->regmap, VEML6046X00_REG_CONF1,
 311			       VEML6046X00_CONF1_ON_1);
 312}
 313
 314static void veml6046x00_shutdown_action(void *data)
 315{
 316	veml6046x00_shutdown(data);
 317}
 318
 319static const struct iio_chan_spec veml6046x00_channels[] = {
 320	{
 321		.type = IIO_INTENSITY,
 322		.address = VEML6046X00_REG_R,
 323		.modified = 1,
 324		.channel2 = IIO_MOD_LIGHT_RED,
 325		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 326		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
 327					   BIT(IIO_CHAN_INFO_SCALE),
 328		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
 329						     BIT(IIO_CHAN_INFO_SCALE),
 330		.scan_index = VEML6046X00_SCAN_R,
 331		.scan_type = {
 332			.sign = 'u',
 333			.realbits = 16,
 334			.storagebits = 16,
 335			.endianness = IIO_LE,
 336		},
 337	},
 338	{
 339		.type = IIO_INTENSITY,
 340		.address = VEML6046X00_REG_G,
 341		.modified = 1,
 342		.channel2 = IIO_MOD_LIGHT_GREEN,
 343		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 344		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
 345					   BIT(IIO_CHAN_INFO_SCALE),
 346		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
 347						     BIT(IIO_CHAN_INFO_SCALE),
 348		.scan_index = VEML6046X00_SCAN_G,
 349		.scan_type = {
 350			.sign = 'u',
 351			.realbits = 16,
 352			.storagebits = 16,
 353			.endianness = IIO_LE,
 354		},
 355	},
 356	{
 357		.type = IIO_INTENSITY,
 358		.address = VEML6046X00_REG_B,
 359		.modified = 1,
 360		.channel2 = IIO_MOD_LIGHT_BLUE,
 361		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 362		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
 363					   BIT(IIO_CHAN_INFO_SCALE),
 364		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
 365						     BIT(IIO_CHAN_INFO_SCALE),
 366		.scan_index = VEML6046X00_SCAN_B,
 367		.scan_type = {
 368			.sign = 'u',
 369			.realbits = 16,
 370			.storagebits = 16,
 371			.endianness = IIO_LE,
 372		},
 373	},
 374	{
 375		.type = IIO_INTENSITY,
 376		.address = VEML6046X00_REG_IR,
 377		.modified = 1,
 378		.channel2 = IIO_MOD_LIGHT_IR,
 379		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 380		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
 381					   BIT(IIO_CHAN_INFO_SCALE),
 382		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
 383						     BIT(IIO_CHAN_INFO_SCALE),
 384		.scan_index = VEML6046X00_SCAN_IR,
 385		.scan_type = {
 386			.sign = 'u',
 387			.realbits = 16,
 388			.storagebits = 16,
 389			.endianness = IIO_LE,
 390		},
 391	},
 392	IIO_CHAN_SOFT_TIMESTAMP(VEML6046X00_SCAN_TIMESTAMP),
 393};
 394
 395static const struct regmap_config veml6046x00_regmap_config = {
 396	.name = "veml6046x00_regm",
 397	.reg_bits = 8,
 398	.val_bits = 8,
 399	.max_register = VEML6046X00_REG_INT_H,
 400};
 401
 402static const struct reg_field veml6046x00_rf_int_en =
 403	REG_FIELD(VEML6046X00_REG_CONF0, 1, 1);
 404
 405static const struct reg_field veml6046x00_rf_trig =
 406	REG_FIELD(VEML6046X00_REG_CONF0, 2, 2);
 407
 408static const struct reg_field veml6046x00_rf_mode =
 409	REG_FIELD(VEML6046X00_REG_CONF0, 3, 3);
 410
 411static const struct reg_field veml6046x00_rf_it =
 412	REG_FIELD(VEML6046X00_REG_CONF0, 4, 6);
 413
 414static const struct reg_field veml6046x00_rf_pers =
 415	REG_FIELD(VEML6046X00_REG_CONF1, 1, 2);
 416
 417static int veml6046x00_regfield_init(struct veml6046x00_data *data)
 418{
 419	struct regmap *regmap = data->regmap;
 420	struct device *dev = regmap_get_device(data->regmap);
 421	struct regmap_field *rm_field;
 422	struct veml6046x00_rf *rf = &data->rf;
 423
 424	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_int_en);
 425	if (IS_ERR(rm_field))
 426		return PTR_ERR(rm_field);
 427	rf->int_en = rm_field;
 428
 429	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_mode);
 430	if (IS_ERR(rm_field))
 431		return PTR_ERR(rm_field);
 432	rf->mode = rm_field;
 433
 434	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_trig);
 435	if (IS_ERR(rm_field))
 436		return PTR_ERR(rm_field);
 437	rf->trig = rm_field;
 438
 439	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_it);
 440	if (IS_ERR(rm_field))
 441		return PTR_ERR(rm_field);
 442	rf->it = rm_field;
 443
 444	rm_field = devm_regmap_field_alloc(dev, regmap, veml6046x00_rf_pers);
 445	if (IS_ERR(rm_field))
 446		return PTR_ERR(rm_field);
 447	rf->pers = rm_field;
 448
 449	return 0;
 450}
 451
 452static int veml6046x00_get_it_index(struct veml6046x00_data *data)
 453{
 454	int ret;
 455	unsigned int reg;
 456
 457	ret = regmap_field_read(data->rf.it, &reg);
 458	if (ret)
 459		return ret;
 460
 461	/* register value is identical with index of array */
 462	if (reg >= ARRAY_SIZE(veml6046x00_it))
 463		return -EINVAL;
 464
 465	return reg;
 466}
 467
 468static int veml6046x00_get_it_usec(struct veml6046x00_data *data, unsigned int *it_usec)
 469{
 470	int ret;
 471	unsigned int reg;
 472
 473	ret = regmap_field_read(data->rf.it, &reg);
 474	if (ret)
 475		return ret;
 476
 477	if (reg >= ARRAY_SIZE(veml6046x00_it))
 478		return -EINVAL;
 479
 480	*it_usec = veml6046x00_it[reg][1];
 481
 482	return IIO_VAL_INT_PLUS_MICRO;
 483}
 484
 485static int veml6046x00_set_it(struct iio_dev *iio, int val, int val2)
 486{
 487	struct veml6046x00_data *data = iio_priv(iio);
 488	unsigned int i;
 489
 490	for (i = 0; i < ARRAY_SIZE(veml6046x00_it); i++) {
 491		if ((veml6046x00_it[i][0] == val) &&
 492		    (veml6046x00_it[i][1] == val2))
 493			return regmap_field_write(data->rf.it, i);
 494	}
 495
 496	return -EINVAL;
 497}
 498
 499static int veml6046x00_get_val_gain_idx(struct veml6046x00_data *data, int val,
 500					int val2)
 501{
 502	unsigned int i;
 503	int it_idx;
 504
 505	it_idx = veml6046x00_get_it_index(data);
 506	if (it_idx < 0)
 507		return it_idx;
 508
 509	for (i = 0; i < ARRAY_SIZE(veml6046x00_it_gains[it_idx]); i++) {
 510		if ((veml6046x00_it_gains[it_idx][i][0] == val) &&
 511		    (veml6046x00_it_gains[it_idx][i][1] == val2))
 512			return i;
 513	}
 514
 515	return -EINVAL;
 516}
 517
 518static int veml6046x00_get_gain_idx(struct veml6046x00_data *data)
 519{
 520	int ret;
 521	unsigned int i, reg, reg_gain, reg_pd;
 522
 523	ret = regmap_read(data->regmap, VEML6046X00_REG_CONF1, &reg);
 524	if (ret)
 525		return ret;
 526
 527	reg_gain = FIELD_GET(VEML6046X00_CONF1_GAIN, reg);
 528	reg_pd = reg & VEML6046X00_CONF1_PD_D2;
 529
 530	for (i = 0; i < ARRAY_SIZE(veml6046x00_gain_pd); i++) {
 531		if ((veml6046x00_gain_pd[i].gain_sen == reg_gain) &&
 532		    (veml6046x00_gain_pd[i].pd == reg_pd))
 533			return i;
 534	}
 535
 536	return -EINVAL;
 537}
 538
 539static int veml6046x00_set_scale(struct iio_dev *iio, int val, int val2)
 540{
 541	struct veml6046x00_data *data = iio_priv(iio);
 542	unsigned int new_scale;
 543	int gain_idx;
 544
 545	gain_idx = veml6046x00_get_val_gain_idx(data, val, val2);
 546	if (gain_idx < 0)
 547		return gain_idx;
 548
 549	new_scale = FIELD_PREP(VEML6046X00_CONF1_GAIN,
 550			       veml6046x00_gain_pd[gain_idx].gain_sen) |
 551			       veml6046x00_gain_pd[gain_idx].pd;
 552
 553	return regmap_update_bits(data->regmap, VEML6046X00_REG_CONF1,
 554				  VEML6046X00_CONF1_GAIN |
 555				  VEML6046X00_CONF1_PD_D2,
 556				  new_scale);
 557}
 558
 559static int veml6046x00_get_scale(struct veml6046x00_data *data,
 560				 int *val, int *val2)
 561{
 562	int gain_idx, it_idx;
 563
 564	gain_idx = veml6046x00_get_gain_idx(data);
 565	if (gain_idx < 0)
 566		return gain_idx;
 567
 568	it_idx = veml6046x00_get_it_index(data);
 569	if (it_idx < 0)
 570		return it_idx;
 571
 572	*val = veml6046x00_it_gains[it_idx][gain_idx][0];
 573	*val2 = veml6046x00_it_gains[it_idx][gain_idx][1];
 574
 575	return IIO_VAL_INT_PLUS_MICRO;
 576}
 577
 578/**
 579 * veml6046x00_read_data_ready() - Read data ready bit
 580 * @data:	Private data.
 581 *
 582 * Helper function for reading data ready bit from interrupt register.
 583 *
 584 * Return:
 585 * * %1		- Data is available (AF_DATA_READY is set)
 586 * * %0		- No data available
 587 * * %-EIO	- Error during bulk read
 588 */
 589static int veml6046x00_read_data_ready(struct veml6046x00_data *data)
 590{
 591	struct device *dev = regmap_get_device(data->regmap);
 592	int ret;
 593	u8 reg[2];
 594
 595	/*
 596	 * Note from the vendor, but not explicitly in the datasheet: we
 597	 * should always read both registers together.
 598	 */
 599	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_INT,
 600			       &reg, sizeof(reg));
 601	if (ret) {
 602		dev_err(dev, "Failed to read interrupt register %d\n", ret);
 603		return -EIO;
 604	}
 605
 606	if (reg[1] & VEML6046X00_INT_DRDY)
 607		return 1;
 608
 609	return 0;
 610}
 611
 612/**
 613 * veml6046x00_wait_data_available() - Wait until data is available
 614 * @iio:	Industrial IO.
 615 * @usecs:	Microseconds to wait for data.
 616 *
 617 * This function waits for a certain bit in the interrupt register which signals
 618 * that there is data to be read available.
 619 *
 620 * It tries it two times with a waiting time of usecs in between.
 621 *
 622 * Return:
 623 * * %1		- Data is available (AF_DATA_READY is set)
 624 * * %0		- Timeout, no data available after usecs timeout
 625 * * %-EIO	- Error during bulk read
 626 */
 627static int veml6046x00_wait_data_available(struct iio_dev *iio, unsigned int usecs)
 628{
 629	struct veml6046x00_data *data = iio_priv(iio);
 630	int ret;
 631
 632	ret = veml6046x00_read_data_ready(data);
 633	if (ret)
 634		return ret;
 635
 636	fsleep(usecs);
 637	return veml6046x00_read_data_ready(data);
 638}
 639
 640static int veml6046x00_single_read(struct iio_dev *iio,
 641				   enum iio_modifier modifier, int *val)
 642{
 643	struct veml6046x00_data *data = iio_priv(iio);
 644	struct device *dev = regmap_get_device(data->regmap);
 645	unsigned int addr, it_usec;
 646	int ret;
 647	__le16 reg;
 648
 649	switch (modifier) {
 650	case IIO_MOD_LIGHT_RED:
 651		addr = VEML6046X00_REG_R;
 652		break;
 653	case IIO_MOD_LIGHT_GREEN:
 654		addr = VEML6046X00_REG_G;
 655		break;
 656	case IIO_MOD_LIGHT_BLUE:
 657		addr = VEML6046X00_REG_B;
 658		break;
 659	case IIO_MOD_LIGHT_IR:
 660		addr = VEML6046X00_REG_IR;
 661		break;
 662	default:
 663		return -EINVAL;
 664	}
 665	ret = pm_runtime_resume_and_get(dev);
 666	if (ret)
 667		return ret;
 668
 669	ret = veml6046x00_get_it_usec(data, &it_usec);
 670	if (ret < 0) {
 671		dev_err(dev, "Failed to get integration time ret: %d", ret);
 672		goto out;
 673	}
 674
 675	ret = regmap_field_write(data->rf.mode, 1);
 676	if (ret) {
 677		dev_err(dev, "Failed to write mode ret: %d", ret);
 678		goto out;
 679	}
 680
 681	ret = regmap_field_write(data->rf.trig, 1);
 682	if (ret) {
 683		dev_err(dev, "Failed to write trigger ret: %d", ret);
 684		goto out;
 685	}
 686
 687	/* integration time + 12.5 % to ensure completion */
 688	fsleep(it_usec + it_usec / 8);
 689
 690	ret = veml6046x00_wait_data_available(iio, it_usec * 4);
 691	if (ret < 0)
 692		goto out;
 693	if (ret == 0) {
 694		ret = -EAGAIN;
 695		goto out;
 696	}
 697
 698	if (!iio_device_claim_direct(iio)) {
 699		ret = -EBUSY;
 700		goto out;
 701	}
 702
 703	ret = regmap_bulk_read(data->regmap, addr, &reg, sizeof(reg));
 704	iio_device_release_direct(iio);
 705	if (ret)
 706		goto out;
 707
 708	*val = le16_to_cpu(reg);
 709
 710	ret = IIO_VAL_INT;
 711
 712out:
 713	pm_runtime_put_autosuspend(dev);
 714
 715	return ret;
 716}
 717
 718static int veml6046x00_read_raw(struct iio_dev *iio,
 719				struct iio_chan_spec const *chan, int *val,
 720				int *val2, long mask)
 721{
 722	struct veml6046x00_data *data = iio_priv(iio);
 723
 724	switch (mask) {
 725	case IIO_CHAN_INFO_RAW:
 726		if (chan->type != IIO_INTENSITY)
 727			return -EINVAL;
 728		return veml6046x00_single_read(iio, chan->channel2, val);
 729	case IIO_CHAN_INFO_INT_TIME:
 730		*val = 0;
 731		return veml6046x00_get_it_usec(data, val2);
 732	case IIO_CHAN_INFO_SCALE:
 733		return veml6046x00_get_scale(data, val, val2);
 734	default:
 735		return -EINVAL;
 736	}
 737}
 738
 739static int veml6046x00_read_avail(struct iio_dev *iio,
 740				  struct iio_chan_spec const *chan,
 741				  const int **vals, int *type, int *length,
 742				  long mask)
 743{
 744	struct veml6046x00_data *data = iio_priv(iio);
 745	int it_idx;
 746
 747	switch (mask) {
 748	case IIO_CHAN_INFO_INT_TIME:
 749		*vals = (int *)&veml6046x00_it;
 750		*length = 2 * ARRAY_SIZE(veml6046x00_it);
 751		*type = IIO_VAL_INT_PLUS_MICRO;
 752		return IIO_AVAIL_LIST;
 753	case IIO_CHAN_INFO_SCALE:
 754		it_idx = veml6046x00_get_it_index(data);
 755		if (it_idx < 0)
 756			return it_idx;
 757		*vals = (int *)&veml6046x00_it_gains[it_idx];
 758		*length = 2 * ARRAY_SIZE(veml6046x00_it_gains[it_idx]);
 759		*type = IIO_VAL_INT_PLUS_MICRO;
 760		return IIO_AVAIL_LIST;
 761	default:
 762		return -EINVAL;
 763	}
 764}
 765
 766static int veml6046x00_write_raw(struct iio_dev *iio,
 767				 struct iio_chan_spec const *chan,
 768				 int val, int val2, long mask)
 769{
 770	switch (mask) {
 771	case IIO_CHAN_INFO_INT_TIME:
 772		return veml6046x00_set_it(iio, val, val2);
 773	case IIO_CHAN_INFO_SCALE:
 774		return veml6046x00_set_scale(iio, val, val2);
 775	default:
 776		return -EINVAL;
 777	}
 778}
 779
 780static const struct iio_info veml6046x00_info_no_irq = {
 781	.read_raw = veml6046x00_read_raw,
 782	.read_avail = veml6046x00_read_avail,
 783	.write_raw = veml6046x00_write_raw,
 784};
 785
 786static int veml6046x00_buffer_preenable(struct iio_dev *iio)
 787{
 788	struct veml6046x00_data *data = iio_priv(iio);
 789	struct device *dev = regmap_get_device(data->regmap);
 790	int ret;
 791
 792	ret = regmap_field_write(data->rf.mode, 0);
 793	if (ret) {
 794		dev_err(dev, "Failed to set mode %d\n", ret);
 795		return ret;
 796	}
 797
 798	ret = regmap_field_write(data->rf.trig, 0);
 799	if (ret) {
 800		/*
 801		 * no unrolling of mode as it is set appropriately with next
 802		 * single read.
 803		 */
 804		dev_err(dev, "Failed to set trigger %d\n", ret);
 805		return ret;
 806	}
 807
 808	return pm_runtime_resume_and_get(dev);
 809}
 810
 811static int veml6046x00_buffer_postdisable(struct iio_dev *iio)
 812{
 813	struct veml6046x00_data *data = iio_priv(iio);
 814	struct device *dev = regmap_get_device(data->regmap);
 815	int ret;
 816
 817	ret = regmap_field_write(data->rf.mode, 1);
 818	if (ret) {
 819		dev_err(dev, "Failed to set mode %d\n", ret);
 820		return ret;
 821	}
 822
 823	pm_runtime_put_autosuspend(dev);
 824
 825	return 0;
 826}
 827
 828static const struct iio_buffer_setup_ops veml6046x00_buffer_setup_ops = {
 829	.preenable = veml6046x00_buffer_preenable,
 830	.postdisable = veml6046x00_buffer_postdisable,
 831};
 832
 833static irqreturn_t veml6046x00_trig_handler(int irq, void *p)
 834{
 835	struct iio_poll_func *pf = p;
 836	struct iio_dev *iio = pf->indio_dev;
 837	struct veml6046x00_data *data = iio_priv(iio);
 838	int ret;
 839	struct {
 840		__le16 chans[4];
 841		aligned_s64 timestamp;
 842	} scan;
 843
 844	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_R,
 845			       &scan.chans, sizeof(scan.chans));
 846	if (ret)
 847		goto done;
 848
 849	iio_push_to_buffers_with_ts(iio, &scan, sizeof(scan),
 850				    iio_get_time_ns(iio));
 851
 852done:
 853	iio_trigger_notify_done(iio->trig);
 854
 855	return IRQ_HANDLED;
 856}
 857
 858static int veml6046x00_validate_part_id(struct veml6046x00_data *data)
 859{
 860	struct device *dev = regmap_get_device(data->regmap);
 861	unsigned int part_id;
 862	int ret;
 863	__le16 reg;
 864
 865	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_ID,
 866			       &reg, sizeof(reg));
 867	if (ret)
 868		return dev_err_probe(dev, ret, "Failed to read ID\n");
 869
 870	part_id = le16_to_cpu(reg);
 871	if (part_id != 0x01)
 872		dev_info(dev, "Unknown ID %#04x\n", part_id);
 873
 874	return 0;
 875}
 876
 877static int veml6046x00_setup_device(struct iio_dev *iio)
 878{
 879	struct veml6046x00_data *data = iio_priv(iio);
 880	struct device *dev = regmap_get_device(data->regmap);
 881	int ret;
 882	__le16 reg16;
 883
 884	reg16 = cpu_to_le16(VEML6046X00_CONF0_AF);
 885	ret = regmap_bulk_write(data->regmap, VEML6046X00_REG_CONF0,
 886				&reg16, sizeof(reg16));
 887	if (ret)
 888		return dev_err_probe(dev, ret, "Failed to set configuration\n");
 889
 890	reg16 = cpu_to_le16(0);
 891	ret = regmap_bulk_write(data->regmap, VEML6046X00_REG_THDL,
 892				&reg16, sizeof(reg16));
 893	if (ret)
 894		return dev_err_probe(dev, ret, "Failed to set low threshold\n");
 895
 896	reg16 = cpu_to_le16(U16_MAX);
 897	ret = regmap_bulk_write(data->regmap, VEML6046X00_REG_THDH,
 898				&reg16, sizeof(reg16));
 899	if (ret)
 900		return dev_err_probe(dev, ret, "Failed to set high threshold\n");
 901
 902	ret = regmap_bulk_read(data->regmap, VEML6046X00_REG_INT,
 903			       &reg16, sizeof(reg16));
 904	if (ret)
 905		return dev_err_probe(dev, ret, "Failed to clear interrupts\n");
 906
 907	return 0;
 908}
 909
 910static int veml6046x00_probe(struct i2c_client *i2c)
 911{
 912	struct device *dev = &i2c->dev;
 913	struct veml6046x00_data *data;
 914	struct iio_dev *iio;
 915	struct regmap *regmap;
 916	int ret;
 917
 918	regmap = devm_regmap_init_i2c(i2c, &veml6046x00_regmap_config);
 919	if (IS_ERR(regmap))
 920		return dev_err_probe(dev, PTR_ERR(regmap), "Failed to set regmap\n");
 921
 922	iio = devm_iio_device_alloc(dev, sizeof(*data));
 923	if (!iio)
 924		return -ENOMEM;
 925
 926	data = iio_priv(iio);
 927	/* struct iio_dev is retrieved via dev_get_drvdata(). */
 928	i2c_set_clientdata(i2c, iio);
 929	data->regmap = regmap;
 930
 931	ret = veml6046x00_regfield_init(data);
 932	if (ret)
 933		return dev_err_probe(dev, ret, "Failed to init regfield\n");
 934
 935	ret = devm_regulator_get_enable(dev, "vdd");
 936	if (ret)
 937		return dev_err_probe(dev, ret, "Failed to enable regulator\n");
 938
 939	/* bring device in a known state and switch device on */
 940	ret = veml6046x00_setup_device(iio);
 941	if (ret < 0)
 942		return ret;
 943
 944	ret = devm_add_action_or_reset(dev, veml6046x00_shutdown_action, data);
 945	if (ret < 0)
 946		return dev_err_probe(dev, ret, "Failed to add shut down action\n");
 947
 948	ret = pm_runtime_set_active(dev);
 949	if (ret < 0)
 950		return dev_err_probe(dev, ret, "Failed to activate PM runtime\n");
 951
 952	ret = devm_pm_runtime_enable(dev);
 953	if (ret)
 954		return dev_err_probe(dev, ret, "Failed to enable PM runtime\n");
 955
 956	pm_runtime_get_noresume(dev);
 957	pm_runtime_set_autosuspend_delay(dev, VEML6046X00_AUTOSUSPEND_MS);
 958	pm_runtime_use_autosuspend(dev);
 959
 960	ret = veml6046x00_validate_part_id(data);
 961	if (ret)
 962		return dev_err_probe(dev, ret, "Failed to validate device ID\n");
 963
 964	iio->name = "veml6046x00";
 965	iio->channels = veml6046x00_channels;
 966	iio->num_channels = ARRAY_SIZE(veml6046x00_channels);
 967	iio->modes = INDIO_DIRECT_MODE;
 968
 969	iio->info = &veml6046x00_info_no_irq;
 970
 971	ret = devm_iio_triggered_buffer_setup(dev, iio, NULL,
 972					      veml6046x00_trig_handler,
 973					      &veml6046x00_buffer_setup_ops);
 974	if (ret)
 975		return dev_err_probe(dev, ret,
 976				     "Failed to register triggered buffer");
 977
 978	pm_runtime_put_autosuspend(dev);
 979
 980	ret = devm_iio_device_register(dev, iio);
 981	if (ret)
 982		return dev_err_probe(dev, ret, "Failed to register iio device");
 983
 984	return 0;
 985}
 986
 987static int veml6046x00_runtime_suspend(struct device *dev)
 988{
 989	struct veml6046x00_data *data = iio_priv(dev_get_drvdata(dev));
 990
 991	return veml6046x00_shutdown(data);
 992}
 993
 994static int veml6046x00_runtime_resume(struct device *dev)
 995{
 996	struct veml6046x00_data *data = iio_priv(dev_get_drvdata(dev));
 997
 998	return veml6046x00_power_on(data);
 999}
1000
1001static DEFINE_RUNTIME_DEV_PM_OPS(veml6046x00_pm_ops,
1002				 veml6046x00_runtime_suspend,
1003				 veml6046x00_runtime_resume, NULL);
1004
1005static const struct of_device_id veml6046x00_of_match[] = {
1006	{ .compatible = "vishay,veml6046x00" },
1007	{ }
1008};
1009MODULE_DEVICE_TABLE(of, veml6046x00_of_match);
1010
1011static const struct i2c_device_id veml6046x00_id[] = {
1012	{ "veml6046x00" },
1013	{ }
1014};
1015MODULE_DEVICE_TABLE(i2c, veml6046x00_id);
1016
1017static struct i2c_driver veml6046x00_driver = {
1018	.driver = {
1019		.name = "veml6046x00",
1020		.of_match_table = veml6046x00_of_match,
1021		.pm = pm_ptr(&veml6046x00_pm_ops),
1022	},
1023	.probe = veml6046x00_probe,
1024	.id_table = veml6046x00_id,
1025};
1026module_i2c_driver(veml6046x00_driver);
1027
1028MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");
1029MODULE_DESCRIPTION("VEML6046X00 RGBIR Color Sensor");
1030MODULE_LICENSE("GPL");
~/ Read-only file preview.