Skip to content

Commit d83610c

Browse files
iio: adc: Add new methods for MAX14001/MAX14002 driver
- Add regulators - Provide scale to convert opcodes to mV - Read ADC sample data Signed-off-by: Marilene A Garcia <marilene.agarcia@gmail.com>
1 parent b451319 commit d83610c

File tree

1 file changed

+76
-10
lines changed

1 file changed

+76
-10
lines changed

drivers/iio/adc/max14001.c

Lines changed: 76 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <linux/spi/spi.h>
1515
#include <linux/iio/iio.h>
1616
#include <linux/of.h>
17+
#include <linux/regulator/consumer.h>
1718

1819
/* MAX14001 registers definition */
1920
#define MAX14001_REG_ADC 0x00
@@ -75,6 +76,10 @@
7576
#define MAX14001_REG_WEN_WRITE_ENABLE 0x294
7677
#define MAX14001_REG_WEN_WRITE_DISABLE 0x0
7778

79+
/* MAX14001 10-bit ADC */
80+
#define MAX14001_NUMBER_OF_DATA_BITS 10
81+
#define MAX14001_BIT_DIV (1 << 10)
82+
7883
enum max14001_chip_model {
7984
max14001,
8085
max14002,
@@ -97,9 +102,51 @@ static struct max14001_chip_info max14001_chip_info_tbl[] = {
97102
struct max14001_state {
98103
struct spi_device *spi;
99104
const struct max14001_chip_info *chip_info;
105+
int vref_mV;
100106
};
101107

102-
static int max14001_spi_read(struct max14001_state *st, u16 reg, u16 *val)
108+
static int max14001_get_scale(struct max14001_state *st)
109+
{
110+
int scale;
111+
112+
/* scale = range / 2^10 */
113+
scale = st->vref_mV / MAX14001_BIT_DIV;
114+
return scale;
115+
}
116+
static int max14001_get_vref_mV(struct max14001_state *st)
117+
{
118+
struct device *dev = &st->spi->dev;
119+
int ret = 0;
120+
121+
ret = devm_regulator_get_enable_read_voltage(dev, "vrefin");
122+
if (ret < 0){
123+
st->vref_mV = 1250000 / 1000;
124+
dev_info(&st->spi->dev, "%s: vrefin not found. vref_mV %d\n", __func__, st->vref_mV);
125+
} else {
126+
st->vref_mV = ret / 1000;
127+
dev_info(&st->spi->dev, "%s: vrefin found. vref_mV %d\n", __func__, st->vref_mV);
128+
}
129+
130+
return ret;
131+
}
132+
133+
static int max14001_init_required_regulators(struct max14001_state *st)
134+
{
135+
struct device *dev = &st->spi->dev;
136+
int ret = 0;
137+
138+
ret = devm_regulator_get_enable(dev, "vdd");
139+
if (ret)
140+
return dev_err_probe(dev, ret, "Failed to enable specified Vdd supply\n");
141+
142+
ret = devm_regulator_get_enable(dev, "vddl");
143+
if (ret)
144+
return dev_err_probe(dev, ret, "Failed to enable specified Vddl supply\n");
145+
146+
return ret;
147+
}
148+
149+
static int max14001_spi_read(struct max14001_state *st, u16 reg, int *val)
103150
{
104151
u16 tx, rx, reversed;
105152
int ret;
@@ -116,7 +163,7 @@ static int max14001_spi_read(struct max14001_state *st, u16 reg, u16 *val)
116163

117164
/* TODO: Validate this line in the hw, could be le16_to_cpu */
118165
reversed = bitrev16(be16_to_cpu(rx));
119-
*val = FIELD_GET(MAX14001_MASK_ADDR, reversed);
166+
*val = FIELD_GET(MAX14001_MASK_DATA, reversed);
120167

121168
return ret;
122169
}
@@ -154,17 +201,17 @@ static int max14001_spi_write_single_reg(struct max14001_state *st, u16 reg, u16
154201
{
155202
int ret;
156203

157-
//Enable register write
204+
/* Enable register write */
158205
ret = max14001_spi_write(st, MAX14001_REG_WEN, MAX14001_REG_WEN_WRITE_ENABLE);
159206
if (ret < 0)
160207
return ret;
161208

162-
//Write data into register
209+
/* Write data into register */
163210
ret = max14001_spi_write(st, reg, val);
164211
if (ret < 0)
165212
return ret;
166213

167-
//Disable register write
214+
/* Disable register write */
168215
ret = max14001_spi_write(st, MAX14001_REG_WEN, MAX14001_REG_WEN_WRITE_DISABLE);
169216
if (ret < 0)
170217
return ret;
@@ -177,14 +224,30 @@ static int max14001_read_raw(struct iio_dev *indio_dev,
177224
int *val, int *val2, long mask)
178225
{
179226
struct max14001_state *st = iio_priv(indio_dev);
227+
int ret;
180228

181229
switch (mask) {
182230
case IIO_CHAN_INFO_RAW:
183-
dev_info(&st->spi->dev, "%s: IIO_CHAN_INFO_RAW\n", __func__);
231+
ret = max14001_spi_read(st, MAX14001_REG_ADC, val);
232+
dev_info(&st->spi->dev, "%s: IIO_CHAN_INFO_RAW: channel: %d, val: %d\n", __func__, chan->channel, val);
233+
if (ret < 0)
234+
return ret;
235+
184236
return IIO_VAL_INT;
185-
case IIO_CHAN_INFO_SCALE:
186-
dev_info(&st->spi->dev, "%s: IIO_CHAN_INFO_SCALE\n", __func__);
237+
case IIO_CHAN_INFO_AVERAGE_RAW:
238+
ret = max14001_spi_read(st, MAX14001_REG_FADC, val);
239+
dev_info(&st->spi->dev, "%s: IIO_CHAN_INFO_AVERAGE_RAW: channel: %d, val: %d\n", __func__, chan->channel, val);
240+
if (ret < 0)
241+
return ret;
242+
187243
return IIO_VAL_INT;
244+
case IIO_CHAN_INFO_SCALE:
245+
ret = max14001_get_scale(st);
246+
*val = ret;
247+
*val2 = MAX14001_NUMBER_OF_DATA_BITS;
248+
dev_info(&st->spi->dev, "%s: IIO_CHAN_INFO_SCALE: val: %d, val2: %d\n", __func__, val, val2);
249+
250+
return IIO_VAL_FRACTIONAL_LOG2;
188251
}
189252

190253
return -EINVAL;
@@ -254,8 +317,6 @@ static int max14001_probe(struct spi_device *spi)
254317
indio_dev->modes = INDIO_DIRECT_MODE;
255318
indio_dev->info = &max14001_info;
256319

257-
dev_info(&st->spi->dev, "%s: probe\n", __func__);
258-
259320
for_each_available_child_of_node_scoped(spi->dev.of_node, child) {
260321
current_channel = of_property_read_bool(child, "current-channel");
261322
if (current_channel)
@@ -270,6 +331,11 @@ static int max14001_probe(struct spi_device *spi)
270331
indio_dev->num_channels = ARRAY_SIZE(max14001_channel_voltage);
271332
}
272333

334+
dev_info(&st->spi->dev, "%s: probe\n", __func__);
335+
336+
max14001_init_required_regulators(st);
337+
max14001_get_vref_mV(st);
338+
273339
return devm_iio_device_register(&spi->dev, indio_dev);
274340
}
275341

0 commit comments

Comments
 (0)