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

tsl2591.c (33091B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright (C) 2021 Joe Sandom <joe.g.sandom@gmail.com>
      4 *
      5 * Datasheet: https://ams.com/tsl25911#tab/documents
      6 *
      7 * Device driver for the TAOS TSL2591. This is a very-high sensitivity
      8 * light-to-digital converter that transforms light intensity into a digital
      9 * signal.
     10 */
     11
     12#include <linux/bitfield.h>
     13#include <linux/debugfs.h>
     14#include <linux/delay.h>
     15#include <linux/i2c.h>
     16#include <linux/interrupt.h>
     17#include <linux/iopoll.h>
     18#include <linux/kernel.h>
     19#include <linux/module.h>
     20#include <linux/mutex.h>
     21#include <linux/pm_runtime.h>
     22#include <linux/sysfs.h>
     23
     24#include <asm/unaligned.h>
     25
     26#include <linux/iio/events.h>
     27#include <linux/iio/iio.h>
     28#include <linux/iio/sysfs.h>
     29
     30/* ADC integration time, field value to time in ms */
     31#define TSL2591_FVAL_TO_MSEC(x) (((x) + 1) * 100)
     32/* ADC integration time, field value to time in seconds */
     33#define TSL2591_FVAL_TO_SEC(x) ((x) + 1)
     34/* ADC integration time, time in seconds to field value */
     35#define TSL2591_SEC_TO_FVAL(x) ((x) - 1)
     36
     37/* TSL2591 register set */
     38#define TSL2591_ENABLE      0x00
     39#define TSL2591_CONTROL     0x01
     40#define TSL2591_AILTL       0x04
     41#define TSL2591_AILTH       0x05
     42#define TSL2591_AIHTL       0x06
     43#define TSL2591_AIHTH       0x07
     44#define TSL2591_NP_AILTL    0x08
     45#define TSL2591_NP_AILTH    0x09
     46#define TSL2591_NP_AIHTL    0x0A
     47#define TSL2591_NP_AIHTH    0x0B
     48#define TSL2591_PERSIST     0x0C
     49#define TSL2591_PACKAGE_ID  0x11
     50#define TSL2591_DEVICE_ID   0x12
     51#define TSL2591_STATUS      0x13
     52#define TSL2591_C0_DATAL    0x14
     53#define TSL2591_C0_DATAH    0x15
     54#define TSL2591_C1_DATAL    0x16
     55#define TSL2591_C1_DATAH    0x17
     56
     57/* TSL2591 command register definitions */
     58#define TSL2591_CMD_NOP             0xA0
     59#define TSL2591_CMD_SF_INTSET       0xE4
     60#define TSL2591_CMD_SF_CALS_I       0xE5
     61#define TSL2591_CMD_SF_CALS_NPI     0xE7
     62#define TSL2591_CMD_SF_CNP_ALSI     0xEA
     63
     64/* TSL2591 enable register definitions */
     65#define TSL2591_PWR_ON              0x01
     66#define TSL2591_PWR_OFF             0x00
     67#define TSL2591_ENABLE_ALS          0x02
     68#define TSL2591_ENABLE_ALS_INT      0x10
     69#define TSL2591_ENABLE_SLEEP_INT    0x40
     70#define TSL2591_ENABLE_NP_INT       0x80
     71
     72/* TSL2591 control register definitions */
     73#define TSL2591_CTRL_ALS_INTEGRATION_100MS  0x00
     74#define TSL2591_CTRL_ALS_INTEGRATION_200MS  0x01
     75#define TSL2591_CTRL_ALS_INTEGRATION_300MS  0x02
     76#define TSL2591_CTRL_ALS_INTEGRATION_400MS  0x03
     77#define TSL2591_CTRL_ALS_INTEGRATION_500MS  0x04
     78#define TSL2591_CTRL_ALS_INTEGRATION_600MS  0x05
     79#define TSL2591_CTRL_ALS_LOW_GAIN           0x00
     80#define TSL2591_CTRL_ALS_MED_GAIN           0x10
     81#define TSL2591_CTRL_ALS_HIGH_GAIN          0x20
     82#define TSL2591_CTRL_ALS_MAX_GAIN           0x30
     83#define TSL2591_CTRL_SYS_RESET              0x80
     84
     85/* TSL2591 persist register definitions */
     86#define TSL2591_PRST_ALS_INT_CYCLE_0        0x00
     87#define TSL2591_PRST_ALS_INT_CYCLE_ANY      0x01
     88#define TSL2591_PRST_ALS_INT_CYCLE_2        0x02
     89#define TSL2591_PRST_ALS_INT_CYCLE_3        0x03
     90#define TSL2591_PRST_ALS_INT_CYCLE_5        0x04
     91#define TSL2591_PRST_ALS_INT_CYCLE_10       0x05
     92#define TSL2591_PRST_ALS_INT_CYCLE_15       0x06
     93#define TSL2591_PRST_ALS_INT_CYCLE_20       0x07
     94#define TSL2591_PRST_ALS_INT_CYCLE_25       0x08
     95#define TSL2591_PRST_ALS_INT_CYCLE_30       0x09
     96#define TSL2591_PRST_ALS_INT_CYCLE_35       0x0A
     97#define TSL2591_PRST_ALS_INT_CYCLE_40       0x0B
     98#define TSL2591_PRST_ALS_INT_CYCLE_45       0x0C
     99#define TSL2591_PRST_ALS_INT_CYCLE_50       0x0D
    100#define TSL2591_PRST_ALS_INT_CYCLE_55       0x0E
    101#define TSL2591_PRST_ALS_INT_CYCLE_60       0x0F
    102#define TSL2591_PRST_ALS_INT_CYCLE_MAX      (BIT(4) - 1)
    103
    104/* TSL2591 PID register mask */
    105#define TSL2591_PACKAGE_ID_MASK  GENMASK(5, 4)
    106
    107/* TSL2591 ID register mask */
    108#define TSL2591_DEVICE_ID_MASK   GENMASK(7, 0)
    109
    110/* TSL2591 status register masks */
    111#define TSL2591_STS_ALS_VALID_MASK   BIT(0)
    112#define TSL2591_STS_ALS_INT_MASK     BIT(4)
    113#define TSL2591_STS_NPERS_INT_MASK   BIT(5)
    114#define TSL2591_STS_VAL_HIGH_MASK    BIT(0)
    115
    116/* TSL2591 constant values */
    117#define TSL2591_PACKAGE_ID_VAL  0x00
    118#define TSL2591_DEVICE_ID_VAL   0x50
    119
    120/* Power off suspend delay time MS */
    121#define TSL2591_POWER_OFF_DELAY_MS   2000
    122
    123/* TSL2591 default values */
    124#define TSL2591_DEFAULT_ALS_INT_TIME          TSL2591_CTRL_ALS_INTEGRATION_300MS
    125#define TSL2591_DEFAULT_ALS_GAIN              TSL2591_CTRL_ALS_MED_GAIN
    126#define TSL2591_DEFAULT_ALS_PERSIST           TSL2591_PRST_ALS_INT_CYCLE_ANY
    127#define TSL2591_DEFAULT_ALS_LOWER_THRESH      100
    128#define TSL2591_DEFAULT_ALS_UPPER_THRESH      1500
    129
    130/* TSL2591 number of data registers */
    131#define TSL2591_NUM_DATA_REGISTERS     4
    132
    133/* TSL2591 number of valid status reads on ADC complete */
    134#define TSL2591_ALS_STS_VALID_COUNT    10
    135
    136/* TSL2591 delay period between polls when checking for ALS valid flag */
    137#define TSL2591_DELAY_PERIOD_US        10000
    138
    139/* TSL2591 maximum values */
    140#define TSL2591_MAX_ALS_INT_TIME_MS    600
    141#define TSL2591_ALS_MAX_VALUE	       (BIT(16) - 1)
    142
    143/*
    144 * LUX calculations;
    145 * AGAIN values from Adafruit's TSL2591 Arduino library
    146 * https://github.com/adafruit/Adafruit_TSL2591_Library
    147 */
    148#define TSL2591_CTRL_ALS_LOW_GAIN_MULTIPLIER   1
    149#define TSL2591_CTRL_ALS_MED_GAIN_MULTIPLIER   25
    150#define TSL2591_CTRL_ALS_HIGH_GAIN_MULTIPLIER  428
    151#define TSL2591_CTRL_ALS_MAX_GAIN_MULTIPLIER   9876
    152#define TSL2591_LUX_COEFFICIENT                408
    153
    154struct tsl2591_als_settings {
    155	u16 als_lower_thresh;
    156	u16 als_upper_thresh;
    157	u8 als_int_time;
    158	u8 als_persist;
    159	u8 als_gain;
    160};
    161
    162struct tsl2591_chip {
    163	struct tsl2591_als_settings als_settings;
    164	struct i2c_client *client;
    165	/*
    166	 * Keep als_settings in sync with hardware state
    167	 * and ensure multiple readers are serialized.
    168	 */
    169	struct mutex als_mutex;
    170	bool events_enabled;
    171};
    172
    173/*
    174 * Period table is ALS persist cycle x integration time setting
    175 * Integration times: 100ms, 200ms, 300ms, 400ms, 500ms, 600ms
    176 * ALS cycles: 1, 2, 3, 5, 10, 20, 25, 30, 35, 40, 45, 50, 55, 60
    177 */
    178static const char * const tsl2591_als_period_list[] = {
    179	"0.1 0.2 0.3 0.5 1.0 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0",
    180	"0.2 0.4 0.6 1.0 2.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0",
    181	"0.3 0.6 0.9 1.5 3.0 6.0 7.5 9.0 10.5 12.0 13.5 15.0 16.5 18.0",
    182	"0.4 0.8 1.2 2.0 4.0 8.0 10.0 12.0 14.0 16.0 18.0 20.0 22.0 24.0",
    183	"0.5 1.0 1.5 2.5 5.0 10.0 12.5 15.0 17.5 20.0 22.5 25.0 27.5 30.0",
    184	"0.6 1.2 1.8 3.0 6.0 12.0 15.0 18.0 21.0 24.0 27.0 30.0 33.0 36.0",
    185};
    186
    187static const int tsl2591_int_time_available[] = {
    188	1, 2, 3, 4, 5, 6,
    189};
    190
    191static const int tsl2591_calibscale_available[] = {
    192	1, 25, 428, 9876,
    193};
    194
    195static int tsl2591_set_als_lower_threshold(struct tsl2591_chip *chip,
    196					   u16 als_lower_threshold);
    197static int tsl2591_set_als_upper_threshold(struct tsl2591_chip *chip,
    198					   u16 als_upper_threshold);
    199
    200static int tsl2591_gain_to_multiplier(const u8 als_gain)
    201{
    202	switch (als_gain) {
    203	case TSL2591_CTRL_ALS_LOW_GAIN:
    204		return TSL2591_CTRL_ALS_LOW_GAIN_MULTIPLIER;
    205	case TSL2591_CTRL_ALS_MED_GAIN:
    206		return TSL2591_CTRL_ALS_MED_GAIN_MULTIPLIER;
    207	case TSL2591_CTRL_ALS_HIGH_GAIN:
    208		return TSL2591_CTRL_ALS_HIGH_GAIN_MULTIPLIER;
    209	case TSL2591_CTRL_ALS_MAX_GAIN:
    210		return TSL2591_CTRL_ALS_MAX_GAIN_MULTIPLIER;
    211	default:
    212		return -EINVAL;
    213	}
    214}
    215
    216static int tsl2591_multiplier_to_gain(const u32 multiplier)
    217{
    218	switch (multiplier) {
    219	case TSL2591_CTRL_ALS_LOW_GAIN_MULTIPLIER:
    220		return TSL2591_CTRL_ALS_LOW_GAIN;
    221	case TSL2591_CTRL_ALS_MED_GAIN_MULTIPLIER:
    222		return TSL2591_CTRL_ALS_MED_GAIN;
    223	case TSL2591_CTRL_ALS_HIGH_GAIN_MULTIPLIER:
    224		return TSL2591_CTRL_ALS_HIGH_GAIN;
    225	case TSL2591_CTRL_ALS_MAX_GAIN_MULTIPLIER:
    226		return TSL2591_CTRL_ALS_MAX_GAIN;
    227	default:
    228		return -EINVAL;
    229	}
    230}
    231
    232static int tsl2591_persist_cycle_to_lit(const u8 als_persist)
    233{
    234	switch (als_persist) {
    235	case TSL2591_PRST_ALS_INT_CYCLE_ANY:
    236		return 1;
    237	case TSL2591_PRST_ALS_INT_CYCLE_2:
    238		return 2;
    239	case TSL2591_PRST_ALS_INT_CYCLE_3:
    240		return 3;
    241	case TSL2591_PRST_ALS_INT_CYCLE_5:
    242		return 5;
    243	case TSL2591_PRST_ALS_INT_CYCLE_10:
    244		return 10;
    245	case TSL2591_PRST_ALS_INT_CYCLE_15:
    246		return 15;
    247	case TSL2591_PRST_ALS_INT_CYCLE_20:
    248		return 20;
    249	case TSL2591_PRST_ALS_INT_CYCLE_25:
    250		return 25;
    251	case TSL2591_PRST_ALS_INT_CYCLE_30:
    252		return 30;
    253	case TSL2591_PRST_ALS_INT_CYCLE_35:
    254		return 35;
    255	case TSL2591_PRST_ALS_INT_CYCLE_40:
    256		return 40;
    257	case TSL2591_PRST_ALS_INT_CYCLE_45:
    258		return 45;
    259	case TSL2591_PRST_ALS_INT_CYCLE_50:
    260		return 50;
    261	case TSL2591_PRST_ALS_INT_CYCLE_55:
    262		return 55;
    263	case TSL2591_PRST_ALS_INT_CYCLE_60:
    264		return 60;
    265	default:
    266		return -EINVAL;
    267	}
    268}
    269
    270static int tsl2591_persist_lit_to_cycle(const u8 als_persist)
    271{
    272	switch (als_persist) {
    273	case 1:
    274		return TSL2591_PRST_ALS_INT_CYCLE_ANY;
    275	case 2:
    276		return TSL2591_PRST_ALS_INT_CYCLE_2;
    277	case 3:
    278		return TSL2591_PRST_ALS_INT_CYCLE_3;
    279	case 5:
    280		return TSL2591_PRST_ALS_INT_CYCLE_5;
    281	case 10:
    282		return TSL2591_PRST_ALS_INT_CYCLE_10;
    283	case 15:
    284		return TSL2591_PRST_ALS_INT_CYCLE_15;
    285	case 20:
    286		return TSL2591_PRST_ALS_INT_CYCLE_20;
    287	case 25:
    288		return TSL2591_PRST_ALS_INT_CYCLE_25;
    289	case 30:
    290		return TSL2591_PRST_ALS_INT_CYCLE_30;
    291	case 35:
    292		return TSL2591_PRST_ALS_INT_CYCLE_35;
    293	case 40:
    294		return TSL2591_PRST_ALS_INT_CYCLE_40;
    295	case 45:
    296		return TSL2591_PRST_ALS_INT_CYCLE_45;
    297	case 50:
    298		return TSL2591_PRST_ALS_INT_CYCLE_50;
    299	case 55:
    300		return TSL2591_PRST_ALS_INT_CYCLE_55;
    301	case 60:
    302		return TSL2591_PRST_ALS_INT_CYCLE_60;
    303	default:
    304		return -EINVAL;
    305	}
    306}
    307
    308static int tsl2591_compatible_int_time(struct tsl2591_chip *chip,
    309				       const u32 als_integration_time)
    310{
    311	switch (als_integration_time) {
    312	case TSL2591_CTRL_ALS_INTEGRATION_100MS:
    313	case TSL2591_CTRL_ALS_INTEGRATION_200MS:
    314	case TSL2591_CTRL_ALS_INTEGRATION_300MS:
    315	case TSL2591_CTRL_ALS_INTEGRATION_400MS:
    316	case TSL2591_CTRL_ALS_INTEGRATION_500MS:
    317	case TSL2591_CTRL_ALS_INTEGRATION_600MS:
    318		return 0;
    319	default:
    320		return -EINVAL;
    321	}
    322}
    323
    324static int tsl2591_als_time_to_fval(const u32 als_integration_time)
    325{
    326	int i;
    327
    328	for (i = 0; i < ARRAY_SIZE(tsl2591_int_time_available); i++) {
    329		if (als_integration_time == tsl2591_int_time_available[i])
    330			return TSL2591_SEC_TO_FVAL(als_integration_time);
    331	}
    332
    333	return -EINVAL;
    334}
    335
    336static int tsl2591_compatible_gain(struct tsl2591_chip *chip, const u8 als_gain)
    337{
    338	switch (als_gain) {
    339	case TSL2591_CTRL_ALS_LOW_GAIN:
    340	case TSL2591_CTRL_ALS_MED_GAIN:
    341	case TSL2591_CTRL_ALS_HIGH_GAIN:
    342	case TSL2591_CTRL_ALS_MAX_GAIN:
    343		return 0;
    344	default:
    345		return -EINVAL;
    346	}
    347}
    348
    349static int tsl2591_compatible_als_persist_cycle(struct tsl2591_chip *chip,
    350						const u32 als_persist)
    351{
    352	switch (als_persist) {
    353	case TSL2591_PRST_ALS_INT_CYCLE_ANY:
    354	case TSL2591_PRST_ALS_INT_CYCLE_2:
    355	case TSL2591_PRST_ALS_INT_CYCLE_3:
    356	case TSL2591_PRST_ALS_INT_CYCLE_5:
    357	case TSL2591_PRST_ALS_INT_CYCLE_10:
    358	case TSL2591_PRST_ALS_INT_CYCLE_15:
    359	case TSL2591_PRST_ALS_INT_CYCLE_20:
    360	case TSL2591_PRST_ALS_INT_CYCLE_25:
    361	case TSL2591_PRST_ALS_INT_CYCLE_30:
    362	case TSL2591_PRST_ALS_INT_CYCLE_35:
    363	case TSL2591_PRST_ALS_INT_CYCLE_40:
    364	case TSL2591_PRST_ALS_INT_CYCLE_45:
    365	case TSL2591_PRST_ALS_INT_CYCLE_50:
    366	case TSL2591_PRST_ALS_INT_CYCLE_55:
    367	case TSL2591_PRST_ALS_INT_CYCLE_60:
    368		return 0;
    369	default:
    370		return -EINVAL;
    371	}
    372}
    373
    374static int tsl2591_check_als_valid(struct i2c_client *client)
    375{
    376	int ret;
    377
    378	ret = i2c_smbus_read_byte_data(client, TSL2591_CMD_NOP | TSL2591_STATUS);
    379	if (ret < 0) {
    380		dev_err(&client->dev, "Failed to read register\n");
    381		return -EINVAL;
    382	}
    383
    384	return FIELD_GET(TSL2591_STS_ALS_VALID_MASK, ret);
    385}
    386
    387static int tsl2591_wait_adc_complete(struct tsl2591_chip *chip)
    388{
    389	struct tsl2591_als_settings settings = chip->als_settings;
    390	struct i2c_client *client = chip->client;
    391	int delay;
    392	int val;
    393	int ret;
    394
    395	delay = TSL2591_FVAL_TO_MSEC(settings.als_int_time);
    396	if (!delay)
    397		return -EINVAL;
    398
    399	/*
    400	 * Sleep for ALS integration time to allow enough time or an ADC read
    401	 * cycle to complete. Check status after delay for ALS valid.
    402	 */
    403	msleep(delay);
    404
    405	/* Check for status ALS valid flag for up to 100ms */
    406	ret = readx_poll_timeout(tsl2591_check_als_valid, client,
    407				 val, val == TSL2591_STS_VAL_HIGH_MASK,
    408				 TSL2591_DELAY_PERIOD_US,
    409				 TSL2591_DELAY_PERIOD_US * TSL2591_ALS_STS_VALID_COUNT);
    410	if (ret)
    411		dev_err(&client->dev, "Timed out waiting for valid ALS data\n");
    412
    413	return ret;
    414}
    415
    416/*
    417 * tsl2591_read_channel_data - Reads raw channel data and calculates lux
    418 *
    419 * Formula for lux calculation;
    420 * Derived from Adafruit's TSL2591 library
    421 * Link: https://github.com/adafruit/Adafruit_TSL2591_Library
    422 * Counts Per Lux (CPL) = (ATIME_ms * AGAIN) / LUX DF
    423 * lux = ((C0DATA - C1DATA) * (1 - (C1DATA / C0DATA))) / CPL
    424 *
    425 * Scale values to get more representative value of lux i.e.
    426 * lux = ((C0DATA - C1DATA) * (1000 - ((C1DATA * 1000) / C0DATA))) / CPL
    427 *
    428 * Channel 0 = IR + Visible
    429 * Channel 1 = IR only
    430 */
    431static int tsl2591_read_channel_data(struct iio_dev *indio_dev,
    432				     struct iio_chan_spec const *chan,
    433				     int *val, int *val2)
    434{
    435	struct tsl2591_chip *chip = iio_priv(indio_dev);
    436	struct tsl2591_als_settings *settings = &chip->als_settings;
    437	struct i2c_client *client = chip->client;
    438	u8 als_data[TSL2591_NUM_DATA_REGISTERS];
    439	int counts_per_lux, int_time_fval, gain_multi, lux;
    440	u16 als_ch0, als_ch1;
    441	int ret;
    442
    443	ret = tsl2591_wait_adc_complete(chip);
    444	if (ret < 0) {
    445		dev_err(&client->dev, "No data available. Err: %d\n", ret);
    446		return ret;
    447	}
    448
    449	ret = i2c_smbus_read_i2c_block_data(client,
    450					    TSL2591_CMD_NOP | TSL2591_C0_DATAL,
    451					    sizeof(als_data), als_data);
    452	if (ret < 0) {
    453		dev_err(&client->dev, "Failed to read data bytes");
    454		return ret;
    455	}
    456
    457	als_ch0 = get_unaligned_le16(&als_data[0]);
    458	als_ch1 = get_unaligned_le16(&als_data[2]);
    459
    460	switch (chan->type) {
    461	case IIO_INTENSITY:
    462		if (chan->channel2 == IIO_MOD_LIGHT_BOTH)
    463			*val = als_ch0;
    464		else if (chan->channel2 == IIO_MOD_LIGHT_IR)
    465			*val = als_ch1;
    466		else
    467			return -EINVAL;
    468		break;
    469	case IIO_LIGHT:
    470		gain_multi = tsl2591_gain_to_multiplier(settings->als_gain);
    471		if (gain_multi < 0) {
    472			dev_err(&client->dev, "Invalid multiplier");
    473			return gain_multi;
    474		}
    475
    476		int_time_fval = TSL2591_FVAL_TO_MSEC(settings->als_int_time);
    477		/* Calculate counts per lux value */
    478		counts_per_lux = (int_time_fval * gain_multi) / TSL2591_LUX_COEFFICIENT;
    479
    480		dev_dbg(&client->dev, "Counts Per Lux: %d\n", counts_per_lux);
    481
    482		/* Calculate lux value */
    483		lux = ((als_ch0 - als_ch1) *
    484		       (1000 - ((als_ch1 * 1000) / als_ch0))) / counts_per_lux;
    485
    486		dev_dbg(&client->dev, "Raw lux calculation: %d\n", lux);
    487
    488		/* Divide by 1000 to get real lux value before scaling */
    489		*val = lux / 1000;
    490
    491		/* Get the decimal part of lux reading */
    492		*val2 = (lux - (*val * 1000)) * 1000;
    493
    494		break;
    495	default:
    496		return -EINVAL;
    497	}
    498
    499	return 0;
    500}
    501
    502static int tsl2591_set_als_gain_int_time(struct tsl2591_chip *chip)
    503{
    504	struct tsl2591_als_settings als_settings = chip->als_settings;
    505	struct i2c_client *client = chip->client;
    506	int ret;
    507
    508	ret = i2c_smbus_write_byte_data(client,
    509					TSL2591_CMD_NOP | TSL2591_CONTROL,
    510					als_settings.als_int_time | als_settings.als_gain);
    511	if (ret)
    512		dev_err(&client->dev, "Failed to set als gain & int time\n");
    513
    514	return ret;
    515}
    516
    517static int tsl2591_set_als_lower_threshold(struct tsl2591_chip *chip,
    518					   u16 als_lower_threshold)
    519{
    520	struct tsl2591_als_settings als_settings = chip->als_settings;
    521	struct i2c_client *client = chip->client;
    522	u16 als_upper_threshold;
    523	u8 als_lower_l;
    524	u8 als_lower_h;
    525	int ret;
    526
    527	chip->als_settings.als_lower_thresh = als_lower_threshold;
    528
    529	/*
    530	 * Lower threshold should not be greater or equal to upper.
    531	 * If this is the case, then assert upper threshold to new lower
    532	 * threshold + 1 to avoid ordering issues when setting thresholds.
    533	 */
    534	if (als_lower_threshold >= als_settings.als_upper_thresh) {
    535		als_upper_threshold = als_lower_threshold + 1;
    536		tsl2591_set_als_upper_threshold(chip, als_upper_threshold);
    537	}
    538
    539	als_lower_l = als_lower_threshold;
    540	als_lower_h = als_lower_threshold >> 8;
    541
    542	ret = i2c_smbus_write_byte_data(client,
    543					TSL2591_CMD_NOP | TSL2591_AILTL,
    544					als_lower_l);
    545	if (ret) {
    546		dev_err(&client->dev, "Failed to set als lower threshold\n");
    547		return ret;
    548	}
    549
    550	ret = i2c_smbus_write_byte_data(client,
    551					TSL2591_CMD_NOP | TSL2591_AILTH,
    552					als_lower_h);
    553	if (ret) {
    554		dev_err(&client->dev, "Failed to set als lower threshold\n");
    555		return ret;
    556	}
    557
    558	return 0;
    559}
    560
    561static int tsl2591_set_als_upper_threshold(struct tsl2591_chip *chip,
    562					   u16 als_upper_threshold)
    563{
    564	struct tsl2591_als_settings als_settings = chip->als_settings;
    565	struct i2c_client *client = chip->client;
    566	u16 als_lower_threshold;
    567	u8 als_upper_l;
    568	u8 als_upper_h;
    569	int ret;
    570
    571	if (als_upper_threshold > TSL2591_ALS_MAX_VALUE)
    572		return -EINVAL;
    573
    574	chip->als_settings.als_upper_thresh = als_upper_threshold;
    575
    576	/*
    577	 * Upper threshold should not be less than lower. If this
    578	 * is the case, then assert lower threshold to new upper
    579	 * threshold - 1 to avoid ordering issues when setting thresholds.
    580	 */
    581	if (als_upper_threshold < als_settings.als_lower_thresh) {
    582		als_lower_threshold = als_upper_threshold - 1;
    583		tsl2591_set_als_lower_threshold(chip, als_lower_threshold);
    584	}
    585
    586	als_upper_l = als_upper_threshold;
    587	als_upper_h = als_upper_threshold >> 8;
    588
    589	ret = i2c_smbus_write_byte_data(client,
    590					TSL2591_CMD_NOP | TSL2591_AIHTL,
    591					als_upper_l);
    592	if (ret) {
    593		dev_err(&client->dev, "Failed to set als upper threshold\n");
    594		return ret;
    595	}
    596
    597	ret = i2c_smbus_write_byte_data(client,
    598					TSL2591_CMD_NOP | TSL2591_AIHTH,
    599					als_upper_h);
    600	if (ret) {
    601		dev_err(&client->dev, "Failed to set als upper threshold\n");
    602		return ret;
    603	}
    604
    605	return 0;
    606}
    607
    608static int tsl2591_set_als_persist_cycle(struct tsl2591_chip *chip,
    609					 u8 als_persist)
    610{
    611	struct i2c_client *client = chip->client;
    612	int ret;
    613
    614	ret = i2c_smbus_write_byte_data(client,
    615					TSL2591_CMD_NOP | TSL2591_PERSIST,
    616					als_persist);
    617	if (ret)
    618		dev_err(&client->dev, "Failed to set als persist cycle\n");
    619
    620	chip->als_settings.als_persist = als_persist;
    621
    622	return ret;
    623}
    624
    625static int tsl2591_set_power_state(struct tsl2591_chip *chip, u8 state)
    626{
    627	struct i2c_client *client = chip->client;
    628	int ret;
    629
    630	ret = i2c_smbus_write_byte_data(client,
    631					TSL2591_CMD_NOP | TSL2591_ENABLE,
    632					state);
    633	if (ret)
    634		dev_err(&client->dev,
    635			"Failed to set the power state to %#04x\n", state);
    636
    637	return ret;
    638}
    639
    640static ssize_t tsl2591_in_illuminance_period_available_show(struct device *dev,
    641							    struct device_attribute *attr,
    642							    char *buf)
    643{
    644	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
    645	struct tsl2591_chip *chip = iio_priv(indio_dev);
    646
    647	return sysfs_emit(buf, "%s\n",
    648		       tsl2591_als_period_list[chip->als_settings.als_int_time]);
    649}
    650
    651static IIO_DEVICE_ATTR_RO(tsl2591_in_illuminance_period_available, 0);
    652
    653static struct attribute *tsl2591_event_attrs_ctrl[] = {
    654	&iio_dev_attr_tsl2591_in_illuminance_period_available.dev_attr.attr,
    655	NULL
    656};
    657
    658static const struct attribute_group tsl2591_event_attribute_group = {
    659	.attrs = tsl2591_event_attrs_ctrl,
    660};
    661
    662static const struct iio_event_spec tsl2591_events[] = {
    663	{
    664		.type = IIO_EV_TYPE_THRESH,
    665		.dir = IIO_EV_DIR_RISING,
    666		.mask_separate = BIT(IIO_EV_INFO_VALUE),
    667	}, {
    668		.type = IIO_EV_TYPE_THRESH,
    669		.dir = IIO_EV_DIR_FALLING,
    670		.mask_separate = BIT(IIO_EV_INFO_VALUE),
    671	}, {
    672		.type = IIO_EV_TYPE_THRESH,
    673		.dir = IIO_EV_DIR_EITHER,
    674		.mask_separate = BIT(IIO_EV_INFO_PERIOD) |
    675				BIT(IIO_EV_INFO_ENABLE),
    676	},
    677};
    678
    679static const struct iio_chan_spec tsl2591_channels[] = {
    680	{
    681		.type = IIO_INTENSITY,
    682		.modified = 1,
    683		.channel2 = IIO_MOD_LIGHT_IR,
    684		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
    685		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
    686						     BIT(IIO_CHAN_INFO_CALIBSCALE),
    687		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
    688					   BIT(IIO_CHAN_INFO_CALIBSCALE)
    689	},
    690	{
    691		.type = IIO_INTENSITY,
    692		.modified = 1,
    693		.channel2 = IIO_MOD_LIGHT_BOTH,
    694		.event_spec = tsl2591_events,
    695		.num_event_specs = ARRAY_SIZE(tsl2591_events),
    696		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
    697		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
    698						     BIT(IIO_CHAN_INFO_CALIBSCALE),
    699		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
    700					   BIT(IIO_CHAN_INFO_CALIBSCALE)
    701	},
    702	{
    703		.type = IIO_LIGHT,
    704		.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
    705		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
    706						     BIT(IIO_CHAN_INFO_CALIBSCALE),
    707		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
    708					   BIT(IIO_CHAN_INFO_CALIBSCALE)
    709	},
    710};
    711
    712static int tsl2591_read_raw(struct iio_dev *indio_dev,
    713			    struct iio_chan_spec const *chan,
    714			    int *val, int *val2, long mask)
    715{
    716	struct tsl2591_chip *chip = iio_priv(indio_dev);
    717	struct i2c_client *client = chip->client;
    718	int ret;
    719
    720	pm_runtime_get_sync(&client->dev);
    721
    722	mutex_lock(&chip->als_mutex);
    723
    724	switch (mask) {
    725	case IIO_CHAN_INFO_RAW:
    726		if (chan->type != IIO_INTENSITY) {
    727			ret = -EINVAL;
    728			goto err_unlock;
    729		}
    730
    731		ret = tsl2591_read_channel_data(indio_dev, chan, val, val2);
    732		if (ret < 0)
    733			goto err_unlock;
    734
    735		ret = IIO_VAL_INT;
    736		break;
    737	case IIO_CHAN_INFO_PROCESSED:
    738		if (chan->type != IIO_LIGHT) {
    739			ret = -EINVAL;
    740			goto err_unlock;
    741		}
    742
    743		ret = tsl2591_read_channel_data(indio_dev, chan, val, val2);
    744		if (ret < 0)
    745			break;
    746
    747		ret = IIO_VAL_INT_PLUS_MICRO;
    748		break;
    749	case IIO_CHAN_INFO_INT_TIME:
    750		if (chan->type != IIO_INTENSITY) {
    751			ret = -EINVAL;
    752			goto err_unlock;
    753		}
    754
    755		*val = TSL2591_FVAL_TO_SEC(chip->als_settings.als_int_time);
    756		ret = IIO_VAL_INT;
    757		break;
    758	case IIO_CHAN_INFO_CALIBSCALE:
    759		if (chan->type != IIO_INTENSITY) {
    760			ret = -EINVAL;
    761			goto err_unlock;
    762		}
    763
    764		*val = tsl2591_gain_to_multiplier(chip->als_settings.als_gain);
    765		ret = IIO_VAL_INT;
    766		break;
    767	default:
    768		ret = -EINVAL;
    769		break;
    770	}
    771
    772err_unlock:
    773	mutex_unlock(&chip->als_mutex);
    774
    775	pm_runtime_mark_last_busy(&client->dev);
    776	pm_runtime_put_autosuspend(&client->dev);
    777
    778	return ret;
    779}
    780
    781static int tsl2591_write_raw(struct iio_dev *indio_dev,
    782			     struct iio_chan_spec const *chan,
    783			     int val, int val2, long mask)
    784{
    785	struct tsl2591_chip *chip = iio_priv(indio_dev);
    786	int int_time;
    787	int gain;
    788	int ret;
    789
    790	mutex_lock(&chip->als_mutex);
    791
    792	switch (mask) {
    793	case IIO_CHAN_INFO_INT_TIME:
    794		int_time = tsl2591_als_time_to_fval(val);
    795		if (int_time < 0) {
    796			ret = int_time;
    797			goto err_unlock;
    798		}
    799		ret = tsl2591_compatible_int_time(chip, int_time);
    800		if (ret < 0)
    801			goto err_unlock;
    802
    803		chip->als_settings.als_int_time = int_time;
    804		break;
    805	case IIO_CHAN_INFO_CALIBSCALE:
    806		gain = tsl2591_multiplier_to_gain(val);
    807		if (gain < 0) {
    808			ret = gain;
    809			goto err_unlock;
    810		}
    811		ret = tsl2591_compatible_gain(chip, gain);
    812		if (ret < 0)
    813			goto err_unlock;
    814
    815		chip->als_settings.als_gain = gain;
    816		break;
    817	default:
    818		ret = -EINVAL;
    819		goto err_unlock;
    820	}
    821
    822	ret = tsl2591_set_als_gain_int_time(chip);
    823
    824err_unlock:
    825	mutex_unlock(&chip->als_mutex);
    826	return ret;
    827}
    828
    829static int tsl2591_read_available(struct iio_dev *indio_dev,
    830				  struct iio_chan_spec const *chan,
    831				  const int **vals, int *type, int *length,
    832				  long mask)
    833{
    834	switch (mask) {
    835	case IIO_CHAN_INFO_INT_TIME:
    836		*length = ARRAY_SIZE(tsl2591_int_time_available);
    837		*vals = tsl2591_int_time_available;
    838		*type = IIO_VAL_INT;
    839		return IIO_AVAIL_LIST;
    840
    841	case IIO_CHAN_INFO_CALIBSCALE:
    842		*length = ARRAY_SIZE(tsl2591_calibscale_available);
    843		*vals = tsl2591_calibscale_available;
    844		*type = IIO_VAL_INT;
    845		return IIO_AVAIL_LIST;
    846	default:
    847		return -EINVAL;
    848	}
    849}
    850
    851static int tsl2591_read_event_value(struct iio_dev *indio_dev,
    852				    const struct iio_chan_spec *chan,
    853				    enum iio_event_type type,
    854				    enum iio_event_direction dir,
    855				    enum iio_event_info info, int *val,
    856				    int *val2)
    857{
    858	struct tsl2591_chip *chip = iio_priv(indio_dev);
    859	struct i2c_client *client = chip->client;
    860	int als_persist, int_time, period;
    861	int ret;
    862
    863	mutex_lock(&chip->als_mutex);
    864
    865	switch (info) {
    866	case IIO_EV_INFO_VALUE:
    867		switch (dir) {
    868		case IIO_EV_DIR_RISING:
    869			*val = chip->als_settings.als_upper_thresh;
    870			break;
    871		case IIO_EV_DIR_FALLING:
    872			*val = chip->als_settings.als_lower_thresh;
    873			break;
    874		default:
    875			ret = -EINVAL;
    876			goto err_unlock;
    877		}
    878		ret = IIO_VAL_INT;
    879		break;
    880	case IIO_EV_INFO_PERIOD:
    881		ret = i2c_smbus_read_byte_data(client,
    882					       TSL2591_CMD_NOP | TSL2591_PERSIST);
    883		if (ret <= 0 || ret > TSL2591_PRST_ALS_INT_CYCLE_MAX)
    884			goto err_unlock;
    885
    886		als_persist = tsl2591_persist_cycle_to_lit(ret);
    887		int_time = TSL2591_FVAL_TO_MSEC(chip->als_settings.als_int_time);
    888		period = als_persist * (int_time * MSEC_PER_SEC);
    889
    890		*val = period / USEC_PER_SEC;
    891		*val2 = period % USEC_PER_SEC;
    892
    893		ret = IIO_VAL_INT_PLUS_MICRO;
    894		break;
    895	default:
    896		ret = -EINVAL;
    897		break;
    898	}
    899
    900err_unlock:
    901	mutex_unlock(&chip->als_mutex);
    902	return ret;
    903}
    904
    905static int tsl2591_write_event_value(struct iio_dev *indio_dev,
    906				     const struct iio_chan_spec *chan,
    907				     enum iio_event_type type,
    908				     enum iio_event_direction dir,
    909				     enum iio_event_info info, int val,
    910				     int val2)
    911{
    912	struct tsl2591_chip *chip = iio_priv(indio_dev);
    913	int period, int_time, als_persist;
    914	int ret;
    915
    916	if (val < 0 || val2 < 0)
    917		return -EINVAL;
    918
    919	mutex_lock(&chip->als_mutex);
    920
    921	switch (info) {
    922	case IIO_EV_INFO_VALUE:
    923		if (val > TSL2591_ALS_MAX_VALUE) {
    924			ret = -EINVAL;
    925			goto err_unlock;
    926		}
    927
    928		switch (dir) {
    929		case IIO_EV_DIR_RISING:
    930			ret = tsl2591_set_als_upper_threshold(chip, val);
    931			if (ret < 0)
    932				goto err_unlock;
    933			break;
    934		case IIO_EV_DIR_FALLING:
    935			ret = tsl2591_set_als_lower_threshold(chip, val);
    936			if (ret < 0)
    937				goto err_unlock;
    938			break;
    939		default:
    940			ret = -EINVAL;
    941			goto err_unlock;
    942		}
    943		break;
    944	case IIO_EV_INFO_PERIOD:
    945		int_time = TSL2591_FVAL_TO_MSEC(chip->als_settings.als_int_time);
    946
    947		period = ((val * MSEC_PER_SEC) +
    948			 (val2 / MSEC_PER_SEC)) / int_time;
    949
    950		als_persist = tsl2591_persist_lit_to_cycle(period);
    951		if (als_persist < 0) {
    952			ret = -EINVAL;
    953			goto err_unlock;
    954		}
    955
    956		ret = tsl2591_compatible_als_persist_cycle(chip, als_persist);
    957		if (ret < 0)
    958			goto err_unlock;
    959
    960		ret = tsl2591_set_als_persist_cycle(chip, als_persist);
    961		if (ret < 0)
    962			goto err_unlock;
    963		break;
    964	default:
    965		ret = -EINVAL;
    966		break;
    967	}
    968
    969err_unlock:
    970	mutex_unlock(&chip->als_mutex);
    971	return ret;
    972}
    973
    974static int tsl2591_read_event_config(struct iio_dev *indio_dev,
    975				     const struct iio_chan_spec *chan,
    976				     enum iio_event_type type,
    977				     enum iio_event_direction dir)
    978{
    979	struct tsl2591_chip *chip = iio_priv(indio_dev);
    980
    981	return chip->events_enabled;
    982}
    983
    984static int tsl2591_write_event_config(struct iio_dev *indio_dev,
    985				      const struct iio_chan_spec *chan,
    986				      enum iio_event_type type,
    987				      enum iio_event_direction dir,
    988				      int state)
    989{
    990	struct tsl2591_chip *chip = iio_priv(indio_dev);
    991	struct i2c_client *client = chip->client;
    992
    993	if (state && !chip->events_enabled) {
    994		chip->events_enabled = true;
    995		pm_runtime_get_sync(&client->dev);
    996	} else if (!state && chip->events_enabled) {
    997		chip->events_enabled = false;
    998		pm_runtime_mark_last_busy(&client->dev);
    999		pm_runtime_put_autosuspend(&client->dev);
   1000	}
   1001
   1002	return 0;
   1003}
   1004
   1005static const struct iio_info tsl2591_info = {
   1006	.event_attrs = &tsl2591_event_attribute_group,
   1007	.read_raw = tsl2591_read_raw,
   1008	.write_raw = tsl2591_write_raw,
   1009	.read_avail = tsl2591_read_available,
   1010	.read_event_value = tsl2591_read_event_value,
   1011	.write_event_value = tsl2591_write_event_value,
   1012	.read_event_config = tsl2591_read_event_config,
   1013	.write_event_config = tsl2591_write_event_config,
   1014};
   1015
   1016static const struct iio_info tsl2591_info_no_irq = {
   1017	.read_raw = tsl2591_read_raw,
   1018	.write_raw = tsl2591_write_raw,
   1019	.read_avail = tsl2591_read_available,
   1020};
   1021
   1022static int __maybe_unused tsl2591_suspend(struct device *dev)
   1023{
   1024	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1025	struct tsl2591_chip *chip = iio_priv(indio_dev);
   1026	int ret;
   1027
   1028	mutex_lock(&chip->als_mutex);
   1029	ret = tsl2591_set_power_state(chip, TSL2591_PWR_OFF);
   1030	mutex_unlock(&chip->als_mutex);
   1031
   1032	return ret;
   1033}
   1034
   1035static int __maybe_unused tsl2591_resume(struct device *dev)
   1036{
   1037	int power_state = TSL2591_PWR_ON | TSL2591_ENABLE_ALS;
   1038	struct iio_dev *indio_dev = dev_get_drvdata(dev);
   1039	struct tsl2591_chip *chip = iio_priv(indio_dev);
   1040	int ret;
   1041
   1042	if (chip->events_enabled)
   1043		power_state |= TSL2591_ENABLE_ALS_INT;
   1044
   1045	mutex_lock(&chip->als_mutex);
   1046	ret = tsl2591_set_power_state(chip, power_state);
   1047	mutex_unlock(&chip->als_mutex);
   1048
   1049	return ret;
   1050}
   1051
   1052static const struct dev_pm_ops tsl2591_pm_ops = {
   1053	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
   1054	SET_RUNTIME_PM_OPS(tsl2591_suspend, tsl2591_resume, NULL)
   1055};
   1056
   1057static irqreturn_t tsl2591_event_handler(int irq, void *private)
   1058{
   1059	struct iio_dev *dev_info = private;
   1060	struct tsl2591_chip *chip = iio_priv(dev_info);
   1061	struct i2c_client *client = chip->client;
   1062
   1063	if (!chip->events_enabled)
   1064		return IRQ_NONE;
   1065
   1066	iio_push_event(dev_info,
   1067		       IIO_UNMOD_EVENT_CODE(IIO_LIGHT, 0,
   1068					    IIO_EV_TYPE_THRESH,
   1069					    IIO_EV_DIR_EITHER),
   1070					    iio_get_time_ns(dev_info));
   1071
   1072	/* Clear ALS irq */
   1073	i2c_smbus_write_byte(client, TSL2591_CMD_SF_CALS_NPI);
   1074
   1075	return IRQ_HANDLED;
   1076}
   1077
   1078static int tsl2591_load_defaults(struct tsl2591_chip *chip)
   1079{
   1080	int ret;
   1081
   1082	chip->als_settings.als_int_time = TSL2591_DEFAULT_ALS_INT_TIME;
   1083	chip->als_settings.als_gain = TSL2591_DEFAULT_ALS_GAIN;
   1084	chip->als_settings.als_lower_thresh = TSL2591_DEFAULT_ALS_LOWER_THRESH;
   1085	chip->als_settings.als_upper_thresh = TSL2591_DEFAULT_ALS_UPPER_THRESH;
   1086
   1087	ret = tsl2591_set_als_gain_int_time(chip);
   1088	if (ret < 0)
   1089		return ret;
   1090
   1091	ret = tsl2591_set_als_persist_cycle(chip, TSL2591_DEFAULT_ALS_PERSIST);
   1092	if (ret < 0)
   1093		return ret;
   1094
   1095	ret = tsl2591_set_als_lower_threshold(chip, TSL2591_DEFAULT_ALS_LOWER_THRESH);
   1096	if (ret < 0)
   1097		return ret;
   1098
   1099	ret = tsl2591_set_als_upper_threshold(chip, TSL2591_DEFAULT_ALS_UPPER_THRESH);
   1100	if (ret < 0)
   1101		return ret;
   1102
   1103	return 0;
   1104}
   1105
   1106static void tsl2591_chip_off(void *data)
   1107{
   1108	struct iio_dev *indio_dev = data;
   1109	struct tsl2591_chip *chip = iio_priv(indio_dev);
   1110	struct i2c_client *client = chip->client;
   1111
   1112	pm_runtime_disable(&client->dev);
   1113	pm_runtime_set_suspended(&client->dev);
   1114	pm_runtime_put_noidle(&client->dev);
   1115
   1116	tsl2591_set_power_state(chip, TSL2591_PWR_OFF);
   1117}
   1118
   1119static int tsl2591_probe(struct i2c_client *client)
   1120{
   1121	struct tsl2591_chip *chip;
   1122	struct iio_dev *indio_dev;
   1123	int ret;
   1124
   1125	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
   1126		dev_err(&client->dev,
   1127			"I2C smbus byte data functionality is not supported\n");
   1128		return -EOPNOTSUPP;
   1129	}
   1130
   1131	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
   1132	if (!indio_dev)
   1133		return -ENOMEM;
   1134
   1135	chip = iio_priv(indio_dev);
   1136	chip->client = client;
   1137	i2c_set_clientdata(client, indio_dev);
   1138
   1139	if (client->irq) {
   1140		ret = devm_request_threaded_irq(&client->dev, client->irq,
   1141						NULL, tsl2591_event_handler,
   1142						IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
   1143						"tsl2591_irq", indio_dev);
   1144		if (ret) {
   1145			dev_err_probe(&client->dev, ret, "IRQ request error\n");
   1146			return -EINVAL;
   1147		}
   1148		indio_dev->info = &tsl2591_info;
   1149	} else {
   1150		indio_dev->info = &tsl2591_info_no_irq;
   1151	}
   1152
   1153	mutex_init(&chip->als_mutex);
   1154
   1155	ret = i2c_smbus_read_byte_data(client,
   1156				       TSL2591_CMD_NOP | TSL2591_DEVICE_ID);
   1157	if (ret < 0) {
   1158		dev_err(&client->dev,
   1159			"Failed to read the device ID register\n");
   1160		return ret;
   1161	}
   1162	ret = FIELD_GET(TSL2591_DEVICE_ID_MASK, ret);
   1163	if (ret != TSL2591_DEVICE_ID_VAL) {
   1164		dev_err(&client->dev, "Device ID: %#04x unknown\n", ret);
   1165		return -EINVAL;
   1166	}
   1167
   1168	indio_dev->channels = tsl2591_channels;
   1169	indio_dev->num_channels = ARRAY_SIZE(tsl2591_channels);
   1170	indio_dev->modes = INDIO_DIRECT_MODE;
   1171	indio_dev->name = chip->client->name;
   1172	chip->events_enabled = false;
   1173
   1174	pm_runtime_enable(&client->dev);
   1175	pm_runtime_set_autosuspend_delay(&client->dev,
   1176					 TSL2591_POWER_OFF_DELAY_MS);
   1177	pm_runtime_use_autosuspend(&client->dev);
   1178
   1179	/*
   1180	 * Add chip off to automatically managed path and disable runtime
   1181	 * power management. This ensures that the chip power management
   1182	 * is handled correctly on driver remove. tsl2591_chip_off() must be
   1183	 * added to the managed path after pm runtime is enabled and before
   1184	 * any error exit paths are met to ensure we're not left in a state
   1185	 * of pm runtime not being disabled properly.
   1186	 */
   1187	ret = devm_add_action_or_reset(&client->dev, tsl2591_chip_off,
   1188				       indio_dev);
   1189	if (ret < 0)
   1190		return -EINVAL;
   1191
   1192	ret = tsl2591_load_defaults(chip);
   1193	if (ret < 0) {
   1194		dev_err(&client->dev, "Failed to load sensor defaults\n");
   1195		return -EINVAL;
   1196	}
   1197
   1198	ret = i2c_smbus_write_byte(client, TSL2591_CMD_SF_CALS_NPI);
   1199	if (ret < 0) {
   1200		dev_err(&client->dev, "Failed to clear als irq\n");
   1201		return -EINVAL;
   1202	}
   1203
   1204	return devm_iio_device_register(&client->dev, indio_dev);
   1205}
   1206
   1207static const struct of_device_id tsl2591_of_match[] = {
   1208	{ .compatible = "amstaos,tsl2591"},
   1209	{}
   1210};
   1211MODULE_DEVICE_TABLE(of, tsl2591_of_match);
   1212
   1213static struct i2c_driver tsl2591_driver = {
   1214	.driver = {
   1215		.name = "tsl2591",
   1216		.pm = &tsl2591_pm_ops,
   1217		.of_match_table = tsl2591_of_match,
   1218	},
   1219	.probe_new = tsl2591_probe
   1220};
   1221module_i2c_driver(tsl2591_driver);
   1222
   1223MODULE_AUTHOR("Joe Sandom <joe.g.sandom@gmail.com>");
   1224MODULE_DESCRIPTION("TAOS tsl2591 ambient light sensor driver");
   1225MODULE_LICENSE("GPL");