cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

si1145.c (35275B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * si1145.c - Support for Silabs SI1132 and SI1141/2/3/5/6/7 combined ambient
      4 * light, UV index and proximity sensors
      5 *
      6 * Copyright 2014-16 Peter Meerwald-Stadler <pmeerw@pmeerw.net>
      7 * Copyright 2016 Crestez Dan Leonard <leonard.crestez@intel.com>
      8 *
      9 * SI1132 (7-bit I2C slave address 0x60)
     10 * SI1141/2/3 (7-bit I2C slave address 0x5a)
     11 * SI1145/6/6 (7-bit I2C slave address 0x60)
     12 */
     13
     14#include <linux/module.h>
     15#include <linux/i2c.h>
     16#include <linux/err.h>
     17#include <linux/slab.h>
     18#include <linux/delay.h>
     19#include <linux/irq.h>
     20
     21#include <linux/iio/iio.h>
     22#include <linux/iio/sysfs.h>
     23#include <linux/iio/trigger.h>
     24#include <linux/iio/trigger_consumer.h>
     25#include <linux/iio/triggered_buffer.h>
     26#include <linux/iio/buffer.h>
     27#include <linux/util_macros.h>
     28
     29#define SI1145_REG_PART_ID		0x00
     30#define SI1145_REG_REV_ID		0x01
     31#define SI1145_REG_SEQ_ID		0x02
     32#define SI1145_REG_INT_CFG		0x03
     33#define SI1145_REG_IRQ_ENABLE		0x04
     34#define SI1145_REG_IRQ_MODE		0x05
     35#define SI1145_REG_HW_KEY		0x07
     36#define SI1145_REG_MEAS_RATE		0x08
     37#define SI1145_REG_PS_LED21		0x0f
     38#define SI1145_REG_PS_LED3		0x10
     39#define SI1145_REG_UCOEF1		0x13
     40#define SI1145_REG_UCOEF2		0x14
     41#define SI1145_REG_UCOEF3		0x15
     42#define SI1145_REG_UCOEF4		0x16
     43#define SI1145_REG_PARAM_WR		0x17
     44#define SI1145_REG_COMMAND		0x18
     45#define SI1145_REG_RESPONSE		0x20
     46#define SI1145_REG_IRQ_STATUS		0x21
     47#define SI1145_REG_ALSVIS_DATA		0x22
     48#define SI1145_REG_ALSIR_DATA		0x24
     49#define SI1145_REG_PS1_DATA		0x26
     50#define SI1145_REG_PS2_DATA		0x28
     51#define SI1145_REG_PS3_DATA		0x2a
     52#define SI1145_REG_AUX_DATA		0x2c
     53#define SI1145_REG_PARAM_RD		0x2e
     54#define SI1145_REG_CHIP_STAT		0x30
     55
     56#define SI1145_UCOEF1_DEFAULT		0x7b
     57#define SI1145_UCOEF2_DEFAULT		0x6b
     58#define SI1145_UCOEF3_DEFAULT		0x01
     59#define SI1145_UCOEF4_DEFAULT		0x00
     60
     61/* Helper to figure out PS_LED register / shift per channel */
     62#define SI1145_PS_LED_REG(ch) \
     63	(((ch) == 2) ? SI1145_REG_PS_LED3 : SI1145_REG_PS_LED21)
     64#define SI1145_PS_LED_SHIFT(ch) \
     65	(((ch) == 1) ? 4 : 0)
     66
     67/* Parameter offsets */
     68#define SI1145_PARAM_CHLIST		0x01
     69#define SI1145_PARAM_PSLED12_SELECT	0x02
     70#define SI1145_PARAM_PSLED3_SELECT	0x03
     71#define SI1145_PARAM_PS_ENCODING	0x05
     72#define SI1145_PARAM_ALS_ENCODING	0x06
     73#define SI1145_PARAM_PS1_ADC_MUX	0x07
     74#define SI1145_PARAM_PS2_ADC_MUX	0x08
     75#define SI1145_PARAM_PS3_ADC_MUX	0x09
     76#define SI1145_PARAM_PS_ADC_COUNTER	0x0a
     77#define SI1145_PARAM_PS_ADC_GAIN	0x0b
     78#define SI1145_PARAM_PS_ADC_MISC	0x0c
     79#define SI1145_PARAM_ALS_ADC_MUX	0x0d
     80#define SI1145_PARAM_ALSIR_ADC_MUX	0x0e
     81#define SI1145_PARAM_AUX_ADC_MUX	0x0f
     82#define SI1145_PARAM_ALSVIS_ADC_COUNTER	0x10
     83#define SI1145_PARAM_ALSVIS_ADC_GAIN	0x11
     84#define SI1145_PARAM_ALSVIS_ADC_MISC	0x12
     85#define SI1145_PARAM_LED_RECOVERY	0x1c
     86#define SI1145_PARAM_ALSIR_ADC_COUNTER	0x1d
     87#define SI1145_PARAM_ALSIR_ADC_GAIN	0x1e
     88#define SI1145_PARAM_ALSIR_ADC_MISC	0x1f
     89#define SI1145_PARAM_ADC_OFFSET		0x1a
     90
     91/* Channel enable masks for CHLIST parameter */
     92#define SI1145_CHLIST_EN_PS1		BIT(0)
     93#define SI1145_CHLIST_EN_PS2		BIT(1)
     94#define SI1145_CHLIST_EN_PS3		BIT(2)
     95#define SI1145_CHLIST_EN_ALSVIS		BIT(4)
     96#define SI1145_CHLIST_EN_ALSIR		BIT(5)
     97#define SI1145_CHLIST_EN_AUX		BIT(6)
     98#define SI1145_CHLIST_EN_UV		BIT(7)
     99
    100/* Proximity measurement mode for ADC_MISC parameter */
    101#define SI1145_PS_ADC_MODE_NORMAL	BIT(2)
    102/* Signal range mask for ADC_MISC parameter */
    103#define SI1145_ADC_MISC_RANGE		BIT(5)
    104
    105/* Commands for REG_COMMAND */
    106#define SI1145_CMD_NOP			0x00
    107#define SI1145_CMD_RESET		0x01
    108#define SI1145_CMD_PS_FORCE		0x05
    109#define SI1145_CMD_ALS_FORCE		0x06
    110#define SI1145_CMD_PSALS_FORCE		0x07
    111#define SI1145_CMD_PS_PAUSE		0x09
    112#define SI1145_CMD_ALS_PAUSE		0x0a
    113#define SI1145_CMD_PSALS_PAUSE		0x0b
    114#define SI1145_CMD_PS_AUTO		0x0d
    115#define SI1145_CMD_ALS_AUTO		0x0e
    116#define SI1145_CMD_PSALS_AUTO		0x0f
    117#define SI1145_CMD_PARAM_QUERY		0x80
    118#define SI1145_CMD_PARAM_SET		0xa0
    119
    120#define SI1145_RSP_INVALID_SETTING	0x80
    121#define SI1145_RSP_COUNTER_MASK		0x0F
    122
    123/* Minimum sleep after each command to ensure it's received */
    124#define SI1145_COMMAND_MINSLEEP_MS	5
    125/* Return -ETIMEDOUT after this long */
    126#define SI1145_COMMAND_TIMEOUT_MS	25
    127
    128/* Interrupt configuration masks for INT_CFG register */
    129#define SI1145_INT_CFG_OE		BIT(0) /* enable interrupt */
    130#define SI1145_INT_CFG_MODE		BIT(1) /* auto reset interrupt pin */
    131
    132/* Interrupt enable masks for IRQ_ENABLE register */
    133#define SI1145_MASK_ALL_IE		(BIT(4) | BIT(3) | BIT(2) | BIT(0))
    134
    135#define SI1145_MUX_TEMP			0x65
    136#define SI1145_MUX_VDD			0x75
    137
    138/* Proximity LED current; see Table 2 in datasheet */
    139#define SI1145_LED_CURRENT_45mA		0x04
    140
    141enum {
    142	SI1132,
    143	SI1141,
    144	SI1142,
    145	SI1143,
    146	SI1145,
    147	SI1146,
    148	SI1147,
    149};
    150
    151struct si1145_part_info {
    152	u8 part;
    153	const struct iio_info *iio_info;
    154	const struct iio_chan_spec *channels;
    155	unsigned int num_channels;
    156	unsigned int num_leds;
    157	bool uncompressed_meas_rate;
    158};
    159
    160/**
    161 * struct si1145_data - si1145 chip state data
    162 * @client:	I2C client
    163 * @lock:	mutex to protect shared state.
    164 * @cmdlock:	Low-level mutex to protect command execution only
    165 * @rsp_seq:	Next expected response number or -1 if counter reset required
    166 * @scan_mask:	Saved scan mask to avoid duplicate set_chlist
    167 * @autonomous: If automatic measurements are active (for buffer support)
    168 * @part_info:	Part information
    169 * @trig:	Pointer to iio trigger
    170 * @meas_rate:	Value of MEAS_RATE register. Only set in HW in auto mode
    171 * @buffer:	Used to pack data read from sensor.
    172 */
    173struct si1145_data {
    174	struct i2c_client *client;
    175	struct mutex lock;
    176	struct mutex cmdlock;
    177	int rsp_seq;
    178	const struct si1145_part_info *part_info;
    179	unsigned long scan_mask;
    180	bool autonomous;
    181	struct iio_trigger *trig;
    182	int meas_rate;
    183	/*
    184	 * Ensure timestamp will be naturally aligned if present.
    185	 * Maximum buffer size (may be only partly used if not all
    186	 * channels are enabled):
    187	 *   6*2 bytes channels data + 4 bytes alignment +
    188	 *   8 bytes timestamp
    189	 */
    190	u8 buffer[24] __aligned(8);
    191};
    192
    193/*
    194 * __si1145_command_reset() - Send CMD_NOP and wait for response 0
    195 *
    196 * Does not modify data->rsp_seq
    197 *
    198 * Return: 0 on success and -errno on error.
    199 */
    200static int __si1145_command_reset(struct si1145_data *data)
    201{
    202	struct device *dev = &data->client->dev;
    203	unsigned long stop_jiffies;
    204	int ret;
    205
    206	ret = i2c_smbus_write_byte_data(data->client, SI1145_REG_COMMAND,
    207						      SI1145_CMD_NOP);
    208	if (ret < 0)
    209		return ret;
    210	msleep(SI1145_COMMAND_MINSLEEP_MS);
    211
    212	stop_jiffies = jiffies + SI1145_COMMAND_TIMEOUT_MS * HZ / 1000;
    213	while (true) {
    214		ret = i2c_smbus_read_byte_data(data->client,
    215					       SI1145_REG_RESPONSE);
    216		if (ret <= 0)
    217			return ret;
    218		if (time_after(jiffies, stop_jiffies)) {
    219			dev_warn(dev, "timeout on reset\n");
    220			return -ETIMEDOUT;
    221		}
    222		msleep(SI1145_COMMAND_MINSLEEP_MS);
    223	}
    224}
    225
    226/*
    227 * si1145_command() - Execute a command and poll the response register
    228 *
    229 * All conversion overflows are reported as -EOVERFLOW
    230 * INVALID_SETTING is reported as -EINVAL
    231 * Timeouts are reported as -ETIMEDOUT
    232 *
    233 * Return: 0 on success or -errno on failure
    234 */
    235static int si1145_command(struct si1145_data *data, u8 cmd)
    236{
    237	struct device *dev = &data->client->dev;
    238	unsigned long stop_jiffies;
    239	int ret;
    240
    241	mutex_lock(&data->cmdlock);
    242
    243	if (data->rsp_seq < 0) {
    244		ret = __si1145_command_reset(data);
    245		if (ret < 0) {
    246			dev_err(dev, "failed to reset command counter, ret=%d\n",
    247				ret);
    248			goto out;
    249		}
    250		data->rsp_seq = 0;
    251	}
    252
    253	ret = i2c_smbus_write_byte_data(data->client, SI1145_REG_COMMAND, cmd);
    254	if (ret) {
    255		dev_warn(dev, "failed to write command, ret=%d\n", ret);
    256		goto out;
    257	}
    258	/* Sleep a little to ensure the command is received */
    259	msleep(SI1145_COMMAND_MINSLEEP_MS);
    260
    261	stop_jiffies = jiffies + SI1145_COMMAND_TIMEOUT_MS * HZ / 1000;
    262	while (true) {
    263		ret = i2c_smbus_read_byte_data(data->client,
    264					       SI1145_REG_RESPONSE);
    265		if (ret < 0) {
    266			dev_warn(dev, "failed to read response, ret=%d\n", ret);
    267			break;
    268		}
    269
    270		if ((ret & ~SI1145_RSP_COUNTER_MASK) == 0) {
    271			if (ret == data->rsp_seq) {
    272				if (time_after(jiffies, stop_jiffies)) {
    273					dev_warn(dev, "timeout on command 0x%02x\n",
    274						 cmd);
    275					ret = -ETIMEDOUT;
    276					break;
    277				}
    278				msleep(SI1145_COMMAND_MINSLEEP_MS);
    279				continue;
    280			}
    281			if (ret == ((data->rsp_seq + 1) &
    282				SI1145_RSP_COUNTER_MASK)) {
    283				data->rsp_seq = ret;
    284				ret = 0;
    285				break;
    286			}
    287			dev_warn(dev, "unexpected response counter %d instead of %d\n",
    288				 ret, (data->rsp_seq + 1) &
    289					SI1145_RSP_COUNTER_MASK);
    290			ret = -EIO;
    291		} else {
    292			if (ret == SI1145_RSP_INVALID_SETTING) {
    293				dev_warn(dev, "INVALID_SETTING error on command 0x%02x\n",
    294					 cmd);
    295				ret = -EINVAL;
    296			} else {
    297				/* All overflows are treated identically */
    298				dev_dbg(dev, "overflow, ret=%d, cmd=0x%02x\n",
    299					ret, cmd);
    300				ret = -EOVERFLOW;
    301			}
    302		}
    303
    304		/* Force a counter reset next time */
    305		data->rsp_seq = -1;
    306		break;
    307	}
    308
    309out:
    310	mutex_unlock(&data->cmdlock);
    311
    312	return ret;
    313}
    314
    315static int si1145_param_update(struct si1145_data *data, u8 op, u8 param,
    316			       u8 value)
    317{
    318	int ret;
    319
    320	ret = i2c_smbus_write_byte_data(data->client,
    321		SI1145_REG_PARAM_WR, value);
    322	if (ret < 0)
    323		return ret;
    324
    325	return si1145_command(data, op | (param & 0x1F));
    326}
    327
    328static int si1145_param_set(struct si1145_data *data, u8 param, u8 value)
    329{
    330	return si1145_param_update(data, SI1145_CMD_PARAM_SET, param, value);
    331}
    332
    333/* Set param. Returns negative errno or current value */
    334static int si1145_param_query(struct si1145_data *data, u8 param)
    335{
    336	int ret;
    337
    338	ret = si1145_command(data, SI1145_CMD_PARAM_QUERY | (param & 0x1F));
    339	if (ret < 0)
    340		return ret;
    341
    342	return i2c_smbus_read_byte_data(data->client, SI1145_REG_PARAM_RD);
    343}
    344
    345/* Expand 8 bit compressed value to 16 bit, see Silabs AN498 */
    346static u16 si1145_uncompress(u8 x)
    347{
    348	u16 result = 0;
    349	u8 exponent = 0;
    350
    351	if (x < 8)
    352		return 0;
    353
    354	exponent = (x & 0xf0) >> 4;
    355	result = 0x10 | (x & 0x0f);
    356
    357	if (exponent >= 4)
    358		return result << (exponent - 4);
    359	return result >> (4 - exponent);
    360}
    361
    362/* Compress 16 bit value to 8 bit, see Silabs AN498 */
    363static u8 si1145_compress(u16 x)
    364{
    365	u32 exponent = 0;
    366	u32 significand = 0;
    367	u32 tmp = x;
    368
    369	if (x == 0x0000)
    370		return 0x00;
    371	if (x == 0x0001)
    372		return 0x08;
    373
    374	while (1) {
    375		tmp >>= 1;
    376		exponent += 1;
    377		if (tmp == 1)
    378			break;
    379	}
    380
    381	if (exponent < 5) {
    382		significand = x << (4 - exponent);
    383		return (exponent << 4) | (significand & 0xF);
    384	}
    385
    386	significand = x >> (exponent - 5);
    387	if (significand & 1) {
    388		significand += 2;
    389		if (significand & 0x0040) {
    390			exponent += 1;
    391			significand >>= 1;
    392		}
    393	}
    394
    395	return (exponent << 4) | ((significand >> 1) & 0xF);
    396}
    397
    398/* Write meas_rate in hardware */
    399static int si1145_set_meas_rate(struct si1145_data *data, int interval)
    400{
    401	if (data->part_info->uncompressed_meas_rate)
    402		return i2c_smbus_write_word_data(data->client,
    403			SI1145_REG_MEAS_RATE, interval);
    404	else
    405		return i2c_smbus_write_byte_data(data->client,
    406			SI1145_REG_MEAS_RATE, interval);
    407}
    408
    409static int si1145_read_samp_freq(struct si1145_data *data, int *val, int *val2)
    410{
    411	*val = 32000;
    412	if (data->part_info->uncompressed_meas_rate)
    413		*val2 = data->meas_rate;
    414	else
    415		*val2 = si1145_uncompress(data->meas_rate);
    416	return IIO_VAL_FRACTIONAL;
    417}
    418
    419/* Set the samp freq in driver private data */
    420static int si1145_store_samp_freq(struct si1145_data *data, int val)
    421{
    422	int ret = 0;
    423	int meas_rate;
    424
    425	if (val <= 0 || val > 32000)
    426		return -ERANGE;
    427	meas_rate = 32000 / val;
    428
    429	mutex_lock(&data->lock);
    430	if (data->autonomous) {
    431		ret = si1145_set_meas_rate(data, meas_rate);
    432		if (ret)
    433			goto out;
    434	}
    435	if (data->part_info->uncompressed_meas_rate)
    436		data->meas_rate = meas_rate;
    437	else
    438		data->meas_rate = si1145_compress(meas_rate);
    439
    440out:
    441	mutex_unlock(&data->lock);
    442
    443	return ret;
    444}
    445
    446static irqreturn_t si1145_trigger_handler(int irq, void *private)
    447{
    448	struct iio_poll_func *pf = private;
    449	struct iio_dev *indio_dev = pf->indio_dev;
    450	struct si1145_data *data = iio_priv(indio_dev);
    451	int i, j = 0;
    452	int ret;
    453	u8 irq_status = 0;
    454
    455	if (!data->autonomous) {
    456		ret = si1145_command(data, SI1145_CMD_PSALS_FORCE);
    457		if (ret < 0 && ret != -EOVERFLOW)
    458			goto done;
    459	} else {
    460		irq_status = ret = i2c_smbus_read_byte_data(data->client,
    461				SI1145_REG_IRQ_STATUS);
    462		if (ret < 0)
    463			goto done;
    464		if (!(irq_status & SI1145_MASK_ALL_IE))
    465			goto done;
    466	}
    467
    468	for_each_set_bit(i, indio_dev->active_scan_mask,
    469		indio_dev->masklength) {
    470		int run = 1;
    471
    472		while (i + run < indio_dev->masklength) {
    473			if (!test_bit(i + run, indio_dev->active_scan_mask))
    474				break;
    475			if (indio_dev->channels[i + run].address !=
    476				indio_dev->channels[i].address + 2 * run)
    477				break;
    478			run++;
    479		}
    480
    481		ret = i2c_smbus_read_i2c_block_data_or_emulated(
    482				data->client, indio_dev->channels[i].address,
    483				sizeof(u16) * run, &data->buffer[j]);
    484		if (ret < 0)
    485			goto done;
    486		j += run * sizeof(u16);
    487		i += run - 1;
    488	}
    489
    490	if (data->autonomous) {
    491		ret = i2c_smbus_write_byte_data(data->client,
    492				SI1145_REG_IRQ_STATUS,
    493				irq_status & SI1145_MASK_ALL_IE);
    494		if (ret < 0)
    495			goto done;
    496	}
    497
    498	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
    499		iio_get_time_ns(indio_dev));
    500
    501done:
    502	iio_trigger_notify_done(indio_dev->trig);
    503	return IRQ_HANDLED;
    504}
    505
    506static int si1145_set_chlist(struct iio_dev *indio_dev, unsigned long scan_mask)
    507{
    508	struct si1145_data *data = iio_priv(indio_dev);
    509	u8 reg = 0, mux;
    510	int ret;
    511	int i;
    512
    513	/* channel list already set, no need to reprogram */
    514	if (data->scan_mask == scan_mask)
    515		return 0;
    516
    517	for_each_set_bit(i, &scan_mask, indio_dev->masklength) {
    518		switch (indio_dev->channels[i].address) {
    519		case SI1145_REG_ALSVIS_DATA:
    520			reg |= SI1145_CHLIST_EN_ALSVIS;
    521			break;
    522		case SI1145_REG_ALSIR_DATA:
    523			reg |= SI1145_CHLIST_EN_ALSIR;
    524			break;
    525		case SI1145_REG_PS1_DATA:
    526			reg |= SI1145_CHLIST_EN_PS1;
    527			break;
    528		case SI1145_REG_PS2_DATA:
    529			reg |= SI1145_CHLIST_EN_PS2;
    530			break;
    531		case SI1145_REG_PS3_DATA:
    532			reg |= SI1145_CHLIST_EN_PS3;
    533			break;
    534		case SI1145_REG_AUX_DATA:
    535			switch (indio_dev->channels[i].type) {
    536			case IIO_UVINDEX:
    537				reg |= SI1145_CHLIST_EN_UV;
    538				break;
    539			default:
    540				reg |= SI1145_CHLIST_EN_AUX;
    541				if (indio_dev->channels[i].type == IIO_TEMP)
    542					mux = SI1145_MUX_TEMP;
    543				else
    544					mux = SI1145_MUX_VDD;
    545				ret = si1145_param_set(data,
    546					SI1145_PARAM_AUX_ADC_MUX, mux);
    547				if (ret < 0)
    548					return ret;
    549
    550				break;
    551			}
    552		}
    553	}
    554
    555	data->scan_mask = scan_mask;
    556	ret = si1145_param_set(data, SI1145_PARAM_CHLIST, reg);
    557
    558	return ret < 0 ? ret : 0;
    559}
    560
    561static int si1145_measure(struct iio_dev *indio_dev,
    562			  struct iio_chan_spec const *chan)
    563{
    564	struct si1145_data *data = iio_priv(indio_dev);
    565	u8 cmd;
    566	int ret;
    567
    568	ret = si1145_set_chlist(indio_dev, BIT(chan->scan_index));
    569	if (ret < 0)
    570		return ret;
    571
    572	cmd = (chan->type == IIO_PROXIMITY) ? SI1145_CMD_PS_FORCE :
    573		SI1145_CMD_ALS_FORCE;
    574	ret = si1145_command(data, cmd);
    575	if (ret < 0 && ret != -EOVERFLOW)
    576		return ret;
    577
    578	return i2c_smbus_read_word_data(data->client, chan->address);
    579}
    580
    581/*
    582 * Conversion between iio scale and ADC_GAIN values
    583 * These could be further adjusted but proximity/intensity are dimensionless
    584 */
    585static const int si1145_proximity_scale_available[] = {
    586	128, 64, 32, 16, 8, 4};
    587static const int si1145_intensity_scale_available[] = {
    588	128, 64, 32, 16, 8, 4, 2, 1};
    589static IIO_CONST_ATTR(in_proximity_scale_available,
    590	"128 64 32 16 8 4");
    591static IIO_CONST_ATTR(in_intensity_scale_available,
    592	"128 64 32 16 8 4 2 1");
    593static IIO_CONST_ATTR(in_intensity_ir_scale_available,
    594	"128 64 32 16 8 4 2 1");
    595
    596static int si1145_scale_from_adcgain(int regval)
    597{
    598	return 128 >> regval;
    599}
    600
    601static int si1145_proximity_adcgain_from_scale(int val, int val2)
    602{
    603	val = find_closest_descending(val, si1145_proximity_scale_available,
    604				ARRAY_SIZE(si1145_proximity_scale_available));
    605	if (val < 0 || val > 5 || val2 != 0)
    606		return -EINVAL;
    607
    608	return val;
    609}
    610
    611static int si1145_intensity_adcgain_from_scale(int val, int val2)
    612{
    613	val = find_closest_descending(val, si1145_intensity_scale_available,
    614				ARRAY_SIZE(si1145_intensity_scale_available));
    615	if (val < 0 || val > 7 || val2 != 0)
    616		return -EINVAL;
    617
    618	return val;
    619}
    620
    621static int si1145_read_raw(struct iio_dev *indio_dev,
    622				struct iio_chan_spec const *chan,
    623				int *val, int *val2, long mask)
    624{
    625	struct si1145_data *data = iio_priv(indio_dev);
    626	int ret;
    627	u8 reg;
    628
    629	switch (mask) {
    630	case IIO_CHAN_INFO_RAW:
    631		switch (chan->type) {
    632		case IIO_INTENSITY:
    633		case IIO_PROXIMITY:
    634		case IIO_VOLTAGE:
    635		case IIO_TEMP:
    636		case IIO_UVINDEX:
    637			ret = iio_device_claim_direct_mode(indio_dev);
    638			if (ret)
    639				return ret;
    640			ret = si1145_measure(indio_dev, chan);
    641			iio_device_release_direct_mode(indio_dev);
    642
    643			if (ret < 0)
    644				return ret;
    645
    646			*val = ret;
    647
    648			return IIO_VAL_INT;
    649		case IIO_CURRENT:
    650			ret = i2c_smbus_read_byte_data(data->client,
    651				SI1145_PS_LED_REG(chan->channel));
    652			if (ret < 0)
    653				return ret;
    654
    655			*val = (ret >> SI1145_PS_LED_SHIFT(chan->channel))
    656				& 0x0f;
    657
    658			return IIO_VAL_INT;
    659		default:
    660			return -EINVAL;
    661		}
    662	case IIO_CHAN_INFO_SCALE:
    663		switch (chan->type) {
    664		case IIO_PROXIMITY:
    665			reg = SI1145_PARAM_PS_ADC_GAIN;
    666			break;
    667		case IIO_INTENSITY:
    668			if (chan->channel2 == IIO_MOD_LIGHT_IR)
    669				reg = SI1145_PARAM_ALSIR_ADC_GAIN;
    670			else
    671				reg = SI1145_PARAM_ALSVIS_ADC_GAIN;
    672			break;
    673		case IIO_TEMP:
    674			*val = 28;
    675			*val2 = 571429;
    676			return IIO_VAL_INT_PLUS_MICRO;
    677		case IIO_UVINDEX:
    678			*val = 0;
    679			*val2 = 10000;
    680			return IIO_VAL_INT_PLUS_MICRO;
    681		default:
    682			return -EINVAL;
    683		}
    684
    685		ret = si1145_param_query(data, reg);
    686		if (ret < 0)
    687			return ret;
    688
    689		*val = si1145_scale_from_adcgain(ret & 0x07);
    690
    691		return IIO_VAL_INT;
    692	case IIO_CHAN_INFO_OFFSET:
    693		switch (chan->type) {
    694		case IIO_TEMP:
    695			/*
    696			 * -ADC offset - ADC counts @ 25°C -
    697			 *   35 * ADC counts / °C
    698			 */
    699			*val = -256 - 11136 + 25 * 35;
    700			return IIO_VAL_INT;
    701		default:
    702			/*
    703			 * All ADC measurements have are by default offset
    704			 * by -256
    705			 * See AN498 5.6.3
    706			 */
    707			ret = si1145_param_query(data, SI1145_PARAM_ADC_OFFSET);
    708			if (ret < 0)
    709				return ret;
    710			*val = -si1145_uncompress(ret);
    711			return IIO_VAL_INT;
    712		}
    713	case IIO_CHAN_INFO_SAMP_FREQ:
    714		return si1145_read_samp_freq(data, val, val2);
    715	default:
    716		return -EINVAL;
    717	}
    718}
    719
    720static int si1145_write_raw(struct iio_dev *indio_dev,
    721			       struct iio_chan_spec const *chan,
    722			       int val, int val2, long mask)
    723{
    724	struct si1145_data *data = iio_priv(indio_dev);
    725	u8 reg1, reg2, shift;
    726	int ret;
    727
    728	switch (mask) {
    729	case IIO_CHAN_INFO_SCALE:
    730		switch (chan->type) {
    731		case IIO_PROXIMITY:
    732			val = si1145_proximity_adcgain_from_scale(val, val2);
    733			if (val < 0)
    734				return val;
    735			reg1 = SI1145_PARAM_PS_ADC_GAIN;
    736			reg2 = SI1145_PARAM_PS_ADC_COUNTER;
    737			break;
    738		case IIO_INTENSITY:
    739			val = si1145_intensity_adcgain_from_scale(val, val2);
    740			if (val < 0)
    741				return val;
    742			if (chan->channel2 == IIO_MOD_LIGHT_IR) {
    743				reg1 = SI1145_PARAM_ALSIR_ADC_GAIN;
    744				reg2 = SI1145_PARAM_ALSIR_ADC_COUNTER;
    745			} else {
    746				reg1 = SI1145_PARAM_ALSVIS_ADC_GAIN;
    747				reg2 = SI1145_PARAM_ALSVIS_ADC_COUNTER;
    748			}
    749			break;
    750		default:
    751			return -EINVAL;
    752		}
    753
    754		ret = iio_device_claim_direct_mode(indio_dev);
    755		if (ret)
    756			return ret;
    757
    758		ret = si1145_param_set(data, reg1, val);
    759		if (ret < 0) {
    760			iio_device_release_direct_mode(indio_dev);
    761			return ret;
    762		}
    763		/* Set recovery period to one's complement of gain */
    764		ret = si1145_param_set(data, reg2, (~val & 0x07) << 4);
    765		iio_device_release_direct_mode(indio_dev);
    766		return ret;
    767	case IIO_CHAN_INFO_RAW:
    768		if (chan->type != IIO_CURRENT)
    769			return -EINVAL;
    770
    771		if (val < 0 || val > 15 || val2 != 0)
    772			return -EINVAL;
    773
    774		reg1 = SI1145_PS_LED_REG(chan->channel);
    775		shift = SI1145_PS_LED_SHIFT(chan->channel);
    776
    777		ret = iio_device_claim_direct_mode(indio_dev);
    778		if (ret)
    779			return ret;
    780
    781		ret = i2c_smbus_read_byte_data(data->client, reg1);
    782		if (ret < 0) {
    783			iio_device_release_direct_mode(indio_dev);
    784			return ret;
    785		}
    786		ret = i2c_smbus_write_byte_data(data->client, reg1,
    787			(ret & ~(0x0f << shift)) |
    788			((val & 0x0f) << shift));
    789		iio_device_release_direct_mode(indio_dev);
    790		return ret;
    791	case IIO_CHAN_INFO_SAMP_FREQ:
    792		return si1145_store_samp_freq(data, val);
    793	default:
    794		return -EINVAL;
    795	}
    796}
    797
    798#define SI1145_ST { \
    799	.sign = 'u', \
    800	.realbits = 16, \
    801	.storagebits = 16, \
    802	.endianness = IIO_LE, \
    803}
    804
    805#define SI1145_INTENSITY_CHANNEL(_si) { \
    806	.type = IIO_INTENSITY, \
    807	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
    808			      BIT(IIO_CHAN_INFO_OFFSET) | \
    809			      BIT(IIO_CHAN_INFO_SCALE), \
    810	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
    811	.scan_type = SI1145_ST, \
    812	.scan_index = _si, \
    813	.address = SI1145_REG_ALSVIS_DATA, \
    814}
    815
    816#define SI1145_INTENSITY_IR_CHANNEL(_si) { \
    817	.type = IIO_INTENSITY, \
    818	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
    819			      BIT(IIO_CHAN_INFO_OFFSET) | \
    820			      BIT(IIO_CHAN_INFO_SCALE), \
    821	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
    822	.modified = 1, \
    823	.channel2 = IIO_MOD_LIGHT_IR, \
    824	.scan_type = SI1145_ST, \
    825	.scan_index = _si, \
    826	.address = SI1145_REG_ALSIR_DATA, \
    827}
    828
    829#define SI1145_TEMP_CHANNEL(_si) { \
    830	.type = IIO_TEMP, \
    831	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
    832			      BIT(IIO_CHAN_INFO_OFFSET) | \
    833			      BIT(IIO_CHAN_INFO_SCALE), \
    834	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
    835	.scan_type = SI1145_ST, \
    836	.scan_index = _si, \
    837	.address = SI1145_REG_AUX_DATA, \
    838}
    839
    840#define SI1145_UV_CHANNEL(_si) { \
    841	.type = IIO_UVINDEX, \
    842	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
    843			      BIT(IIO_CHAN_INFO_SCALE), \
    844	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
    845	.scan_type = SI1145_ST, \
    846	.scan_index = _si, \
    847	.address = SI1145_REG_AUX_DATA, \
    848}
    849
    850#define SI1145_PROXIMITY_CHANNEL(_si, _ch) { \
    851	.type = IIO_PROXIMITY, \
    852	.indexed = 1, \
    853	.channel = _ch, \
    854	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
    855	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
    856				    BIT(IIO_CHAN_INFO_OFFSET), \
    857	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
    858	.scan_type = SI1145_ST, \
    859	.scan_index = _si, \
    860	.address = SI1145_REG_PS1_DATA + _ch * 2, \
    861}
    862
    863#define SI1145_VOLTAGE_CHANNEL(_si) { \
    864	.type = IIO_VOLTAGE, \
    865	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
    866	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
    867	.scan_type = SI1145_ST, \
    868	.scan_index = _si, \
    869	.address = SI1145_REG_AUX_DATA, \
    870}
    871
    872#define SI1145_CURRENT_CHANNEL(_ch) { \
    873	.type = IIO_CURRENT, \
    874	.indexed = 1, \
    875	.channel = _ch, \
    876	.output = 1, \
    877	.scan_index = -1, \
    878	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
    879}
    880
    881static const struct iio_chan_spec si1132_channels[] = {
    882	SI1145_INTENSITY_CHANNEL(0),
    883	SI1145_INTENSITY_IR_CHANNEL(1),
    884	SI1145_TEMP_CHANNEL(2),
    885	SI1145_VOLTAGE_CHANNEL(3),
    886	SI1145_UV_CHANNEL(4),
    887	IIO_CHAN_SOFT_TIMESTAMP(6),
    888};
    889
    890static const struct iio_chan_spec si1141_channels[] = {
    891	SI1145_INTENSITY_CHANNEL(0),
    892	SI1145_INTENSITY_IR_CHANNEL(1),
    893	SI1145_PROXIMITY_CHANNEL(2, 0),
    894	SI1145_TEMP_CHANNEL(3),
    895	SI1145_VOLTAGE_CHANNEL(4),
    896	IIO_CHAN_SOFT_TIMESTAMP(5),
    897	SI1145_CURRENT_CHANNEL(0),
    898};
    899
    900static const struct iio_chan_spec si1142_channels[] = {
    901	SI1145_INTENSITY_CHANNEL(0),
    902	SI1145_INTENSITY_IR_CHANNEL(1),
    903	SI1145_PROXIMITY_CHANNEL(2, 0),
    904	SI1145_PROXIMITY_CHANNEL(3, 1),
    905	SI1145_TEMP_CHANNEL(4),
    906	SI1145_VOLTAGE_CHANNEL(5),
    907	IIO_CHAN_SOFT_TIMESTAMP(6),
    908	SI1145_CURRENT_CHANNEL(0),
    909	SI1145_CURRENT_CHANNEL(1),
    910};
    911
    912static const struct iio_chan_spec si1143_channels[] = {
    913	SI1145_INTENSITY_CHANNEL(0),
    914	SI1145_INTENSITY_IR_CHANNEL(1),
    915	SI1145_PROXIMITY_CHANNEL(2, 0),
    916	SI1145_PROXIMITY_CHANNEL(3, 1),
    917	SI1145_PROXIMITY_CHANNEL(4, 2),
    918	SI1145_TEMP_CHANNEL(5),
    919	SI1145_VOLTAGE_CHANNEL(6),
    920	IIO_CHAN_SOFT_TIMESTAMP(7),
    921	SI1145_CURRENT_CHANNEL(0),
    922	SI1145_CURRENT_CHANNEL(1),
    923	SI1145_CURRENT_CHANNEL(2),
    924};
    925
    926static const struct iio_chan_spec si1145_channels[] = {
    927	SI1145_INTENSITY_CHANNEL(0),
    928	SI1145_INTENSITY_IR_CHANNEL(1),
    929	SI1145_PROXIMITY_CHANNEL(2, 0),
    930	SI1145_TEMP_CHANNEL(3),
    931	SI1145_VOLTAGE_CHANNEL(4),
    932	SI1145_UV_CHANNEL(5),
    933	IIO_CHAN_SOFT_TIMESTAMP(6),
    934	SI1145_CURRENT_CHANNEL(0),
    935};
    936
    937static const struct iio_chan_spec si1146_channels[] = {
    938	SI1145_INTENSITY_CHANNEL(0),
    939	SI1145_INTENSITY_IR_CHANNEL(1),
    940	SI1145_TEMP_CHANNEL(2),
    941	SI1145_VOLTAGE_CHANNEL(3),
    942	SI1145_UV_CHANNEL(4),
    943	SI1145_PROXIMITY_CHANNEL(5, 0),
    944	SI1145_PROXIMITY_CHANNEL(6, 1),
    945	IIO_CHAN_SOFT_TIMESTAMP(7),
    946	SI1145_CURRENT_CHANNEL(0),
    947	SI1145_CURRENT_CHANNEL(1),
    948};
    949
    950static const struct iio_chan_spec si1147_channels[] = {
    951	SI1145_INTENSITY_CHANNEL(0),
    952	SI1145_INTENSITY_IR_CHANNEL(1),
    953	SI1145_PROXIMITY_CHANNEL(2, 0),
    954	SI1145_PROXIMITY_CHANNEL(3, 1),
    955	SI1145_PROXIMITY_CHANNEL(4, 2),
    956	SI1145_TEMP_CHANNEL(5),
    957	SI1145_VOLTAGE_CHANNEL(6),
    958	SI1145_UV_CHANNEL(7),
    959	IIO_CHAN_SOFT_TIMESTAMP(8),
    960	SI1145_CURRENT_CHANNEL(0),
    961	SI1145_CURRENT_CHANNEL(1),
    962	SI1145_CURRENT_CHANNEL(2),
    963};
    964
    965static struct attribute *si1132_attributes[] = {
    966	&iio_const_attr_in_intensity_scale_available.dev_attr.attr,
    967	&iio_const_attr_in_intensity_ir_scale_available.dev_attr.attr,
    968	NULL,
    969};
    970
    971static struct attribute *si114x_attributes[] = {
    972	&iio_const_attr_in_intensity_scale_available.dev_attr.attr,
    973	&iio_const_attr_in_intensity_ir_scale_available.dev_attr.attr,
    974	&iio_const_attr_in_proximity_scale_available.dev_attr.attr,
    975	NULL,
    976};
    977
    978static const struct attribute_group si1132_attribute_group = {
    979	.attrs = si1132_attributes,
    980};
    981
    982static const struct attribute_group si114x_attribute_group = {
    983	.attrs = si114x_attributes,
    984};
    985
    986
    987static const struct iio_info si1132_info = {
    988	.read_raw = si1145_read_raw,
    989	.write_raw = si1145_write_raw,
    990	.attrs = &si1132_attribute_group,
    991};
    992
    993static const struct iio_info si114x_info = {
    994	.read_raw = si1145_read_raw,
    995	.write_raw = si1145_write_raw,
    996	.attrs = &si114x_attribute_group,
    997};
    998
    999#define SI1145_PART(id, iio_info, chans, leds, uncompressed_meas_rate) \
   1000	{id, iio_info, chans, ARRAY_SIZE(chans), leds, uncompressed_meas_rate}
   1001
   1002static const struct si1145_part_info si1145_part_info[] = {
   1003	[SI1132] = SI1145_PART(0x32, &si1132_info, si1132_channels, 0, true),
   1004	[SI1141] = SI1145_PART(0x41, &si114x_info, si1141_channels, 1, false),
   1005	[SI1142] = SI1145_PART(0x42, &si114x_info, si1142_channels, 2, false),
   1006	[SI1143] = SI1145_PART(0x43, &si114x_info, si1143_channels, 3, false),
   1007	[SI1145] = SI1145_PART(0x45, &si114x_info, si1145_channels, 1, true),
   1008	[SI1146] = SI1145_PART(0x46, &si114x_info, si1146_channels, 2, true),
   1009	[SI1147] = SI1145_PART(0x47, &si114x_info, si1147_channels, 3, true),
   1010};
   1011
   1012static int si1145_initialize(struct si1145_data *data)
   1013{
   1014	struct i2c_client *client = data->client;
   1015	int ret;
   1016
   1017	ret = i2c_smbus_write_byte_data(client, SI1145_REG_COMMAND,
   1018					SI1145_CMD_RESET);
   1019	if (ret < 0)
   1020		return ret;
   1021	msleep(SI1145_COMMAND_TIMEOUT_MS);
   1022
   1023	/* Hardware key, magic value */
   1024	ret = i2c_smbus_write_byte_data(client, SI1145_REG_HW_KEY, 0x17);
   1025	if (ret < 0)
   1026		return ret;
   1027	msleep(SI1145_COMMAND_TIMEOUT_MS);
   1028
   1029	/* Turn off autonomous mode */
   1030	ret = si1145_set_meas_rate(data, 0);
   1031	if (ret < 0)
   1032		return ret;
   1033
   1034	/* Initialize sampling freq to 10 Hz */
   1035	ret = si1145_store_samp_freq(data, 10);
   1036	if (ret < 0)
   1037		return ret;
   1038
   1039	/* Set LED currents to 45 mA; have 4 bits, see Table 2 in datasheet */
   1040	switch (data->part_info->num_leds) {
   1041	case 3:
   1042		ret = i2c_smbus_write_byte_data(client,
   1043						SI1145_REG_PS_LED3,
   1044						SI1145_LED_CURRENT_45mA);
   1045		if (ret < 0)
   1046			return ret;
   1047		fallthrough;
   1048	case 2:
   1049		ret = i2c_smbus_write_byte_data(client,
   1050						SI1145_REG_PS_LED21,
   1051						(SI1145_LED_CURRENT_45mA << 4) |
   1052						SI1145_LED_CURRENT_45mA);
   1053		break;
   1054	case 1:
   1055		ret = i2c_smbus_write_byte_data(client,
   1056						SI1145_REG_PS_LED21,
   1057						SI1145_LED_CURRENT_45mA);
   1058		break;
   1059	default:
   1060		ret = 0;
   1061		break;
   1062	}
   1063	if (ret < 0)
   1064		return ret;
   1065
   1066	/* Set normal proximity measurement mode */
   1067	ret = si1145_param_set(data, SI1145_PARAM_PS_ADC_MISC,
   1068			       SI1145_PS_ADC_MODE_NORMAL);
   1069	if (ret < 0)
   1070		return ret;
   1071
   1072	ret = si1145_param_set(data, SI1145_PARAM_PS_ADC_GAIN, 0x01);
   1073	if (ret < 0)
   1074		return ret;
   1075
   1076	/* ADC_COUNTER should be one complement of ADC_GAIN */
   1077	ret = si1145_param_set(data, SI1145_PARAM_PS_ADC_COUNTER, 0x06 << 4);
   1078	if (ret < 0)
   1079		return ret;
   1080
   1081	/* Set ALS visible measurement mode */
   1082	ret = si1145_param_set(data, SI1145_PARAM_ALSVIS_ADC_MISC,
   1083			       SI1145_ADC_MISC_RANGE);
   1084	if (ret < 0)
   1085		return ret;
   1086
   1087	ret = si1145_param_set(data, SI1145_PARAM_ALSVIS_ADC_GAIN, 0x03);
   1088	if (ret < 0)
   1089		return ret;
   1090
   1091	ret = si1145_param_set(data, SI1145_PARAM_ALSVIS_ADC_COUNTER,
   1092			       0x04 << 4);
   1093	if (ret < 0)
   1094		return ret;
   1095
   1096	/* Set ALS IR measurement mode */
   1097	ret = si1145_param_set(data, SI1145_PARAM_ALSIR_ADC_MISC,
   1098			       SI1145_ADC_MISC_RANGE);
   1099	if (ret < 0)
   1100		return ret;
   1101
   1102	ret = si1145_param_set(data, SI1145_PARAM_ALSIR_ADC_GAIN, 0x01);
   1103	if (ret < 0)
   1104		return ret;
   1105
   1106	ret = si1145_param_set(data, SI1145_PARAM_ALSIR_ADC_COUNTER,
   1107			       0x06 << 4);
   1108	if (ret < 0)
   1109		return ret;
   1110
   1111	/*
   1112	 * Initialize UCOEF to default values in datasheet
   1113	 * These registers are normally zero on reset
   1114	 */
   1115	if (data->part_info == &si1145_part_info[SI1132] ||
   1116		data->part_info == &si1145_part_info[SI1145] ||
   1117		data->part_info == &si1145_part_info[SI1146] ||
   1118		data->part_info == &si1145_part_info[SI1147]) {
   1119		ret = i2c_smbus_write_byte_data(data->client,
   1120						SI1145_REG_UCOEF1,
   1121						SI1145_UCOEF1_DEFAULT);
   1122		if (ret < 0)
   1123			return ret;
   1124		ret = i2c_smbus_write_byte_data(data->client,
   1125				SI1145_REG_UCOEF2, SI1145_UCOEF2_DEFAULT);
   1126		if (ret < 0)
   1127			return ret;
   1128		ret = i2c_smbus_write_byte_data(data->client,
   1129				SI1145_REG_UCOEF3, SI1145_UCOEF3_DEFAULT);
   1130		if (ret < 0)
   1131			return ret;
   1132		ret = i2c_smbus_write_byte_data(data->client,
   1133				SI1145_REG_UCOEF4, SI1145_UCOEF4_DEFAULT);
   1134		if (ret < 0)
   1135			return ret;
   1136	}
   1137
   1138	return 0;
   1139}
   1140
   1141/*
   1142 * Program the channels we want to measure with CMD_PSALS_AUTO. No need for
   1143 * _postdisable as we stop with CMD_PSALS_PAUSE; single measurement (direct)
   1144 * mode reprograms the channels list anyway...
   1145 */
   1146static int si1145_buffer_preenable(struct iio_dev *indio_dev)
   1147{
   1148	struct si1145_data *data = iio_priv(indio_dev);
   1149	int ret;
   1150
   1151	mutex_lock(&data->lock);
   1152	ret = si1145_set_chlist(indio_dev, *indio_dev->active_scan_mask);
   1153	mutex_unlock(&data->lock);
   1154
   1155	return ret;
   1156}
   1157
   1158static bool si1145_validate_scan_mask(struct iio_dev *indio_dev,
   1159			       const unsigned long *scan_mask)
   1160{
   1161	struct si1145_data *data = iio_priv(indio_dev);
   1162	unsigned int count = 0;
   1163	int i;
   1164
   1165	/* Check that at most one AUX channel is enabled */
   1166	for_each_set_bit(i, scan_mask, data->part_info->num_channels) {
   1167		if (indio_dev->channels[i].address == SI1145_REG_AUX_DATA)
   1168			count++;
   1169	}
   1170
   1171	return count <= 1;
   1172}
   1173
   1174static const struct iio_buffer_setup_ops si1145_buffer_setup_ops = {
   1175	.preenable = si1145_buffer_preenable,
   1176	.validate_scan_mask = si1145_validate_scan_mask,
   1177};
   1178
   1179/*
   1180 * si1145_trigger_set_state() - Set trigger state
   1181 *
   1182 * When not using triggers interrupts are disabled and measurement rate is
   1183 * set to zero in order to minimize power consumption.
   1184 */
   1185static int si1145_trigger_set_state(struct iio_trigger *trig, bool state)
   1186{
   1187	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
   1188	struct si1145_data *data = iio_priv(indio_dev);
   1189	int err = 0, ret;
   1190
   1191	mutex_lock(&data->lock);
   1192
   1193	if (state) {
   1194		data->autonomous = true;
   1195		err = i2c_smbus_write_byte_data(data->client,
   1196				SI1145_REG_INT_CFG, SI1145_INT_CFG_OE);
   1197		if (err < 0)
   1198			goto disable;
   1199		err = i2c_smbus_write_byte_data(data->client,
   1200				SI1145_REG_IRQ_ENABLE, SI1145_MASK_ALL_IE);
   1201		if (err < 0)
   1202			goto disable;
   1203		err = si1145_set_meas_rate(data, data->meas_rate);
   1204		if (err < 0)
   1205			goto disable;
   1206		err = si1145_command(data, SI1145_CMD_PSALS_AUTO);
   1207		if (err < 0)
   1208			goto disable;
   1209	} else {
   1210disable:
   1211		/* Disable as much as possible skipping errors */
   1212		ret = si1145_command(data, SI1145_CMD_PSALS_PAUSE);
   1213		if (ret < 0 && !err)
   1214			err = ret;
   1215		ret = si1145_set_meas_rate(data, 0);
   1216		if (ret < 0 && !err)
   1217			err = ret;
   1218		ret = i2c_smbus_write_byte_data(data->client,
   1219						SI1145_REG_IRQ_ENABLE, 0);
   1220		if (ret < 0 && !err)
   1221			err = ret;
   1222		ret = i2c_smbus_write_byte_data(data->client,
   1223						SI1145_REG_INT_CFG, 0);
   1224		if (ret < 0 && !err)
   1225			err = ret;
   1226		data->autonomous = false;
   1227	}
   1228
   1229	mutex_unlock(&data->lock);
   1230	return err;
   1231}
   1232
   1233static const struct iio_trigger_ops si1145_trigger_ops = {
   1234	.set_trigger_state = si1145_trigger_set_state,
   1235};
   1236
   1237static int si1145_probe_trigger(struct iio_dev *indio_dev)
   1238{
   1239	struct si1145_data *data = iio_priv(indio_dev);
   1240	struct i2c_client *client = data->client;
   1241	struct iio_trigger *trig;
   1242	int ret;
   1243
   1244	trig = devm_iio_trigger_alloc(&client->dev,
   1245			"%s-dev%d", indio_dev->name, iio_device_id(indio_dev));
   1246	if (!trig)
   1247		return -ENOMEM;
   1248
   1249	trig->ops = &si1145_trigger_ops;
   1250	iio_trigger_set_drvdata(trig, indio_dev);
   1251
   1252	ret = devm_request_irq(&client->dev, client->irq,
   1253			  iio_trigger_generic_data_rdy_poll,
   1254			  IRQF_TRIGGER_FALLING,
   1255			  "si1145_irq",
   1256			  trig);
   1257	if (ret < 0) {
   1258		dev_err(&client->dev, "irq request failed\n");
   1259		return ret;
   1260	}
   1261
   1262	ret = devm_iio_trigger_register(&client->dev, trig);
   1263	if (ret)
   1264		return ret;
   1265
   1266	data->trig = trig;
   1267	indio_dev->trig = iio_trigger_get(data->trig);
   1268
   1269	return 0;
   1270}
   1271
   1272static int si1145_probe(struct i2c_client *client,
   1273			const struct i2c_device_id *id)
   1274{
   1275	struct si1145_data *data;
   1276	struct iio_dev *indio_dev;
   1277	u8 part_id, rev_id, seq_id;
   1278	int ret;
   1279
   1280	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
   1281	if (!indio_dev)
   1282		return -ENOMEM;
   1283
   1284	data = iio_priv(indio_dev);
   1285	i2c_set_clientdata(client, indio_dev);
   1286	data->client = client;
   1287	data->part_info = &si1145_part_info[id->driver_data];
   1288
   1289	part_id = ret = i2c_smbus_read_byte_data(data->client,
   1290						 SI1145_REG_PART_ID);
   1291	if (ret < 0)
   1292		return ret;
   1293	rev_id = ret = i2c_smbus_read_byte_data(data->client,
   1294						SI1145_REG_REV_ID);
   1295	if (ret < 0)
   1296		return ret;
   1297	seq_id = ret = i2c_smbus_read_byte_data(data->client,
   1298						SI1145_REG_SEQ_ID);
   1299	if (ret < 0)
   1300		return ret;
   1301	dev_info(&client->dev, "device ID part 0x%02x rev 0x%02x seq 0x%02x\n",
   1302			part_id, rev_id, seq_id);
   1303	if (part_id != data->part_info->part) {
   1304		dev_err(&client->dev, "part ID mismatch got 0x%02x, expected 0x%02x\n",
   1305				part_id, data->part_info->part);
   1306		return -ENODEV;
   1307	}
   1308
   1309	indio_dev->name = id->name;
   1310	indio_dev->channels = data->part_info->channels;
   1311	indio_dev->num_channels = data->part_info->num_channels;
   1312	indio_dev->info = data->part_info->iio_info;
   1313	indio_dev->modes = INDIO_DIRECT_MODE;
   1314
   1315	mutex_init(&data->lock);
   1316	mutex_init(&data->cmdlock);
   1317
   1318	ret = si1145_initialize(data);
   1319	if (ret < 0)
   1320		return ret;
   1321
   1322	ret = devm_iio_triggered_buffer_setup(&client->dev,
   1323		indio_dev, NULL,
   1324		si1145_trigger_handler, &si1145_buffer_setup_ops);
   1325	if (ret < 0)
   1326		return ret;
   1327
   1328	if (client->irq) {
   1329		ret = si1145_probe_trigger(indio_dev);
   1330		if (ret < 0)
   1331			return ret;
   1332	} else {
   1333		dev_info(&client->dev, "no irq, using polling\n");
   1334	}
   1335
   1336	return devm_iio_device_register(&client->dev, indio_dev);
   1337}
   1338
   1339static const struct i2c_device_id si1145_ids[] = {
   1340	{ "si1132", SI1132 },
   1341	{ "si1141", SI1141 },
   1342	{ "si1142", SI1142 },
   1343	{ "si1143", SI1143 },
   1344	{ "si1145", SI1145 },
   1345	{ "si1146", SI1146 },
   1346	{ "si1147", SI1147 },
   1347	{ }
   1348};
   1349MODULE_DEVICE_TABLE(i2c, si1145_ids);
   1350
   1351static struct i2c_driver si1145_driver = {
   1352	.driver = {
   1353		.name   = "si1145",
   1354	},
   1355	.probe  = si1145_probe,
   1356	.id_table = si1145_ids,
   1357};
   1358
   1359module_i2c_driver(si1145_driver);
   1360
   1361MODULE_AUTHOR("Peter Meerwald-Stadler <pmeerw@pmeerw.net>");
   1362MODULE_DESCRIPTION("Silabs SI1132 and SI1141/2/3/5/6/7 proximity, ambient light and UV index sensor driver");
   1363MODULE_LICENSE("GPL");