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