Commit 0eaecea6 authored by Mircea Caprioru's avatar Mircea Caprioru Committed by Jonathan Cameron

iio: adc: ad7124: Add buffered input support

This patch adds the option to enable the buffered mode for positive and
negative inputs. Each option can be enabled independently.

In buffered mode, the input channel feeds into a high impedance input stage
of the buffer amplifier. Therefore, the input can tolerate significant
source impedances and is tailored for direct connection to external
resistive type sensors such as strain gages or RTDs.
Signed-off-by: default avatarMircea Caprioru <mircea.caprioru@analog.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent f1794fd7
...@@ -61,6 +61,8 @@ ...@@ -61,6 +61,8 @@
#define AD7124_CONFIG_REF_SEL(x) FIELD_PREP(AD7124_CONFIG_REF_SEL_MSK, x) #define AD7124_CONFIG_REF_SEL(x) FIELD_PREP(AD7124_CONFIG_REF_SEL_MSK, x)
#define AD7124_CONFIG_PGA_MSK GENMASK(2, 0) #define AD7124_CONFIG_PGA_MSK GENMASK(2, 0)
#define AD7124_CONFIG_PGA(x) FIELD_PREP(AD7124_CONFIG_PGA_MSK, x) #define AD7124_CONFIG_PGA(x) FIELD_PREP(AD7124_CONFIG_PGA_MSK, x)
#define AD7124_CONFIG_IN_BUFF_MSK GENMASK(7, 6)
#define AD7124_CONFIG_IN_BUFF(x) FIELD_PREP(AD7124_CONFIG_IN_BUFF_MSK, x)
/* AD7124_FILTER_X */ /* AD7124_FILTER_X */
#define AD7124_FILTER_FS_MSK GENMASK(10, 0) #define AD7124_FILTER_FS_MSK GENMASK(10, 0)
...@@ -108,6 +110,8 @@ struct ad7124_chip_info { ...@@ -108,6 +110,8 @@ struct ad7124_chip_info {
struct ad7124_channel_config { struct ad7124_channel_config {
enum ad7124_ref_sel refsel; enum ad7124_ref_sel refsel;
bool bipolar; bool bipolar;
bool buf_positive;
bool buf_negative;
unsigned int ain; unsigned int ain;
unsigned int vref_mv; unsigned int vref_mv;
unsigned int pga_bits; unsigned int pga_bits;
...@@ -473,6 +477,11 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev, ...@@ -473,6 +477,11 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
else else
st->channel_config[channel].refsel = tmp; st->channel_config[channel].refsel = tmp;
st->channel_config[channel].buf_positive =
of_property_read_bool(child, "adi,buffered-positive");
st->channel_config[channel].buf_negative =
of_property_read_bool(child, "adi,buffered-negative");
*chan = ad7124_channel_template; *chan = ad7124_channel_template;
chan->address = channel; chan->address = channel;
chan->scan_index = channel; chan->scan_index = channel;
...@@ -492,7 +501,7 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev, ...@@ -492,7 +501,7 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
static int ad7124_setup(struct ad7124_state *st) static int ad7124_setup(struct ad7124_state *st)
{ {
unsigned int val, fclk, power_mode; unsigned int val, fclk, power_mode;
int i, ret; int i, ret, tmp;
fclk = clk_get_rate(st->mclk); fclk = clk_get_rate(st->mclk);
if (!fclk) if (!fclk)
...@@ -525,8 +534,12 @@ static int ad7124_setup(struct ad7124_state *st) ...@@ -525,8 +534,12 @@ static int ad7124_setup(struct ad7124_state *st)
if (ret < 0) if (ret < 0)
return ret; return ret;
tmp = (st->channel_config[i].buf_positive << 1) +
st->channel_config[i].buf_negative;
val = AD7124_CONFIG_BIPOLAR(st->channel_config[i].bipolar) | val = AD7124_CONFIG_BIPOLAR(st->channel_config[i].bipolar) |
AD7124_CONFIG_REF_SEL(st->channel_config[i].refsel); AD7124_CONFIG_REF_SEL(st->channel_config[i].refsel) |
AD7124_CONFIG_IN_BUFF(tmp);
ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(i), 2, val); ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(i), 2, val);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment