1*3b1cae7cSLars-Peter Clausen /* 2*3b1cae7cSLars-Peter Clausen * AD7291 8-Channel, I2C, 12-Bit SAR ADC with Temperature Sensor 3*3b1cae7cSLars-Peter Clausen * 4*3b1cae7cSLars-Peter Clausen * Copyright 2010-2011 Analog Devices Inc. 5*3b1cae7cSLars-Peter Clausen * 6*3b1cae7cSLars-Peter Clausen * Licensed under the GPL-2 or later. 7*3b1cae7cSLars-Peter Clausen */ 8*3b1cae7cSLars-Peter Clausen 9*3b1cae7cSLars-Peter Clausen #include <linux/device.h> 10*3b1cae7cSLars-Peter Clausen #include <linux/err.h> 11*3b1cae7cSLars-Peter Clausen #include <linux/i2c.h> 12*3b1cae7cSLars-Peter Clausen #include <linux/interrupt.h> 13*3b1cae7cSLars-Peter Clausen #include <linux/kernel.h> 14*3b1cae7cSLars-Peter Clausen #include <linux/module.h> 15*3b1cae7cSLars-Peter Clausen #include <linux/mutex.h> 16*3b1cae7cSLars-Peter Clausen #include <linux/regulator/consumer.h> 17*3b1cae7cSLars-Peter Clausen #include <linux/slab.h> 18*3b1cae7cSLars-Peter Clausen #include <linux/sysfs.h> 19*3b1cae7cSLars-Peter Clausen 20*3b1cae7cSLars-Peter Clausen #include <linux/iio/iio.h> 21*3b1cae7cSLars-Peter Clausen #include <linux/iio/sysfs.h> 22*3b1cae7cSLars-Peter Clausen #include <linux/iio/events.h> 23*3b1cae7cSLars-Peter Clausen 24*3b1cae7cSLars-Peter Clausen #include <linux/platform_data/ad7291.h> 25*3b1cae7cSLars-Peter Clausen 26*3b1cae7cSLars-Peter Clausen /* 27*3b1cae7cSLars-Peter Clausen * Simplified handling 28*3b1cae7cSLars-Peter Clausen * 29*3b1cae7cSLars-Peter Clausen * If no events enabled - single polled channel read 30*3b1cae7cSLars-Peter Clausen * If event enabled direct reads disable unless channel 31*3b1cae7cSLars-Peter Clausen * is in the read mask. 32*3b1cae7cSLars-Peter Clausen * 33*3b1cae7cSLars-Peter Clausen * The noise-delayed bit as per datasheet suggestion is always enabled. 34*3b1cae7cSLars-Peter Clausen */ 35*3b1cae7cSLars-Peter Clausen 36*3b1cae7cSLars-Peter Clausen /* 37*3b1cae7cSLars-Peter Clausen * AD7291 registers definition 38*3b1cae7cSLars-Peter Clausen */ 39*3b1cae7cSLars-Peter Clausen #define AD7291_COMMAND 0x00 40*3b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE 0x01 41*3b1cae7cSLars-Peter Clausen #define AD7291_T_SENSE 0x02 42*3b1cae7cSLars-Peter Clausen #define AD7291_T_AVERAGE 0x03 43*3b1cae7cSLars-Peter Clausen #define AD7291_DATA_HIGH(x) ((x) * 3 + 0x4) 44*3b1cae7cSLars-Peter Clausen #define AD7291_DATA_LOW(x) ((x) * 3 + 0x5) 45*3b1cae7cSLars-Peter Clausen #define AD7291_HYST(x) ((x) * 3 + 0x6) 46*3b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_ALERT_STATUS 0x1F 47*3b1cae7cSLars-Peter Clausen #define AD7291_T_ALERT_STATUS 0x20 48*3b1cae7cSLars-Peter Clausen 49*3b1cae7cSLars-Peter Clausen #define AD7291_BITS 12 50*3b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_LIMIT_COUNT 8 51*3b1cae7cSLars-Peter Clausen 52*3b1cae7cSLars-Peter Clausen 53*3b1cae7cSLars-Peter Clausen /* 54*3b1cae7cSLars-Peter Clausen * AD7291 command 55*3b1cae7cSLars-Peter Clausen */ 56*3b1cae7cSLars-Peter Clausen #define AD7291_AUTOCYCLE BIT(0) 57*3b1cae7cSLars-Peter Clausen #define AD7291_RESET BIT(1) 58*3b1cae7cSLars-Peter Clausen #define AD7291_ALERT_CLEAR BIT(2) 59*3b1cae7cSLars-Peter Clausen #define AD7291_ALERT_POLARITY BIT(3) 60*3b1cae7cSLars-Peter Clausen #define AD7291_EXT_REF BIT(4) 61*3b1cae7cSLars-Peter Clausen #define AD7291_NOISE_DELAY BIT(5) 62*3b1cae7cSLars-Peter Clausen #define AD7291_T_SENSE_MASK BIT(7) 63*3b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_MASK GENMASK(15, 8) 64*3b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_OFFSET 8 65*3b1cae7cSLars-Peter Clausen 66*3b1cae7cSLars-Peter Clausen /* 67*3b1cae7cSLars-Peter Clausen * AD7291 value masks 68*3b1cae7cSLars-Peter Clausen */ 69*3b1cae7cSLars-Peter Clausen #define AD7291_VALUE_MASK GENMASK(11, 0) 70*3b1cae7cSLars-Peter Clausen 71*3b1cae7cSLars-Peter Clausen /* 72*3b1cae7cSLars-Peter Clausen * AD7291 alert register bits 73*3b1cae7cSLars-Peter Clausen */ 74*3b1cae7cSLars-Peter Clausen #define AD7291_T_LOW BIT(0) 75*3b1cae7cSLars-Peter Clausen #define AD7291_T_HIGH BIT(1) 76*3b1cae7cSLars-Peter Clausen #define AD7291_T_AVG_LOW BIT(2) 77*3b1cae7cSLars-Peter Clausen #define AD7291_T_AVG_HIGH BIT(3) 78*3b1cae7cSLars-Peter Clausen #define AD7291_V_LOW(x) BIT((x) * 2) 79*3b1cae7cSLars-Peter Clausen #define AD7291_V_HIGH(x) BIT((x) * 2 + 1) 80*3b1cae7cSLars-Peter Clausen 81*3b1cae7cSLars-Peter Clausen 82*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info { 83*3b1cae7cSLars-Peter Clausen struct i2c_client *client; 84*3b1cae7cSLars-Peter Clausen struct regulator *reg; 85*3b1cae7cSLars-Peter Clausen u16 command; 86*3b1cae7cSLars-Peter Clausen u16 c_mask; /* Active voltage channels for events */ 87*3b1cae7cSLars-Peter Clausen struct mutex state_lock; 88*3b1cae7cSLars-Peter Clausen }; 89*3b1cae7cSLars-Peter Clausen 90*3b1cae7cSLars-Peter Clausen static int ad7291_i2c_read(struct ad7291_chip_info *chip, u8 reg, u16 *data) 91*3b1cae7cSLars-Peter Clausen { 92*3b1cae7cSLars-Peter Clausen struct i2c_client *client = chip->client; 93*3b1cae7cSLars-Peter Clausen int ret = 0; 94*3b1cae7cSLars-Peter Clausen 95*3b1cae7cSLars-Peter Clausen ret = i2c_smbus_read_word_swapped(client, reg); 96*3b1cae7cSLars-Peter Clausen if (ret < 0) { 97*3b1cae7cSLars-Peter Clausen dev_err(&client->dev, "I2C read error\n"); 98*3b1cae7cSLars-Peter Clausen return ret; 99*3b1cae7cSLars-Peter Clausen } 100*3b1cae7cSLars-Peter Clausen 101*3b1cae7cSLars-Peter Clausen *data = ret; 102*3b1cae7cSLars-Peter Clausen 103*3b1cae7cSLars-Peter Clausen return 0; 104*3b1cae7cSLars-Peter Clausen } 105*3b1cae7cSLars-Peter Clausen 106*3b1cae7cSLars-Peter Clausen static int ad7291_i2c_write(struct ad7291_chip_info *chip, u8 reg, u16 data) 107*3b1cae7cSLars-Peter Clausen { 108*3b1cae7cSLars-Peter Clausen return i2c_smbus_write_word_swapped(chip->client, reg, data); 109*3b1cae7cSLars-Peter Clausen } 110*3b1cae7cSLars-Peter Clausen 111*3b1cae7cSLars-Peter Clausen static irqreturn_t ad7291_event_handler(int irq, void *private) 112*3b1cae7cSLars-Peter Clausen { 113*3b1cae7cSLars-Peter Clausen struct iio_dev *indio_dev = private; 114*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip = iio_priv(private); 115*3b1cae7cSLars-Peter Clausen u16 t_status, v_status; 116*3b1cae7cSLars-Peter Clausen u16 command; 117*3b1cae7cSLars-Peter Clausen int i; 118*3b1cae7cSLars-Peter Clausen s64 timestamp = iio_get_time_ns(); 119*3b1cae7cSLars-Peter Clausen 120*3b1cae7cSLars-Peter Clausen if (ad7291_i2c_read(chip, AD7291_T_ALERT_STATUS, &t_status)) 121*3b1cae7cSLars-Peter Clausen return IRQ_HANDLED; 122*3b1cae7cSLars-Peter Clausen 123*3b1cae7cSLars-Peter Clausen if (ad7291_i2c_read(chip, AD7291_VOLTAGE_ALERT_STATUS, &v_status)) 124*3b1cae7cSLars-Peter Clausen return IRQ_HANDLED; 125*3b1cae7cSLars-Peter Clausen 126*3b1cae7cSLars-Peter Clausen if (!(t_status || v_status)) 127*3b1cae7cSLars-Peter Clausen return IRQ_HANDLED; 128*3b1cae7cSLars-Peter Clausen 129*3b1cae7cSLars-Peter Clausen command = chip->command | AD7291_ALERT_CLEAR; 130*3b1cae7cSLars-Peter Clausen ad7291_i2c_write(chip, AD7291_COMMAND, command); 131*3b1cae7cSLars-Peter Clausen 132*3b1cae7cSLars-Peter Clausen command = chip->command & ~AD7291_ALERT_CLEAR; 133*3b1cae7cSLars-Peter Clausen ad7291_i2c_write(chip, AD7291_COMMAND, command); 134*3b1cae7cSLars-Peter Clausen 135*3b1cae7cSLars-Peter Clausen /* For now treat t_sense and t_sense_average the same */ 136*3b1cae7cSLars-Peter Clausen if ((t_status & AD7291_T_LOW) || (t_status & AD7291_T_AVG_LOW)) 137*3b1cae7cSLars-Peter Clausen iio_push_event(indio_dev, 138*3b1cae7cSLars-Peter Clausen IIO_UNMOD_EVENT_CODE(IIO_TEMP, 139*3b1cae7cSLars-Peter Clausen 0, 140*3b1cae7cSLars-Peter Clausen IIO_EV_TYPE_THRESH, 141*3b1cae7cSLars-Peter Clausen IIO_EV_DIR_FALLING), 142*3b1cae7cSLars-Peter Clausen timestamp); 143*3b1cae7cSLars-Peter Clausen if ((t_status & AD7291_T_HIGH) || (t_status & AD7291_T_AVG_HIGH)) 144*3b1cae7cSLars-Peter Clausen iio_push_event(indio_dev, 145*3b1cae7cSLars-Peter Clausen IIO_UNMOD_EVENT_CODE(IIO_TEMP, 146*3b1cae7cSLars-Peter Clausen 0, 147*3b1cae7cSLars-Peter Clausen IIO_EV_TYPE_THRESH, 148*3b1cae7cSLars-Peter Clausen IIO_EV_DIR_RISING), 149*3b1cae7cSLars-Peter Clausen timestamp); 150*3b1cae7cSLars-Peter Clausen 151*3b1cae7cSLars-Peter Clausen for (i = 0; i < AD7291_VOLTAGE_LIMIT_COUNT; i++) { 152*3b1cae7cSLars-Peter Clausen if (v_status & AD7291_V_LOW(i)) 153*3b1cae7cSLars-Peter Clausen iio_push_event(indio_dev, 154*3b1cae7cSLars-Peter Clausen IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 155*3b1cae7cSLars-Peter Clausen i, 156*3b1cae7cSLars-Peter Clausen IIO_EV_TYPE_THRESH, 157*3b1cae7cSLars-Peter Clausen IIO_EV_DIR_FALLING), 158*3b1cae7cSLars-Peter Clausen timestamp); 159*3b1cae7cSLars-Peter Clausen if (v_status & AD7291_V_HIGH(i)) 160*3b1cae7cSLars-Peter Clausen iio_push_event(indio_dev, 161*3b1cae7cSLars-Peter Clausen IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 162*3b1cae7cSLars-Peter Clausen i, 163*3b1cae7cSLars-Peter Clausen IIO_EV_TYPE_THRESH, 164*3b1cae7cSLars-Peter Clausen IIO_EV_DIR_RISING), 165*3b1cae7cSLars-Peter Clausen timestamp); 166*3b1cae7cSLars-Peter Clausen } 167*3b1cae7cSLars-Peter Clausen 168*3b1cae7cSLars-Peter Clausen return IRQ_HANDLED; 169*3b1cae7cSLars-Peter Clausen } 170*3b1cae7cSLars-Peter Clausen 171*3b1cae7cSLars-Peter Clausen static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, 172*3b1cae7cSLars-Peter Clausen enum iio_event_direction dir, 173*3b1cae7cSLars-Peter Clausen enum iio_event_info info) 174*3b1cae7cSLars-Peter Clausen { 175*3b1cae7cSLars-Peter Clausen unsigned int offset; 176*3b1cae7cSLars-Peter Clausen 177*3b1cae7cSLars-Peter Clausen switch (chan->type) { 178*3b1cae7cSLars-Peter Clausen case IIO_VOLTAGE: 179*3b1cae7cSLars-Peter Clausen offset = chan->channel; 180*3b1cae7cSLars-Peter Clausen break; 181*3b1cae7cSLars-Peter Clausen case IIO_TEMP: 182*3b1cae7cSLars-Peter Clausen offset = AD7291_VOLTAGE_OFFSET; 183*3b1cae7cSLars-Peter Clausen break; 184*3b1cae7cSLars-Peter Clausen default: 185*3b1cae7cSLars-Peter Clausen return 0; 186*3b1cae7cSLars-Peter Clausen } 187*3b1cae7cSLars-Peter Clausen 188*3b1cae7cSLars-Peter Clausen switch (info) { 189*3b1cae7cSLars-Peter Clausen case IIO_EV_INFO_VALUE: 190*3b1cae7cSLars-Peter Clausen if (dir == IIO_EV_DIR_FALLING) 191*3b1cae7cSLars-Peter Clausen return AD7291_DATA_HIGH(offset); 192*3b1cae7cSLars-Peter Clausen else 193*3b1cae7cSLars-Peter Clausen return AD7291_DATA_LOW(offset); 194*3b1cae7cSLars-Peter Clausen case IIO_EV_INFO_HYSTERESIS: 195*3b1cae7cSLars-Peter Clausen return AD7291_HYST(offset); 196*3b1cae7cSLars-Peter Clausen default: 197*3b1cae7cSLars-Peter Clausen break; 198*3b1cae7cSLars-Peter Clausen } 199*3b1cae7cSLars-Peter Clausen return 0; 200*3b1cae7cSLars-Peter Clausen } 201*3b1cae7cSLars-Peter Clausen 202*3b1cae7cSLars-Peter Clausen static int ad7291_read_event_value(struct iio_dev *indio_dev, 203*3b1cae7cSLars-Peter Clausen const struct iio_chan_spec *chan, 204*3b1cae7cSLars-Peter Clausen enum iio_event_type type, 205*3b1cae7cSLars-Peter Clausen enum iio_event_direction dir, 206*3b1cae7cSLars-Peter Clausen enum iio_event_info info, 207*3b1cae7cSLars-Peter Clausen int *val, int *val2) 208*3b1cae7cSLars-Peter Clausen { 209*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip = iio_priv(indio_dev); 210*3b1cae7cSLars-Peter Clausen int ret; 211*3b1cae7cSLars-Peter Clausen u16 uval; 212*3b1cae7cSLars-Peter Clausen 213*3b1cae7cSLars-Peter Clausen ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir, info), 214*3b1cae7cSLars-Peter Clausen &uval); 215*3b1cae7cSLars-Peter Clausen if (ret < 0) 216*3b1cae7cSLars-Peter Clausen return ret; 217*3b1cae7cSLars-Peter Clausen 218*3b1cae7cSLars-Peter Clausen if (info == IIO_EV_INFO_HYSTERESIS || chan->type == IIO_VOLTAGE) 219*3b1cae7cSLars-Peter Clausen *val = uval & AD7291_VALUE_MASK; 220*3b1cae7cSLars-Peter Clausen 221*3b1cae7cSLars-Peter Clausen else 222*3b1cae7cSLars-Peter Clausen *val = sign_extend32(uval, 11); 223*3b1cae7cSLars-Peter Clausen 224*3b1cae7cSLars-Peter Clausen return IIO_VAL_INT; 225*3b1cae7cSLars-Peter Clausen } 226*3b1cae7cSLars-Peter Clausen 227*3b1cae7cSLars-Peter Clausen static int ad7291_write_event_value(struct iio_dev *indio_dev, 228*3b1cae7cSLars-Peter Clausen const struct iio_chan_spec *chan, 229*3b1cae7cSLars-Peter Clausen enum iio_event_type type, 230*3b1cae7cSLars-Peter Clausen enum iio_event_direction dir, 231*3b1cae7cSLars-Peter Clausen enum iio_event_info info, 232*3b1cae7cSLars-Peter Clausen int val, int val2) 233*3b1cae7cSLars-Peter Clausen { 234*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip = iio_priv(indio_dev); 235*3b1cae7cSLars-Peter Clausen 236*3b1cae7cSLars-Peter Clausen if (info == IIO_EV_INFO_HYSTERESIS || chan->type == IIO_VOLTAGE) { 237*3b1cae7cSLars-Peter Clausen if (val > AD7291_VALUE_MASK || val < 0) 238*3b1cae7cSLars-Peter Clausen return -EINVAL; 239*3b1cae7cSLars-Peter Clausen } else { 240*3b1cae7cSLars-Peter Clausen if (val > 2047 || val < -2048) 241*3b1cae7cSLars-Peter Clausen return -EINVAL; 242*3b1cae7cSLars-Peter Clausen } 243*3b1cae7cSLars-Peter Clausen 244*3b1cae7cSLars-Peter Clausen return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir, info), 245*3b1cae7cSLars-Peter Clausen val); 246*3b1cae7cSLars-Peter Clausen } 247*3b1cae7cSLars-Peter Clausen 248*3b1cae7cSLars-Peter Clausen static int ad7291_read_event_config(struct iio_dev *indio_dev, 249*3b1cae7cSLars-Peter Clausen const struct iio_chan_spec *chan, 250*3b1cae7cSLars-Peter Clausen enum iio_event_type type, 251*3b1cae7cSLars-Peter Clausen enum iio_event_direction dir) 252*3b1cae7cSLars-Peter Clausen { 253*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip = iio_priv(indio_dev); 254*3b1cae7cSLars-Peter Clausen /* 255*3b1cae7cSLars-Peter Clausen * To be enabled the channel must simply be on. If any are enabled 256*3b1cae7cSLars-Peter Clausen * we are in continuous sampling mode 257*3b1cae7cSLars-Peter Clausen */ 258*3b1cae7cSLars-Peter Clausen 259*3b1cae7cSLars-Peter Clausen switch (chan->type) { 260*3b1cae7cSLars-Peter Clausen case IIO_VOLTAGE: 261*3b1cae7cSLars-Peter Clausen return !!(chip->c_mask & BIT(15 - chan->channel)); 262*3b1cae7cSLars-Peter Clausen case IIO_TEMP: 263*3b1cae7cSLars-Peter Clausen /* always on */ 264*3b1cae7cSLars-Peter Clausen return 1; 265*3b1cae7cSLars-Peter Clausen default: 266*3b1cae7cSLars-Peter Clausen return -EINVAL; 267*3b1cae7cSLars-Peter Clausen } 268*3b1cae7cSLars-Peter Clausen 269*3b1cae7cSLars-Peter Clausen } 270*3b1cae7cSLars-Peter Clausen 271*3b1cae7cSLars-Peter Clausen static int ad7291_write_event_config(struct iio_dev *indio_dev, 272*3b1cae7cSLars-Peter Clausen const struct iio_chan_spec *chan, 273*3b1cae7cSLars-Peter Clausen enum iio_event_type type, 274*3b1cae7cSLars-Peter Clausen enum iio_event_direction dir, 275*3b1cae7cSLars-Peter Clausen int state) 276*3b1cae7cSLars-Peter Clausen { 277*3b1cae7cSLars-Peter Clausen int ret = 0; 278*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip = iio_priv(indio_dev); 279*3b1cae7cSLars-Peter Clausen unsigned int mask; 280*3b1cae7cSLars-Peter Clausen u16 regval; 281*3b1cae7cSLars-Peter Clausen 282*3b1cae7cSLars-Peter Clausen mutex_lock(&chip->state_lock); 283*3b1cae7cSLars-Peter Clausen regval = chip->command; 284*3b1cae7cSLars-Peter Clausen /* 285*3b1cae7cSLars-Peter Clausen * To be enabled the channel must simply be on. If any are enabled 286*3b1cae7cSLars-Peter Clausen * use continuous sampling mode. 287*3b1cae7cSLars-Peter Clausen * Possible to disable temp as well but that makes single read tricky. 288*3b1cae7cSLars-Peter Clausen */ 289*3b1cae7cSLars-Peter Clausen 290*3b1cae7cSLars-Peter Clausen mask = BIT(15 - chan->channel); 291*3b1cae7cSLars-Peter Clausen 292*3b1cae7cSLars-Peter Clausen switch (chan->type) { 293*3b1cae7cSLars-Peter Clausen case IIO_VOLTAGE: 294*3b1cae7cSLars-Peter Clausen if ((!state) && (chip->c_mask & mask)) 295*3b1cae7cSLars-Peter Clausen chip->c_mask &= ~mask; 296*3b1cae7cSLars-Peter Clausen else if (state && (!(chip->c_mask & mask))) 297*3b1cae7cSLars-Peter Clausen chip->c_mask |= mask; 298*3b1cae7cSLars-Peter Clausen else 299*3b1cae7cSLars-Peter Clausen break; 300*3b1cae7cSLars-Peter Clausen 301*3b1cae7cSLars-Peter Clausen regval &= ~AD7291_AUTOCYCLE; 302*3b1cae7cSLars-Peter Clausen regval |= chip->c_mask; 303*3b1cae7cSLars-Peter Clausen if (chip->c_mask) /* Enable autocycle? */ 304*3b1cae7cSLars-Peter Clausen regval |= AD7291_AUTOCYCLE; 305*3b1cae7cSLars-Peter Clausen 306*3b1cae7cSLars-Peter Clausen ret = ad7291_i2c_write(chip, AD7291_COMMAND, regval); 307*3b1cae7cSLars-Peter Clausen if (ret < 0) 308*3b1cae7cSLars-Peter Clausen goto error_ret; 309*3b1cae7cSLars-Peter Clausen 310*3b1cae7cSLars-Peter Clausen chip->command = regval; 311*3b1cae7cSLars-Peter Clausen break; 312*3b1cae7cSLars-Peter Clausen default: 313*3b1cae7cSLars-Peter Clausen ret = -EINVAL; 314*3b1cae7cSLars-Peter Clausen } 315*3b1cae7cSLars-Peter Clausen 316*3b1cae7cSLars-Peter Clausen error_ret: 317*3b1cae7cSLars-Peter Clausen mutex_unlock(&chip->state_lock); 318*3b1cae7cSLars-Peter Clausen return ret; 319*3b1cae7cSLars-Peter Clausen } 320*3b1cae7cSLars-Peter Clausen 321*3b1cae7cSLars-Peter Clausen static int ad7291_read_raw(struct iio_dev *indio_dev, 322*3b1cae7cSLars-Peter Clausen struct iio_chan_spec const *chan, 323*3b1cae7cSLars-Peter Clausen int *val, 324*3b1cae7cSLars-Peter Clausen int *val2, 325*3b1cae7cSLars-Peter Clausen long mask) 326*3b1cae7cSLars-Peter Clausen { 327*3b1cae7cSLars-Peter Clausen int ret; 328*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip = iio_priv(indio_dev); 329*3b1cae7cSLars-Peter Clausen u16 regval; 330*3b1cae7cSLars-Peter Clausen 331*3b1cae7cSLars-Peter Clausen switch (mask) { 332*3b1cae7cSLars-Peter Clausen case IIO_CHAN_INFO_RAW: 333*3b1cae7cSLars-Peter Clausen switch (chan->type) { 334*3b1cae7cSLars-Peter Clausen case IIO_VOLTAGE: 335*3b1cae7cSLars-Peter Clausen mutex_lock(&chip->state_lock); 336*3b1cae7cSLars-Peter Clausen /* If in autocycle mode drop through */ 337*3b1cae7cSLars-Peter Clausen if (chip->command & AD7291_AUTOCYCLE) { 338*3b1cae7cSLars-Peter Clausen mutex_unlock(&chip->state_lock); 339*3b1cae7cSLars-Peter Clausen return -EBUSY; 340*3b1cae7cSLars-Peter Clausen } 341*3b1cae7cSLars-Peter Clausen /* Enable this channel alone */ 342*3b1cae7cSLars-Peter Clausen regval = chip->command & (~AD7291_VOLTAGE_MASK); 343*3b1cae7cSLars-Peter Clausen regval |= BIT(15 - chan->channel); 344*3b1cae7cSLars-Peter Clausen ret = ad7291_i2c_write(chip, AD7291_COMMAND, regval); 345*3b1cae7cSLars-Peter Clausen if (ret < 0) { 346*3b1cae7cSLars-Peter Clausen mutex_unlock(&chip->state_lock); 347*3b1cae7cSLars-Peter Clausen return ret; 348*3b1cae7cSLars-Peter Clausen } 349*3b1cae7cSLars-Peter Clausen /* Read voltage */ 350*3b1cae7cSLars-Peter Clausen ret = i2c_smbus_read_word_swapped(chip->client, 351*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE); 352*3b1cae7cSLars-Peter Clausen if (ret < 0) { 353*3b1cae7cSLars-Peter Clausen mutex_unlock(&chip->state_lock); 354*3b1cae7cSLars-Peter Clausen return ret; 355*3b1cae7cSLars-Peter Clausen } 356*3b1cae7cSLars-Peter Clausen *val = ret & AD7291_VALUE_MASK; 357*3b1cae7cSLars-Peter Clausen mutex_unlock(&chip->state_lock); 358*3b1cae7cSLars-Peter Clausen return IIO_VAL_INT; 359*3b1cae7cSLars-Peter Clausen case IIO_TEMP: 360*3b1cae7cSLars-Peter Clausen /* Assumes tsense bit of command register always set */ 361*3b1cae7cSLars-Peter Clausen ret = i2c_smbus_read_word_swapped(chip->client, 362*3b1cae7cSLars-Peter Clausen AD7291_T_SENSE); 363*3b1cae7cSLars-Peter Clausen if (ret < 0) 364*3b1cae7cSLars-Peter Clausen return ret; 365*3b1cae7cSLars-Peter Clausen *val = sign_extend32(ret, 11); 366*3b1cae7cSLars-Peter Clausen return IIO_VAL_INT; 367*3b1cae7cSLars-Peter Clausen default: 368*3b1cae7cSLars-Peter Clausen return -EINVAL; 369*3b1cae7cSLars-Peter Clausen } 370*3b1cae7cSLars-Peter Clausen case IIO_CHAN_INFO_AVERAGE_RAW: 371*3b1cae7cSLars-Peter Clausen ret = i2c_smbus_read_word_swapped(chip->client, 372*3b1cae7cSLars-Peter Clausen AD7291_T_AVERAGE); 373*3b1cae7cSLars-Peter Clausen if (ret < 0) 374*3b1cae7cSLars-Peter Clausen return ret; 375*3b1cae7cSLars-Peter Clausen *val = sign_extend32(ret, 11); 376*3b1cae7cSLars-Peter Clausen return IIO_VAL_INT; 377*3b1cae7cSLars-Peter Clausen case IIO_CHAN_INFO_SCALE: 378*3b1cae7cSLars-Peter Clausen switch (chan->type) { 379*3b1cae7cSLars-Peter Clausen case IIO_VOLTAGE: 380*3b1cae7cSLars-Peter Clausen if (chip->reg) { 381*3b1cae7cSLars-Peter Clausen int vref; 382*3b1cae7cSLars-Peter Clausen 383*3b1cae7cSLars-Peter Clausen vref = regulator_get_voltage(chip->reg); 384*3b1cae7cSLars-Peter Clausen if (vref < 0) 385*3b1cae7cSLars-Peter Clausen return vref; 386*3b1cae7cSLars-Peter Clausen *val = vref / 1000; 387*3b1cae7cSLars-Peter Clausen } else { 388*3b1cae7cSLars-Peter Clausen *val = 2500; 389*3b1cae7cSLars-Peter Clausen } 390*3b1cae7cSLars-Peter Clausen *val2 = AD7291_BITS; 391*3b1cae7cSLars-Peter Clausen return IIO_VAL_FRACTIONAL_LOG2; 392*3b1cae7cSLars-Peter Clausen case IIO_TEMP: 393*3b1cae7cSLars-Peter Clausen /* 394*3b1cae7cSLars-Peter Clausen * One LSB of the ADC corresponds to 0.25 deg C. 395*3b1cae7cSLars-Peter Clausen * The temperature reading is in 12-bit twos 396*3b1cae7cSLars-Peter Clausen * complement format 397*3b1cae7cSLars-Peter Clausen */ 398*3b1cae7cSLars-Peter Clausen *val = 250; 399*3b1cae7cSLars-Peter Clausen return IIO_VAL_INT; 400*3b1cae7cSLars-Peter Clausen default: 401*3b1cae7cSLars-Peter Clausen return -EINVAL; 402*3b1cae7cSLars-Peter Clausen } 403*3b1cae7cSLars-Peter Clausen default: 404*3b1cae7cSLars-Peter Clausen return -EINVAL; 405*3b1cae7cSLars-Peter Clausen } 406*3b1cae7cSLars-Peter Clausen } 407*3b1cae7cSLars-Peter Clausen 408*3b1cae7cSLars-Peter Clausen static const struct iio_event_spec ad7291_events[] = { 409*3b1cae7cSLars-Peter Clausen { 410*3b1cae7cSLars-Peter Clausen .type = IIO_EV_TYPE_THRESH, 411*3b1cae7cSLars-Peter Clausen .dir = IIO_EV_DIR_RISING, 412*3b1cae7cSLars-Peter Clausen .mask_separate = BIT(IIO_EV_INFO_VALUE) | 413*3b1cae7cSLars-Peter Clausen BIT(IIO_EV_INFO_ENABLE), 414*3b1cae7cSLars-Peter Clausen }, { 415*3b1cae7cSLars-Peter Clausen .type = IIO_EV_TYPE_THRESH, 416*3b1cae7cSLars-Peter Clausen .dir = IIO_EV_DIR_FALLING, 417*3b1cae7cSLars-Peter Clausen .mask_separate = BIT(IIO_EV_INFO_VALUE) | 418*3b1cae7cSLars-Peter Clausen BIT(IIO_EV_INFO_ENABLE), 419*3b1cae7cSLars-Peter Clausen }, { 420*3b1cae7cSLars-Peter Clausen .type = IIO_EV_TYPE_THRESH, 421*3b1cae7cSLars-Peter Clausen .dir = IIO_EV_DIR_EITHER, 422*3b1cae7cSLars-Peter Clausen .mask_separate = BIT(IIO_EV_INFO_HYSTERESIS), 423*3b1cae7cSLars-Peter Clausen }, 424*3b1cae7cSLars-Peter Clausen }; 425*3b1cae7cSLars-Peter Clausen 426*3b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_CHAN(_chan) \ 427*3b1cae7cSLars-Peter Clausen { \ 428*3b1cae7cSLars-Peter Clausen .type = IIO_VOLTAGE, \ 429*3b1cae7cSLars-Peter Clausen .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 430*3b1cae7cSLars-Peter Clausen .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 431*3b1cae7cSLars-Peter Clausen .indexed = 1, \ 432*3b1cae7cSLars-Peter Clausen .channel = _chan, \ 433*3b1cae7cSLars-Peter Clausen .event_spec = ad7291_events, \ 434*3b1cae7cSLars-Peter Clausen .num_event_specs = ARRAY_SIZE(ad7291_events), \ 435*3b1cae7cSLars-Peter Clausen } 436*3b1cae7cSLars-Peter Clausen 437*3b1cae7cSLars-Peter Clausen static const struct iio_chan_spec ad7291_channels[] = { 438*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(0), 439*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(1), 440*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(2), 441*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(3), 442*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(4), 443*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(5), 444*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(6), 445*3b1cae7cSLars-Peter Clausen AD7291_VOLTAGE_CHAN(7), 446*3b1cae7cSLars-Peter Clausen { 447*3b1cae7cSLars-Peter Clausen .type = IIO_TEMP, 448*3b1cae7cSLars-Peter Clausen .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 449*3b1cae7cSLars-Peter Clausen BIT(IIO_CHAN_INFO_AVERAGE_RAW) | 450*3b1cae7cSLars-Peter Clausen BIT(IIO_CHAN_INFO_SCALE), 451*3b1cae7cSLars-Peter Clausen .indexed = 1, 452*3b1cae7cSLars-Peter Clausen .channel = 0, 453*3b1cae7cSLars-Peter Clausen .event_spec = ad7291_events, 454*3b1cae7cSLars-Peter Clausen .num_event_specs = ARRAY_SIZE(ad7291_events), 455*3b1cae7cSLars-Peter Clausen } 456*3b1cae7cSLars-Peter Clausen }; 457*3b1cae7cSLars-Peter Clausen 458*3b1cae7cSLars-Peter Clausen static const struct iio_info ad7291_info = { 459*3b1cae7cSLars-Peter Clausen .read_raw = &ad7291_read_raw, 460*3b1cae7cSLars-Peter Clausen .read_event_config = &ad7291_read_event_config, 461*3b1cae7cSLars-Peter Clausen .write_event_config = &ad7291_write_event_config, 462*3b1cae7cSLars-Peter Clausen .read_event_value = &ad7291_read_event_value, 463*3b1cae7cSLars-Peter Clausen .write_event_value = &ad7291_write_event_value, 464*3b1cae7cSLars-Peter Clausen .driver_module = THIS_MODULE, 465*3b1cae7cSLars-Peter Clausen }; 466*3b1cae7cSLars-Peter Clausen 467*3b1cae7cSLars-Peter Clausen static int ad7291_probe(struct i2c_client *client, 468*3b1cae7cSLars-Peter Clausen const struct i2c_device_id *id) 469*3b1cae7cSLars-Peter Clausen { 470*3b1cae7cSLars-Peter Clausen struct ad7291_platform_data *pdata = client->dev.platform_data; 471*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip; 472*3b1cae7cSLars-Peter Clausen struct iio_dev *indio_dev; 473*3b1cae7cSLars-Peter Clausen int ret = 0; 474*3b1cae7cSLars-Peter Clausen 475*3b1cae7cSLars-Peter Clausen indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip)); 476*3b1cae7cSLars-Peter Clausen if (!indio_dev) 477*3b1cae7cSLars-Peter Clausen return -ENOMEM; 478*3b1cae7cSLars-Peter Clausen chip = iio_priv(indio_dev); 479*3b1cae7cSLars-Peter Clausen 480*3b1cae7cSLars-Peter Clausen if (pdata && pdata->use_external_ref) { 481*3b1cae7cSLars-Peter Clausen chip->reg = devm_regulator_get(&client->dev, "vref"); 482*3b1cae7cSLars-Peter Clausen if (IS_ERR(chip->reg)) 483*3b1cae7cSLars-Peter Clausen return ret; 484*3b1cae7cSLars-Peter Clausen 485*3b1cae7cSLars-Peter Clausen ret = regulator_enable(chip->reg); 486*3b1cae7cSLars-Peter Clausen if (ret) 487*3b1cae7cSLars-Peter Clausen return ret; 488*3b1cae7cSLars-Peter Clausen } 489*3b1cae7cSLars-Peter Clausen 490*3b1cae7cSLars-Peter Clausen mutex_init(&chip->state_lock); 491*3b1cae7cSLars-Peter Clausen /* this is only used for device removal purposes */ 492*3b1cae7cSLars-Peter Clausen i2c_set_clientdata(client, indio_dev); 493*3b1cae7cSLars-Peter Clausen 494*3b1cae7cSLars-Peter Clausen chip->client = client; 495*3b1cae7cSLars-Peter Clausen 496*3b1cae7cSLars-Peter Clausen chip->command = AD7291_NOISE_DELAY | 497*3b1cae7cSLars-Peter Clausen AD7291_T_SENSE_MASK | /* Tsense always enabled */ 498*3b1cae7cSLars-Peter Clausen AD7291_ALERT_POLARITY; /* set irq polarity low level */ 499*3b1cae7cSLars-Peter Clausen 500*3b1cae7cSLars-Peter Clausen if (pdata && pdata->use_external_ref) 501*3b1cae7cSLars-Peter Clausen chip->command |= AD7291_EXT_REF; 502*3b1cae7cSLars-Peter Clausen 503*3b1cae7cSLars-Peter Clausen indio_dev->name = id->name; 504*3b1cae7cSLars-Peter Clausen indio_dev->channels = ad7291_channels; 505*3b1cae7cSLars-Peter Clausen indio_dev->num_channels = ARRAY_SIZE(ad7291_channels); 506*3b1cae7cSLars-Peter Clausen 507*3b1cae7cSLars-Peter Clausen indio_dev->dev.parent = &client->dev; 508*3b1cae7cSLars-Peter Clausen indio_dev->info = &ad7291_info; 509*3b1cae7cSLars-Peter Clausen indio_dev->modes = INDIO_DIRECT_MODE; 510*3b1cae7cSLars-Peter Clausen 511*3b1cae7cSLars-Peter Clausen ret = ad7291_i2c_write(chip, AD7291_COMMAND, AD7291_RESET); 512*3b1cae7cSLars-Peter Clausen if (ret) { 513*3b1cae7cSLars-Peter Clausen ret = -EIO; 514*3b1cae7cSLars-Peter Clausen goto error_disable_reg; 515*3b1cae7cSLars-Peter Clausen } 516*3b1cae7cSLars-Peter Clausen 517*3b1cae7cSLars-Peter Clausen ret = ad7291_i2c_write(chip, AD7291_COMMAND, chip->command); 518*3b1cae7cSLars-Peter Clausen if (ret) { 519*3b1cae7cSLars-Peter Clausen ret = -EIO; 520*3b1cae7cSLars-Peter Clausen goto error_disable_reg; 521*3b1cae7cSLars-Peter Clausen } 522*3b1cae7cSLars-Peter Clausen 523*3b1cae7cSLars-Peter Clausen if (client->irq > 0) { 524*3b1cae7cSLars-Peter Clausen ret = request_threaded_irq(client->irq, 525*3b1cae7cSLars-Peter Clausen NULL, 526*3b1cae7cSLars-Peter Clausen &ad7291_event_handler, 527*3b1cae7cSLars-Peter Clausen IRQF_TRIGGER_LOW | IRQF_ONESHOT, 528*3b1cae7cSLars-Peter Clausen id->name, 529*3b1cae7cSLars-Peter Clausen indio_dev); 530*3b1cae7cSLars-Peter Clausen if (ret) 531*3b1cae7cSLars-Peter Clausen goto error_disable_reg; 532*3b1cae7cSLars-Peter Clausen } 533*3b1cae7cSLars-Peter Clausen 534*3b1cae7cSLars-Peter Clausen ret = iio_device_register(indio_dev); 535*3b1cae7cSLars-Peter Clausen if (ret) 536*3b1cae7cSLars-Peter Clausen goto error_unreg_irq; 537*3b1cae7cSLars-Peter Clausen 538*3b1cae7cSLars-Peter Clausen return 0; 539*3b1cae7cSLars-Peter Clausen 540*3b1cae7cSLars-Peter Clausen error_unreg_irq: 541*3b1cae7cSLars-Peter Clausen if (client->irq) 542*3b1cae7cSLars-Peter Clausen free_irq(client->irq, indio_dev); 543*3b1cae7cSLars-Peter Clausen error_disable_reg: 544*3b1cae7cSLars-Peter Clausen if (chip->reg) 545*3b1cae7cSLars-Peter Clausen regulator_disable(chip->reg); 546*3b1cae7cSLars-Peter Clausen 547*3b1cae7cSLars-Peter Clausen return ret; 548*3b1cae7cSLars-Peter Clausen } 549*3b1cae7cSLars-Peter Clausen 550*3b1cae7cSLars-Peter Clausen static int ad7291_remove(struct i2c_client *client) 551*3b1cae7cSLars-Peter Clausen { 552*3b1cae7cSLars-Peter Clausen struct iio_dev *indio_dev = i2c_get_clientdata(client); 553*3b1cae7cSLars-Peter Clausen struct ad7291_chip_info *chip = iio_priv(indio_dev); 554*3b1cae7cSLars-Peter Clausen 555*3b1cae7cSLars-Peter Clausen iio_device_unregister(indio_dev); 556*3b1cae7cSLars-Peter Clausen 557*3b1cae7cSLars-Peter Clausen if (client->irq) 558*3b1cae7cSLars-Peter Clausen free_irq(client->irq, indio_dev); 559*3b1cae7cSLars-Peter Clausen 560*3b1cae7cSLars-Peter Clausen if (chip->reg) 561*3b1cae7cSLars-Peter Clausen regulator_disable(chip->reg); 562*3b1cae7cSLars-Peter Clausen 563*3b1cae7cSLars-Peter Clausen return 0; 564*3b1cae7cSLars-Peter Clausen } 565*3b1cae7cSLars-Peter Clausen 566*3b1cae7cSLars-Peter Clausen static const struct i2c_device_id ad7291_id[] = { 567*3b1cae7cSLars-Peter Clausen { "ad7291", 0 }, 568*3b1cae7cSLars-Peter Clausen {} 569*3b1cae7cSLars-Peter Clausen }; 570*3b1cae7cSLars-Peter Clausen 571*3b1cae7cSLars-Peter Clausen MODULE_DEVICE_TABLE(i2c, ad7291_id); 572*3b1cae7cSLars-Peter Clausen 573*3b1cae7cSLars-Peter Clausen static struct i2c_driver ad7291_driver = { 574*3b1cae7cSLars-Peter Clausen .driver = { 575*3b1cae7cSLars-Peter Clausen .name = KBUILD_MODNAME, 576*3b1cae7cSLars-Peter Clausen }, 577*3b1cae7cSLars-Peter Clausen .probe = ad7291_probe, 578*3b1cae7cSLars-Peter Clausen .remove = ad7291_remove, 579*3b1cae7cSLars-Peter Clausen .id_table = ad7291_id, 580*3b1cae7cSLars-Peter Clausen }; 581*3b1cae7cSLars-Peter Clausen module_i2c_driver(ad7291_driver); 582*3b1cae7cSLars-Peter Clausen 583*3b1cae7cSLars-Peter Clausen MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>"); 584*3b1cae7cSLars-Peter Clausen MODULE_DESCRIPTION("Analog Devices AD7291 ADC driver"); 585*3b1cae7cSLars-Peter Clausen MODULE_LICENSE("GPL v2"); 586