Skip to content

Commit 3aec57d

Browse files
committed
iio: adc: Add regmap support and device tree support
Signed-off-by: Abhinav Jain <[email protected]>
1 parent fad64a4 commit 3aec57d

File tree

1 file changed

+100
-15
lines changed

1 file changed

+100
-15
lines changed

drivers/iio/adc/max22531.c

Lines changed: 100 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,41 @@
11
#include <linux/module.h>
22
#include <linux/spi/spi.h>
33
#include <linux/iio/iio.h>
4+
#include <linux/regmap.h>
5+
#include <linux/regulator/consumer.h>
6+
7+
#define MAX22531_REG_PROD_ID 0x00
8+
#define MAX22531_REG_ADC1 0x01
9+
#define MAX22531_REG_ADC2 0x02
10+
#define MAX22531_REG_ADC3 0x03
11+
#define MAX22531_REG_ADC4 0x04
12+
#define MAX22531_REG_FADC1 0x05
13+
#define MAX22531_REG_FADC2 0x06
14+
#define MAX22531_REG_FADC3 0x07
15+
#define MAX22531_REG_FADC4 0x08
16+
#define MAX22531_REG_COUTHI1 0x09
17+
#define MAX22531_REG_COUTHI2 0x0a
18+
#define MAX22531_REG_COUTHI3 0x0b
19+
#define MAX22531_REG_COUTHI4 0x0c
20+
#define MAX22531_REG_COUTLO1 0x0d
21+
#define MAX22531_REG_COUTLO2 0x0e
22+
#define MAX22531_REG_COUTLO3 0x0f
23+
#define MAX22531_REG_COUTLO4 0x10
24+
#define MAX22531_REG_COUT_STATUS 0x11
25+
#define MAX22531_REG_INTERRUPT_STATUS 0x12
26+
#define MAX22531_REG_INTERRUPT_ENABLE 0x13
27+
#define MAX22531_REG_CONTROL 0x14
428

529
enum max22531_id {
630
max22531,
731
};
832

933
struct max22531 {
10-
struct spi_device *spi;
34+
struct spi_device *spi_dev;
1135
struct regulator *vref;
36+
struct regulator *vddl;
37+
struct regulator *vddf;
38+
struct regmap *regmap;
1239
};
1340

1441
#define MAX22531_CHANNEL(ch) \
@@ -30,53 +57,111 @@ static const struct iio_chan_spec max22531_channels[] = {
3057
IIO_CHAN_SOFT_TIMESTAMP(2),
3158
};
3259

60+
static const struct regmap_config regmap_config = {
61+
.reg_bits = 16,
62+
.val_bits = 16,
63+
.max_register = 0x14,
64+
};
65+
66+
static int max22531_read_raw(struct iio_dev *indio_dev,
67+
struct iio_chan_spec const *chan,
68+
int *val, int *val2, long mask)
69+
{
70+
struct regmap **regmap = iio_priv(indio_dev);
71+
int ret;
72+
73+
/* mock for now */
74+
switch(mask) {
75+
case IIO_CHAN_INFO_RAW:
76+
ret = regmap_read(*regmap, chan->address, val);
77+
if (ret)
78+
return ret;
79+
return IIO_VAL_INT;
80+
case IIO_CHAN_INFO_SCALE:
81+
return IIO_VAL_INT;
82+
default:
83+
return -EINVAL;
84+
}
85+
}
86+
3387
static const struct iio_info max22531_info = {
88+
.read_raw = max22531_read_raw,
3489
};
3590

91+
static void max22531_regulator_disable(void *reg)
92+
{
93+
regulator_disable(reg);
94+
}
95+
3696
static int max22531_probe(struct spi_device *spi)
3797
{
38-
pr_err("max22531: probe on\n");
98+
dev_info(&spi->dev, "MAX22531: probing ADC\n");
3999

100+
unsigned int ret, prod_id;
40101
struct max22531 *adc;
41102
struct iio_dev *indio_dev;
42-
const struct spi_device_id *id = spi_get_device_id(spi);
43103

44104
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
45105
if (!indio_dev) {
46-
pr_err("max22531: Failed to allocate memory for IIO device.\n");
106+
dev_err(&spi->dev, "MAX22531: Failed to allocate memory"
107+
"for IIO device.\n");
47108
return -ENOMEM;
48109
}
49110

50111
adc = iio_priv(indio_dev);
51-
adc->spi = spi;
112+
adc->spi_dev = spi;
52113

53-
indio_dev->name = spi_get_device_id(spi)->name;
114+
indio_dev->name = "max22531";
54115
indio_dev->info = &max22531_info;
55116
indio_dev->channels = max22531_channels;
56117
indio_dev->num_channels = ARRAY_SIZE(max22531_channels);
57118

119+
adc->regmap = devm_regmap_init_spi(spi, &regmap_config);
120+
if (IS_ERR(adc->regmap))
121+
dev_err(&spi->dev, "regmap init failure\n");
122+
123+
ret = regmap_read(adc->regmap, MAX22531_REG_PROD_ID, &prod_id);
124+
if (ret)
125+
dev_err(&spi->dev, "Failed to read PROD_ID\n");
126+
else
127+
dev_info(&spi->dev, "MAX22531: Successfully read PROD_ID"
128+
": %d from the driver.\n", ret);
129+
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;
137+
138+
ret = devm_add_action_or_reset(&spi->dev, max22531_regulator_disable,
139+
adc->vref);
140+
if (ret)
141+
return ret;
142+
58143
return devm_iio_device_register(&spi->dev, indio_dev);
59144
}
60145

61146
static const struct spi_device_id max22531_id[] = {
62-
{ "max22531", max22531 },
63-
{}
147+
{ "max22531" },
148+
{ }
64149
};
65150
MODULE_DEVICE_TABLE(spi, max22531_id);
66151

67-
static const struct of_device_id max22531_dt_ids[] = {
68-
{ .compatible = "maxim,max22531" },
69-
{},
152+
static const struct of_device_id max22531_spi_of_id[] = {
153+
{ .compatible = "adi,max22531" },
154+
{ }
70155
};
71-
MODULE_DEVICE_TABLE(of, max22531_dt_ids);
156+
MODULE_DEVICE_TABLE(of, max22531_spi_of_id);
72157

73158
static struct spi_driver max22531_driver = {
74159
.driver = {
75160
.name = "max22531",
76-
.of_match_table = max22531_dt_ids,
161+
.of_match_table = max22531_spi_of_id,
77162
},
78-
.probe = max22531_probe,
79-
.id_table = max22531_id,
163+
.probe = max22531_probe,
164+
.id_table = max22531_id,
80165
};
81166
module_spi_driver(max22531_driver);
82167

0 commit comments

Comments
 (0)