xref: /openbmc/linux/drivers/iio/adc/ad7291.c (revision db7c17ecbf4d6328597047c4e4d6e8914945477c)
13b1cae7cSLars-Peter Clausen /*
23b1cae7cSLars-Peter Clausen  * AD7291 8-Channel, I2C, 12-Bit SAR ADC with Temperature Sensor
33b1cae7cSLars-Peter Clausen  *
43b1cae7cSLars-Peter Clausen  * Copyright 2010-2011 Analog Devices Inc.
53b1cae7cSLars-Peter Clausen  *
63b1cae7cSLars-Peter Clausen  * Licensed under the GPL-2 or later.
73b1cae7cSLars-Peter Clausen  */
83b1cae7cSLars-Peter Clausen 
93b1cae7cSLars-Peter Clausen #include <linux/device.h>
103b1cae7cSLars-Peter Clausen #include <linux/err.h>
113b1cae7cSLars-Peter Clausen #include <linux/i2c.h>
123b1cae7cSLars-Peter Clausen #include <linux/interrupt.h>
133b1cae7cSLars-Peter Clausen #include <linux/kernel.h>
143b1cae7cSLars-Peter Clausen #include <linux/module.h>
153b1cae7cSLars-Peter Clausen #include <linux/mutex.h>
163b1cae7cSLars-Peter Clausen #include <linux/regulator/consumer.h>
173b1cae7cSLars-Peter Clausen #include <linux/slab.h>
183b1cae7cSLars-Peter Clausen #include <linux/sysfs.h>
193b1cae7cSLars-Peter Clausen 
203b1cae7cSLars-Peter Clausen #include <linux/iio/iio.h>
213b1cae7cSLars-Peter Clausen #include <linux/iio/sysfs.h>
223b1cae7cSLars-Peter Clausen #include <linux/iio/events.h>
233b1cae7cSLars-Peter Clausen 
243b1cae7cSLars-Peter Clausen #include <linux/platform_data/ad7291.h>
253b1cae7cSLars-Peter Clausen 
263b1cae7cSLars-Peter Clausen /*
273b1cae7cSLars-Peter Clausen  * Simplified handling
283b1cae7cSLars-Peter Clausen  *
293b1cae7cSLars-Peter Clausen  * If no events enabled - single polled channel read
303b1cae7cSLars-Peter Clausen  * If event enabled direct reads disable unless channel
313b1cae7cSLars-Peter Clausen  * is in the read mask.
323b1cae7cSLars-Peter Clausen  *
333b1cae7cSLars-Peter Clausen  * The noise-delayed bit as per datasheet suggestion is always enabled.
343b1cae7cSLars-Peter Clausen  */
353b1cae7cSLars-Peter Clausen 
363b1cae7cSLars-Peter Clausen /*
373b1cae7cSLars-Peter Clausen  * AD7291 registers definition
383b1cae7cSLars-Peter Clausen  */
393b1cae7cSLars-Peter Clausen #define AD7291_COMMAND			0x00
403b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE			0x01
413b1cae7cSLars-Peter Clausen #define AD7291_T_SENSE			0x02
423b1cae7cSLars-Peter Clausen #define AD7291_T_AVERAGE		0x03
433b1cae7cSLars-Peter Clausen #define AD7291_DATA_HIGH(x)		((x) * 3 + 0x4)
443b1cae7cSLars-Peter Clausen #define AD7291_DATA_LOW(x)		((x) * 3 + 0x5)
453b1cae7cSLars-Peter Clausen #define AD7291_HYST(x)			((x) * 3 + 0x6)
463b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_ALERT_STATUS	0x1F
473b1cae7cSLars-Peter Clausen #define AD7291_T_ALERT_STATUS		0x20
483b1cae7cSLars-Peter Clausen 
493b1cae7cSLars-Peter Clausen #define AD7291_BITS			12
503b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_LIMIT_COUNT	8
513b1cae7cSLars-Peter Clausen 
523b1cae7cSLars-Peter Clausen 
533b1cae7cSLars-Peter Clausen /*
543b1cae7cSLars-Peter Clausen  * AD7291 command
553b1cae7cSLars-Peter Clausen  */
563b1cae7cSLars-Peter Clausen #define AD7291_AUTOCYCLE		BIT(0)
573b1cae7cSLars-Peter Clausen #define AD7291_RESET			BIT(1)
583b1cae7cSLars-Peter Clausen #define AD7291_ALERT_CLEAR		BIT(2)
593b1cae7cSLars-Peter Clausen #define AD7291_ALERT_POLARITY		BIT(3)
603b1cae7cSLars-Peter Clausen #define AD7291_EXT_REF			BIT(4)
613b1cae7cSLars-Peter Clausen #define AD7291_NOISE_DELAY		BIT(5)
623b1cae7cSLars-Peter Clausen #define AD7291_T_SENSE_MASK		BIT(7)
633b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_MASK		GENMASK(15, 8)
643b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_OFFSET		8
653b1cae7cSLars-Peter Clausen 
663b1cae7cSLars-Peter Clausen /*
673b1cae7cSLars-Peter Clausen  * AD7291 value masks
683b1cae7cSLars-Peter Clausen  */
693b1cae7cSLars-Peter Clausen #define AD7291_VALUE_MASK		GENMASK(11, 0)
703b1cae7cSLars-Peter Clausen 
713b1cae7cSLars-Peter Clausen /*
723b1cae7cSLars-Peter Clausen  * AD7291 alert register bits
733b1cae7cSLars-Peter Clausen  */
743b1cae7cSLars-Peter Clausen #define AD7291_T_LOW			BIT(0)
753b1cae7cSLars-Peter Clausen #define AD7291_T_HIGH			BIT(1)
763b1cae7cSLars-Peter Clausen #define AD7291_T_AVG_LOW		BIT(2)
773b1cae7cSLars-Peter Clausen #define AD7291_T_AVG_HIGH		BIT(3)
783b1cae7cSLars-Peter Clausen #define AD7291_V_LOW(x)			BIT((x) * 2)
793b1cae7cSLars-Peter Clausen #define AD7291_V_HIGH(x)		BIT((x) * 2 + 1)
803b1cae7cSLars-Peter Clausen 
813b1cae7cSLars-Peter Clausen 
823b1cae7cSLars-Peter Clausen struct ad7291_chip_info {
833b1cae7cSLars-Peter Clausen 	struct i2c_client	*client;
843b1cae7cSLars-Peter Clausen 	struct regulator	*reg;
853b1cae7cSLars-Peter Clausen 	u16			command;
863b1cae7cSLars-Peter Clausen 	u16			c_mask;	/* Active voltage channels for events */
873b1cae7cSLars-Peter Clausen 	struct mutex		state_lock;
883b1cae7cSLars-Peter Clausen };
893b1cae7cSLars-Peter Clausen 
903b1cae7cSLars-Peter Clausen static int ad7291_i2c_read(struct ad7291_chip_info *chip, u8 reg, u16 *data)
913b1cae7cSLars-Peter Clausen {
923b1cae7cSLars-Peter Clausen 	struct i2c_client *client = chip->client;
933b1cae7cSLars-Peter Clausen 	int ret = 0;
943b1cae7cSLars-Peter Clausen 
953b1cae7cSLars-Peter Clausen 	ret = i2c_smbus_read_word_swapped(client, reg);
963b1cae7cSLars-Peter Clausen 	if (ret < 0) {
973b1cae7cSLars-Peter Clausen 		dev_err(&client->dev, "I2C read error\n");
983b1cae7cSLars-Peter Clausen 		return ret;
993b1cae7cSLars-Peter Clausen 	}
1003b1cae7cSLars-Peter Clausen 
1013b1cae7cSLars-Peter Clausen 	*data = ret;
1023b1cae7cSLars-Peter Clausen 
1033b1cae7cSLars-Peter Clausen 	return 0;
1043b1cae7cSLars-Peter Clausen }
1053b1cae7cSLars-Peter Clausen 
1063b1cae7cSLars-Peter Clausen static int ad7291_i2c_write(struct ad7291_chip_info *chip, u8 reg, u16 data)
1073b1cae7cSLars-Peter Clausen {
1083b1cae7cSLars-Peter Clausen 	return i2c_smbus_write_word_swapped(chip->client, reg, data);
1093b1cae7cSLars-Peter Clausen }
1103b1cae7cSLars-Peter Clausen 
1113b1cae7cSLars-Peter Clausen static irqreturn_t ad7291_event_handler(int irq, void *private)
1123b1cae7cSLars-Peter Clausen {
1133b1cae7cSLars-Peter Clausen 	struct iio_dev *indio_dev = private;
1143b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip = iio_priv(private);
1153b1cae7cSLars-Peter Clausen 	u16 t_status, v_status;
1163b1cae7cSLars-Peter Clausen 	u16 command;
1173b1cae7cSLars-Peter Clausen 	int i;
1183b1cae7cSLars-Peter Clausen 	s64 timestamp = iio_get_time_ns();
1193b1cae7cSLars-Peter Clausen 
1203b1cae7cSLars-Peter Clausen 	if (ad7291_i2c_read(chip, AD7291_T_ALERT_STATUS, &t_status))
1213b1cae7cSLars-Peter Clausen 		return IRQ_HANDLED;
1223b1cae7cSLars-Peter Clausen 
1233b1cae7cSLars-Peter Clausen 	if (ad7291_i2c_read(chip, AD7291_VOLTAGE_ALERT_STATUS, &v_status))
1243b1cae7cSLars-Peter Clausen 		return IRQ_HANDLED;
1253b1cae7cSLars-Peter Clausen 
1263b1cae7cSLars-Peter Clausen 	if (!(t_status || v_status))
1273b1cae7cSLars-Peter Clausen 		return IRQ_HANDLED;
1283b1cae7cSLars-Peter Clausen 
1293b1cae7cSLars-Peter Clausen 	command = chip->command | AD7291_ALERT_CLEAR;
1303b1cae7cSLars-Peter Clausen 	ad7291_i2c_write(chip, AD7291_COMMAND, command);
1313b1cae7cSLars-Peter Clausen 
1323b1cae7cSLars-Peter Clausen 	command = chip->command & ~AD7291_ALERT_CLEAR;
1333b1cae7cSLars-Peter Clausen 	ad7291_i2c_write(chip, AD7291_COMMAND, command);
1343b1cae7cSLars-Peter Clausen 
1353b1cae7cSLars-Peter Clausen 	/* For now treat t_sense and t_sense_average the same */
1363b1cae7cSLars-Peter Clausen 	if ((t_status & AD7291_T_LOW) || (t_status & AD7291_T_AVG_LOW))
1373b1cae7cSLars-Peter Clausen 		iio_push_event(indio_dev,
1383b1cae7cSLars-Peter Clausen 			       IIO_UNMOD_EVENT_CODE(IIO_TEMP,
1393b1cae7cSLars-Peter Clausen 						    0,
1403b1cae7cSLars-Peter Clausen 						    IIO_EV_TYPE_THRESH,
1413b1cae7cSLars-Peter Clausen 						    IIO_EV_DIR_FALLING),
1423b1cae7cSLars-Peter Clausen 			       timestamp);
1433b1cae7cSLars-Peter Clausen 	if ((t_status & AD7291_T_HIGH) || (t_status & AD7291_T_AVG_HIGH))
1443b1cae7cSLars-Peter Clausen 		iio_push_event(indio_dev,
1453b1cae7cSLars-Peter Clausen 			       IIO_UNMOD_EVENT_CODE(IIO_TEMP,
1463b1cae7cSLars-Peter Clausen 						    0,
1473b1cae7cSLars-Peter Clausen 						    IIO_EV_TYPE_THRESH,
1483b1cae7cSLars-Peter Clausen 						    IIO_EV_DIR_RISING),
1493b1cae7cSLars-Peter Clausen 			       timestamp);
1503b1cae7cSLars-Peter Clausen 
1513b1cae7cSLars-Peter Clausen 	for (i = 0; i < AD7291_VOLTAGE_LIMIT_COUNT; i++) {
1523b1cae7cSLars-Peter Clausen 		if (v_status & AD7291_V_LOW(i))
1533b1cae7cSLars-Peter Clausen 			iio_push_event(indio_dev,
1543b1cae7cSLars-Peter Clausen 				       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE,
1553b1cae7cSLars-Peter Clausen 							    i,
1563b1cae7cSLars-Peter Clausen 							    IIO_EV_TYPE_THRESH,
1573b1cae7cSLars-Peter Clausen 							    IIO_EV_DIR_FALLING),
1583b1cae7cSLars-Peter Clausen 				       timestamp);
1593b1cae7cSLars-Peter Clausen 		if (v_status & AD7291_V_HIGH(i))
1603b1cae7cSLars-Peter Clausen 			iio_push_event(indio_dev,
1613b1cae7cSLars-Peter Clausen 				       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE,
1623b1cae7cSLars-Peter Clausen 							    i,
1633b1cae7cSLars-Peter Clausen 							    IIO_EV_TYPE_THRESH,
1643b1cae7cSLars-Peter Clausen 							    IIO_EV_DIR_RISING),
1653b1cae7cSLars-Peter Clausen 				       timestamp);
1663b1cae7cSLars-Peter Clausen 	}
1673b1cae7cSLars-Peter Clausen 
1683b1cae7cSLars-Peter Clausen 	return IRQ_HANDLED;
1693b1cae7cSLars-Peter Clausen }
1703b1cae7cSLars-Peter Clausen 
1713b1cae7cSLars-Peter Clausen static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan,
1723b1cae7cSLars-Peter Clausen 					 enum iio_event_direction dir,
1733b1cae7cSLars-Peter Clausen 					 enum iio_event_info info)
1743b1cae7cSLars-Peter Clausen {
1753b1cae7cSLars-Peter Clausen 	unsigned int offset;
1763b1cae7cSLars-Peter Clausen 
1773b1cae7cSLars-Peter Clausen 	switch (chan->type) {
1783b1cae7cSLars-Peter Clausen 	case IIO_VOLTAGE:
1793b1cae7cSLars-Peter Clausen 		offset = chan->channel;
1803b1cae7cSLars-Peter Clausen 		break;
1813b1cae7cSLars-Peter Clausen 	case IIO_TEMP:
1823b1cae7cSLars-Peter Clausen 		offset = AD7291_VOLTAGE_OFFSET;
1833b1cae7cSLars-Peter Clausen 		break;
1843b1cae7cSLars-Peter Clausen 	default:
1853b1cae7cSLars-Peter Clausen 	    return 0;
1863b1cae7cSLars-Peter Clausen 	}
1873b1cae7cSLars-Peter Clausen 
1883b1cae7cSLars-Peter Clausen 	switch (info) {
1893b1cae7cSLars-Peter Clausen 	case IIO_EV_INFO_VALUE:
1903b1cae7cSLars-Peter Clausen 		if (dir == IIO_EV_DIR_FALLING)
1913b1cae7cSLars-Peter Clausen 			return AD7291_DATA_HIGH(offset);
1923b1cae7cSLars-Peter Clausen 		else
1933b1cae7cSLars-Peter Clausen 			return AD7291_DATA_LOW(offset);
1943b1cae7cSLars-Peter Clausen 	case IIO_EV_INFO_HYSTERESIS:
1953b1cae7cSLars-Peter Clausen 		return AD7291_HYST(offset);
1963b1cae7cSLars-Peter Clausen 	default:
1973b1cae7cSLars-Peter Clausen 		break;
1983b1cae7cSLars-Peter Clausen 	}
1993b1cae7cSLars-Peter Clausen 	return 0;
2003b1cae7cSLars-Peter Clausen }
2013b1cae7cSLars-Peter Clausen 
2023b1cae7cSLars-Peter Clausen static int ad7291_read_event_value(struct iio_dev *indio_dev,
2033b1cae7cSLars-Peter Clausen 				   const struct iio_chan_spec *chan,
2043b1cae7cSLars-Peter Clausen 				   enum iio_event_type type,
2053b1cae7cSLars-Peter Clausen 				   enum iio_event_direction dir,
2063b1cae7cSLars-Peter Clausen 				   enum iio_event_info info,
2073b1cae7cSLars-Peter Clausen 				   int *val, int *val2)
2083b1cae7cSLars-Peter Clausen {
2093b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip = iio_priv(indio_dev);
2103b1cae7cSLars-Peter Clausen 	int ret;
2113b1cae7cSLars-Peter Clausen 	u16 uval;
2123b1cae7cSLars-Peter Clausen 
2133b1cae7cSLars-Peter Clausen 	ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir, info),
2143b1cae7cSLars-Peter Clausen 			      &uval);
2153b1cae7cSLars-Peter Clausen 	if (ret < 0)
2163b1cae7cSLars-Peter Clausen 		return ret;
2173b1cae7cSLars-Peter Clausen 
2183b1cae7cSLars-Peter Clausen 	if (info == IIO_EV_INFO_HYSTERESIS || chan->type == IIO_VOLTAGE)
2193b1cae7cSLars-Peter Clausen 		*val = uval & AD7291_VALUE_MASK;
2203b1cae7cSLars-Peter Clausen 
2213b1cae7cSLars-Peter Clausen 	else
2223b1cae7cSLars-Peter Clausen 		*val = sign_extend32(uval, 11);
2233b1cae7cSLars-Peter Clausen 
2243b1cae7cSLars-Peter Clausen 	return IIO_VAL_INT;
2253b1cae7cSLars-Peter Clausen }
2263b1cae7cSLars-Peter Clausen 
2273b1cae7cSLars-Peter Clausen static int ad7291_write_event_value(struct iio_dev *indio_dev,
2283b1cae7cSLars-Peter Clausen 				    const struct iio_chan_spec *chan,
2293b1cae7cSLars-Peter Clausen 				    enum iio_event_type type,
2303b1cae7cSLars-Peter Clausen 				    enum iio_event_direction dir,
2313b1cae7cSLars-Peter Clausen 				    enum iio_event_info info,
2323b1cae7cSLars-Peter Clausen 				    int val, int val2)
2333b1cae7cSLars-Peter Clausen {
2343b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip = iio_priv(indio_dev);
2353b1cae7cSLars-Peter Clausen 
2363b1cae7cSLars-Peter Clausen 	if (info == IIO_EV_INFO_HYSTERESIS || chan->type == IIO_VOLTAGE) {
2373b1cae7cSLars-Peter Clausen 		if (val > AD7291_VALUE_MASK || val < 0)
2383b1cae7cSLars-Peter Clausen 			return -EINVAL;
2393b1cae7cSLars-Peter Clausen 	} else {
2403b1cae7cSLars-Peter Clausen 		if (val > 2047 || val < -2048)
2413b1cae7cSLars-Peter Clausen 			return -EINVAL;
2423b1cae7cSLars-Peter Clausen 	}
2433b1cae7cSLars-Peter Clausen 
2443b1cae7cSLars-Peter Clausen 	return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir, info),
2453b1cae7cSLars-Peter Clausen 				val);
2463b1cae7cSLars-Peter Clausen }
2473b1cae7cSLars-Peter Clausen 
2483b1cae7cSLars-Peter Clausen static int ad7291_read_event_config(struct iio_dev *indio_dev,
2493b1cae7cSLars-Peter Clausen 				    const struct iio_chan_spec *chan,
2503b1cae7cSLars-Peter Clausen 				    enum iio_event_type type,
2513b1cae7cSLars-Peter Clausen 				    enum iio_event_direction dir)
2523b1cae7cSLars-Peter Clausen {
2533b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip = iio_priv(indio_dev);
2543b1cae7cSLars-Peter Clausen 	/*
2553b1cae7cSLars-Peter Clausen 	 * To be enabled the channel must simply be on. If any are enabled
2563b1cae7cSLars-Peter Clausen 	 * we are in continuous sampling mode
2573b1cae7cSLars-Peter Clausen 	 */
2583b1cae7cSLars-Peter Clausen 
2593b1cae7cSLars-Peter Clausen 	switch (chan->type) {
2603b1cae7cSLars-Peter Clausen 	case IIO_VOLTAGE:
2613b1cae7cSLars-Peter Clausen 		return !!(chip->c_mask & BIT(15 - chan->channel));
2623b1cae7cSLars-Peter Clausen 	case IIO_TEMP:
2633b1cae7cSLars-Peter Clausen 		/* always on */
2643b1cae7cSLars-Peter Clausen 		return 1;
2653b1cae7cSLars-Peter Clausen 	default:
2663b1cae7cSLars-Peter Clausen 		return -EINVAL;
2673b1cae7cSLars-Peter Clausen 	}
2683b1cae7cSLars-Peter Clausen 
2693b1cae7cSLars-Peter Clausen }
2703b1cae7cSLars-Peter Clausen 
2713b1cae7cSLars-Peter Clausen static int ad7291_write_event_config(struct iio_dev *indio_dev,
2723b1cae7cSLars-Peter Clausen 				     const struct iio_chan_spec *chan,
2733b1cae7cSLars-Peter Clausen 				     enum iio_event_type type,
2743b1cae7cSLars-Peter Clausen 				     enum iio_event_direction dir,
2753b1cae7cSLars-Peter Clausen 				     int state)
2763b1cae7cSLars-Peter Clausen {
2773b1cae7cSLars-Peter Clausen 	int ret = 0;
2783b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip = iio_priv(indio_dev);
2793b1cae7cSLars-Peter Clausen 	unsigned int mask;
2803b1cae7cSLars-Peter Clausen 	u16 regval;
2813b1cae7cSLars-Peter Clausen 
2823b1cae7cSLars-Peter Clausen 	mutex_lock(&chip->state_lock);
2833b1cae7cSLars-Peter Clausen 	regval = chip->command;
2843b1cae7cSLars-Peter Clausen 	/*
2853b1cae7cSLars-Peter Clausen 	 * To be enabled the channel must simply be on. If any are enabled
2863b1cae7cSLars-Peter Clausen 	 * use continuous sampling mode.
2873b1cae7cSLars-Peter Clausen 	 * Possible to disable temp as well but that makes single read tricky.
2883b1cae7cSLars-Peter Clausen 	 */
2893b1cae7cSLars-Peter Clausen 
2903b1cae7cSLars-Peter Clausen 	mask = BIT(15 - chan->channel);
2913b1cae7cSLars-Peter Clausen 
2923b1cae7cSLars-Peter Clausen 	switch (chan->type) {
2933b1cae7cSLars-Peter Clausen 	case IIO_VOLTAGE:
2943b1cae7cSLars-Peter Clausen 		if ((!state) && (chip->c_mask & mask))
2953b1cae7cSLars-Peter Clausen 			chip->c_mask &= ~mask;
2963b1cae7cSLars-Peter Clausen 		else if (state && (!(chip->c_mask & mask)))
2973b1cae7cSLars-Peter Clausen 			chip->c_mask |= mask;
2983b1cae7cSLars-Peter Clausen 		else
2993b1cae7cSLars-Peter Clausen 			break;
3003b1cae7cSLars-Peter Clausen 
3013b1cae7cSLars-Peter Clausen 		regval &= ~AD7291_AUTOCYCLE;
3023b1cae7cSLars-Peter Clausen 		regval |= chip->c_mask;
3033b1cae7cSLars-Peter Clausen 		if (chip->c_mask) /* Enable autocycle? */
3043b1cae7cSLars-Peter Clausen 			regval |= AD7291_AUTOCYCLE;
3053b1cae7cSLars-Peter Clausen 
3063b1cae7cSLars-Peter Clausen 		ret = ad7291_i2c_write(chip, AD7291_COMMAND, regval);
3073b1cae7cSLars-Peter Clausen 		if (ret < 0)
3083b1cae7cSLars-Peter Clausen 			goto error_ret;
3093b1cae7cSLars-Peter Clausen 
3103b1cae7cSLars-Peter Clausen 		chip->command = regval;
3113b1cae7cSLars-Peter Clausen 		break;
3123b1cae7cSLars-Peter Clausen 	default:
3133b1cae7cSLars-Peter Clausen 		ret = -EINVAL;
3143b1cae7cSLars-Peter Clausen 	}
3153b1cae7cSLars-Peter Clausen 
3163b1cae7cSLars-Peter Clausen error_ret:
3173b1cae7cSLars-Peter Clausen 	mutex_unlock(&chip->state_lock);
3183b1cae7cSLars-Peter Clausen 	return ret;
3193b1cae7cSLars-Peter Clausen }
3203b1cae7cSLars-Peter Clausen 
3213b1cae7cSLars-Peter Clausen static int ad7291_read_raw(struct iio_dev *indio_dev,
3223b1cae7cSLars-Peter Clausen 			   struct iio_chan_spec const *chan,
3233b1cae7cSLars-Peter Clausen 			   int *val,
3243b1cae7cSLars-Peter Clausen 			   int *val2,
3253b1cae7cSLars-Peter Clausen 			   long mask)
3263b1cae7cSLars-Peter Clausen {
3273b1cae7cSLars-Peter Clausen 	int ret;
3283b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip = iio_priv(indio_dev);
3293b1cae7cSLars-Peter Clausen 	u16 regval;
3303b1cae7cSLars-Peter Clausen 
3313b1cae7cSLars-Peter Clausen 	switch (mask) {
3323b1cae7cSLars-Peter Clausen 	case IIO_CHAN_INFO_RAW:
3333b1cae7cSLars-Peter Clausen 		switch (chan->type) {
3343b1cae7cSLars-Peter Clausen 		case IIO_VOLTAGE:
3353b1cae7cSLars-Peter Clausen 			mutex_lock(&chip->state_lock);
3363b1cae7cSLars-Peter Clausen 			/* If in autocycle mode drop through */
3373b1cae7cSLars-Peter Clausen 			if (chip->command & AD7291_AUTOCYCLE) {
3383b1cae7cSLars-Peter Clausen 				mutex_unlock(&chip->state_lock);
3393b1cae7cSLars-Peter Clausen 				return -EBUSY;
3403b1cae7cSLars-Peter Clausen 			}
3413b1cae7cSLars-Peter Clausen 			/* Enable this channel alone */
3423b1cae7cSLars-Peter Clausen 			regval = chip->command & (~AD7291_VOLTAGE_MASK);
3433b1cae7cSLars-Peter Clausen 			regval |= BIT(15 - chan->channel);
3443b1cae7cSLars-Peter Clausen 			ret = ad7291_i2c_write(chip, AD7291_COMMAND, regval);
3453b1cae7cSLars-Peter Clausen 			if (ret < 0) {
3463b1cae7cSLars-Peter Clausen 				mutex_unlock(&chip->state_lock);
3473b1cae7cSLars-Peter Clausen 				return ret;
3483b1cae7cSLars-Peter Clausen 			}
3493b1cae7cSLars-Peter Clausen 			/* Read voltage */
3503b1cae7cSLars-Peter Clausen 			ret = i2c_smbus_read_word_swapped(chip->client,
3513b1cae7cSLars-Peter Clausen 							  AD7291_VOLTAGE);
3523b1cae7cSLars-Peter Clausen 			if (ret < 0) {
3533b1cae7cSLars-Peter Clausen 				mutex_unlock(&chip->state_lock);
3543b1cae7cSLars-Peter Clausen 				return ret;
3553b1cae7cSLars-Peter Clausen 			}
3563b1cae7cSLars-Peter Clausen 			*val = ret & AD7291_VALUE_MASK;
3573b1cae7cSLars-Peter Clausen 			mutex_unlock(&chip->state_lock);
3583b1cae7cSLars-Peter Clausen 			return IIO_VAL_INT;
3593b1cae7cSLars-Peter Clausen 		case IIO_TEMP:
3603b1cae7cSLars-Peter Clausen 			/* Assumes tsense bit of command register always set */
3613b1cae7cSLars-Peter Clausen 			ret = i2c_smbus_read_word_swapped(chip->client,
3623b1cae7cSLars-Peter Clausen 							  AD7291_T_SENSE);
3633b1cae7cSLars-Peter Clausen 			if (ret < 0)
3643b1cae7cSLars-Peter Clausen 				return ret;
3653b1cae7cSLars-Peter Clausen 			*val = sign_extend32(ret, 11);
3663b1cae7cSLars-Peter Clausen 			return IIO_VAL_INT;
3673b1cae7cSLars-Peter Clausen 		default:
3683b1cae7cSLars-Peter Clausen 			return -EINVAL;
3693b1cae7cSLars-Peter Clausen 		}
3703b1cae7cSLars-Peter Clausen 	case IIO_CHAN_INFO_AVERAGE_RAW:
3713b1cae7cSLars-Peter Clausen 		ret = i2c_smbus_read_word_swapped(chip->client,
3723b1cae7cSLars-Peter Clausen 						  AD7291_T_AVERAGE);
3733b1cae7cSLars-Peter Clausen 			if (ret < 0)
3743b1cae7cSLars-Peter Clausen 				return ret;
3753b1cae7cSLars-Peter Clausen 			*val = sign_extend32(ret, 11);
3763b1cae7cSLars-Peter Clausen 			return IIO_VAL_INT;
3773b1cae7cSLars-Peter Clausen 	case IIO_CHAN_INFO_SCALE:
3783b1cae7cSLars-Peter Clausen 		switch (chan->type) {
3793b1cae7cSLars-Peter Clausen 		case IIO_VOLTAGE:
3803b1cae7cSLars-Peter Clausen 			if (chip->reg) {
3813b1cae7cSLars-Peter Clausen 				int vref;
3823b1cae7cSLars-Peter Clausen 
3833b1cae7cSLars-Peter Clausen 				vref = regulator_get_voltage(chip->reg);
3843b1cae7cSLars-Peter Clausen 				if (vref < 0)
3853b1cae7cSLars-Peter Clausen 					return vref;
3863b1cae7cSLars-Peter Clausen 				*val = vref / 1000;
3873b1cae7cSLars-Peter Clausen 			} else {
3883b1cae7cSLars-Peter Clausen 				*val = 2500;
3893b1cae7cSLars-Peter Clausen 			}
3903b1cae7cSLars-Peter Clausen 			*val2 = AD7291_BITS;
3913b1cae7cSLars-Peter Clausen 			return IIO_VAL_FRACTIONAL_LOG2;
3923b1cae7cSLars-Peter Clausen 		case IIO_TEMP:
3933b1cae7cSLars-Peter Clausen 			/*
3943b1cae7cSLars-Peter Clausen 			 * One LSB of the ADC corresponds to 0.25 deg C.
3953b1cae7cSLars-Peter Clausen 			 * The temperature reading is in 12-bit twos
3963b1cae7cSLars-Peter Clausen 			 * complement format
3973b1cae7cSLars-Peter Clausen 			 */
3983b1cae7cSLars-Peter Clausen 			*val = 250;
3993b1cae7cSLars-Peter Clausen 			return IIO_VAL_INT;
4003b1cae7cSLars-Peter Clausen 		default:
4013b1cae7cSLars-Peter Clausen 			return -EINVAL;
4023b1cae7cSLars-Peter Clausen 		}
4033b1cae7cSLars-Peter Clausen 	default:
4043b1cae7cSLars-Peter Clausen 		return -EINVAL;
4053b1cae7cSLars-Peter Clausen 	}
4063b1cae7cSLars-Peter Clausen }
4073b1cae7cSLars-Peter Clausen 
4083b1cae7cSLars-Peter Clausen static const struct iio_event_spec ad7291_events[] = {
4093b1cae7cSLars-Peter Clausen 	{
4103b1cae7cSLars-Peter Clausen 		.type = IIO_EV_TYPE_THRESH,
4113b1cae7cSLars-Peter Clausen 		.dir = IIO_EV_DIR_RISING,
4123b1cae7cSLars-Peter Clausen 		.mask_separate = BIT(IIO_EV_INFO_VALUE) |
4133b1cae7cSLars-Peter Clausen 			BIT(IIO_EV_INFO_ENABLE),
4143b1cae7cSLars-Peter Clausen 	}, {
4153b1cae7cSLars-Peter Clausen 		.type = IIO_EV_TYPE_THRESH,
4163b1cae7cSLars-Peter Clausen 		.dir = IIO_EV_DIR_FALLING,
4173b1cae7cSLars-Peter Clausen 		.mask_separate = BIT(IIO_EV_INFO_VALUE) |
4183b1cae7cSLars-Peter Clausen 			BIT(IIO_EV_INFO_ENABLE),
4193b1cae7cSLars-Peter Clausen 	}, {
4203b1cae7cSLars-Peter Clausen 		.type = IIO_EV_TYPE_THRESH,
4213b1cae7cSLars-Peter Clausen 		.dir = IIO_EV_DIR_EITHER,
4223b1cae7cSLars-Peter Clausen 		.mask_separate = BIT(IIO_EV_INFO_HYSTERESIS),
4233b1cae7cSLars-Peter Clausen 	},
4243b1cae7cSLars-Peter Clausen };
4253b1cae7cSLars-Peter Clausen 
4263b1cae7cSLars-Peter Clausen #define AD7291_VOLTAGE_CHAN(_chan)					\
4273b1cae7cSLars-Peter Clausen {									\
4283b1cae7cSLars-Peter Clausen 	.type = IIO_VOLTAGE,						\
4293b1cae7cSLars-Peter Clausen 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
4303b1cae7cSLars-Peter Clausen 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),		\
4313b1cae7cSLars-Peter Clausen 	.indexed = 1,							\
4323b1cae7cSLars-Peter Clausen 	.channel = _chan,						\
4333b1cae7cSLars-Peter Clausen 	.event_spec = ad7291_events,					\
4343b1cae7cSLars-Peter Clausen 	.num_event_specs = ARRAY_SIZE(ad7291_events),			\
4353b1cae7cSLars-Peter Clausen }
4363b1cae7cSLars-Peter Clausen 
4373b1cae7cSLars-Peter Clausen static const struct iio_chan_spec ad7291_channels[] = {
4383b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(0),
4393b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(1),
4403b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(2),
4413b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(3),
4423b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(4),
4433b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(5),
4443b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(6),
4453b1cae7cSLars-Peter Clausen 	AD7291_VOLTAGE_CHAN(7),
4463b1cae7cSLars-Peter Clausen 	{
4473b1cae7cSLars-Peter Clausen 		.type = IIO_TEMP,
4483b1cae7cSLars-Peter Clausen 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
4493b1cae7cSLars-Peter Clausen 				BIT(IIO_CHAN_INFO_AVERAGE_RAW) |
4503b1cae7cSLars-Peter Clausen 				BIT(IIO_CHAN_INFO_SCALE),
4513b1cae7cSLars-Peter Clausen 		.indexed = 1,
4523b1cae7cSLars-Peter Clausen 		.channel = 0,
4533b1cae7cSLars-Peter Clausen 		.event_spec = ad7291_events,
4543b1cae7cSLars-Peter Clausen 		.num_event_specs = ARRAY_SIZE(ad7291_events),
4553b1cae7cSLars-Peter Clausen 	}
4563b1cae7cSLars-Peter Clausen };
4573b1cae7cSLars-Peter Clausen 
4583b1cae7cSLars-Peter Clausen static const struct iio_info ad7291_info = {
4593b1cae7cSLars-Peter Clausen 	.read_raw = &ad7291_read_raw,
4603b1cae7cSLars-Peter Clausen 	.read_event_config = &ad7291_read_event_config,
4613b1cae7cSLars-Peter Clausen 	.write_event_config = &ad7291_write_event_config,
4623b1cae7cSLars-Peter Clausen 	.read_event_value = &ad7291_read_event_value,
4633b1cae7cSLars-Peter Clausen 	.write_event_value = &ad7291_write_event_value,
4643b1cae7cSLars-Peter Clausen 	.driver_module = THIS_MODULE,
4653b1cae7cSLars-Peter Clausen };
4663b1cae7cSLars-Peter Clausen 
4673b1cae7cSLars-Peter Clausen static int ad7291_probe(struct i2c_client *client,
4683b1cae7cSLars-Peter Clausen 			const struct i2c_device_id *id)
4693b1cae7cSLars-Peter Clausen {
4703b1cae7cSLars-Peter Clausen 	struct ad7291_platform_data *pdata = client->dev.platform_data;
4713b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip;
4723b1cae7cSLars-Peter Clausen 	struct iio_dev *indio_dev;
473*db7c17ecSGreg Kroah-Hartman 	int ret;
4743b1cae7cSLars-Peter Clausen 
4753b1cae7cSLars-Peter Clausen 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
4763b1cae7cSLars-Peter Clausen 	if (!indio_dev)
4773b1cae7cSLars-Peter Clausen 		return -ENOMEM;
4783b1cae7cSLars-Peter Clausen 	chip = iio_priv(indio_dev);
4793b1cae7cSLars-Peter Clausen 
4803b1cae7cSLars-Peter Clausen 	if (pdata && pdata->use_external_ref) {
4813b1cae7cSLars-Peter Clausen 		chip->reg = devm_regulator_get(&client->dev, "vref");
4823b1cae7cSLars-Peter Clausen 		if (IS_ERR(chip->reg))
483*db7c17ecSGreg Kroah-Hartman 			return PTR_ERR(chip->reg);
4843b1cae7cSLars-Peter Clausen 
4853b1cae7cSLars-Peter Clausen 		ret = regulator_enable(chip->reg);
4863b1cae7cSLars-Peter Clausen 		if (ret)
4873b1cae7cSLars-Peter Clausen 			return ret;
4883b1cae7cSLars-Peter Clausen 	}
4893b1cae7cSLars-Peter Clausen 
4903b1cae7cSLars-Peter Clausen 	mutex_init(&chip->state_lock);
4913b1cae7cSLars-Peter Clausen 	/* this is only used for device removal purposes */
4923b1cae7cSLars-Peter Clausen 	i2c_set_clientdata(client, indio_dev);
4933b1cae7cSLars-Peter Clausen 
4943b1cae7cSLars-Peter Clausen 	chip->client = client;
4953b1cae7cSLars-Peter Clausen 
4963b1cae7cSLars-Peter Clausen 	chip->command = AD7291_NOISE_DELAY |
4973b1cae7cSLars-Peter Clausen 			AD7291_T_SENSE_MASK | /* Tsense always enabled */
4983b1cae7cSLars-Peter Clausen 			AD7291_ALERT_POLARITY; /* set irq polarity low level */
4993b1cae7cSLars-Peter Clausen 
5003b1cae7cSLars-Peter Clausen 	if (pdata && pdata->use_external_ref)
5013b1cae7cSLars-Peter Clausen 		chip->command |= AD7291_EXT_REF;
5023b1cae7cSLars-Peter Clausen 
5033b1cae7cSLars-Peter Clausen 	indio_dev->name = id->name;
5043b1cae7cSLars-Peter Clausen 	indio_dev->channels = ad7291_channels;
5053b1cae7cSLars-Peter Clausen 	indio_dev->num_channels = ARRAY_SIZE(ad7291_channels);
5063b1cae7cSLars-Peter Clausen 
5073b1cae7cSLars-Peter Clausen 	indio_dev->dev.parent = &client->dev;
5083b1cae7cSLars-Peter Clausen 	indio_dev->info = &ad7291_info;
5093b1cae7cSLars-Peter Clausen 	indio_dev->modes = INDIO_DIRECT_MODE;
5103b1cae7cSLars-Peter Clausen 
5113b1cae7cSLars-Peter Clausen 	ret = ad7291_i2c_write(chip, AD7291_COMMAND, AD7291_RESET);
5123b1cae7cSLars-Peter Clausen 	if (ret) {
5133b1cae7cSLars-Peter Clausen 		ret = -EIO;
5143b1cae7cSLars-Peter Clausen 		goto error_disable_reg;
5153b1cae7cSLars-Peter Clausen 	}
5163b1cae7cSLars-Peter Clausen 
5173b1cae7cSLars-Peter Clausen 	ret = ad7291_i2c_write(chip, AD7291_COMMAND, chip->command);
5183b1cae7cSLars-Peter Clausen 	if (ret) {
5193b1cae7cSLars-Peter Clausen 		ret = -EIO;
5203b1cae7cSLars-Peter Clausen 		goto error_disable_reg;
5213b1cae7cSLars-Peter Clausen 	}
5223b1cae7cSLars-Peter Clausen 
5233b1cae7cSLars-Peter Clausen 	if (client->irq > 0) {
5243b1cae7cSLars-Peter Clausen 		ret = request_threaded_irq(client->irq,
5253b1cae7cSLars-Peter Clausen 					   NULL,
5263b1cae7cSLars-Peter Clausen 					   &ad7291_event_handler,
5273b1cae7cSLars-Peter Clausen 					   IRQF_TRIGGER_LOW | IRQF_ONESHOT,
5283b1cae7cSLars-Peter Clausen 					   id->name,
5293b1cae7cSLars-Peter Clausen 					   indio_dev);
5303b1cae7cSLars-Peter Clausen 		if (ret)
5313b1cae7cSLars-Peter Clausen 			goto error_disable_reg;
5323b1cae7cSLars-Peter Clausen 	}
5333b1cae7cSLars-Peter Clausen 
5343b1cae7cSLars-Peter Clausen 	ret = iio_device_register(indio_dev);
5353b1cae7cSLars-Peter Clausen 	if (ret)
5363b1cae7cSLars-Peter Clausen 		goto error_unreg_irq;
5373b1cae7cSLars-Peter Clausen 
5383b1cae7cSLars-Peter Clausen 	return 0;
5393b1cae7cSLars-Peter Clausen 
5403b1cae7cSLars-Peter Clausen error_unreg_irq:
5413b1cae7cSLars-Peter Clausen 	if (client->irq)
5423b1cae7cSLars-Peter Clausen 		free_irq(client->irq, indio_dev);
5433b1cae7cSLars-Peter Clausen error_disable_reg:
5443b1cae7cSLars-Peter Clausen 	if (chip->reg)
5453b1cae7cSLars-Peter Clausen 		regulator_disable(chip->reg);
5463b1cae7cSLars-Peter Clausen 
5473b1cae7cSLars-Peter Clausen 	return ret;
5483b1cae7cSLars-Peter Clausen }
5493b1cae7cSLars-Peter Clausen 
5503b1cae7cSLars-Peter Clausen static int ad7291_remove(struct i2c_client *client)
5513b1cae7cSLars-Peter Clausen {
5523b1cae7cSLars-Peter Clausen 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
5533b1cae7cSLars-Peter Clausen 	struct ad7291_chip_info *chip = iio_priv(indio_dev);
5543b1cae7cSLars-Peter Clausen 
5553b1cae7cSLars-Peter Clausen 	iio_device_unregister(indio_dev);
5563b1cae7cSLars-Peter Clausen 
5573b1cae7cSLars-Peter Clausen 	if (client->irq)
5583b1cae7cSLars-Peter Clausen 		free_irq(client->irq, indio_dev);
5593b1cae7cSLars-Peter Clausen 
5603b1cae7cSLars-Peter Clausen 	if (chip->reg)
5613b1cae7cSLars-Peter Clausen 		regulator_disable(chip->reg);
5623b1cae7cSLars-Peter Clausen 
5633b1cae7cSLars-Peter Clausen 	return 0;
5643b1cae7cSLars-Peter Clausen }
5653b1cae7cSLars-Peter Clausen 
5663b1cae7cSLars-Peter Clausen static const struct i2c_device_id ad7291_id[] = {
5673b1cae7cSLars-Peter Clausen 	{ "ad7291", 0 },
5683b1cae7cSLars-Peter Clausen 	{}
5693b1cae7cSLars-Peter Clausen };
5703b1cae7cSLars-Peter Clausen 
5713b1cae7cSLars-Peter Clausen MODULE_DEVICE_TABLE(i2c, ad7291_id);
5723b1cae7cSLars-Peter Clausen 
5733b1cae7cSLars-Peter Clausen static struct i2c_driver ad7291_driver = {
5743b1cae7cSLars-Peter Clausen 	.driver = {
5753b1cae7cSLars-Peter Clausen 		.name = KBUILD_MODNAME,
5763b1cae7cSLars-Peter Clausen 	},
5773b1cae7cSLars-Peter Clausen 	.probe = ad7291_probe,
5783b1cae7cSLars-Peter Clausen 	.remove = ad7291_remove,
5793b1cae7cSLars-Peter Clausen 	.id_table = ad7291_id,
5803b1cae7cSLars-Peter Clausen };
5813b1cae7cSLars-Peter Clausen module_i2c_driver(ad7291_driver);
5823b1cae7cSLars-Peter Clausen 
5833b1cae7cSLars-Peter Clausen MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
5843b1cae7cSLars-Peter Clausen MODULE_DESCRIPTION("Analog Devices AD7291 ADC driver");
5853b1cae7cSLars-Peter Clausen MODULE_LICENSE("GPL v2");
586