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