xref: /openbmc/u-boot/drivers/adc/meson-saradc.c (revision f77d4410)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2017 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
4  * Copyright (C) 2018 BayLibre, SAS
5  * Author: Neil Armstrong <narmstrong@baylibre.com>
6  *
7  * Amlogic Meson Successive Approximation Register (SAR) A/D Converter
8  */
9 
10 #include <common.h>
11 #include <adc.h>
12 #include <clk.h>
13 #include <dm.h>
14 #include <regmap.h>
15 #include <errno.h>
16 #include <asm/io.h>
17 #include <linux/math64.h>
18 #include <linux/bitfield.h>
19 
20 #define MESON_SAR_ADC_REG0					0x00
21 	#define MESON_SAR_ADC_REG0_PANEL_DETECT			BIT(31)
22 	#define MESON_SAR_ADC_REG0_BUSY_MASK			GENMASK(30, 28)
23 	#define MESON_SAR_ADC_REG0_DELTA_BUSY			BIT(30)
24 	#define MESON_SAR_ADC_REG0_AVG_BUSY			BIT(29)
25 	#define MESON_SAR_ADC_REG0_SAMPLE_BUSY			BIT(28)
26 	#define MESON_SAR_ADC_REG0_FIFO_FULL			BIT(27)
27 	#define MESON_SAR_ADC_REG0_FIFO_EMPTY			BIT(26)
28 	#define MESON_SAR_ADC_REG0_FIFO_COUNT_MASK		GENMASK(25, 21)
29 	#define MESON_SAR_ADC_REG0_ADC_BIAS_CTRL_MASK		GENMASK(20, 19)
30 	#define MESON_SAR_ADC_REG0_CURR_CHAN_ID_MASK		GENMASK(18, 16)
31 	#define MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL		BIT(15)
32 	#define MESON_SAR_ADC_REG0_SAMPLING_STOP		BIT(14)
33 	#define MESON_SAR_ADC_REG0_CHAN_DELTA_EN_MASK		GENMASK(13, 12)
34 	#define MESON_SAR_ADC_REG0_DETECT_IRQ_POL		BIT(10)
35 	#define MESON_SAR_ADC_REG0_DETECT_IRQ_EN		BIT(9)
36 	#define MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK		GENMASK(8, 4)
37 	#define MESON_SAR_ADC_REG0_FIFO_IRQ_EN			BIT(3)
38 	#define MESON_SAR_ADC_REG0_SAMPLING_START		BIT(2)
39 	#define MESON_SAR_ADC_REG0_CONTINUOUS_EN		BIT(1)
40 	#define MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE		BIT(0)
41 
42 #define MESON_SAR_ADC_CHAN_LIST					0x04
43 	#define MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK		GENMASK(26, 24)
44 	#define MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(_chan)	\
45 					(GENMASK(2, 0) << ((_chan) * 3))
46 
47 #define MESON_SAR_ADC_AVG_CNTL					0x08
48 	#define MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(_chan)	\
49 					(16 + ((_chan) * 2))
50 	#define MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(_chan)	\
51 					(GENMASK(17, 16) << ((_chan) * 2))
52 	#define MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(_chan)	\
53 					(0 + ((_chan) * 2))
54 	#define MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(_chan)	\
55 					(GENMASK(1, 0) << ((_chan) * 2))
56 
57 #define MESON_SAR_ADC_REG3					0x0c
58 	#define MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY		BIT(31)
59 	#define MESON_SAR_ADC_REG3_CLK_EN			BIT(30)
60 	#define MESON_SAR_ADC_REG3_BL30_INITIALIZED		BIT(28)
61 	#define MESON_SAR_ADC_REG3_CTRL_CONT_RING_COUNTER_EN	BIT(27)
62 	#define MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE	BIT(26)
63 	#define MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK	GENMASK(25, 23)
64 	#define MESON_SAR_ADC_REG3_DETECT_EN			BIT(22)
65 	#define MESON_SAR_ADC_REG3_ADC_EN			BIT(21)
66 	#define MESON_SAR_ADC_REG3_PANEL_DETECT_COUNT_MASK	GENMASK(20, 18)
67 	#define MESON_SAR_ADC_REG3_PANEL_DETECT_FILTER_TB_MASK	GENMASK(17, 16)
68 	#define MESON_SAR_ADC_REG3_ADC_CLK_DIV_SHIFT		10
69 	#define MESON_SAR_ADC_REG3_ADC_CLK_DIV_WIDTH		5
70 	#define MESON_SAR_ADC_REG3_BLOCK_DLY_SEL_MASK		GENMASK(9, 8)
71 	#define MESON_SAR_ADC_REG3_BLOCK_DLY_MASK		GENMASK(7, 0)
72 
73 #define MESON_SAR_ADC_DELAY					0x10
74 	#define MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK		GENMASK(25, 24)
75 	#define MESON_SAR_ADC_DELAY_BL30_BUSY			BIT(15)
76 	#define MESON_SAR_ADC_DELAY_KERNEL_BUSY			BIT(14)
77 	#define MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK		GENMASK(23, 16)
78 	#define MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK		GENMASK(9, 8)
79 	#define MESON_SAR_ADC_DELAY_SAMPLE_DLY_CNT_MASK		GENMASK(7, 0)
80 
81 #define MESON_SAR_ADC_LAST_RD					0x14
82 	#define MESON_SAR_ADC_LAST_RD_LAST_CHANNEL1_MASK	GENMASK(23, 16)
83 	#define MESON_SAR_ADC_LAST_RD_LAST_CHANNEL0_MASK	GENMASK(9, 0)
84 
85 #define MESON_SAR_ADC_FIFO_RD					0x18
86 	#define MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK		GENMASK(14, 12)
87 	#define MESON_SAR_ADC_FIFO_RD_SAMPLE_VALUE_MASK		GENMASK(11, 0)
88 
89 #define MESON_SAR_ADC_AUX_SW					0x1c
90 	#define MESON_SAR_ADC_AUX_SW_MUX_SEL_CHAN_SHIFT(_chan)	\
91 					(8 + (((_chan) - 2) * 3))
92 	#define MESON_SAR_ADC_AUX_SW_VREF_P_MUX			BIT(6)
93 	#define MESON_SAR_ADC_AUX_SW_VREF_N_MUX			BIT(5)
94 	#define MESON_SAR_ADC_AUX_SW_MODE_SEL			BIT(4)
95 	#define MESON_SAR_ADC_AUX_SW_YP_DRIVE_SW		BIT(3)
96 	#define MESON_SAR_ADC_AUX_SW_XP_DRIVE_SW		BIT(2)
97 	#define MESON_SAR_ADC_AUX_SW_YM_DRIVE_SW		BIT(1)
98 	#define MESON_SAR_ADC_AUX_SW_XM_DRIVE_SW		BIT(0)
99 
100 #define MESON_SAR_ADC_CHAN_10_SW				0x20
101 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK	GENMASK(25, 23)
102 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_VREF_P_MUX	BIT(22)
103 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_VREF_N_MUX	BIT(21)
104 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_MODE_SEL		BIT(20)
105 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_YP_DRIVE_SW	BIT(19)
106 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_XP_DRIVE_SW	BIT(18)
107 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_YM_DRIVE_SW	BIT(17)
108 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN1_XM_DRIVE_SW	BIT(16)
109 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_MUX_SEL_MASK	GENMASK(9, 7)
110 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_VREF_P_MUX	BIT(6)
111 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_VREF_N_MUX	BIT(5)
112 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_MODE_SEL		BIT(4)
113 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_YP_DRIVE_SW	BIT(3)
114 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_XP_DRIVE_SW	BIT(2)
115 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_YM_DRIVE_SW	BIT(1)
116 	#define MESON_SAR_ADC_CHAN_10_SW_CHAN0_XM_DRIVE_SW	BIT(0)
117 
118 #define MESON_SAR_ADC_DETECT_IDLE_SW				0x24
119 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_SW_EN	BIT(26)
120 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK	GENMASK(25, 23)
121 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_VREF_P_MUX	BIT(22)
122 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_VREF_N_MUX	BIT(21)
123 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MODE_SEL	BIT(20)
124 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_YP_DRIVE_SW	BIT(19)
125 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_XP_DRIVE_SW	BIT(18)
126 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_YM_DRIVE_SW	BIT(17)
127 	#define MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_XM_DRIVE_SW	BIT(16)
128 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK	GENMASK(9, 7)
129 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_VREF_P_MUX	BIT(6)
130 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_VREF_N_MUX	BIT(5)
131 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MODE_SEL	BIT(4)
132 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_YP_DRIVE_SW	BIT(3)
133 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_XP_DRIVE_SW	BIT(2)
134 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_YM_DRIVE_SW	BIT(1)
135 	#define MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_XM_DRIVE_SW	BIT(0)
136 
137 #define MESON_SAR_ADC_DELTA_10					0x28
138 	#define MESON_SAR_ADC_DELTA_10_TEMP_SEL			BIT(27)
139 	#define MESON_SAR_ADC_DELTA_10_TS_REVE1			BIT(26)
140 	#define MESON_SAR_ADC_DELTA_10_CHAN1_DELTA_VALUE_MASK	GENMASK(25, 16)
141 	#define MESON_SAR_ADC_DELTA_10_TS_REVE0			BIT(15)
142 	#define MESON_SAR_ADC_DELTA_10_TS_C_SHIFT		11
143 	#define MESON_SAR_ADC_DELTA_10_TS_C_MASK		GENMASK(14, 11)
144 	#define MESON_SAR_ADC_DELTA_10_TS_VBG_EN		BIT(10)
145 	#define MESON_SAR_ADC_DELTA_10_CHAN0_DELTA_VALUE_MASK	GENMASK(9, 0)
146 
147 /*
148  * NOTE: registers from here are undocumented (the vendor Linux kernel driver
149  * and u-boot source served as reference). These only seem to be relevant on
150  * GXBB and newer.
151  */
152 #define MESON_SAR_ADC_REG11					0x2c
153 	#define MESON_SAR_ADC_REG11_BANDGAP_EN			BIT(13)
154 
155 #define MESON_SAR_ADC_REG13					0x34
156 	#define MESON_SAR_ADC_REG13_12BIT_CALIBRATION_MASK	GENMASK(13, 8)
157 
158 #define MESON_SAR_ADC_MAX_FIFO_SIZE				32
159 #define MESON_SAR_ADC_TIMEOUT					100 /* ms */
160 
161 #define NUM_CHANNELS						8
162 
163 #define MILLION							1000000
164 
165 struct meson_saradc_data {
166 	int				num_bits;
167 };
168 
169 struct meson_saradc_priv {
170 	const struct meson_saradc_data	*data;
171 	struct regmap			*regmap;
172 	struct clk			core_clk;
173 	struct clk			adc_clk;
174 	bool				initialized;
175 	int				active_channel;
176 	int				calibbias;
177 	int				calibscale;
178 };
179 
180 static unsigned int
181 meson_saradc_get_fifo_count(struct meson_saradc_priv *priv)
182 {
183 	u32 regval;
184 
185 	regmap_read(priv->regmap, MESON_SAR_ADC_REG0, &regval);
186 
187 	return FIELD_GET(MESON_SAR_ADC_REG0_FIFO_COUNT_MASK, regval);
188 }
189 
190 static int meson_saradc_lock(struct meson_saradc_priv *priv)
191 {
192 	uint val, timeout = 10000;
193 
194 	/* prevent BL30 from using the SAR ADC while we are using it */
195 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
196 			   MESON_SAR_ADC_DELAY_KERNEL_BUSY,
197 			   MESON_SAR_ADC_DELAY_KERNEL_BUSY);
198 
199 	/*
200 	 * wait until BL30 releases it's lock (so we can use the SAR ADC)
201 	 */
202 	do {
203 		udelay(1);
204 		regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val);
205 	} while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--);
206 
207 	if (timeout < 0) {
208 		printf("Timeout while waiting for BL30 unlock\n");
209 		return -ETIMEDOUT;
210 	}
211 
212 	return 0;
213 }
214 
215 static void meson_saradc_unlock(struct meson_saradc_priv *priv)
216 {
217 	/* allow BL30 to use the SAR ADC again */
218 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
219 			   MESON_SAR_ADC_DELAY_KERNEL_BUSY, 0);
220 }
221 
222 static void meson_saradc_clear_fifo(struct meson_saradc_priv *priv)
223 {
224 	unsigned int count, tmp;
225 
226 	for (count = 0; count < MESON_SAR_ADC_MAX_FIFO_SIZE; count++) {
227 		if (!meson_saradc_get_fifo_count(priv))
228 			break;
229 
230 		regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, &tmp);
231 	}
232 }
233 
234 static int meson_saradc_calib_val(struct meson_saradc_priv *priv, int val)
235 {
236 	int tmp;
237 
238 	/* use val_calib = scale * val_raw + offset calibration function */
239 	tmp = div_s64((s64)val * priv->calibscale, MILLION) + priv->calibbias;
240 
241 	return clamp(tmp, 0, (1 << priv->data->num_bits) - 1);
242 }
243 
244 static int meson_saradc_wait_busy_clear(struct meson_saradc_priv *priv)
245 {
246 	uint regval, timeout = 10000;
247 
248 	/*
249 	 * NOTE: we need a small delay before reading the status, otherwise
250 	 * the sample engine may not have started internally (which would
251 	 * seem to us that sampling is already finished).
252 	 */
253 	do {
254 		udelay(1);
255 		regmap_read(priv->regmap, MESON_SAR_ADC_REG0, &regval);
256 	} while (FIELD_GET(MESON_SAR_ADC_REG0_BUSY_MASK, regval) && timeout--);
257 
258 	if (timeout < 0)
259 		return -ETIMEDOUT;
260 
261 	return 0;
262 }
263 
264 static int meson_saradc_read_raw_sample(struct meson_saradc_priv *priv,
265 					unsigned int channel, uint *val)
266 {
267 	uint regval, fifo_chan, fifo_val, count;
268 	int ret;
269 
270 	ret = meson_saradc_wait_busy_clear(priv);
271 	if (ret)
272 		return ret;
273 
274 	count = meson_saradc_get_fifo_count(priv);
275 	if (count != 1) {
276 		printf("ADC FIFO has %d element(s) instead of one\n", count);
277 		return -EINVAL;
278 	}
279 
280 	regmap_read(priv->regmap, MESON_SAR_ADC_FIFO_RD, &regval);
281 	fifo_chan = FIELD_GET(MESON_SAR_ADC_FIFO_RD_CHAN_ID_MASK, regval);
282 	if (fifo_chan != channel) {
283 		printf("ADC FIFO entry belongs to channel %d instead of %d\n",
284 		       fifo_chan, channel);
285 		return -EINVAL;
286 	}
287 
288 	fifo_val = FIELD_GET(MESON_SAR_ADC_FIFO_RD_SAMPLE_VALUE_MASK, regval);
289 	fifo_val &= GENMASK(priv->data->num_bits - 1, 0);
290 	*val = meson_saradc_calib_val(priv, fifo_val);
291 
292 	return 0;
293 }
294 
295 static void meson_saradc_start_sample_engine(struct meson_saradc_priv *priv)
296 {
297 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
298 			   MESON_SAR_ADC_REG0_FIFO_IRQ_EN,
299 			   MESON_SAR_ADC_REG0_FIFO_IRQ_EN);
300 
301 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
302 			   MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE,
303 			   MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE);
304 
305 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
306 			   MESON_SAR_ADC_REG0_SAMPLING_START,
307 			   MESON_SAR_ADC_REG0_SAMPLING_START);
308 }
309 
310 static void meson_saradc_stop_sample_engine(struct meson_saradc_priv *priv)
311 {
312 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
313 			   MESON_SAR_ADC_REG0_FIFO_IRQ_EN, 0);
314 
315 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
316 			   MESON_SAR_ADC_REG0_SAMPLING_STOP,
317 			   MESON_SAR_ADC_REG0_SAMPLING_STOP);
318 
319 	/* wait until all modules are stopped */
320 	meson_saradc_wait_busy_clear(priv);
321 
322 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
323 			   MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE, 0);
324 }
325 
326 enum meson_saradc_avg_mode {
327 	NO_AVERAGING = 0x0,
328 	MEAN_AVERAGING = 0x1,
329 	MEDIAN_AVERAGING = 0x2,
330 };
331 
332 enum meson_saradc_num_samples {
333 	ONE_SAMPLE = 0x0,
334 	TWO_SAMPLES = 0x1,
335 	FOUR_SAMPLES = 0x2,
336 	EIGHT_SAMPLES = 0x3,
337 };
338 
339 static void meson_saradc_set_averaging(struct meson_saradc_priv *priv,
340 				       unsigned int channel,
341 				       enum meson_saradc_avg_mode mode,
342 				       enum meson_saradc_num_samples samples)
343 {
344 	int val;
345 
346 	val = samples << MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_SHIFT(channel);
347 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
348 			   MESON_SAR_ADC_AVG_CNTL_NUM_SAMPLES_MASK(channel),
349 			   val);
350 
351 	val = mode << MESON_SAR_ADC_AVG_CNTL_AVG_MODE_SHIFT(channel);
352 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_AVG_CNTL,
353 			   MESON_SAR_ADC_AVG_CNTL_AVG_MODE_MASK(channel), val);
354 }
355 
356 static void meson_saradc_enable_channel(struct meson_saradc_priv *priv,
357 					unsigned int channel)
358 {
359 	uint regval;
360 
361 	/*
362 	 * the SAR ADC engine allows sampling multiple channels at the same
363 	 * time. to keep it simple we're only working with one *internal*
364 	 * channel, which starts counting at index 0 (which means: count = 1).
365 	 */
366 	regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK, 0);
367 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
368 			   MESON_SAR_ADC_CHAN_LIST_MAX_INDEX_MASK, regval);
369 
370 	/* map channel index 0 to the channel which we want to read */
371 	regval = FIELD_PREP(MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0), channel);
372 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_LIST,
373 			   MESON_SAR_ADC_CHAN_LIST_ENTRY_MASK(0), regval);
374 
375 	regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
376 			    channel);
377 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
378 			   MESON_SAR_ADC_DETECT_IDLE_SW_DETECT_MUX_MASK,
379 			   regval);
380 
381 	regval = FIELD_PREP(MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
382 			    channel);
383 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DETECT_IDLE_SW,
384 			   MESON_SAR_ADC_DETECT_IDLE_SW_IDLE_MUX_SEL_MASK,
385 			   regval);
386 
387 	if (channel == 6)
388 		regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10,
389 				   MESON_SAR_ADC_DELTA_10_TEMP_SEL, 0);
390 }
391 
392 static int meson_saradc_get_sample(struct meson_saradc_priv *priv,
393 				   int chan, uint *val)
394 {
395 	int ret;
396 
397 	ret = meson_saradc_lock(priv);
398 	if (ret)
399 		return ret;
400 
401 	/* clear the FIFO to make sure we're not reading old values */
402 	meson_saradc_clear_fifo(priv);
403 
404 	meson_saradc_set_averaging(priv, chan, MEAN_AVERAGING, EIGHT_SAMPLES);
405 
406 	meson_saradc_enable_channel(priv, chan);
407 
408 	meson_saradc_start_sample_engine(priv);
409 	ret = meson_saradc_read_raw_sample(priv, chan, val);
410 	meson_saradc_stop_sample_engine(priv);
411 
412 	meson_saradc_unlock(priv);
413 
414 	if (ret) {
415 		printf("failed to read sample for channel %d: %d\n",
416 		       chan, ret);
417 		return ret;
418 	}
419 
420 	return 0;
421 }
422 
423 static int meson_saradc_channel_data(struct udevice *dev, int channel,
424 				     unsigned int *data)
425 {
426 	struct meson_saradc_priv *priv = dev_get_priv(dev);
427 
428 	if (channel != priv->active_channel) {
429 		pr_err("Requested channel is not active!");
430 		return -EINVAL;
431 	}
432 
433 	return meson_saradc_get_sample(priv, channel, data);
434 }
435 
436 enum meson_saradc_chan7_mux_sel {
437 	CHAN7_MUX_VSS = 0x0,
438 	CHAN7_MUX_VDD_DIV4 = 0x1,
439 	CHAN7_MUX_VDD_DIV2 = 0x2,
440 	CHAN7_MUX_VDD_MUL3_DIV4 = 0x3,
441 	CHAN7_MUX_VDD = 0x4,
442 	CHAN7_MUX_CH7_INPUT = 0x7,
443 };
444 
445 static void meson_saradc_set_chan7_mux(struct meson_saradc_priv *priv,
446 				       enum meson_saradc_chan7_mux_sel sel)
447 {
448 	u32 regval;
449 
450 	regval = FIELD_PREP(MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, sel);
451 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
452 			   MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, regval);
453 
454 	udelay(20);
455 }
456 
457 static int meson_saradc_calib(struct meson_saradc_priv *priv)
458 {
459 	uint nominal0, nominal1, value0, value1;
460 	int ret;
461 
462 	/* use points 25% and 75% for calibration */
463 	nominal0 = (1 << priv->data->num_bits) / 4;
464 	nominal1 = (1 << priv->data->num_bits) * 3 / 4;
465 
466 	meson_saradc_set_chan7_mux(priv, CHAN7_MUX_VDD_DIV4);
467 	udelay(20);
468 	ret = meson_saradc_get_sample(priv, 7, &value0);
469 	if (ret < 0)
470 		goto out;
471 
472 	meson_saradc_set_chan7_mux(priv, CHAN7_MUX_VDD_MUL3_DIV4);
473 	udelay(20);
474 	ret = meson_saradc_get_sample(priv, 7, &value1);
475 	if (ret < 0)
476 		goto out;
477 
478 	if (value1 <= value0) {
479 		ret = -EINVAL;
480 		goto out;
481 	}
482 
483 	priv->calibscale = div_s64((nominal1 - nominal0) * (s64)MILLION,
484 				   value1 - value0);
485 	priv->calibbias = nominal0 - div_s64((s64)value0 * priv->calibscale,
486 					     MILLION);
487 	ret = 0;
488 out:
489 	meson_saradc_set_chan7_mux(priv, CHAN7_MUX_CH7_INPUT);
490 
491 	return ret;
492 }
493 
494 static int meson_saradc_init(struct meson_saradc_priv *priv)
495 {
496 	uint regval;
497 	int ret, i;
498 
499 	priv->calibscale = MILLION;
500 
501 	/*
502 	 * make sure we start at CH7 input since the other muxes are only used
503 	 * for internal calibration.
504 	 */
505 	meson_saradc_set_chan7_mux(priv, CHAN7_MUX_CH7_INPUT);
506 
507 	/*
508 	 * leave sampling delay and the input clocks as configured by
509 	 * BL30 to make sure BL30 gets the values it expects when
510 	 * reading the temperature sensor.
511 	 */
512 	regmap_read(priv->regmap, MESON_SAR_ADC_REG3, &regval);
513 	if (regval & MESON_SAR_ADC_REG3_BL30_INITIALIZED)
514 		return 0;
515 
516 	meson_saradc_stop_sample_engine(priv);
517 
518 	/* update the channel 6 MUX to select the temperature sensor */
519 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
520 			   MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL,
521 			   MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL);
522 
523 	/* disable all channels by default */
524 	regmap_write(priv->regmap, MESON_SAR_ADC_CHAN_LIST, 0x0);
525 
526 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
527 			   MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE, 0);
528 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
529 			   MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY,
530 			   MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY);
531 
532 	/* delay between two samples = (10+1) * 1uS */
533 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
534 			   MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
535 			   FIELD_PREP(MESON_SAR_ADC_DELAY_SAMPLE_DLY_CNT_MASK,
536 				      10));
537 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
538 			   MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK,
539 			   FIELD_PREP(MESON_SAR_ADC_DELAY_SAMPLE_DLY_SEL_MASK,
540 				      0));
541 
542 	/* delay between two samples = (10+1) * 1uS */
543 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
544 			   MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
545 			   FIELD_PREP(MESON_SAR_ADC_DELAY_INPUT_DLY_CNT_MASK,
546 				      10));
547 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
548 			   MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK,
549 			   FIELD_PREP(MESON_SAR_ADC_DELAY_INPUT_DLY_SEL_MASK,
550 				      1));
551 
552 	/*
553 	 * set up the input channel muxes in MESON_SAR_ADC_CHAN_10_SW
554 	 * (0 = SAR_ADC_CH0, 1 = SAR_ADC_CH1)
555 	 */
556 	regval = FIELD_PREP(MESON_SAR_ADC_CHAN_10_SW_CHAN0_MUX_SEL_MASK, 0);
557 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW,
558 			   MESON_SAR_ADC_CHAN_10_SW_CHAN0_MUX_SEL_MASK,
559 			   regval);
560 	regval = FIELD_PREP(MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK, 1);
561 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW,
562 			   MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK,
563 			   regval);
564 
565 	/*
566 	 * set up the input channel muxes in MESON_SAR_ADC_AUX_SW
567 	 * (2 = SAR_ADC_CH2, 3 = SAR_ADC_CH3, ...) and enable
568 	 * MESON_SAR_ADC_AUX_SW_YP_DRIVE_SW and
569 	 * MESON_SAR_ADC_AUX_SW_XP_DRIVE_SW like the vendor driver.
570 	 */
571 	regval = 0;
572 	for (i = 2; i <= 7; i++)
573 		regval |= i << MESON_SAR_ADC_AUX_SW_MUX_SEL_CHAN_SHIFT(i);
574 	regval |= MESON_SAR_ADC_AUX_SW_YP_DRIVE_SW;
575 	regval |= MESON_SAR_ADC_AUX_SW_XP_DRIVE_SW;
576 	regmap_write(priv->regmap, MESON_SAR_ADC_AUX_SW, regval);
577 
578 	ret = meson_saradc_lock(priv);
579 	if (ret)
580 		return ret;
581 
582 #if CONFIG_IS_ENABLED(CLK)
583 	ret = clk_enable(&priv->core_clk);
584 	if (ret)
585 		return ret;
586 #endif
587 
588 	regval = FIELD_PREP(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, 1);
589 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
590 			   MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval);
591 
592 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG11,
593 			   MESON_SAR_ADC_REG11_BANDGAP_EN,
594 			   MESON_SAR_ADC_REG11_BANDGAP_EN);
595 
596 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
597 			   MESON_SAR_ADC_REG3_ADC_EN,
598 			   MESON_SAR_ADC_REG3_ADC_EN);
599 
600 	udelay(5);
601 
602 #if CONFIG_IS_ENABLED(CLK)
603 	ret = clk_enable(&priv->adc_clk);
604 	if (ret)
605 		return ret;
606 #endif
607 
608 	meson_saradc_unlock(priv);
609 
610 	ret = meson_saradc_calib(priv);
611 	if (ret) {
612 		printf("calibration failed\n");
613 		return -EIO;
614 	}
615 
616 	return 0;
617 }
618 
619 static int meson_saradc_start_channel(struct udevice *dev, int channel)
620 {
621 	struct meson_saradc_priv *priv = dev_get_priv(dev);
622 
623 	if (channel < 0 || channel >= NUM_CHANNELS) {
624 		printf("Requested channel is invalid!");
625 		return -EINVAL;
626 	}
627 
628 	if (!priv->initialized) {
629 		int ret;
630 
631 		ret = meson_saradc_init(priv);
632 		if (ret)
633 			return ret;
634 
635 		priv->initialized = true;
636 	}
637 
638 	priv->active_channel = channel;
639 
640 	return 0;
641 }
642 
643 static int meson_saradc_stop(struct udevice *dev)
644 {
645 	struct meson_saradc_priv *priv = dev_get_priv(dev);
646 
647 	priv->active_channel = -1;
648 
649 	return 0;
650 }
651 
652 static int meson_saradc_probe(struct udevice *dev)
653 {
654 	struct meson_saradc_priv *priv = dev_get_priv(dev);
655 	int ret;
656 
657 	ret = regmap_init_mem(dev_ofnode(dev), &priv->regmap);
658 	if (ret)
659 		return ret;
660 
661 #if CONFIG_IS_ENABLED(CLK)
662 	ret = clk_get_by_name(dev, "core", &priv->core_clk);
663 	if (ret)
664 		return ret;
665 
666 	ret = clk_get_by_name(dev, "adc_clk", &priv->adc_clk);
667 	if (ret)
668 		return ret;
669 #endif
670 
671 	priv->active_channel = -1;
672 
673 	return 0;
674 }
675 
676 int meson_saradc_ofdata_to_platdata(struct udevice *dev)
677 {
678 	struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev);
679 	struct meson_saradc_priv *priv = dev_get_priv(dev);
680 
681 	priv->data = (struct meson_saradc_data *)dev_get_driver_data(dev);
682 
683 	uc_pdata->data_mask = GENMASK(priv->data->num_bits - 1, 0);
684 	uc_pdata->data_format = ADC_DATA_FORMAT_BIN;
685 	uc_pdata->data_timeout_us = MESON_SAR_ADC_TIMEOUT * 1000;
686 	uc_pdata->channel_mask = GENMASK(NUM_CHANNELS - 1, 0);
687 
688 	return 0;
689 }
690 
691 static const struct adc_ops meson_saradc_ops = {
692 	.start_channel = meson_saradc_start_channel,
693 	.channel_data = meson_saradc_channel_data,
694 	.stop = meson_saradc_stop,
695 };
696 
697 static const struct meson_saradc_data gxbb_saradc_data = {
698 	.num_bits = 10,
699 };
700 
701 static const struct meson_saradc_data gxl_saradc_data = {
702 	.num_bits = 12,
703 };
704 
705 static const struct udevice_id meson_saradc_ids[] = {
706 	{ .compatible = "amlogic,meson-gxbb-saradc",
707 	  .data = (ulong)&gxbb_saradc_data },
708 	{ .compatible = "amlogic,meson-gxl-saradc",
709 	  .data = (ulong)&gxl_saradc_data },
710 	{ .compatible = "amlogic,meson-gxm-saradc",
711 	  .data = (ulong)&gxl_saradc_data },
712 	{ }
713 };
714 
715 U_BOOT_DRIVER(meson_saradc) = {
716 	.name		= "meson_saradc",
717 	.id		= UCLASS_ADC,
718 	.of_match	= meson_saradc_ids,
719 	.ops		= &meson_saradc_ops,
720 	.probe		= meson_saradc_probe,
721 	.ofdata_to_platdata = meson_saradc_ofdata_to_platdata,
722 	.priv_auto_alloc_size = sizeof(struct meson_saradc_priv),
723 };
724