Skip to content

Commit 5bd91fc

Browse files
committed
iio: adc: Improve the MAX22531 ADC driver
Add device entries for MAX22530 and MAX22532. Retrieve logic and DC-DC power supplies post fixes in DT overlay. Add chip_info structure for the device. Fix regmap_config for SPI read/write commands as per the datasheet. Implement scale in max22531_read_raw function. Add boilerplate text to Kconfig for the driver. Signed-off-by: Abhinav Jain <jain.abhinav177@gmail.com>
1 parent 8de7c35 commit 5bd91fc

File tree

2 files changed

+112
-42
lines changed

2 files changed

+112
-42
lines changed

drivers/iio/adc/Kconfig

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,11 @@ config MAX22531
11301130
tristate "Analog Devices MAX22531 ADC Driver"
11311131
depends on SPI
11321132
help
1133-
Say yes here to build support for this driver.
1133+
Say yes here to build support for field-side self-powered 12-bit
1134+
isolated Maxim ADCs. (max22530, max22531, max22532).
1135+
1136+
To compile this driver as a module, choose M here: the module will be
1137+
called max22531.
11341138

11351139
config MAX77541_ADC
11361140
tristate "Analog Devices MAX77541 ADC driver"

drivers/iio/adc/max22531.c

Lines changed: 107 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,36 @@
2626
#define MAX22531_REG_INTERRUPT_ENABLE 0x13
2727
#define MAX22531_REG_CONTROL 0x14
2828

29+
#define MAX22531_VREF_MV 1800
30+
31+
2932
enum max22531_id {
33+
max22530,
3034
max22531,
35+
max22532,
36+
};
37+
38+
struct max22531_chip_info {
39+
const char* name;
40+
};
41+
42+
static struct max22531_chip_info max22531_chip_info_tbl[] = {
43+
[max22530] = {
44+
.name = "max22530",
45+
},
46+
[max22531] = {
47+
.name = "max22531",
48+
},
49+
[max22532] = {
50+
.name = "max22532",
51+
}.
3152
};
3253

3354
struct max22531 {
3455
struct spi_device *spi_dev;
35-
struct regulator *vref;
56+
const struct max22531_chip_info *chip_info;
3657
struct regulator *vddl;
37-
struct regulator *vddf;
58+
struct regulator *vddpl;
3859
struct regmap *regmap;
3960
};
4061

@@ -46,111 +67,156 @@ struct max22531 {
4667
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
4768
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
4869
.scan_index = ch, \
49-
.output = 0, \
5070
}
5171

5272
static const struct iio_chan_spec max22531_channels[] = {
5373
MAX22531_CHANNEL(0),
5474
MAX22531_CHANNEL(1),
5575
MAX22531_CHANNEL(2),
5676
MAX22531_CHANNEL(3),
57-
IIO_CHAN_SOFT_TIMESTAMP(2),
5877
};
5978

6079
static const struct regmap_config regmap_config = {
61-
.reg_bits = 16,
62-
.val_bits = 16,
63-
.max_register = 0x14,
80+
.reg_bits = 6,
81+
.val_bits = 6,
82+
.write_flag_mask = BIT(1),
83+
.pad_bits = 1,
84+
.max_register = MAX22531_REG_CONTROL,
6485
};
6586

6687
static int max22531_read_raw(struct iio_dev *indio_dev,
6788
struct iio_chan_spec const *chan,
6889
int *val, int *val2, long mask)
6990
{
70-
struct regmap **regmap = iio_priv(indio_dev);
91+
struct max22531 *adc = iio_priv(indio_dev);
7192
int ret;
7293

73-
/* mock for now */
7494
switch(mask) {
7595
case IIO_CHAN_INFO_RAW:
76-
ret = regmap_read(*regmap, chan->address, val);
77-
if (ret)
78-
return ret;
79-
return IIO_VAL_INT;
96+
switch(chan->channel) {
97+
case 0:
98+
reg = MAX22531_REG_ADC1;
99+
break;
100+
case 1:
101+
reg = MAX22531_REG_ADC2;
102+
break;
103+
case 2:
104+
reg = MAX22531_REG_ADC3;
105+
break;
106+
case 3:
107+
reg = MAX22531_REG_ADC3;
108+
break;
109+
default:
110+
return -EINVAL;
111+
}
112+
ret = regmap_read(adc->regmap, reg, val);
113+
if (ret)
114+
return ret;
115+
return IIO_VAL_INT;
116+
117+
case IIO_CHAN_INFO_SCALE:
118+
switch(chan->channel) {
119+
case 0:
120+
reg = MAX22531_REG_FADC1;
121+
break;
122+
case 1:
123+
reg = MAX22531_REG_FADC2;
124+
break;
125+
case 2:
126+
reg = MAX22531_REG_FADC3;
127+
break;
128+
case 3:
129+
reg = MAX22531_REG_FADC4;
130+
break;
131+
default:
132+
return -EINVAL;
133+
}
134+
135+
reg = regmap_read(adc->regmap, reg, val);
136+
if (ret)
137+
return ret;
138+
return IIO_VAL_INT;
139+
80140
case IIO_CHAN_INFO_SCALE:
81-
return IIO_VAL_INT;
141+
*val = MAX22531_VREF_MV;
142+
*val2 = 12;
143+
144+
return IIO_VAL_FRACTIONAL_LOG2;
145+
82146
default:
83147
return -EINVAL;
148+
84149
}
85150
}
86151

87152
static const struct iio_info max22531_info = {
88153
.read_raw = max22531_read_raw,
89154
};
90155

91-
static void max22531_regulator_disable(void *reg)
92-
{
93-
regulator_disable(reg);
94-
}
95-
96156
static int max22531_probe(struct spi_device *spi)
97157
{
98158
dev_info(&spi->dev, "MAX22531: probing ADC\n");
99159

100160
unsigned int ret, prod_id;
161+
const struct max22531_chip_info *info;
101162
struct max22531 *adc;
102163
struct iio_dev *indio_dev;
103164

104165
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
105-
if (!indio_dev) {
106-
dev_err(&spi->dev, "MAX22531: Failed to allocate memory"
107-
"for IIO device.\n");
108-
return -ENOMEM;
109-
}
166+
if (!indio_dev)
167+
dev_err_probe(&spi->dev, -ENODEV,
168+
"MAX22531: Failed to allocate memory or IIO device.\n");
110169

111170
adc = iio_priv(indio_dev);
112171
adc->spi_dev = spi;
113-
114-
indio_dev->name = "max22531";
172+
adc->chip_info = info;
173+
174+
indio_dev->name = adc->chip_info->name;
115175
indio_dev->info = &max22531_info;
116176
indio_dev->channels = max22531_channels;
117177
indio_dev->num_channels = ARRAY_SIZE(max22531_channels);
118178

119179
adc->regmap = devm_regmap_init_spi(spi, &regmap_config);
120180
if (IS_ERR(adc->regmap))
121-
dev_err(&spi->dev, "regmap init failure\n");
181+
return dev_err_probe(&spi->dev, PTR_ERR(adc->regmap),
182+
"regmap init failure\n");
122183

123184
ret = regmap_read(adc->regmap, MAX22531_REG_PROD_ID, &prod_id);
124185
if (ret)
125-
dev_err(&spi->dev, "Failed to read PROD_ID\n");
186+
return dev_err_probe(&spi->dev, PTR_ERR(adc->regmap),
187+
"Failed to read PROD_ID\n");
126188
else
127189
dev_info(&spi->dev, "MAX22531: Successfully read PROD_ID"
128190
": %d from the driver.\n", ret);
129191

130-
adc->vref = devm_regulator_get(&spi->dev, "vref");
131-
if (IS_ERR(adc->vref))
132-
dev_err(&spi->dev, "Failed to retrieve vref\n");
133-
134-
ret = regulator_enable(adc->vref);
135-
if (ret)
136-
return ret;
192+
adc->vddl = devm_regulator_get_enable(&spi->dev, "vddl");
193+
if (IS_ERR(adc->vddl))
194+
return dev_err_probe(&spi->dev, PTR_ERR(adc->vddl),
195+
"Failed to retrieve power logic supply\n");
137196

138-
ret = devm_add_action_or_reset(&spi->dev, max22531_regulator_disable,
139-
adc->vref);
140-
if (ret)
141-
return ret;
197+
adc->vddpl = devm_regulator_get_enable(&spi->dev, "vddpl");
198+
if (IS_ERR(adc->vddpl))
199+
return dev_err_probe(&spi->dev, PTR_ERR(adc->vddpl),
200+
"Failed to retrieve isolated DC-DC supply\n");
142201

143202
return devm_iio_device_register(&spi->dev, indio_dev);
144203
}
145204

146205
static const struct spi_device_id max22531_id[] = {
147-
{ "max22531" },
206+
{ "max22530", (kernel_ulong_t)&max22531_chip_info_tbl[max22530] },
207+
{ "max22531", (kernel_ulong_t)&max22531_chip_info_tbl[max22531] },
208+
{ "max22532", (kernel_ulong_t)&max22531_chip_info_tbl[max22532] },
148209
{ }
149210
};
150211
MODULE_DEVICE_TABLE(spi, max22531_id);
151212

152213
static const struct of_device_id max22531_spi_of_id[] = {
153-
{ .compatible = "adi,max22531" },
214+
{ .compatible = "adi,max22530",
215+
.data = &max22531_chip_info_tbl[max22530], },
216+
{ .compatible = "adi,max22531",
217+
.data = &max22531_chip_info_tbl[max22531], },
218+
{ .compatible = "adi,max22532",
219+
.data = &max22531_chip_info_tbl[max22532], },
154220
{ }
155221
};
156222
MODULE_DEVICE_TABLE(of, max22531_spi_of_id);

0 commit comments

Comments
 (0)