1*2387a7d6SHerve Codina (Schneider Electric) // SPDX-License-Identifier: GPL-2.0
2*2387a7d6SHerve Codina (Schneider Electric) /*
3*2387a7d6SHerve Codina (Schneider Electric) * Renesas RZ/N1 ADC driver
4*2387a7d6SHerve Codina (Schneider Electric) *
5*2387a7d6SHerve Codina (Schneider Electric) * Copyright (C) 2025 Schneider-Electric
6*2387a7d6SHerve Codina (Schneider Electric) *
7*2387a7d6SHerve Codina (Schneider Electric) * Author: Herve Codina <herve.codina@bootlin.com>
8*2387a7d6SHerve Codina (Schneider Electric) *
9*2387a7d6SHerve Codina (Schneider Electric) * The RZ/N1 ADC controller can handle channels from its internal ADC1 and/or
10*2387a7d6SHerve Codina (Schneider Electric) * ADC2 cores. The driver use ADC1 and/or ADC2 cores depending on the presence
11*2387a7d6SHerve Codina (Schneider Electric) * of the related power supplies (AVDD and VREF) description in the device-tree.
12*2387a7d6SHerve Codina (Schneider Electric) */
13*2387a7d6SHerve Codina (Schneider Electric)
14*2387a7d6SHerve Codina (Schneider Electric) #include <linux/array_size.h>
15*2387a7d6SHerve Codina (Schneider Electric) #include <linux/bitfield.h>
16*2387a7d6SHerve Codina (Schneider Electric) #include <linux/bits.h>
17*2387a7d6SHerve Codina (Schneider Electric) #include <linux/cleanup.h>
18*2387a7d6SHerve Codina (Schneider Electric) #include <linux/clk.h>
19*2387a7d6SHerve Codina (Schneider Electric) #include <linux/dev_printk.h>
20*2387a7d6SHerve Codina (Schneider Electric) #include <linux/err.h>
21*2387a7d6SHerve Codina (Schneider Electric) #include <linux/iio/iio.h>
22*2387a7d6SHerve Codina (Schneider Electric) #include <linux/io.h>
23*2387a7d6SHerve Codina (Schneider Electric) #include <linux/iopoll.h>
24*2387a7d6SHerve Codina (Schneider Electric) #include <linux/mod_devicetable.h>
25*2387a7d6SHerve Codina (Schneider Electric) #include <linux/module.h>
26*2387a7d6SHerve Codina (Schneider Electric) #include <linux/mutex.h>
27*2387a7d6SHerve Codina (Schneider Electric) #include <linux/platform_device.h>
28*2387a7d6SHerve Codina (Schneider Electric) #include <linux/pm_runtime.h>
29*2387a7d6SHerve Codina (Schneider Electric) #include <linux/regulator/consumer.h>
30*2387a7d6SHerve Codina (Schneider Electric) #include <linux/types.h>
31*2387a7d6SHerve Codina (Schneider Electric)
32*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_CONTROL_REG 0x02c
33*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_CONTROL_ADC_BUSY BIT(6)
34*2387a7d6SHerve Codina (Schneider Electric)
35*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_FORCE_REG 0x030
36*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_SET_FORCE_REG 0x034
37*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_CLEAR_FORCE_REG 0x038
38*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_FORCE_VC(_n) BIT(_n)
39*2387a7d6SHerve Codina (Schneider Electric)
40*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_CONFIG_REG 0x040
41*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_CONFIG_ADC_POWER_DOWN BIT(3)
42*2387a7d6SHerve Codina (Schneider Electric)
43*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_VC_REG(_n) (0x0c0 + 4 * (_n))
44*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_VC_ADC2_ENABLE BIT(16)
45*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_VC_ADC1_ENABLE BIT(15)
46*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_VC_ADC2_CHANNEL_SEL_MASK GENMASK(5, 3)
47*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_VC_ADC1_CHANNEL_SEL_MASK GENMASK(2, 0)
48*2387a7d6SHerve Codina (Schneider Electric)
49*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_ADC1_DATA_REG(_n) (0x100 + 4 * (_n))
50*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_ADC2_DATA_REG(_n) (0x140 + 4 * (_n))
51*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_ADCX_DATA_DATA_MASK GENMASK(11, 0)
52*2387a7d6SHerve Codina (Schneider Electric)
53*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_NO_CHANNEL -1
54*2387a7d6SHerve Codina (Schneider Electric)
55*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_CHANNEL_SHARED_SCALE(_ch, _ds_name) { \
56*2387a7d6SHerve Codina (Schneider Electric) .type = IIO_VOLTAGE, \
57*2387a7d6SHerve Codina (Schneider Electric) .indexed = 1, \
58*2387a7d6SHerve Codina (Schneider Electric) .channel = (_ch), \
59*2387a7d6SHerve Codina (Schneider Electric) .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
60*2387a7d6SHerve Codina (Schneider Electric) .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
61*2387a7d6SHerve Codina (Schneider Electric) .datasheet_name = (_ds_name), \
62*2387a7d6SHerve Codina (Schneider Electric) }
63*2387a7d6SHerve Codina (Schneider Electric)
64*2387a7d6SHerve Codina (Schneider Electric) #define RZN1_ADC_CHANNEL_SEPARATED_SCALE(_ch, _ds_name) { \
65*2387a7d6SHerve Codina (Schneider Electric) .type = IIO_VOLTAGE, \
66*2387a7d6SHerve Codina (Schneider Electric) .indexed = 1, \
67*2387a7d6SHerve Codina (Schneider Electric) .channel = (_ch), \
68*2387a7d6SHerve Codina (Schneider Electric) .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
69*2387a7d6SHerve Codina (Schneider Electric) BIT(IIO_CHAN_INFO_SCALE), \
70*2387a7d6SHerve Codina (Schneider Electric) .datasheet_name = (_ds_name), \
71*2387a7d6SHerve Codina (Schneider Electric) }
72*2387a7d6SHerve Codina (Schneider Electric)
73*2387a7d6SHerve Codina (Schneider Electric) /*
74*2387a7d6SHerve Codina (Schneider Electric) * 8 ADC1_IN signals existed numbered 0..4, 6..8
75*2387a7d6SHerve Codina (Schneider Electric) * ADCx_IN5 doesn't exist in RZ/N1 datasheet
76*2387a7d6SHerve Codina (Schneider Electric) */
77*2387a7d6SHerve Codina (Schneider Electric) static struct iio_chan_spec rzn1_adc1_channels[] = {
78*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(0, "ADC1_IN0"),
79*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(1, "ADC1_IN1"),
80*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(2, "ADC1_IN2"),
81*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(3, "ADC1_IN3"),
82*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(4, "ADC1_IN4"),
83*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(5, "ADC1_IN6"),
84*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(6, "ADC1_IN7"),
85*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(7, "ADC1_IN8"),
86*2387a7d6SHerve Codina (Schneider Electric) };
87*2387a7d6SHerve Codina (Schneider Electric)
88*2387a7d6SHerve Codina (Schneider Electric) static struct iio_chan_spec rzn1_adc2_channels[] = {
89*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(8, "ADC2_IN0"),
90*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(9, "ADC2_IN1"),
91*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(10, "ADC2_IN2"),
92*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(11, "ADC2_IN3"),
93*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(12, "ADC2_IN4"),
94*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(13, "ADC2_IN6"),
95*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(14, "ADC2_IN7"),
96*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SHARED_SCALE(15, "ADC2_IN8"),
97*2387a7d6SHerve Codina (Schneider Electric) };
98*2387a7d6SHerve Codina (Schneider Electric)
99*2387a7d6SHerve Codina (Schneider Electric) /*
100*2387a7d6SHerve Codina (Schneider Electric) * If both ADCs core are used, scale cannot be common. Indeed, scale is
101*2387a7d6SHerve Codina (Schneider Electric) * based on Vref connected on each ADC core.
102*2387a7d6SHerve Codina (Schneider Electric) */
103*2387a7d6SHerve Codina (Schneider Electric) static struct iio_chan_spec rzn1_adc1_adc2_channels[] = {
104*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(0, "ADC1_IN0"),
105*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(1, "ADC1_IN1"),
106*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(2, "ADC1_IN2"),
107*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(3, "ADC1_IN3"),
108*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(4, "ADC1_IN4"),
109*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(5, "ADC1_IN6"),
110*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(6, "ADC1_IN7"),
111*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(7, "ADC1_IN8"),
112*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(8, "ADC2_IN0"),
113*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(9, "ADC2_IN1"),
114*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(10, "ADC2_IN2"),
115*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(11, "ADC2_IN3"),
116*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(12, "ADC2_IN4"),
117*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(13, "ADC2_IN6"),
118*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(14, "ADC2_IN7"),
119*2387a7d6SHerve Codina (Schneider Electric) RZN1_ADC_CHANNEL_SEPARATED_SCALE(15, "ADC2_IN8"),
120*2387a7d6SHerve Codina (Schneider Electric) };
121*2387a7d6SHerve Codina (Schneider Electric)
122*2387a7d6SHerve Codina (Schneider Electric) struct rzn1_adc {
123*2387a7d6SHerve Codina (Schneider Electric) struct device *dev;
124*2387a7d6SHerve Codina (Schneider Electric) void __iomem *regs;
125*2387a7d6SHerve Codina (Schneider Electric) struct mutex lock; /* ADC lock */
126*2387a7d6SHerve Codina (Schneider Electric) int adc1_vref_mV; /* ADC1 Vref in mV. Negative if ADC1 is not used */
127*2387a7d6SHerve Codina (Schneider Electric) int adc2_vref_mV; /* ADC2 Vref in mV. Negative if ADC2 is not used */
128*2387a7d6SHerve Codina (Schneider Electric) };
129*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_power(struct rzn1_adc * rzn1_adc,bool power)130*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_power(struct rzn1_adc *rzn1_adc, bool power)
131*2387a7d6SHerve Codina (Schneider Electric) {
132*2387a7d6SHerve Codina (Schneider Electric) u32 v;
133*2387a7d6SHerve Codina (Schneider Electric)
134*2387a7d6SHerve Codina (Schneider Electric) writel(power ? 0 : RZN1_ADC_CONFIG_ADC_POWER_DOWN,
135*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc->regs + RZN1_ADC_CONFIG_REG);
136*2387a7d6SHerve Codina (Schneider Electric)
137*2387a7d6SHerve Codina (Schneider Electric) /* Wait for the ADC_BUSY to clear */
138*2387a7d6SHerve Codina (Schneider Electric) return readl_poll_timeout_atomic(rzn1_adc->regs + RZN1_ADC_CONTROL_REG,
139*2387a7d6SHerve Codina (Schneider Electric) v, !(v & RZN1_ADC_CONTROL_ADC_BUSY),
140*2387a7d6SHerve Codina (Schneider Electric) 0, 500);
141*2387a7d6SHerve Codina (Schneider Electric) }
142*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_vc_setup_conversion(struct rzn1_adc * rzn1_adc,u32 ch,int adc1_ch,int adc2_ch)143*2387a7d6SHerve Codina (Schneider Electric) static void rzn1_adc_vc_setup_conversion(struct rzn1_adc *rzn1_adc, u32 ch,
144*2387a7d6SHerve Codina (Schneider Electric) int adc1_ch, int adc2_ch)
145*2387a7d6SHerve Codina (Schneider Electric) {
146*2387a7d6SHerve Codina (Schneider Electric) u32 vc = 0;
147*2387a7d6SHerve Codina (Schneider Electric)
148*2387a7d6SHerve Codina (Schneider Electric) if (adc1_ch != RZN1_ADC_NO_CHANNEL)
149*2387a7d6SHerve Codina (Schneider Electric) vc |= RZN1_ADC_VC_ADC1_ENABLE |
150*2387a7d6SHerve Codina (Schneider Electric) FIELD_PREP(RZN1_ADC_VC_ADC1_CHANNEL_SEL_MASK, adc1_ch);
151*2387a7d6SHerve Codina (Schneider Electric)
152*2387a7d6SHerve Codina (Schneider Electric) if (adc2_ch != RZN1_ADC_NO_CHANNEL)
153*2387a7d6SHerve Codina (Schneider Electric) vc |= RZN1_ADC_VC_ADC2_ENABLE |
154*2387a7d6SHerve Codina (Schneider Electric) FIELD_PREP(RZN1_ADC_VC_ADC2_CHANNEL_SEL_MASK, adc2_ch);
155*2387a7d6SHerve Codina (Schneider Electric)
156*2387a7d6SHerve Codina (Schneider Electric) writel(vc, rzn1_adc->regs + RZN1_ADC_VC_REG(ch));
157*2387a7d6SHerve Codina (Schneider Electric) }
158*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_vc_start_conversion(struct rzn1_adc * rzn1_adc,u32 ch)159*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_vc_start_conversion(struct rzn1_adc *rzn1_adc, u32 ch)
160*2387a7d6SHerve Codina (Schneider Electric) {
161*2387a7d6SHerve Codina (Schneider Electric) u32 val;
162*2387a7d6SHerve Codina (Schneider Electric)
163*2387a7d6SHerve Codina (Schneider Electric) val = readl(rzn1_adc->regs + RZN1_ADC_FORCE_REG);
164*2387a7d6SHerve Codina (Schneider Electric) if (val & RZN1_ADC_FORCE_VC(ch))
165*2387a7d6SHerve Codina (Schneider Electric) return -EBUSY;
166*2387a7d6SHerve Codina (Schneider Electric)
167*2387a7d6SHerve Codina (Schneider Electric) writel(RZN1_ADC_FORCE_VC(ch), rzn1_adc->regs + RZN1_ADC_SET_FORCE_REG);
168*2387a7d6SHerve Codina (Schneider Electric)
169*2387a7d6SHerve Codina (Schneider Electric) return 0;
170*2387a7d6SHerve Codina (Schneider Electric) }
171*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_vc_stop_conversion(struct rzn1_adc * rzn1_adc,u32 ch)172*2387a7d6SHerve Codina (Schneider Electric) static void rzn1_adc_vc_stop_conversion(struct rzn1_adc *rzn1_adc, u32 ch)
173*2387a7d6SHerve Codina (Schneider Electric) {
174*2387a7d6SHerve Codina (Schneider Electric) writel(RZN1_ADC_FORCE_VC(ch), rzn1_adc->regs + RZN1_ADC_CLEAR_FORCE_REG);
175*2387a7d6SHerve Codina (Schneider Electric) }
176*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_vc_wait_conversion(struct rzn1_adc * rzn1_adc,u32 ch,u32 * adc1_data,u32 * adc2_data)177*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_vc_wait_conversion(struct rzn1_adc *rzn1_adc, u32 ch,
178*2387a7d6SHerve Codina (Schneider Electric) u32 *adc1_data, u32 *adc2_data)
179*2387a7d6SHerve Codina (Schneider Electric) {
180*2387a7d6SHerve Codina (Schneider Electric) u32 data_reg;
181*2387a7d6SHerve Codina (Schneider Electric) int ret;
182*2387a7d6SHerve Codina (Schneider Electric) u32 v;
183*2387a7d6SHerve Codina (Schneider Electric)
184*2387a7d6SHerve Codina (Schneider Electric) /*
185*2387a7d6SHerve Codina (Schneider Electric) * When a VC is selected, it needs 20 ADC clocks to perform the
186*2387a7d6SHerve Codina (Schneider Electric) * conversion.
187*2387a7d6SHerve Codina (Schneider Electric) *
188*2387a7d6SHerve Codina (Schneider Electric) * The worst case is when the 16 VCs need to perform a conversion and
189*2387a7d6SHerve Codina (Schneider Electric) * our VC is the lowest in term of priority.
190*2387a7d6SHerve Codina (Schneider Electric) *
191*2387a7d6SHerve Codina (Schneider Electric) * In that case, the conversion is performed in 16 * 20 ADC clocks.
192*2387a7d6SHerve Codina (Schneider Electric) *
193*2387a7d6SHerve Codina (Schneider Electric) * The ADC clock can be set from 4MHz to 20MHz. This leads to a worst
194*2387a7d6SHerve Codina (Schneider Electric) * case of 16 * 20 * 1/4Mhz = 80us.
195*2387a7d6SHerve Codina (Schneider Electric) *
196*2387a7d6SHerve Codina (Schneider Electric) * Round it up to 100us.
197*2387a7d6SHerve Codina (Schneider Electric) */
198*2387a7d6SHerve Codina (Schneider Electric)
199*2387a7d6SHerve Codina (Schneider Electric) /* Wait for the ADC_FORCE_VC(n) to clear */
200*2387a7d6SHerve Codina (Schneider Electric) ret = readl_poll_timeout_atomic(rzn1_adc->regs + RZN1_ADC_FORCE_REG,
201*2387a7d6SHerve Codina (Schneider Electric) v, !(v & RZN1_ADC_FORCE_VC(ch)),
202*2387a7d6SHerve Codina (Schneider Electric) 0, 100);
203*2387a7d6SHerve Codina (Schneider Electric) if (ret)
204*2387a7d6SHerve Codina (Schneider Electric) return ret;
205*2387a7d6SHerve Codina (Schneider Electric)
206*2387a7d6SHerve Codina (Schneider Electric) if (adc1_data) {
207*2387a7d6SHerve Codina (Schneider Electric) data_reg = readl(rzn1_adc->regs + RZN1_ADC_ADC1_DATA_REG(ch));
208*2387a7d6SHerve Codina (Schneider Electric) *adc1_data = FIELD_GET(RZN1_ADC_ADCX_DATA_DATA_MASK, data_reg);
209*2387a7d6SHerve Codina (Schneider Electric) }
210*2387a7d6SHerve Codina (Schneider Electric)
211*2387a7d6SHerve Codina (Schneider Electric) if (adc2_data) {
212*2387a7d6SHerve Codina (Schneider Electric) data_reg = readl(rzn1_adc->regs + RZN1_ADC_ADC2_DATA_REG(ch));
213*2387a7d6SHerve Codina (Schneider Electric) *adc2_data = FIELD_GET(RZN1_ADC_ADCX_DATA_DATA_MASK, data_reg);
214*2387a7d6SHerve Codina (Schneider Electric) }
215*2387a7d6SHerve Codina (Schneider Electric)
216*2387a7d6SHerve Codina (Schneider Electric) return 0;
217*2387a7d6SHerve Codina (Schneider Electric) }
218*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_read_raw_ch(struct rzn1_adc * rzn1_adc,unsigned int chan,int * val)219*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_read_raw_ch(struct rzn1_adc *rzn1_adc, unsigned int chan, int *val)
220*2387a7d6SHerve Codina (Schneider Electric) {
221*2387a7d6SHerve Codina (Schneider Electric) u32 *adc1_data, *adc2_data;
222*2387a7d6SHerve Codina (Schneider Electric) int adc1_ch, adc2_ch;
223*2387a7d6SHerve Codina (Schneider Electric) u32 adc_data;
224*2387a7d6SHerve Codina (Schneider Electric) int ret;
225*2387a7d6SHerve Codina (Schneider Electric)
226*2387a7d6SHerve Codina (Schneider Electric) /*
227*2387a7d6SHerve Codina (Schneider Electric) * IIO chan are decoupled from chans used in rzn1_adc_vc_*() functions.
228*2387a7d6SHerve Codina (Schneider Electric) * The RZ/N1 ADC VC controller can handle on a single VC chan one
229*2387a7d6SHerve Codina (Schneider Electric) * channel from the ADC1 core and one channel from the ADC2 core.
230*2387a7d6SHerve Codina (Schneider Electric) *
231*2387a7d6SHerve Codina (Schneider Electric) * Even if IIO chans are mapped 1:1 to ADC core chans and so uses only
232*2387a7d6SHerve Codina (Schneider Electric) * a chan from ADC1 or a chan from ADC2, future improvements can define
233*2387a7d6SHerve Codina (Schneider Electric) * an IIO chan that uses one chan from ADC1 and one chan from ADC2.
234*2387a7d6SHerve Codina (Schneider Electric) */
235*2387a7d6SHerve Codina (Schneider Electric)
236*2387a7d6SHerve Codina (Schneider Electric) if (chan < 8) {
237*2387a7d6SHerve Codina (Schneider Electric) /* chan 0..7 used to get ADC1 ch 0..7 */
238*2387a7d6SHerve Codina (Schneider Electric) adc1_ch = chan;
239*2387a7d6SHerve Codina (Schneider Electric) adc1_data = &adc_data;
240*2387a7d6SHerve Codina (Schneider Electric) adc2_ch = RZN1_ADC_NO_CHANNEL;
241*2387a7d6SHerve Codina (Schneider Electric) adc2_data = NULL;
242*2387a7d6SHerve Codina (Schneider Electric) } else if (chan < 16) {
243*2387a7d6SHerve Codina (Schneider Electric) /* chan 8..15 used to get ADC2 ch 0..7 */
244*2387a7d6SHerve Codina (Schneider Electric) adc1_ch = RZN1_ADC_NO_CHANNEL;
245*2387a7d6SHerve Codina (Schneider Electric) adc1_data = NULL;
246*2387a7d6SHerve Codina (Schneider Electric) adc2_ch = chan - 8;
247*2387a7d6SHerve Codina (Schneider Electric) adc2_data = &adc_data;
248*2387a7d6SHerve Codina (Schneider Electric) } else {
249*2387a7d6SHerve Codina (Schneider Electric) return -EINVAL;
250*2387a7d6SHerve Codina (Schneider Electric) }
251*2387a7d6SHerve Codina (Schneider Electric)
252*2387a7d6SHerve Codina (Schneider Electric) ACQUIRE(pm_runtime_active_auto_try_enabled, pm)(rzn1_adc->dev);
253*2387a7d6SHerve Codina (Schneider Electric) ret = ACQUIRE_ERR(pm_runtime_active_auto_try_enabled, &pm);
254*2387a7d6SHerve Codina (Schneider Electric) if (ret < 0)
255*2387a7d6SHerve Codina (Schneider Electric) return ret;
256*2387a7d6SHerve Codina (Schneider Electric)
257*2387a7d6SHerve Codina (Schneider Electric) scoped_guard(mutex, &rzn1_adc->lock) {
258*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc_vc_setup_conversion(rzn1_adc, chan, adc1_ch, adc2_ch);
259*2387a7d6SHerve Codina (Schneider Electric)
260*2387a7d6SHerve Codina (Schneider Electric) ret = rzn1_adc_vc_start_conversion(rzn1_adc, chan);
261*2387a7d6SHerve Codina (Schneider Electric) if (ret)
262*2387a7d6SHerve Codina (Schneider Electric) return ret;
263*2387a7d6SHerve Codina (Schneider Electric)
264*2387a7d6SHerve Codina (Schneider Electric) ret = rzn1_adc_vc_wait_conversion(rzn1_adc, chan, adc1_data, adc2_data);
265*2387a7d6SHerve Codina (Schneider Electric) if (ret) {
266*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc_vc_stop_conversion(rzn1_adc, chan);
267*2387a7d6SHerve Codina (Schneider Electric) return ret;
268*2387a7d6SHerve Codina (Schneider Electric) }
269*2387a7d6SHerve Codina (Schneider Electric) }
270*2387a7d6SHerve Codina (Schneider Electric)
271*2387a7d6SHerve Codina (Schneider Electric) *val = adc_data;
272*2387a7d6SHerve Codina (Schneider Electric) ret = IIO_VAL_INT;
273*2387a7d6SHerve Codina (Schneider Electric)
274*2387a7d6SHerve Codina (Schneider Electric) return 0;
275*2387a7d6SHerve Codina (Schneider Electric) }
276*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_get_vref_mV(struct rzn1_adc * rzn1_adc,unsigned int chan)277*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_get_vref_mV(struct rzn1_adc *rzn1_adc, unsigned int chan)
278*2387a7d6SHerve Codina (Schneider Electric) {
279*2387a7d6SHerve Codina (Schneider Electric) /* chan 0..7 use ADC1 ch 0..7. Vref related to ADC1 core */
280*2387a7d6SHerve Codina (Schneider Electric) if (chan < 8)
281*2387a7d6SHerve Codina (Schneider Electric) return rzn1_adc->adc1_vref_mV;
282*2387a7d6SHerve Codina (Schneider Electric)
283*2387a7d6SHerve Codina (Schneider Electric) /* chan 8..15 use ADC2 ch 0..7. Vref related to ADC2 core */
284*2387a7d6SHerve Codina (Schneider Electric) if (chan < 16)
285*2387a7d6SHerve Codina (Schneider Electric) return rzn1_adc->adc2_vref_mV;
286*2387a7d6SHerve Codina (Schneider Electric)
287*2387a7d6SHerve Codina (Schneider Electric) return -EINVAL;
288*2387a7d6SHerve Codina (Schneider Electric) }
289*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long mask)290*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan,
291*2387a7d6SHerve Codina (Schneider Electric) int *val, int *val2, long mask)
292*2387a7d6SHerve Codina (Schneider Electric) {
293*2387a7d6SHerve Codina (Schneider Electric) struct rzn1_adc *rzn1_adc = iio_priv(indio_dev);
294*2387a7d6SHerve Codina (Schneider Electric) int ret;
295*2387a7d6SHerve Codina (Schneider Electric)
296*2387a7d6SHerve Codina (Schneider Electric) switch (mask) {
297*2387a7d6SHerve Codina (Schneider Electric) case IIO_CHAN_INFO_RAW:
298*2387a7d6SHerve Codina (Schneider Electric) ret = rzn1_adc_read_raw_ch(rzn1_adc, chan->channel, val);
299*2387a7d6SHerve Codina (Schneider Electric) if (ret)
300*2387a7d6SHerve Codina (Schneider Electric) return ret;
301*2387a7d6SHerve Codina (Schneider Electric) return IIO_VAL_INT;
302*2387a7d6SHerve Codina (Schneider Electric)
303*2387a7d6SHerve Codina (Schneider Electric) case IIO_CHAN_INFO_SCALE:
304*2387a7d6SHerve Codina (Schneider Electric) ret = rzn1_adc_get_vref_mV(rzn1_adc, chan->channel);
305*2387a7d6SHerve Codina (Schneider Electric) if (ret < 0)
306*2387a7d6SHerve Codina (Schneider Electric) return ret;
307*2387a7d6SHerve Codina (Schneider Electric) *val = ret;
308*2387a7d6SHerve Codina (Schneider Electric) *val2 = 12;
309*2387a7d6SHerve Codina (Schneider Electric) return IIO_VAL_FRACTIONAL_LOG2;
310*2387a7d6SHerve Codina (Schneider Electric)
311*2387a7d6SHerve Codina (Schneider Electric) default:
312*2387a7d6SHerve Codina (Schneider Electric) return -EINVAL;
313*2387a7d6SHerve Codina (Schneider Electric) }
314*2387a7d6SHerve Codina (Schneider Electric) }
315*2387a7d6SHerve Codina (Schneider Electric)
316*2387a7d6SHerve Codina (Schneider Electric) static const struct iio_info rzn1_adc_info = {
317*2387a7d6SHerve Codina (Schneider Electric) .read_raw = &rzn1_adc_read_raw,
318*2387a7d6SHerve Codina (Schneider Electric) };
319*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_set_iio_dev_channels(struct rzn1_adc * rzn1_adc,struct iio_dev * indio_dev)320*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_set_iio_dev_channels(struct rzn1_adc *rzn1_adc,
321*2387a7d6SHerve Codina (Schneider Electric) struct iio_dev *indio_dev)
322*2387a7d6SHerve Codina (Schneider Electric) {
323*2387a7d6SHerve Codina (Schneider Electric) /*
324*2387a7d6SHerve Codina (Schneider Electric) * When an ADC core is not used, its related vref_mV is set to a
325*2387a7d6SHerve Codina (Schneider Electric) * negative error code. Use the correct IIO channels table based on
326*2387a7d6SHerve Codina (Schneider Electric) * those vref_mV values.
327*2387a7d6SHerve Codina (Schneider Electric) */
328*2387a7d6SHerve Codina (Schneider Electric) if (rzn1_adc->adc1_vref_mV >= 0) {
329*2387a7d6SHerve Codina (Schneider Electric) if (rzn1_adc->adc2_vref_mV >= 0) {
330*2387a7d6SHerve Codina (Schneider Electric) indio_dev->channels = rzn1_adc1_adc2_channels;
331*2387a7d6SHerve Codina (Schneider Electric) indio_dev->num_channels = ARRAY_SIZE(rzn1_adc1_adc2_channels);
332*2387a7d6SHerve Codina (Schneider Electric) } else {
333*2387a7d6SHerve Codina (Schneider Electric) indio_dev->channels = rzn1_adc1_channels;
334*2387a7d6SHerve Codina (Schneider Electric) indio_dev->num_channels = ARRAY_SIZE(rzn1_adc1_channels);
335*2387a7d6SHerve Codina (Schneider Electric) }
336*2387a7d6SHerve Codina (Schneider Electric) return 0;
337*2387a7d6SHerve Codina (Schneider Electric) }
338*2387a7d6SHerve Codina (Schneider Electric)
339*2387a7d6SHerve Codina (Schneider Electric) if (rzn1_adc->adc2_vref_mV >= 0) {
340*2387a7d6SHerve Codina (Schneider Electric) indio_dev->channels = rzn1_adc2_channels;
341*2387a7d6SHerve Codina (Schneider Electric) indio_dev->num_channels = ARRAY_SIZE(rzn1_adc2_channels);
342*2387a7d6SHerve Codina (Schneider Electric) return 0;
343*2387a7d6SHerve Codina (Schneider Electric) }
344*2387a7d6SHerve Codina (Schneider Electric)
345*2387a7d6SHerve Codina (Schneider Electric) return dev_err_probe(rzn1_adc->dev, -ENODEV,
346*2387a7d6SHerve Codina (Schneider Electric) "Failed to set IIO channels, no ADC core used\n");
347*2387a7d6SHerve Codina (Schneider Electric) }
348*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_core_get_regulators(struct rzn1_adc * rzn1_adc,int * adc_vref_mV,const char * avdd_name,const char * vref_name)349*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_core_get_regulators(struct rzn1_adc *rzn1_adc,
350*2387a7d6SHerve Codina (Schneider Electric) int *adc_vref_mV,
351*2387a7d6SHerve Codina (Schneider Electric) const char *avdd_name, const char *vref_name)
352*2387a7d6SHerve Codina (Schneider Electric) {
353*2387a7d6SHerve Codina (Schneider Electric) struct device *dev = rzn1_adc->dev;
354*2387a7d6SHerve Codina (Schneider Electric) int ret;
355*2387a7d6SHerve Codina (Schneider Electric)
356*2387a7d6SHerve Codina (Schneider Electric) /*
357*2387a7d6SHerve Codina (Schneider Electric) * For a given ADC core (ADC1 or ADC2), both regulators (AVDD and VREF)
358*2387a7d6SHerve Codina (Schneider Electric) * must be available in order to have the ADC core used.
359*2387a7d6SHerve Codina (Schneider Electric) *
360*2387a7d6SHerve Codina (Schneider Electric) * We use the regulators presence to check the usage of the related
361*2387a7d6SHerve Codina (Schneider Electric) * ADC core. If both regulators are available, the ADC core is used.
362*2387a7d6SHerve Codina (Schneider Electric) * Otherwise, the ADC core is not used.
363*2387a7d6SHerve Codina (Schneider Electric) *
364*2387a7d6SHerve Codina (Schneider Electric) * The adc_vref_mV value is set to a negative error code (-ENODEV) when
365*2387a7d6SHerve Codina (Schneider Electric) * the ADC core is not used. Otherwise it is set to the VRef mV value.
366*2387a7d6SHerve Codina (Schneider Electric) */
367*2387a7d6SHerve Codina (Schneider Electric)
368*2387a7d6SHerve Codina (Schneider Electric) *adc_vref_mV = -ENODEV;
369*2387a7d6SHerve Codina (Schneider Electric)
370*2387a7d6SHerve Codina (Schneider Electric) ret = devm_regulator_get_enable_optional(dev, avdd_name);
371*2387a7d6SHerve Codina (Schneider Electric) if (ret == -ENODEV)
372*2387a7d6SHerve Codina (Schneider Electric) return 0;
373*2387a7d6SHerve Codina (Schneider Electric) if (ret < 0)
374*2387a7d6SHerve Codina (Schneider Electric) return dev_err_probe(dev, ret, "Failed to get '%s' regulator\n",
375*2387a7d6SHerve Codina (Schneider Electric) avdd_name);
376*2387a7d6SHerve Codina (Schneider Electric)
377*2387a7d6SHerve Codina (Schneider Electric) ret = devm_regulator_get_enable_read_voltage(dev, vref_name);
378*2387a7d6SHerve Codina (Schneider Electric) if (ret == -ENODEV)
379*2387a7d6SHerve Codina (Schneider Electric) return 0;
380*2387a7d6SHerve Codina (Schneider Electric) if (ret < 0)
381*2387a7d6SHerve Codina (Schneider Electric) return dev_err_probe(dev, ret, "Failed to get '%s' regulator\n",
382*2387a7d6SHerve Codina (Schneider Electric) vref_name);
383*2387a7d6SHerve Codina (Schneider Electric)
384*2387a7d6SHerve Codina (Schneider Electric) /*
385*2387a7d6SHerve Codina (Schneider Electric) * Both regulators are available.
386*2387a7d6SHerve Codina (Schneider Electric) * Set adc_vref_mV to the Vref value in mV. This, as the value set is
387*2387a7d6SHerve Codina (Schneider Electric) * positive, also signals that the ADC is used.
388*2387a7d6SHerve Codina (Schneider Electric) */
389*2387a7d6SHerve Codina (Schneider Electric) *adc_vref_mV = ret / 1000;
390*2387a7d6SHerve Codina (Schneider Electric)
391*2387a7d6SHerve Codina (Schneider Electric) return 0;
392*2387a7d6SHerve Codina (Schneider Electric) }
393*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_probe(struct platform_device * pdev)394*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_probe(struct platform_device *pdev)
395*2387a7d6SHerve Codina (Schneider Electric) {
396*2387a7d6SHerve Codina (Schneider Electric) struct device *dev = &pdev->dev;
397*2387a7d6SHerve Codina (Schneider Electric) struct iio_dev *indio_dev;
398*2387a7d6SHerve Codina (Schneider Electric) struct rzn1_adc *rzn1_adc;
399*2387a7d6SHerve Codina (Schneider Electric) struct clk *clk;
400*2387a7d6SHerve Codina (Schneider Electric) int ret;
401*2387a7d6SHerve Codina (Schneider Electric)
402*2387a7d6SHerve Codina (Schneider Electric) indio_dev = devm_iio_device_alloc(dev, sizeof(*rzn1_adc));
403*2387a7d6SHerve Codina (Schneider Electric) if (!indio_dev)
404*2387a7d6SHerve Codina (Schneider Electric) return -ENOMEM;
405*2387a7d6SHerve Codina (Schneider Electric)
406*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc = iio_priv(indio_dev);
407*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc->dev = dev;
408*2387a7d6SHerve Codina (Schneider Electric)
409*2387a7d6SHerve Codina (Schneider Electric) ret = devm_mutex_init(dev, &rzn1_adc->lock);
410*2387a7d6SHerve Codina (Schneider Electric) if (ret)
411*2387a7d6SHerve Codina (Schneider Electric) return ret;
412*2387a7d6SHerve Codina (Schneider Electric)
413*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc->regs = devm_platform_ioremap_resource(pdev, 0);
414*2387a7d6SHerve Codina (Schneider Electric) if (IS_ERR(rzn1_adc->regs))
415*2387a7d6SHerve Codina (Schneider Electric) return PTR_ERR(rzn1_adc->regs);
416*2387a7d6SHerve Codina (Schneider Electric)
417*2387a7d6SHerve Codina (Schneider Electric) clk = devm_clk_get_enabled(dev, "pclk");
418*2387a7d6SHerve Codina (Schneider Electric) if (IS_ERR(clk))
419*2387a7d6SHerve Codina (Schneider Electric) return dev_err_probe(dev, PTR_ERR(clk), "Failed to get pclk\n");
420*2387a7d6SHerve Codina (Schneider Electric)
421*2387a7d6SHerve Codina (Schneider Electric) clk = devm_clk_get_enabled(dev, "adc");
422*2387a7d6SHerve Codina (Schneider Electric) if (IS_ERR(clk))
423*2387a7d6SHerve Codina (Schneider Electric) return dev_err_probe(dev, PTR_ERR(clk), "Failed to get adc clk\n");
424*2387a7d6SHerve Codina (Schneider Electric)
425*2387a7d6SHerve Codina (Schneider Electric) ret = rzn1_adc_core_get_regulators(rzn1_adc, &rzn1_adc->adc1_vref_mV,
426*2387a7d6SHerve Codina (Schneider Electric) "adc1-avdd", "adc1-vref");
427*2387a7d6SHerve Codina (Schneider Electric) if (ret)
428*2387a7d6SHerve Codina (Schneider Electric) return ret;
429*2387a7d6SHerve Codina (Schneider Electric)
430*2387a7d6SHerve Codina (Schneider Electric) ret = rzn1_adc_core_get_regulators(rzn1_adc, &rzn1_adc->adc2_vref_mV,
431*2387a7d6SHerve Codina (Schneider Electric) "adc2-avdd", "adc2-vref");
432*2387a7d6SHerve Codina (Schneider Electric) if (ret)
433*2387a7d6SHerve Codina (Schneider Electric) return ret;
434*2387a7d6SHerve Codina (Schneider Electric)
435*2387a7d6SHerve Codina (Schneider Electric) platform_set_drvdata(pdev, rzn1_adc);
436*2387a7d6SHerve Codina (Schneider Electric)
437*2387a7d6SHerve Codina (Schneider Electric) indio_dev->name = "rzn1-adc";
438*2387a7d6SHerve Codina (Schneider Electric) indio_dev->info = &rzn1_adc_info;
439*2387a7d6SHerve Codina (Schneider Electric) indio_dev->modes = INDIO_DIRECT_MODE;
440*2387a7d6SHerve Codina (Schneider Electric) ret = rzn1_adc_set_iio_dev_channels(rzn1_adc, indio_dev);
441*2387a7d6SHerve Codina (Schneider Electric) if (ret)
442*2387a7d6SHerve Codina (Schneider Electric) return ret;
443*2387a7d6SHerve Codina (Schneider Electric)
444*2387a7d6SHerve Codina (Schneider Electric) pm_runtime_set_autosuspend_delay(dev, 500);
445*2387a7d6SHerve Codina (Schneider Electric) pm_runtime_use_autosuspend(dev);
446*2387a7d6SHerve Codina (Schneider Electric) ret = devm_pm_runtime_enable(dev);
447*2387a7d6SHerve Codina (Schneider Electric) if (ret)
448*2387a7d6SHerve Codina (Schneider Electric) return dev_err_probe(dev, ret, "Failed to enable runtime PM\n");
449*2387a7d6SHerve Codina (Schneider Electric)
450*2387a7d6SHerve Codina (Schneider Electric) return devm_iio_device_register(dev, indio_dev);
451*2387a7d6SHerve Codina (Schneider Electric) }
452*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_pm_runtime_suspend(struct device * dev)453*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_pm_runtime_suspend(struct device *dev)
454*2387a7d6SHerve Codina (Schneider Electric) {
455*2387a7d6SHerve Codina (Schneider Electric) struct rzn1_adc *rzn1_adc = dev_get_drvdata(dev);
456*2387a7d6SHerve Codina (Schneider Electric)
457*2387a7d6SHerve Codina (Schneider Electric) return rzn1_adc_power(rzn1_adc, false);
458*2387a7d6SHerve Codina (Schneider Electric) }
459*2387a7d6SHerve Codina (Schneider Electric)
rzn1_adc_pm_runtime_resume(struct device * dev)460*2387a7d6SHerve Codina (Schneider Electric) static int rzn1_adc_pm_runtime_resume(struct device *dev)
461*2387a7d6SHerve Codina (Schneider Electric) {
462*2387a7d6SHerve Codina (Schneider Electric) struct rzn1_adc *rzn1_adc = dev_get_drvdata(dev);
463*2387a7d6SHerve Codina (Schneider Electric)
464*2387a7d6SHerve Codina (Schneider Electric) return rzn1_adc_power(rzn1_adc, true);
465*2387a7d6SHerve Codina (Schneider Electric) }
466*2387a7d6SHerve Codina (Schneider Electric)
467*2387a7d6SHerve Codina (Schneider Electric) static DEFINE_RUNTIME_DEV_PM_OPS(rzn1_adc_pm_ops,
468*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc_pm_runtime_suspend,
469*2387a7d6SHerve Codina (Schneider Electric) rzn1_adc_pm_runtime_resume,
470*2387a7d6SHerve Codina (Schneider Electric) NULL);
471*2387a7d6SHerve Codina (Schneider Electric)
472*2387a7d6SHerve Codina (Schneider Electric) static const struct of_device_id rzn1_adc_of_match[] = {
473*2387a7d6SHerve Codina (Schneider Electric) { .compatible = "renesas,rzn1-adc" },
474*2387a7d6SHerve Codina (Schneider Electric) { }
475*2387a7d6SHerve Codina (Schneider Electric) };
476*2387a7d6SHerve Codina (Schneider Electric) MODULE_DEVICE_TABLE(of, rzn1_adc_of_match);
477*2387a7d6SHerve Codina (Schneider Electric)
478*2387a7d6SHerve Codina (Schneider Electric) static struct platform_driver rzn1_adc_driver = {
479*2387a7d6SHerve Codina (Schneider Electric) .probe = rzn1_adc_probe,
480*2387a7d6SHerve Codina (Schneider Electric) .driver = {
481*2387a7d6SHerve Codina (Schneider Electric) .name = "rzn1-adc",
482*2387a7d6SHerve Codina (Schneider Electric) .of_match_table = rzn1_adc_of_match,
483*2387a7d6SHerve Codina (Schneider Electric) .pm = pm_ptr(&rzn1_adc_pm_ops),
484*2387a7d6SHerve Codina (Schneider Electric) },
485*2387a7d6SHerve Codina (Schneider Electric) };
486*2387a7d6SHerve Codina (Schneider Electric) module_platform_driver(rzn1_adc_driver);
487*2387a7d6SHerve Codina (Schneider Electric)
488*2387a7d6SHerve Codina (Schneider Electric) MODULE_AUTHOR("Herve Codina <herve.codina@bootlin.com>");
489*2387a7d6SHerve Codina (Schneider Electric) MODULE_DESCRIPTION("Renesas RZ/N1 ADC Driver");
490*2387a7d6SHerve Codina (Schneider Electric) MODULE_LICENSE("GPL");
491