xref: /openbmc/linux/drivers/iio/adc/max11100.c (revision a8e7e88df9ec1b7df2d12b6ee4ec48aee7b6aec7)
1*a8e7e88dSJacopo Mondi /*
2*a8e7e88dSJacopo Mondi  * iio/adc/max11100.c
3*a8e7e88dSJacopo Mondi  * Maxim max11100 ADC Driver with IIO interface
4*a8e7e88dSJacopo Mondi  *
5*a8e7e88dSJacopo Mondi  * Copyright (C) 2016-17 Renesas Electronics Corporation
6*a8e7e88dSJacopo Mondi  * Copyright (C) 2016-17 Jacopo Mondi
7*a8e7e88dSJacopo Mondi  *
8*a8e7e88dSJacopo Mondi  * This program is free software; you can redistribute it and/or modify
9*a8e7e88dSJacopo Mondi  * it under the terms of the GNU General Public License version 2 as
10*a8e7e88dSJacopo Mondi  * published by the Free Software Foundation.
11*a8e7e88dSJacopo Mondi  */
12*a8e7e88dSJacopo Mondi #include <linux/delay.h>
13*a8e7e88dSJacopo Mondi #include <linux/kernel.h>
14*a8e7e88dSJacopo Mondi #include <linux/module.h>
15*a8e7e88dSJacopo Mondi #include <linux/regulator/consumer.h>
16*a8e7e88dSJacopo Mondi #include <linux/spi/spi.h>
17*a8e7e88dSJacopo Mondi 
18*a8e7e88dSJacopo Mondi #include <linux/iio/iio.h>
19*a8e7e88dSJacopo Mondi #include <linux/iio/driver.h>
20*a8e7e88dSJacopo Mondi 
21*a8e7e88dSJacopo Mondi /*
22*a8e7e88dSJacopo Mondi  * LSB is the ADC single digital step
23*a8e7e88dSJacopo Mondi  * 1 LSB = (vref_mv / 2 ^ 16)
24*a8e7e88dSJacopo Mondi  *
25*a8e7e88dSJacopo Mondi  * LSB is used to calculate analog voltage value
26*a8e7e88dSJacopo Mondi  * from the number of ADC steps count
27*a8e7e88dSJacopo Mondi  *
28*a8e7e88dSJacopo Mondi  * Ain = (count * LSB)
29*a8e7e88dSJacopo Mondi  */
30*a8e7e88dSJacopo Mondi #define MAX11100_LSB_DIV		(1 << 16)
31*a8e7e88dSJacopo Mondi 
32*a8e7e88dSJacopo Mondi struct max11100_state {
33*a8e7e88dSJacopo Mondi 	const struct max11100_chip_desc *desc;
34*a8e7e88dSJacopo Mondi 	struct regulator *vref_reg;
35*a8e7e88dSJacopo Mondi 	struct spi_device *spi;
36*a8e7e88dSJacopo Mondi 
37*a8e7e88dSJacopo Mondi 	/*
38*a8e7e88dSJacopo Mondi 	 * DMA (thus cache coherency maintenance) requires the
39*a8e7e88dSJacopo Mondi 	 * transfer buffers to live in their own cache lines.
40*a8e7e88dSJacopo Mondi 	 */
41*a8e7e88dSJacopo Mondi 	u8 buffer[3] ____cacheline_aligned;
42*a8e7e88dSJacopo Mondi };
43*a8e7e88dSJacopo Mondi 
44*a8e7e88dSJacopo Mondi static struct iio_chan_spec max11100_channels[] = {
45*a8e7e88dSJacopo Mondi 	{ /* [0] */
46*a8e7e88dSJacopo Mondi 		.type = IIO_VOLTAGE,
47*a8e7e88dSJacopo Mondi 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
48*a8e7e88dSJacopo Mondi 				      BIT(IIO_CHAN_INFO_SCALE),
49*a8e7e88dSJacopo Mondi 	},
50*a8e7e88dSJacopo Mondi };
51*a8e7e88dSJacopo Mondi 
52*a8e7e88dSJacopo Mondi static struct max11100_chip_desc {
53*a8e7e88dSJacopo Mondi 	unsigned int num_chan;
54*a8e7e88dSJacopo Mondi 	const struct iio_chan_spec *channels;
55*a8e7e88dSJacopo Mondi } max11100_desc = {
56*a8e7e88dSJacopo Mondi 	.num_chan = ARRAY_SIZE(max11100_channels),
57*a8e7e88dSJacopo Mondi 	.channels = max11100_channels,
58*a8e7e88dSJacopo Mondi };
59*a8e7e88dSJacopo Mondi 
60*a8e7e88dSJacopo Mondi static int max11100_read_single(struct iio_dev *indio_dev, int *val)
61*a8e7e88dSJacopo Mondi {
62*a8e7e88dSJacopo Mondi 	int ret;
63*a8e7e88dSJacopo Mondi 	struct max11100_state *state = iio_priv(indio_dev);
64*a8e7e88dSJacopo Mondi 
65*a8e7e88dSJacopo Mondi 	ret = spi_read(state->spi, state->buffer, sizeof(state->buffer));
66*a8e7e88dSJacopo Mondi 	if (ret) {
67*a8e7e88dSJacopo Mondi 		dev_err(&indio_dev->dev, "SPI transfer failed\n");
68*a8e7e88dSJacopo Mondi 		return ret;
69*a8e7e88dSJacopo Mondi 	}
70*a8e7e88dSJacopo Mondi 
71*a8e7e88dSJacopo Mondi 	/* the first 8 bits sent out from ADC must be 0s */
72*a8e7e88dSJacopo Mondi 	if (state->buffer[0]) {
73*a8e7e88dSJacopo Mondi 		dev_err(&indio_dev->dev, "Invalid value: buffer[0] != 0\n");
74*a8e7e88dSJacopo Mondi 		return -EINVAL;
75*a8e7e88dSJacopo Mondi 	}
76*a8e7e88dSJacopo Mondi 
77*a8e7e88dSJacopo Mondi 	*val = (state->buffer[1] << 8) | state->buffer[2];
78*a8e7e88dSJacopo Mondi 
79*a8e7e88dSJacopo Mondi 	return 0;
80*a8e7e88dSJacopo Mondi }
81*a8e7e88dSJacopo Mondi 
82*a8e7e88dSJacopo Mondi static int max11100_read_raw(struct iio_dev *indio_dev,
83*a8e7e88dSJacopo Mondi 			     struct iio_chan_spec const *chan,
84*a8e7e88dSJacopo Mondi 			     int *val, int *val2, long info)
85*a8e7e88dSJacopo Mondi {
86*a8e7e88dSJacopo Mondi 	int ret, vref_uv;
87*a8e7e88dSJacopo Mondi 	struct max11100_state *state = iio_priv(indio_dev);
88*a8e7e88dSJacopo Mondi 
89*a8e7e88dSJacopo Mondi 	switch (info) {
90*a8e7e88dSJacopo Mondi 	case IIO_CHAN_INFO_RAW:
91*a8e7e88dSJacopo Mondi 		ret = max11100_read_single(indio_dev, val);
92*a8e7e88dSJacopo Mondi 		if (ret)
93*a8e7e88dSJacopo Mondi 			return ret;
94*a8e7e88dSJacopo Mondi 
95*a8e7e88dSJacopo Mondi 		return IIO_VAL_INT;
96*a8e7e88dSJacopo Mondi 
97*a8e7e88dSJacopo Mondi 	case IIO_CHAN_INFO_SCALE:
98*a8e7e88dSJacopo Mondi 		vref_uv = regulator_get_voltage(state->vref_reg);
99*a8e7e88dSJacopo Mondi 		if (vref_uv < 0)
100*a8e7e88dSJacopo Mondi 			/* dummy regulator "get_voltage" returns -EINVAL */
101*a8e7e88dSJacopo Mondi 			return -EINVAL;
102*a8e7e88dSJacopo Mondi 
103*a8e7e88dSJacopo Mondi 		*val =  vref_uv / 1000;
104*a8e7e88dSJacopo Mondi 		*val2 = MAX11100_LSB_DIV;
105*a8e7e88dSJacopo Mondi 		return IIO_VAL_FRACTIONAL;
106*a8e7e88dSJacopo Mondi 	}
107*a8e7e88dSJacopo Mondi 
108*a8e7e88dSJacopo Mondi 	return -EINVAL;
109*a8e7e88dSJacopo Mondi }
110*a8e7e88dSJacopo Mondi 
111*a8e7e88dSJacopo Mondi static const struct iio_info max11100_info = {
112*a8e7e88dSJacopo Mondi 	.driver_module = THIS_MODULE,
113*a8e7e88dSJacopo Mondi 	.read_raw = max11100_read_raw,
114*a8e7e88dSJacopo Mondi };
115*a8e7e88dSJacopo Mondi 
116*a8e7e88dSJacopo Mondi static int max11100_probe(struct spi_device *spi)
117*a8e7e88dSJacopo Mondi {
118*a8e7e88dSJacopo Mondi 	int ret;
119*a8e7e88dSJacopo Mondi 	struct iio_dev *indio_dev;
120*a8e7e88dSJacopo Mondi 	struct max11100_state *state;
121*a8e7e88dSJacopo Mondi 
122*a8e7e88dSJacopo Mondi 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*state));
123*a8e7e88dSJacopo Mondi 	if (!indio_dev)
124*a8e7e88dSJacopo Mondi 		return -ENOMEM;
125*a8e7e88dSJacopo Mondi 
126*a8e7e88dSJacopo Mondi 	spi_set_drvdata(spi, indio_dev);
127*a8e7e88dSJacopo Mondi 
128*a8e7e88dSJacopo Mondi 	state = iio_priv(indio_dev);
129*a8e7e88dSJacopo Mondi 	state->spi = spi;
130*a8e7e88dSJacopo Mondi 	state->desc = &max11100_desc;
131*a8e7e88dSJacopo Mondi 
132*a8e7e88dSJacopo Mondi 	indio_dev->dev.parent = &spi->dev;
133*a8e7e88dSJacopo Mondi 	indio_dev->dev.of_node = spi->dev.of_node;
134*a8e7e88dSJacopo Mondi 	indio_dev->name = "max11100";
135*a8e7e88dSJacopo Mondi 	indio_dev->info = &max11100_info;
136*a8e7e88dSJacopo Mondi 	indio_dev->modes = INDIO_DIRECT_MODE;
137*a8e7e88dSJacopo Mondi 	indio_dev->channels = state->desc->channels;
138*a8e7e88dSJacopo Mondi 	indio_dev->num_channels = state->desc->num_chan;
139*a8e7e88dSJacopo Mondi 
140*a8e7e88dSJacopo Mondi 	state->vref_reg = devm_regulator_get(&spi->dev, "vref");
141*a8e7e88dSJacopo Mondi 	if (IS_ERR(state->vref_reg))
142*a8e7e88dSJacopo Mondi 		return PTR_ERR(state->vref_reg);
143*a8e7e88dSJacopo Mondi 
144*a8e7e88dSJacopo Mondi 	ret = regulator_enable(state->vref_reg);
145*a8e7e88dSJacopo Mondi 	if (ret)
146*a8e7e88dSJacopo Mondi 		return ret;
147*a8e7e88dSJacopo Mondi 
148*a8e7e88dSJacopo Mondi 	ret = iio_device_register(indio_dev);
149*a8e7e88dSJacopo Mondi 	if (ret)
150*a8e7e88dSJacopo Mondi 		goto disable_regulator;
151*a8e7e88dSJacopo Mondi 
152*a8e7e88dSJacopo Mondi 	return 0;
153*a8e7e88dSJacopo Mondi 
154*a8e7e88dSJacopo Mondi disable_regulator:
155*a8e7e88dSJacopo Mondi 	regulator_disable(state->vref_reg);
156*a8e7e88dSJacopo Mondi 
157*a8e7e88dSJacopo Mondi 	return ret;
158*a8e7e88dSJacopo Mondi }
159*a8e7e88dSJacopo Mondi 
160*a8e7e88dSJacopo Mondi static int max11100_remove(struct spi_device *spi)
161*a8e7e88dSJacopo Mondi {
162*a8e7e88dSJacopo Mondi 	struct iio_dev *indio_dev = spi_get_drvdata(spi);
163*a8e7e88dSJacopo Mondi 	struct max11100_state *state = iio_priv(indio_dev);
164*a8e7e88dSJacopo Mondi 
165*a8e7e88dSJacopo Mondi 	regulator_disable(state->vref_reg);
166*a8e7e88dSJacopo Mondi 
167*a8e7e88dSJacopo Mondi 	iio_device_unregister(indio_dev);
168*a8e7e88dSJacopo Mondi 
169*a8e7e88dSJacopo Mondi 	return 0;
170*a8e7e88dSJacopo Mondi }
171*a8e7e88dSJacopo Mondi 
172*a8e7e88dSJacopo Mondi static const struct of_device_id max11100_ids[] = {
173*a8e7e88dSJacopo Mondi 	{.compatible = "maxim,max11100"},
174*a8e7e88dSJacopo Mondi 	{ },
175*a8e7e88dSJacopo Mondi };
176*a8e7e88dSJacopo Mondi MODULE_DEVICE_TABLE(of, max11100_ids);
177*a8e7e88dSJacopo Mondi 
178*a8e7e88dSJacopo Mondi static struct spi_driver max11100_driver = {
179*a8e7e88dSJacopo Mondi 	.driver = {
180*a8e7e88dSJacopo Mondi 		.name	= "max11100",
181*a8e7e88dSJacopo Mondi 		.owner	= THIS_MODULE,
182*a8e7e88dSJacopo Mondi 		.of_match_table = of_match_ptr(max11100_ids),
183*a8e7e88dSJacopo Mondi 	},
184*a8e7e88dSJacopo Mondi 	.probe		= max11100_probe,
185*a8e7e88dSJacopo Mondi 	.remove		= max11100_remove,
186*a8e7e88dSJacopo Mondi };
187*a8e7e88dSJacopo Mondi 
188*a8e7e88dSJacopo Mondi module_spi_driver(max11100_driver);
189*a8e7e88dSJacopo Mondi 
190*a8e7e88dSJacopo Mondi MODULE_AUTHOR("Jacopo Mondi <jacopo@jmondi.org>");
191*a8e7e88dSJacopo Mondi MODULE_DESCRIPTION("Maxim max11100 ADC Driver");
192*a8e7e88dSJacopo Mondi MODULE_LICENSE("GPL v2");
193