Skip to content

Commit f6eaef5

Browse files
iio: adc: Improve initial drive features
- Update the ovelay file to reflect the evaluation board name - Add Vddl and Vrefin regulators to the overlay file - Update the log print methods - Remove unnecessary code - Improve code style - Add chip_info struct - Add max14001_spi_write_single_reg method, which enables and disables the write register when writing data to another register
1 parent 0ecd86d commit f6eaef5

File tree

4 files changed

+139
-70
lines changed

4 files changed

+139
-70
lines changed

arch/arm/boot/dts/overlays/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
309309
rpi-ltc2991.dtbo \
310310
rpi-ltc4162.dtbo \
311311
rpi-ltc6952.dtbo \
312-
rpi-max14001.dtbo \
312+
rpi-max14001-pmb.dtbo \
313313
rpi-max14830-i2c.dtbo \
314314
rpi-max14830-spi.dtbo \
315315
rpi-max31335.dtbo \

arch/arm/boot/dts/overlays/rpi-max14001-overlay.dts

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
/*
3+
* Overlay for the MAX14001 ADC
4+
*
5+
* Copyright (c) 2025 Marilene Andrade Garcia <marilene.agarcia@gmail.com>
6+
*
7+
* Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/MAX14001-MAX14002.pdf
8+
*/
9+
10+
/dts-v1/;
11+
/plugin/;
12+
13+
/ {
14+
compatible = "brcm,bcm2712";
15+
16+
vdd: fixedregulator@0 {
17+
compatible = "regulator-fixed";
18+
regulator-name = "Isolated DC-DC Power Supply Input Voltage";
19+
regulator-min-microvolt = <3300000>;
20+
regulator-max-microvolt = <3300000>;
21+
regulator-boot-on;
22+
enable-active-high;
23+
status = "okay";
24+
};
25+
26+
vddl: fixedregulator@1 {
27+
compatible = "regulator-fixed";
28+
regulator-name = "Logic Power Supply Voltage";
29+
regulator-min-microvolt = <3300000>;
30+
regulator-max-microvolt = <3300000>;
31+
regulator-boot-on;
32+
enable-active-high;
33+
status = "okay";
34+
};
35+
36+
vrefin: fixedregulator@2 {
37+
compatible = "regulator-fixed";
38+
regulator-name = "Reference Input Range Voltage";
39+
regulator-min-microvolt = <1250000>;
40+
regulator-max-microvolt = <1250000>;
41+
regulator-boot-on;
42+
enable-active-high;
43+
status = "okay";
44+
};
45+
};
46+
47+
&spi0 {
48+
status = "okay";
49+
max14001_voltage_channel: max14001@0 {
50+
compatible = "max14001";
51+
reg = <0x0>;
52+
spi-max-frequency = <5000000>;
53+
vdd-supply = <&vdd>;
54+
vddl-supply = <&vddl>;
55+
vrefin-supply = <&vrefin>;
56+
status = "okay";
57+
};
58+
max14001_current_channel: max14001@1 {
59+
compatible = "max14001";
60+
reg = <0x1>;
61+
spi-max-frequency = <5000000>;
62+
current-channel;
63+
vdd-supply = <&vdd>;
64+
vddl-supply = <&vddl>;
65+
vrefin-supply = <&vrefin>;
66+
status = "okay";
67+
};
68+
};

drivers/iio/adc/max14001.c

Lines changed: 70 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,36 @@
7575
#define MAX14001_REG_WEN_WRITE_ENABLE 0x294
7676
#define MAX14001_REG_WEN_WRITE_DISABLE 0x0
7777

78-
enum max14001_chips {
78+
enum max14001_chip_model {
7979
max14001,
8080
max14002,
8181
};
8282

83+
struct max14001_chip_info {
84+
const char *name;
85+
/* TODO: Add more information */
86+
};
87+
88+
static struct max14001_chip_info max14001_chip_info_tbl[] = {
89+
[max14001] = {
90+
.name = "max14001",
91+
},
92+
[max14002] = {
93+
.name = "max14002",
94+
},
95+
};
96+
8397
struct max14001_state {
8498
struct spi_device *spi;
99+
const struct max14001_chip_info *chip_info;
85100
};
86101

87102
static int max14001_spi_read(struct max14001_state *st, u16 reg, u16 *val)
88103
{
89-
u16 tx = 0;
90-
u16 rx = 0;
91-
u16 reversed = 0;
92-
int ret = 0;
104+
u16 tx, rx, reversed;
105+
int ret;
93106

94-
pr_err("[Log Debug] max14001_spi_read: reg: %x, val: %x\n", reg, *val);
107+
dev_info(&st->spi->dev, "%s: reg: %x, val: %x\n", __func__, reg, *val);
95108

96109
tx |= FIELD_PREP(MAX14001_MASK_ADDR, reg);
97110
tx |= FIELD_PREP(MAX14001_MASK_WR, MAX14001_REG_READ);
@@ -101,37 +114,34 @@ static int max14001_spi_read(struct max14001_state *st, u16 reg, u16 *val)
101114
if (ret < 0)
102115
return ret;
103116

117+
/* TODO: Validate this line in the hw, could be le16_to_cpu */
104118
reversed = bitrev16(be16_to_cpu(rx));
105-
*val = MAX14001_MASK_ADDR&reversed;
119+
*val = FIELD_GET(MAX14001_MASK_ADDR, reversed);
106120

107121
return ret;
108122
}
109123

110124
static int max14001_spi_write(struct max14001_state *st, u16 reg, u16 val)
111125
{
112-
u16 tx = 0;
126+
struct spi_transfer xfer;
127+
int ret;
128+
u16 tx, reversed;
113129
u16 msg = 0;
114-
u16 reversed = 0;
115-
int ret = 0;
116-
117-
pr_err("[Log Debug] max14001_spi_write: reg: %x, val: %x\n", reg, val);
118130

119-
struct spi_transfer xfer = {
120-
.tx_buf = NULL,
121-
.len = 0,
122-
};
131+
dev_info(&st->spi->dev, "%s: reg: %x, val: %x\n", __func__, reg, val);
123132

124133
msg |= FIELD_PREP(MAX14001_MASK_ADDR, reg);
125134
msg |= FIELD_PREP(MAX14001_MASK_WR, MAX14001_REG_WRITE);
126135
msg |= FIELD_PREP(MAX14001_MASK_DATA, val);
127136

128137
reversed = bitrev16(msg);
138+
/* TODO: Validate this line in the hw, could be put_unaligned_le16 */
129139
put_unaligned_be16(reversed, &tx);
130140

131141
xfer.tx_buf = &tx;
132142
xfer.len = sizeof(tx);
133143

134-
pr_err("[Log Debug] max14001_spi_write: msg: %x, tx: %x\n", msg, tx);
144+
dev_info(&st->spi->dev, "%s: msg: %x, tx: %x\n", __func__, msg, tx);
135145

136146
ret = spi_sync_transfer(st->spi, &xfer, 1);
137147
if (ret < 0)
@@ -140,6 +150,28 @@ static int max14001_spi_write(struct max14001_state *st, u16 reg, u16 val)
140150
return ret;
141151
}
142152

153+
static int max14001_spi_write_single_reg(struct max14001_state *st, u16 reg, u16 val)
154+
{
155+
int ret;
156+
157+
//Enable register write
158+
ret = max14001_spi_write(st, MAX14001_REG_WEN, MAX14001_REG_WEN_WRITE_ENABLE);
159+
if (ret < 0)
160+
return ret;
161+
162+
//Write data into register
163+
ret = max14001_spi_write(st, reg, val);
164+
if (ret < 0)
165+
return ret;
166+
167+
//Disable register write
168+
ret = max14001_spi_write(st, MAX14001_REG_WEN, MAX14001_REG_WEN_WRITE_DISABLE);
169+
if (ret < 0)
170+
return ret;
171+
172+
return ret;
173+
}
174+
143175
static int max14001_read_raw(struct iio_dev *indio_dev,
144176
struct iio_chan_spec const *chan,
145177
int *val, int *val2, long mask)
@@ -148,26 +180,25 @@ static int max14001_read_raw(struct iio_dev *indio_dev,
148180

149181
switch (mask) {
150182
case IIO_CHAN_INFO_RAW:
151-
pr_err("[Log Debug] max14001_read_raw: IIO_CHAN_INFO_RAW\n");
183+
dev_info(&st->spi->dev, "%s: IIO_CHAN_INFO_RAW\n", __func__);
152184
return IIO_VAL_INT;
153185
case IIO_CHAN_INFO_SCALE:
154-
pr_err("[Log Debug] max14001_read_raw: IIO_CHAN_INFO_SCALE\n");
186+
dev_info(&st->spi->dev, "%s: IIO_CHAN_INFO_SCALE\n", __func__);
155187
return IIO_VAL_INT;
156188
}
157189

158190
return -EINVAL;
159191
}
160192

193+
/* TODO: Check if this method is nedeed */
161194
static int max14001_write_raw(struct iio_dev *indio_dev,
162195
struct iio_chan_spec const *chan,
163196
int val, int val2, long mask)
164197
{
165198
struct max14001_state *st = iio_priv(indio_dev);
166199

167200
switch (mask) {
168-
case IIO_CHAN_INFO_RAW:
169-
pr_err("[Log Debug] max14001_write_raw: IIO_CHAN_INFO_RAW\n");
170-
return 0;
201+
171202
}
172203

173204
return -EINVAL;
@@ -183,7 +214,6 @@ static const struct iio_chan_spec max14001_channel_voltage[] = {
183214
.type = IIO_VOLTAGE,
184215
.indexed = 1,
185216
.channel = 0,
186-
.output = 0,
187217
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
188218
BIT(IIO_CHAN_INFO_SCALE),
189219
}
@@ -194,32 +224,38 @@ static const struct iio_chan_spec max14001_channel_current[] = {
194224
.type = IIO_CURRENT,
195225
.indexed = 1,
196226
.channel = 0,
197-
.output = 0,
198227
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
199228
BIT(IIO_CHAN_INFO_SCALE),
200229
}
201230
};
202231

203232
static int max14001_probe(struct spi_device *spi)
204233
{
205-
pr_err("[Log Debug] max14001_probe\n");
206-
234+
const struct max14001_chip_info *info;
235+
struct device *dev = &spi->dev;
207236
struct max14001_state *st;
208237
struct iio_dev *indio_dev;
209238
bool current_channel = false;
210239
int ret;
211240

241+
info = spi_get_device_match_data(spi);
242+
if (!dev)
243+
return dev_err_probe(dev, -ENODEV, "Failed to get match data\n");
244+
212245
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
213246
if (!indio_dev)
214247
return -ENOMEM;
215248

216249
st = iio_priv(indio_dev);
217250
st->spi = spi;
251+
st->chip_info = info;
218252

219-
indio_dev->name = "max14001"; //spi_get_device_id(spi)->name;
253+
indio_dev->name = st->chip_info->name;
220254
indio_dev->modes = INDIO_DIRECT_MODE;
221255
indio_dev->info = &max14001_info;
222256

257+
dev_info(&st->spi->dev, "%s: probe\n", __func__);
258+
223259
for_each_available_child_of_node_scoped(spi->dev.of_node, child) {
224260
current_channel = of_property_read_bool(child, "current-channel");
225261
if (current_channel)
@@ -234,21 +270,21 @@ static int max14001_probe(struct spi_device *spi)
234270
indio_dev->num_channels = ARRAY_SIZE(max14001_channel_voltage);
235271
}
236272

237-
//Enable register write
238-
max14001_spi_write(st, MAX14001_REG_WEN, MAX14001_REG_WEN_WRITE_ENABLE);
239273
return devm_iio_device_register(&spi->dev, indio_dev);
240274
}
241275

242276
static const struct spi_device_id max14001_id_table[] = {
243-
{ "max14001", max14001 },
244-
{ "max14002", max14002 },
277+
{ "max14001", (kernel_ulong_t)&max14001_chip_info_tbl[max14001] },
278+
{ "max14002", (kernel_ulong_t)&max14001_chip_info_tbl[max14002] },
245279
{}
246280
};
247281
MODULE_DEVICE_TABLE(spi, max14001_id_table);
248282

249283
static const struct of_device_id max14001_of_match[] = {
250-
{ .compatible = "adi,max14001" },
251-
{ .compatible = "adi,max14002" },
284+
{ .compatible = "adi,max14001",
285+
.data = &max14001_chip_info_tbl[max14001], },
286+
{ .compatible = "adi,max14002",
287+
.data = &max14001_chip_info_tbl[max14002], },
252288
{}
253289
};
254290
MODULE_DEVICE_TABLE(of, max14001_of_match);
@@ -265,4 +301,4 @@ module_spi_driver(max14001_driver);
265301

266302
MODULE_AUTHOR("Marilene Andrade Garcia <marilene.agarcia@gmail.com>");
267303
MODULE_DESCRIPTION("Analog Devices MAX14001/MAX14002 ADCs driver");
268-
MODULE_LICENSE("GPL v2");
304+
MODULE_LICENSE("GPL v2");

0 commit comments

Comments
 (0)