blob: 9f186de24cd7439ca00b0cf0a9df82a269139fee [file] [log] [blame]
Martin Blumenstingl3adbf342017-01-22 19:17:13 +01001/*
2 * Amlogic Meson Successive Approximation Register (SAR) A/D Converter
3 *
4 * Copyright (C) 2017 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * You should have received a copy of the GNU General Public License
11 * along with this program. If not, see <http://www.gnu.org/licenses/>.
12 */
13
14#include <linux/bitfield.h>
15#include <linux/clk.h>
16#include <linux/clk-provider.h>
17#include <linux/delay.h>
18#include <linux/io.h>
19#include <linux/iio/iio.h>
20#include <linux/module.h>
Heiner Kallweit3af10912017-02-15 20:31:45 +010021#include <linux/interrupt.h>
Martin Blumenstingl3adbf342017-01-22 19:17:13 +010022#include <linux/of.h>
Heiner Kallweit3af10912017-02-15 20:31:45 +010023#include <linux/of_irq.h>
Martin Blumenstingl3adbf342017-01-22 19:17:13 +010024#include <linux/of_device.h>
25#include <linux/platform_device.h>
26#include <linux/regmap.h>
27#include <linux/regulator/consumer.h>
28
29#define MESON_SAR_ADC_REG0 0x00
30 #define MESON_SAR_ADC_REG0_PANEL_DETECT BIT(31)
31 #define MESON_SAR_ADC_REG0_BUSY_MASK GENMASK(30, 28)
32 #define MESON_SAR_ADC_REG0_DELTA_BUSY BIT(30)
33 #define MESON_SAR_ADC_REG0_AVG_BUSY BIT(29)
34 #define MESON_SAR_ADC_REG0_SAMPLE_BUSY BIT(28)
35 #define MESON_SAR_ADC_REG0_FIFO_FULL BIT(27)
36 #define MESON_SAR_ADC_REG0_FIFO_EMPTY BIT(26)
37 #define MESON_SAR_ADC_REG0_FIFO_COUNT_MASK GENMASK(25, 21)
38 #define MESON_SAR_ADC_REG0_ADC_BIAS_CTRL_MASK GENMASK(20, 19)
39 #define MESON_SAR_ADC_REG0_CURR_CHAN_ID_MASK GENMASK(18, 16)
40 #define MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL BIT(15)
41 #define MESON_SAR_ADC_REG0_SAMPLING_STOP BIT(14)
42 #define MESON_SAR_ADC_REG0_CHAN_DELTA_EN_MASK GENMASK(13, 12)
43 #define MESON_SAR_ADC_REG0_DETECT_IRQ_POL BIT(10)
44 #define MESON_SAR_ADC_REG0_DETECT_IRQ_EN BIT(9)
45 #define MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK GENMASK(8, 4)
46 #define MESON_SAR_ADC_REG0_FIFO_IRQ_EN BIT(3)
47 #define MESON_SAR_ADC_REG0_SAMPLING_START BIT(2)
48 #define MESON_SAR_ADC_REG0_CONTINUOUS_EN BIT(1)
49 #define MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE BIT(0)
50
51#define MESON_SAR_ADC_CHAN_LIST 0x04
52 #define MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK GENMASK(26, 24)
53 #define MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(_chan) \
54 (GENMASK(2, 0) << ((_chan) * 3))
55
56#define MESON_SAR_ADC_AVG_CNTL 0x08
57 #define MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(_chan) \
58 (16 + ((_chan) * 2))
59 #define MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(_chan) \
60 (GENMASK(17, 16) << ((_chan) * 2))
61 #define MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(_chan) \
62 (0 + ((_chan) * 2))
63 #define MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(_chan) \
64 (GENMASK(1, 0) << ((_chan) * 2))
65
66#define MESON_SAR_ADC_REG3 0x0c
67 #define MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY BIT(31)
68 #define MESON_SAR_ADC_REG3_CLK_EN BIT(30)
69 #define MESON_SAR_ADC_REG3_BL30_INITIALIZED BIT(28)
70 #define MESON_SAR_ADC_REG3_CTRL_CONT_RING_COUNTER_EN BIT(27)
71 #define MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE BIT(26)
72 #define MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK GENMASK(25, 23)
73 #define MESON_SAR_ADC_REG3_DETECT_EN BIT(22)
74 #define MESON_SAR_ADC_REG3_ADC_EN BIT(21)
75 #define MESON_SAR_ADC_REG3_PANEL_DETECT_COUNT_MASK GENMASK(20, 18)
76 #define MESON_SAR_ADC_REG3_PANEL_DETECT_FILTER_TB_MASK GENMASK(17, 16)
77 #define MESON_SAR_ADC_REG3_ADC_CLK_DIV_SHIFT 10
78 #define MESON_SAR_ADC_REG3_ADC_CLK_DIV_WIDTH 5
79 #define MESON_SAR_ADC_REG3_BLOCK_DLY_SEL_MASK GENMASK(9, 8)
80 #define MESON_SAR_ADC_REG3_BLOCK_DLY_MASK GENMASK(7, 0)
81
82#define MESON_SAR_ADC_DELAY 0x10
83 #define MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK GENMASK(25, 24)
84 #define MESON_SAR_ADC_DELAY_BL30_BUSY BIT(15)
85 #define MESON_SAR_ADC_DELAY_KERNEL_BUSY BIT(14)
86 #define MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK GENMASK(23, 16)
87 #define MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK GENMASK(9, 8)
88 #define MESON_SAR_ADC_DELAY_SAMPLE_DLY_CNT_MASK GENMASK(7, 0)
89
90#define MESON_SAR_ADC_LAST_RD 0x14
91 #define MESON_SAR_ADC_LAST_RD_LAST_CHANNEL1_MASK GENMASK(23, 16)
92 #define MESON_SAR_ADC_LAST_RD_LAST_CHANNEL0_MASK GENMASK(9, 0)
93
94#define MESON_SAR_ADC_FIFO_RD 0x18
95 #define MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK GENMASK(14, 12)
96 #define MESON_SAR_ADC_FIFO_RD_SAMPLE_VALUE_MASK GENMASK(11, 0)
97
98#define MESON_SAR_ADC_AUX_SW 0x1c
99 #define MESON_SAR_ADC_AUX_SW_MUX_SEL_CHAN_MASK(_chan) \
100 (GENMASK(10, 8) << (((_chan) - 2) * 2))
101 #define MESON_SAR_ADC_AUX_SW_VREF_P_MUX BIT(6)
102 #define MESON_SAR_ADC_AUX_SW_VREF_N_MUX BIT(5)
103 #define MESON_SAR_ADC_AUX_SW_MODE_SEL BIT(4)
104 #define MESON_SAR_ADC_AUX_SW_YP_DRIVE_SW BIT(3)
105 #define MESON_SAR_ADC_AUX_SW_XP_DRIVE_SW BIT(2)
106 #define MESON_SAR_ADC_AUX_SW_YM_DRIVE_SW BIT(1)
107 #define MESON_SAR_ADC_AUX_SW_XM_DRIVE_SW BIT(0)
108
109#define MESON_SAR_ADC_CHAN_10_SW 0x20
110 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK GENMASK(25, 23)
111 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_VREF_P_MUX BIT(22)
112 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_VREF_N_MUX BIT(21)
113 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_MODE_SEL BIT(20)
114 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_YP_DRIVE_SW BIT(19)
115 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_XP_DRIVE_SW BIT(18)
116 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_YM_DRIVE_SW BIT(17)
117 #define MESON_SAR_ADC_CHAN_10_SW_CHAN1_XM_DRIVE_SW BIT(16)
118 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_MUX_SEL_MASK GENMASK(9, 7)
119 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_VREF_P_MUX BIT(6)
120 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_VREF_N_MUX BIT(5)
121 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_MODE_SEL BIT(4)
122 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_YP_DRIVE_SW BIT(3)
123 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_XP_DRIVE_SW BIT(2)
124 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_YM_DRIVE_SW BIT(1)
125 #define MESON_SAR_ADC_CHAN_10_SW_CHAN0_XM_DRIVE_SW BIT(0)
126
127#define MESON_SAR_ADC_DETECT_IDLE_SW 0x24
128 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_SW_EN BIT(26)
129 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK GENMASK(25, 23)
130 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_VREF_P_MUX BIT(22)
131 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_VREF_N_MUX BIT(21)
132 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MODE_SEL BIT(20)
133 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_YP_DRIVE_SW BIT(19)
134 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_XP_DRIVE_SW BIT(18)
135 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_YM_DRIVE_SW BIT(17)
136 #define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_XM_DRIVE_SW BIT(16)
137 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK GENMASK(9, 7)
138 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_VREF_P_MUX BIT(6)
139 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_VREF_N_MUX BIT(5)
140 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MODE_SEL BIT(4)
141 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_YP_DRIVE_SW BIT(3)
142 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_XP_DRIVE_SW BIT(2)
143 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_YM_DRIVE_SW BIT(1)
144 #define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_XM_DRIVE_SW BIT(0)
145
146#define MESON_SAR_ADC_DELTA_10 0x28
147 #define MESON_SAR_ADC_DELTA_10_TEMP_SEL BIT(27)
148 #define MESON_SAR_ADC_DELTA_10_TS_REVE1 BIT(26)
149 #define MESON_SAR_ADC_DELTA_10_CHAN1_DELTA_VALUE_MASK GENMASK(25, 16)
150 #define MESON_SAR_ADC_DELTA_10_TS_REVE0 BIT(15)
151 #define MESON_SAR_ADC_DELTA_10_TS_C_SHIFT 11
152 #define MESON_SAR_ADC_DELTA_10_TS_C_MASK GENMASK(14, 11)
153 #define MESON_SAR_ADC_DELTA_10_TS_VBG_EN BIT(10)
154 #define MESON_SAR_ADC_DELTA_10_CHAN0_DELTA_VALUE_MASK GENMASK(9, 0)
155
156/*
157 * NOTE: registers from here are undocumented (the vendor Linux kernel driver
158 * and u-boot source served as reference). These only seem to be relevant on
159 * GXBB and newer.
160 */
161#define MESON_SAR_ADC_REG11 0x2c
162 #define MESON_SAR_ADC_REG11_BANDGAP_EN BIT(13)
163
164#define MESON_SAR_ADC_REG13 0x34
165 #define MESON_SAR_ADC_REG13_12BIT_CALIBRATION_MASK GENMASK(13, 8)
166
167#define MESON_SAR_ADC_MAX_FIFO_SIZE 32
Heiner Kallweit3af10912017-02-15 20:31:45 +0100168#define MESON_SAR_ADC_TIMEOUT 100 /* ms */
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100169
170#define MESON_SAR_ADC_CHAN(_chan) { \
171 .type = IIO_VOLTAGE, \
172 .indexed = 1, \
173 .channel = _chan, \
174 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
175 BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
176 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
177 .datasheet_name = "SAR_ADC_CH"#_chan, \
178}
179
180/*
181 * TODO: the hardware supports IIO_TEMP for channel 6 as well which is
182 * currently not supported by this driver.
183 */
184static const struct iio_chan_spec meson_sar_adc_iio_channels[] = {
185 MESON_SAR_ADC_CHAN(0),
186 MESON_SAR_ADC_CHAN(1),
187 MESON_SAR_ADC_CHAN(2),
188 MESON_SAR_ADC_CHAN(3),
189 MESON_SAR_ADC_CHAN(4),
190 MESON_SAR_ADC_CHAN(5),
191 MESON_SAR_ADC_CHAN(6),
192 MESON_SAR_ADC_CHAN(7),
193 IIO_CHAN_SOFT_TIMESTAMP(8),
194};
195
196enum meson_sar_adc_avg_mode {
197 NO_AVERAGING = 0x0,
198 MEAN_AVERAGING = 0x1,
199 MEDIAN_AVERAGING = 0x2,
200};
201
202enum meson_sar_adc_num_samples {
203 ONE_SAMPLE = 0x0,
204 TWO_SAMPLES = 0x1,
205 FOUR_SAMPLES = 0x2,
206 EIGHT_SAMPLES = 0x3,
207};
208
209enum meson_sar_adc_chan7_mux_sel {
210 CHAN7_MUX_VSS = 0x0,
211 CHAN7_MUX_VDD_DIV4 = 0x1,
212 CHAN7_MUX_VDD_DIV2 = 0x2,
213 CHAN7_MUX_VDD_MUL3_DIV4 = 0x3,
214 CHAN7_MUX_VDD = 0x4,
215 CHAN7_MUX_CH7_INPUT = 0x7,
216};
217
218struct meson_sar_adc_data {
219 unsigned int resolution;
220 const char *name;
221};
222
223struct meson_sar_adc_priv {
224 struct regmap *regmap;
225 struct regulator *vref;
226 const struct meson_sar_adc_data *data;
227 struct clk *clkin;
228 struct clk *core_clk;
229 struct clk *sana_clk;
230 struct clk *adc_sel_clk;
231 struct clk *adc_clk;
232 struct clk_gate clk_gate;
233 struct clk *adc_div_clk;
234 struct clk_divider clk_div;
Heiner Kallweit3af10912017-02-15 20:31:45 +0100235 struct completion done;
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100236};
237
238static const struct regmap_config meson_sar_adc_regmap_config = {
239 .reg_bits = 8,
240 .val_bits = 32,
241 .reg_stride = 4,
242 .max_register = MESON_SAR_ADC_REG13,
243};
244
245static unsigned int meson_sar_adc_get_fifo_count(struct iio_dev *indio_dev)
246{
247 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
248 u32 regval;
249
250 regmap_read(priv->regmap, MESON_SAR_ADC_REG0, &regval);
251
252 return FIELD_GET(MESON_SAR_ADC_REG0_FIFO_COUNT_MASK, regval);
253}
254
255static int meson_sar_adc_wait_busy_clear(struct iio_dev *indio_dev)
256{
257 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
258 int regval, timeout = 10000;
259
260 /*
261 * NOTE: we need a small delay before reading the status, otherwise
262 * the sample engine may not have started internally (which would
263 * seem to us that sampling is already finished).
264 */
265 do {
266 udelay(1);
267 regmap_read(priv->regmap, MESON_SAR_ADC_REG0, &regval);
268 } while (FIELD_GET(MESON_SAR_ADC_REG0_BUSY_MASK, regval) && timeout--);
269
270 if (timeout < 0)
271 return -ETIMEDOUT;
272
273 return 0;
274}
275
276static int meson_sar_adc_read_raw_sample(struct iio_dev *indio_dev,
277 const struct iio_chan_spec *chan,
278 int *val)
279{
280 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
Heiner Kallweit3af10912017-02-15 20:31:45 +0100281 int regval, fifo_chan, fifo_val, sum = 0, count = 0;
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100282
Heiner Kallweit3af10912017-02-15 20:31:45 +0100283 if(!wait_for_completion_timeout(&priv->done,
284 msecs_to_jiffies(MESON_SAR_ADC_TIMEOUT)))
285 return -ETIMEDOUT;
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100286
287 while (meson_sar_adc_get_fifo_count(indio_dev) > 0 &&
288 count < MESON_SAR_ADC_MAX_FIFO_SIZE) {
289 regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, &regval);
290
291 fifo_chan = FIELD_GET(MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK,
292 regval);
293 if (fifo_chan != chan->channel)
294 continue;
295
296 fifo_val = FIELD_GET(MESON_SAR_ADC_FIFO_RD_SAMPLE_VALUE_MASK,
297 regval);
298 fifo_val &= (BIT(priv->data->resolution) - 1);
299
300 sum += fifo_val;
301 count++;
302 }
303
304 if (!count)
305 return -ENOENT;
306
307 *val = sum / count;
308
309 return 0;
310}
311
312static void meson_sar_adc_set_averaging(struct iio_dev *indio_dev,
313 const struct iio_chan_spec *chan,
314 enum meson_sar_adc_avg_mode mode,
315 enum meson_sar_adc_num_samples samples)
316{
317 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
318 int val, channel = chan->channel;
319
320 val = samples << MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(channel);
321 regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
322 MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(channel),
323 val);
324
325 val = mode << MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(channel);
326 regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
327 MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(channel), val);
328}
329
330static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
331 const struct iio_chan_spec *chan)
332{
333 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
334 u32 regval;
335
336 /*
337 * the SAR ADC engine allows sampling multiple channels at the same
338 * time. to keep it simple we're only working with one *internal*
339 * channel, which starts counting at index 0 (which means: count = 1).
340 */
341 regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK, 0);
342 regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
343 MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK, regval);
344
345 /* map channel index 0 to the channel which we want to read */
346 regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0),
347 chan->channel);
348 regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
349 MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0), regval);
350
351 regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
352 chan->channel);
353 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
354 MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
355 regval);
356
357 regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
358 chan->channel);
359 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
360 MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
361 regval);
362
363 if (chan->channel == 6)
364 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
365 MESON_SAR_ADC_DELTA_10_TEMP_SEL, 0);
366}
367
368static void meson_sar_adc_set_chan7_mux(struct iio_dev *indio_dev,
369 enum meson_sar_adc_chan7_mux_sel sel)
370{
371 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
372 u32 regval;
373
374 regval = FIELD_PREP(MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, sel);
375 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
376 MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, regval);
377
378 usleep_range(10, 20);
379}
380
381static void meson_sar_adc_start_sample_engine(struct iio_dev *indio_dev)
382{
383 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
384
Heiner Kallweit3af10912017-02-15 20:31:45 +0100385 reinit_completion(&priv->done);
386
387 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
388 MESON_SAR_ADC_REG0_FIFO_IRQ_EN,
389 MESON_SAR_ADC_REG0_FIFO_IRQ_EN);
390
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100391 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
392 MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE,
393 MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE);
394
395 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
396 MESON_SAR_ADC_REG0_SAMPLING_START,
397 MESON_SAR_ADC_REG0_SAMPLING_START);
398}
399
400static void meson_sar_adc_stop_sample_engine(struct iio_dev *indio_dev)
401{
402 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
403
404 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
Heiner Kallweit3af10912017-02-15 20:31:45 +0100405 MESON_SAR_ADC_REG0_FIFO_IRQ_EN, 0);
406
407 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100408 MESON_SAR_ADC_REG0_SAMPLING_STOP,
409 MESON_SAR_ADC_REG0_SAMPLING_STOP);
410
411 /* wait until all modules are stopped */
412 meson_sar_adc_wait_busy_clear(indio_dev);
413
414 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
415 MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE, 0);
416}
417
418static int meson_sar_adc_lock(struct iio_dev *indio_dev)
419{
420 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
421 int val, timeout = 10000;
422
423 mutex_lock(&indio_dev->mlock);
424
425 /* prevent BL30 from using the SAR ADC while we are using it */
426 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
427 MESON_SAR_ADC_DELAY_KERNEL_BUSY,
428 MESON_SAR_ADC_DELAY_KERNEL_BUSY);
429
430 /* wait until BL30 releases it's lock (so we can use the SAR ADC) */
431 do {
432 udelay(1);
433 regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val);
434 } while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--);
435
436 if (timeout < 0)
437 return -ETIMEDOUT;
438
439 return 0;
440}
441
442static void meson_sar_adc_unlock(struct iio_dev *indio_dev)
443{
444 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
445
446 /* allow BL30 to use the SAR ADC again */
447 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
448 MESON_SAR_ADC_DELAY_KERNEL_BUSY, 0);
449
450 mutex_unlock(&indio_dev->mlock);
451}
452
453static void meson_sar_adc_clear_fifo(struct iio_dev *indio_dev)
454{
455 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
456 int count;
457
458 for (count = 0; count < MESON_SAR_ADC_MAX_FIFO_SIZE; count++) {
459 if (!meson_sar_adc_get_fifo_count(indio_dev))
460 break;
461
462 regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, 0);
463 }
464}
465
466static int meson_sar_adc_get_sample(struct iio_dev *indio_dev,
467 const struct iio_chan_spec *chan,
468 enum meson_sar_adc_avg_mode avg_mode,
469 enum meson_sar_adc_num_samples avg_samples,
470 int *val)
471{
472 int ret;
473
474 ret = meson_sar_adc_lock(indio_dev);
475 if (ret)
476 return ret;
477
478 /* clear the FIFO to make sure we're not reading old values */
479 meson_sar_adc_clear_fifo(indio_dev);
480
481 meson_sar_adc_set_averaging(indio_dev, chan, avg_mode, avg_samples);
482
483 meson_sar_adc_enable_channel(indio_dev, chan);
484
485 meson_sar_adc_start_sample_engine(indio_dev);
486 ret = meson_sar_adc_read_raw_sample(indio_dev, chan, val);
487 meson_sar_adc_stop_sample_engine(indio_dev);
488
489 meson_sar_adc_unlock(indio_dev);
490
491 if (ret) {
492 dev_warn(indio_dev->dev.parent,
493 "failed to read sample for channel %d: %d\n",
494 chan->channel, ret);
495 return ret;
496 }
497
498 return IIO_VAL_INT;
499}
500
501static int meson_sar_adc_iio_info_read_raw(struct iio_dev *indio_dev,
502 const struct iio_chan_spec *chan,
503 int *val, int *val2, long mask)
504{
505 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
506 int ret;
507
508 switch (mask) {
509 case IIO_CHAN_INFO_RAW:
510 return meson_sar_adc_get_sample(indio_dev, chan, NO_AVERAGING,
511 ONE_SAMPLE, val);
512 break;
513
514 case IIO_CHAN_INFO_AVERAGE_RAW:
515 return meson_sar_adc_get_sample(indio_dev, chan,
516 MEAN_AVERAGING, EIGHT_SAMPLES,
517 val);
518 break;
519
520 case IIO_CHAN_INFO_SCALE:
521 ret = regulator_get_voltage(priv->vref);
522 if (ret < 0) {
523 dev_err(indio_dev->dev.parent,
524 "failed to get vref voltage: %d\n", ret);
525 return ret;
526 }
527
528 *val = ret / 1000;
529 *val2 = priv->data->resolution;
530 return IIO_VAL_FRACTIONAL_LOG2;
531
532 default:
533 return -EINVAL;
534 }
535}
536
537static int meson_sar_adc_clk_init(struct iio_dev *indio_dev,
538 void __iomem *base)
539{
540 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
541 struct clk_init_data init;
542 const char *clk_parents[1];
543
544 init.name = devm_kasprintf(&indio_dev->dev, GFP_KERNEL, "%s#adc_div",
545 of_node_full_name(indio_dev->dev.of_node));
546 init.flags = 0;
547 init.ops = &clk_divider_ops;
548 clk_parents[0] = __clk_get_name(priv->clkin);
549 init.parent_names = clk_parents;
550 init.num_parents = 1;
551
552 priv->clk_div.reg = base + MESON_SAR_ADC_REG3;
553 priv->clk_div.shift = MESON_SAR_ADC_REG3_ADC_CLK_DIV_SHIFT;
554 priv->clk_div.width = MESON_SAR_ADC_REG3_ADC_CLK_DIV_WIDTH;
555 priv->clk_div.hw.init = &init;
556 priv->clk_div.flags = 0;
557
558 priv->adc_div_clk = devm_clk_register(&indio_dev->dev,
559 &priv->clk_div.hw);
560 if (WARN_ON(IS_ERR(priv->adc_div_clk)))
561 return PTR_ERR(priv->adc_div_clk);
562
563 init.name = devm_kasprintf(&indio_dev->dev, GFP_KERNEL, "%s#adc_en",
564 of_node_full_name(indio_dev->dev.of_node));
565 init.flags = CLK_SET_RATE_PARENT;
566 init.ops = &clk_gate_ops;
567 clk_parents[0] = __clk_get_name(priv->adc_div_clk);
568 init.parent_names = clk_parents;
569 init.num_parents = 1;
570
571 priv->clk_gate.reg = base + MESON_SAR_ADC_REG3;
572 priv->clk_gate.bit_idx = fls(MESON_SAR_ADC_REG3_CLK_EN);
573 priv->clk_gate.hw.init = &init;
574
575 priv->adc_clk = devm_clk_register(&indio_dev->dev, &priv->clk_gate.hw);
576 if (WARN_ON(IS_ERR(priv->adc_clk)))
577 return PTR_ERR(priv->adc_clk);
578
579 return 0;
580}
581
582static int meson_sar_adc_init(struct iio_dev *indio_dev)
583{
584 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
585 int regval, ret;
586
587 /*
588 * make sure we start at CH7 input since the other muxes are only used
589 * for internal calibration.
590 */
591 meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_CH7_INPUT);
592
593 /*
594 * leave sampling delay and the input clocks as configured by BL30 to
595 * make sure BL30 gets the values it expects when reading the
596 * temperature sensor.
597 */
598 regmap_read(priv->regmap, MESON_SAR_ADC_REG3, &regval);
599 if (regval & MESON_SAR_ADC_REG3_BL30_INITIALIZED)
600 return 0;
601
602 meson_sar_adc_stop_sample_engine(indio_dev);
603
604 /* update the channel 6 MUX to select the temperature sensor */
605 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
606 MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL,
607 MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL);
608
609 /* disable all channels by default */
610 regmap_write(priv->regmap, MESON_SAR_ADC_CHAN_LIST, 0x0);
611
612 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
613 MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE, 0);
614 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
615 MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY,
616 MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY);
617
618 /* delay between two samples = (10+1) * 1uS */
619 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
620 MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
621 FIELD_PREP(MESON_SAR_ADC_DELAY_SAMPLE_DLY_CNT_MASK,
622 10));
623 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
624 MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK,
625 FIELD_PREP(MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK,
626 0));
627
628 /* delay between two samples = (10+1) * 1uS */
629 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
630 MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
631 FIELD_PREP(MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
632 10));
633 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
634 MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK,
635 FIELD_PREP(MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK,
636 1));
637
638 ret = clk_set_parent(priv->adc_sel_clk, priv->clkin);
639 if (ret) {
640 dev_err(indio_dev->dev.parent,
641 "failed to set adc parent to clkin\n");
642 return ret;
643 }
644
645 ret = clk_set_rate(priv->adc_clk, 1200000);
646 if (ret) {
647 dev_err(indio_dev->dev.parent,
648 "failed to set adc clock rate\n");
649 return ret;
650 }
651
652 return 0;
653}
654
655static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev)
656{
657 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
658 int ret;
Heiner Kallweit3af10912017-02-15 20:31:45 +0100659 u32 regval;
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100660
661 ret = meson_sar_adc_lock(indio_dev);
662 if (ret)
663 goto err_lock;
664
665 ret = regulator_enable(priv->vref);
666 if (ret < 0) {
667 dev_err(indio_dev->dev.parent,
668 "failed to enable vref regulator\n");
669 goto err_vref;
670 }
671
672 ret = clk_prepare_enable(priv->core_clk);
673 if (ret) {
674 dev_err(indio_dev->dev.parent, "failed to enable core clk\n");
675 goto err_core_clk;
676 }
677
678 ret = clk_prepare_enable(priv->sana_clk);
679 if (ret) {
680 dev_err(indio_dev->dev.parent, "failed to enable sana clk\n");
681 goto err_sana_clk;
682 }
683
Heiner Kallweit3af10912017-02-15 20:31:45 +0100684 regval = FIELD_PREP(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, 1);
685 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
686 MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval);
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100687 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG11,
688 MESON_SAR_ADC_REG11_BANDGAP_EN,
689 MESON_SAR_ADC_REG11_BANDGAP_EN);
690 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
691 MESON_SAR_ADC_REG3_ADC_EN,
692 MESON_SAR_ADC_REG3_ADC_EN);
693
694 udelay(5);
695
696 ret = clk_prepare_enable(priv->adc_clk);
697 if (ret) {
698 dev_err(indio_dev->dev.parent, "failed to enable adc clk\n");
699 goto err_adc_clk;
700 }
701
702 meson_sar_adc_unlock(indio_dev);
703
704 return 0;
705
706err_adc_clk:
707 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
708 MESON_SAR_ADC_REG3_ADC_EN, 0);
709 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG11,
710 MESON_SAR_ADC_REG11_BANDGAP_EN, 0);
711 clk_disable_unprepare(priv->sana_clk);
712err_sana_clk:
713 clk_disable_unprepare(priv->core_clk);
714err_core_clk:
715 regulator_disable(priv->vref);
716err_vref:
717 meson_sar_adc_unlock(indio_dev);
718err_lock:
719 return ret;
720}
721
722static int meson_sar_adc_hw_disable(struct iio_dev *indio_dev)
723{
724 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
725 int ret;
726
727 ret = meson_sar_adc_lock(indio_dev);
728 if (ret)
729 return ret;
730
731 clk_disable_unprepare(priv->adc_clk);
732
733 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
734 MESON_SAR_ADC_REG3_ADC_EN, 0);
735 regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG11,
736 MESON_SAR_ADC_REG11_BANDGAP_EN, 0);
737
738 clk_disable_unprepare(priv->sana_clk);
739 clk_disable_unprepare(priv->core_clk);
740
741 regulator_disable(priv->vref);
742
743 meson_sar_adc_unlock(indio_dev);
744
745 return 0;
746}
747
Heiner Kallweit3af10912017-02-15 20:31:45 +0100748static irqreturn_t meson_sar_adc_irq(int irq, void *data)
749{
750 struct iio_dev *indio_dev = data;
751 struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
752 unsigned int cnt, threshold;
753 u32 regval;
754
755 regmap_read(priv->regmap, MESON_SAR_ADC_REG0, &regval);
756 cnt = FIELD_GET(MESON_SAR_ADC_REG0_FIFO_COUNT_MASK, regval);
757 threshold = FIELD_GET(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval);
758
759 if (cnt < threshold)
760 return IRQ_NONE;
761
762 complete(&priv->done);
763
764 return IRQ_HANDLED;
765}
766
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100767static const struct iio_info meson_sar_adc_iio_info = {
768 .read_raw = meson_sar_adc_iio_info_read_raw,
769 .driver_module = THIS_MODULE,
770};
771
772struct meson_sar_adc_data meson_sar_adc_gxbb_data = {
773 .resolution = 10,
774 .name = "meson-gxbb-saradc",
775};
776
777struct meson_sar_adc_data meson_sar_adc_gxl_data = {
778 .resolution = 12,
779 .name = "meson-gxl-saradc",
780};
781
782struct meson_sar_adc_data meson_sar_adc_gxm_data = {
783 .resolution = 12,
784 .name = "meson-gxm-saradc",
785};
786
787static const struct of_device_id meson_sar_adc_of_match[] = {
788 {
789 .compatible = "amlogic,meson-gxbb-saradc",
790 .data = &meson_sar_adc_gxbb_data,
791 }, {
792 .compatible = "amlogic,meson-gxl-saradc",
793 .data = &meson_sar_adc_gxl_data,
794 }, {
795 .compatible = "amlogic,meson-gxm-saradc",
796 .data = &meson_sar_adc_gxm_data,
797 },
798 {},
799};
800MODULE_DEVICE_TABLE(of, meson_sar_adc_of_match);
801
802static int meson_sar_adc_probe(struct platform_device *pdev)
803{
804 struct meson_sar_adc_priv *priv;
805 struct iio_dev *indio_dev;
806 struct resource *res;
807 void __iomem *base;
808 const struct of_device_id *match;
Heiner Kallweit3af10912017-02-15 20:31:45 +0100809 int irq, ret;
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100810
811 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv));
812 if (!indio_dev) {
813 dev_err(&pdev->dev, "failed allocating iio device\n");
814 return -ENOMEM;
815 }
816
817 priv = iio_priv(indio_dev);
Heiner Kallweit3af10912017-02-15 20:31:45 +0100818 init_completion(&priv->done);
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100819
820 match = of_match_device(meson_sar_adc_of_match, &pdev->dev);
821 priv->data = match->data;
822
823 indio_dev->name = priv->data->name;
824 indio_dev->dev.parent = &pdev->dev;
825 indio_dev->dev.of_node = pdev->dev.of_node;
826 indio_dev->modes = INDIO_DIRECT_MODE;
827 indio_dev->info = &meson_sar_adc_iio_info;
828
829 indio_dev->channels = meson_sar_adc_iio_channels;
830 indio_dev->num_channels = ARRAY_SIZE(meson_sar_adc_iio_channels);
831
832 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
833 base = devm_ioremap_resource(&pdev->dev, res);
834 if (IS_ERR(base))
835 return PTR_ERR(base);
836
Heiner Kallweit3af10912017-02-15 20:31:45 +0100837 irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
838 if (!irq)
839 return -EINVAL;
840
841 ret = devm_request_irq(&pdev->dev, irq, meson_sar_adc_irq, IRQF_SHARED,
842 dev_name(&pdev->dev), indio_dev);
843 if (ret)
844 return ret;
845
Martin Blumenstingl3adbf342017-01-22 19:17:13 +0100846 priv->regmap = devm_regmap_init_mmio(&pdev->dev, base,
847 &meson_sar_adc_regmap_config);
848 if (IS_ERR(priv->regmap))
849 return PTR_ERR(priv->regmap);
850
851 priv->clkin = devm_clk_get(&pdev->dev, "clkin");
852 if (IS_ERR(priv->clkin)) {
853 dev_err(&pdev->dev, "failed to get clkin\n");
854 return PTR_ERR(priv->clkin);
855 }
856
857 priv->core_clk = devm_clk_get(&pdev->dev, "core");
858 if (IS_ERR(priv->core_clk)) {
859 dev_err(&pdev->dev, "failed to get core clk\n");
860 return PTR_ERR(priv->core_clk);
861 }
862
863 priv->sana_clk = devm_clk_get(&pdev->dev, "sana");
864 if (IS_ERR(priv->sana_clk)) {
865 if (PTR_ERR(priv->sana_clk) == -ENOENT) {
866 priv->sana_clk = NULL;
867 } else {
868 dev_err(&pdev->dev, "failed to get sana clk\n");
869 return PTR_ERR(priv->sana_clk);
870 }
871 }
872
873 priv->adc_clk = devm_clk_get(&pdev->dev, "adc_clk");
874 if (IS_ERR(priv->adc_clk)) {
875 if (PTR_ERR(priv->adc_clk) == -ENOENT) {
876 priv->adc_clk = NULL;
877 } else {
878 dev_err(&pdev->dev, "failed to get adc clk\n");
879 return PTR_ERR(priv->adc_clk);
880 }
881 }
882
883 priv->adc_sel_clk = devm_clk_get(&pdev->dev, "adc_sel");
884 if (IS_ERR(priv->adc_sel_clk)) {
885 if (PTR_ERR(priv->adc_sel_clk) == -ENOENT) {
886 priv->adc_sel_clk = NULL;
887 } else {
888 dev_err(&pdev->dev, "failed to get adc_sel clk\n");
889 return PTR_ERR(priv->adc_sel_clk);
890 }
891 }
892
893 /* on pre-GXBB SoCs the SAR ADC itself provides the ADC clock: */
894 if (!priv->adc_clk) {
895 ret = meson_sar_adc_clk_init(indio_dev, base);
896 if (ret)
897 return ret;
898 }
899
900 priv->vref = devm_regulator_get(&pdev->dev, "vref");
901 if (IS_ERR(priv->vref)) {
902 dev_err(&pdev->dev, "failed to get vref regulator\n");
903 return PTR_ERR(priv->vref);
904 }
905
906 ret = meson_sar_adc_init(indio_dev);
907 if (ret)
908 goto err;
909
910 ret = meson_sar_adc_hw_enable(indio_dev);
911 if (ret)
912 goto err;
913
914 platform_set_drvdata(pdev, indio_dev);
915
916 ret = iio_device_register(indio_dev);
917 if (ret)
918 goto err_hw;
919
920 return 0;
921
922err_hw:
923 meson_sar_adc_hw_disable(indio_dev);
924err:
925 return ret;
926}
927
928static int meson_sar_adc_remove(struct platform_device *pdev)
929{
930 struct iio_dev *indio_dev = platform_get_drvdata(pdev);
931
932 iio_device_unregister(indio_dev);
933
934 return meson_sar_adc_hw_disable(indio_dev);
935}
936
937static int __maybe_unused meson_sar_adc_suspend(struct device *dev)
938{
939 struct iio_dev *indio_dev = dev_get_drvdata(dev);
940
941 return meson_sar_adc_hw_disable(indio_dev);
942}
943
944static int __maybe_unused meson_sar_adc_resume(struct device *dev)
945{
946 struct iio_dev *indio_dev = dev_get_drvdata(dev);
947
948 return meson_sar_adc_hw_enable(indio_dev);
949}
950
951static SIMPLE_DEV_PM_OPS(meson_sar_adc_pm_ops,
952 meson_sar_adc_suspend, meson_sar_adc_resume);
953
954static struct platform_driver meson_sar_adc_driver = {
955 .probe = meson_sar_adc_probe,
956 .remove = meson_sar_adc_remove,
957 .driver = {
958 .name = "meson-saradc",
959 .of_match_table = meson_sar_adc_of_match,
960 .pm = &meson_sar_adc_pm_ops,
961 },
962};
963
964module_platform_driver(meson_sar_adc_driver);
965
966MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
967MODULE_DESCRIPTION("Amlogic Meson SAR ADC driver");
968MODULE_LICENSE("GPL v2");