linux/drivers/iio/adc/ti-ads7924.c

// SPDX-License-Identifier: GPL-2.0
/*
 * IIO driver for Texas Instruments ADS7924 ADC, 12-bit, 4-Channels, I2C
 *
 * Author: Hugo Villeneuve <[email protected]>
 * Copyright 2022 DimOnOff
 *
 * based on iio/adc/ti-ads1015.c
 * Copyright (c) 2016, Intel Corporation.
 *
 * Datasheet: https://www.ti.com/lit/gpn/ads7924
 */

#include <linux/bitfield.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>

#include <linux/iio/iio.h>
#include <linux/iio/types.h>

#define ADS7924_CHANNELS
#define ADS7924_BITS
#define ADS7924_DATA_SHIFT

/* Registers. */
#define ADS7924_MODECNTRL_REG
#define ADS7924_INTCNTRL_REG
#define ADS7924_DATA0_U_REG
#define ADS7924_DATA0_L_REG
#define ADS7924_DATA1_U_REG
#define ADS7924_DATA1_L_REG
#define ADS7924_DATA2_U_REG
#define ADS7924_DATA2_L_REG
#define ADS7924_DATA3_U_REG
#define ADS7924_DATA3_L_REG
#define ADS7924_ULR0_REG
#define ADS7924_LLR0_REG
#define ADS7924_ULR1_REG
#define ADS7924_LLR1_REG
#define ADS7924_ULR2_REG
#define ADS7924_LLR2_REG
#define ADS7924_ULR3_REG
#define ADS7924_LLR3_REG
#define ADS7924_INTCONFIG_REG
#define ADS7924_SLPCONFIG_REG
#define ADS7924_ACQCONFIG_REG
#define ADS7924_PWRCONFIG_REG
#define ADS7924_RESET_REG

/*
 * Register address INC bit: when set to '1', the register address is
 * automatically incremented after every register read which allows convenient
 * reading of multiple registers. Set INC to '0' when reading a single register.
 */
#define ADS7924_AUTO_INCREMENT_BIT

#define ADS7924_MODECNTRL_MODE_MASK

#define ADS7924_MODECNTRL_SEL_MASK

#define ADS7924_CFG_INTPOL_BIT
#define ADS7924_CFG_INTTRIG_BIT

#define ADS7924_CFG_INTPOL_MASK
#define ADS7924_CFG_INTTRIG_MASK

/* Interrupt pin polarity */
#define ADS7924_CFG_INTPOL_LOW
#define ADS7924_CFG_INTPOL_HIGH

/* Interrupt pin signaling */
#define ADS7924_CFG_INTTRIG_LEVEL
#define ADS7924_CFG_INTTRIG_EDGE

/* Mode control values */
#define ADS7924_MODECNTRL_IDLE
#define ADS7924_MODECNTRL_AWAKE
#define ADS7924_MODECNTRL_MANUAL_SINGLE
#define ADS7924_MODECNTRL_MANUAL_SCAN
#define ADS7924_MODECNTRL_AUTO_SINGLE
#define ADS7924_MODECNTRL_AUTO_SCAN
#define ADS7924_MODECNTRL_AUTO_SINGLE_SLEEP
#define ADS7924_MODECNTRL_AUTO_SCAN_SLEEP
#define ADS7924_MODECNTRL_AUTO_BURST_SLEEP

#define ADS7924_ACQTIME_MASK

#define ADS7924_PWRUPTIME_MASK

/*
 * The power-up time is allowed to elapse whenever the device has been shutdown
 * in idle mode. Power-up time can allow external circuits, such as an
 * operational amplifier, between the MUXOUT and ADCIN pins to turn on.
 * The nominal time programmed by the PUTIME[4:0] register bits is given by:
 *     t PU = PWRUPTIME[4:0] × 2 μs
 * If a power-up time is not required, set the bits to '0' to effectively bypass.
 */
#define ADS7924_PWRUPTIME_US

/*
 * Acquisition Time according to ACQTIME[4:0] register bits.
 * The Acquisition Time is given by:
 *     t ACQ = (ACQTIME[4:0] × 2 μs) + 6 μs
 * Using default value of 0 for ACQTIME[4:0] results in a minimum acquisition
 * time of 6us.
 */
#define ADS7924_ACQTIME_US

/* The conversion time is always 4μs and cannot be programmed by the user. */
#define ADS7924_CONVTIME_US

#define ADS7924_TOTAL_CONVTIME_US

#define ADS7924_V_CHAN(_chan, _addr)

struct ads7924_data {};

static bool ads7924_is_writeable_reg(struct device *dev, unsigned int reg)
{}

static const struct regmap_config ads7924_regmap_config =;

static const struct iio_chan_spec ads7924_channels[] =;

static int ads7924_get_adc_result(struct ads7924_data *data,
				  struct iio_chan_spec const *chan, int *val)
{}

static int ads7924_read_raw(struct iio_dev *indio_dev,
			    struct iio_chan_spec const *chan, int *val,
			    int *val2, long mask)
{}

static const struct iio_info ads7924_info =;

static int ads7924_get_channels_config(struct i2c_client *client,
				       struct iio_dev *indio_dev)
{}

static int ads7924_set_conv_mode(struct ads7924_data *data, int mode)
{}

static int ads7924_reset(struct iio_dev *indio_dev)
{
	struct ads7924_data *data = iio_priv(indio_dev);

	if (data->reset_gpio) {
		gpiod_set_value(data->reset_gpio, 1); /* Assert. */
		/* Educated guess: assert time not specified in datasheet... */
		mdelay(100);
		gpiod_set_value(data->reset_gpio, 0); /* Deassert. */
		return 0;
	}

	/*
	 * A write of 10101010 to this register will generate a
	 * software reset of the ADS7924.
	 */
	return regmap_write(data->regmap, ADS7924_RESET_REG, 0b10101010);
};

static void ads7924_reg_disable(void *data)
{}

static void ads7924_set_idle_mode(void *data)
{}

static int ads7924_probe(struct i2c_client *client)
{}

static const struct i2c_device_id ads7924_id[] =;
MODULE_DEVICE_TABLE(i2c, ads7924_id);

static const struct of_device_id ads7924_of_match[] =;
MODULE_DEVICE_TABLE(of, ads7924_of_match);

static struct i2c_driver ads7924_driver =;

module_i2c_driver();

MODULE_AUTHOR();
MODULE_DESCRIPTION();
MODULE_LICENSE();