xref: /linux/drivers/iio/adc/ade9000.c (revision 4f38da1f027ea2c9f01bb71daa7a299c191b6940)
1*81de7b46SAntoniu Miclaus // SPDX-License-Identifier: GPL-2.0-only
2*81de7b46SAntoniu Miclaus /**
3*81de7b46SAntoniu Miclaus  * ADE9000 driver
4*81de7b46SAntoniu Miclaus  *
5*81de7b46SAntoniu Miclaus  * Copyright 2025 Analog Devices Inc.
6*81de7b46SAntoniu Miclaus  */
7*81de7b46SAntoniu Miclaus 
8*81de7b46SAntoniu Miclaus #include <linux/bitfield.h>
9*81de7b46SAntoniu Miclaus #include <linux/clk.h>
10*81de7b46SAntoniu Miclaus #include <linux/clk-provider.h>
11*81de7b46SAntoniu Miclaus #include <linux/completion.h>
12*81de7b46SAntoniu Miclaus #include <linux/delay.h>
13*81de7b46SAntoniu Miclaus #include <linux/gpio/consumer.h>
14*81de7b46SAntoniu Miclaus #include <linux/iio/iio.h>
15*81de7b46SAntoniu Miclaus #include <linux/iio/buffer.h>
16*81de7b46SAntoniu Miclaus #include <linux/iio/kfifo_buf.h>
17*81de7b46SAntoniu Miclaus #include <linux/iio/events.h>
18*81de7b46SAntoniu Miclaus #include <linux/interrupt.h>
19*81de7b46SAntoniu Miclaus #include <linux/minmax.h>
20*81de7b46SAntoniu Miclaus #include <linux/module.h>
21*81de7b46SAntoniu Miclaus #include <linux/property.h>
22*81de7b46SAntoniu Miclaus #include <linux/regmap.h>
23*81de7b46SAntoniu Miclaus #include <linux/regulator/consumer.h>
24*81de7b46SAntoniu Miclaus #include <linux/spi/spi.h>
25*81de7b46SAntoniu Miclaus #include <linux/unaligned.h>
26*81de7b46SAntoniu Miclaus 
27*81de7b46SAntoniu Miclaus /* Address of ADE9000 registers */
28*81de7b46SAntoniu Miclaus #define ADE9000_REG_AIGAIN		0x000
29*81de7b46SAntoniu Miclaus #define ADE9000_REG_AVGAIN		0x00B
30*81de7b46SAntoniu Miclaus #define ADE9000_REG_AIRMSOS		0x00C
31*81de7b46SAntoniu Miclaus #define ADE9000_REG_AVRMSOS		0x00D
32*81de7b46SAntoniu Miclaus #define ADE9000_REG_APGAIN		0x00E
33*81de7b46SAntoniu Miclaus #define ADE9000_REG_AWATTOS		0x00F
34*81de7b46SAntoniu Miclaus #define ADE9000_REG_AVAROS		0x010
35*81de7b46SAntoniu Miclaus #define ADE9000_REG_AFVAROS		0x012
36*81de7b46SAntoniu Miclaus #define ADE9000_REG_CONFIG0		0x060
37*81de7b46SAntoniu Miclaus #define ADE9000_REG_DICOEFF		0x072
38*81de7b46SAntoniu Miclaus #define ADE9000_REG_AI_PCF		0x20A
39*81de7b46SAntoniu Miclaus #define ADE9000_REG_AV_PCF		0x20B
40*81de7b46SAntoniu Miclaus #define ADE9000_REG_AIRMS		0x20C
41*81de7b46SAntoniu Miclaus #define ADE9000_REG_AVRMS		0x20D
42*81de7b46SAntoniu Miclaus #define ADE9000_REG_AWATT		0x210
43*81de7b46SAntoniu Miclaus #define ADE9000_REG_AVAR		0x211
44*81de7b46SAntoniu Miclaus #define ADE9000_REG_AVA			0x212
45*81de7b46SAntoniu Miclaus #define ADE9000_REG_AFVAR		0x214
46*81de7b46SAntoniu Miclaus #define ADE9000_REG_APF			0x216
47*81de7b46SAntoniu Miclaus #define ADE9000_REG_BI_PCF		0x22A
48*81de7b46SAntoniu Miclaus #define ADE9000_REG_BV_PCF		0x22B
49*81de7b46SAntoniu Miclaus #define ADE9000_REG_BIRMS		0x22C
50*81de7b46SAntoniu Miclaus #define ADE9000_REG_BVRMS		0x22D
51*81de7b46SAntoniu Miclaus #define ADE9000_REG_CI_PCF		0x24A
52*81de7b46SAntoniu Miclaus #define ADE9000_REG_CV_PCF		0x24B
53*81de7b46SAntoniu Miclaus #define ADE9000_REG_CIRMS		0x24C
54*81de7b46SAntoniu Miclaus #define ADE9000_REG_CVRMS		0x24D
55*81de7b46SAntoniu Miclaus #define ADE9000_REG_AWATT_ACC		0x2E5
56*81de7b46SAntoniu Miclaus #define ADE9000_REG_AWATTHR_LO		0x2E6
57*81de7b46SAntoniu Miclaus #define ADE9000_REG_AVAHR_LO		0x2FA
58*81de7b46SAntoniu Miclaus #define ADE9000_REG_AFVARHR_LO		0x30E
59*81de7b46SAntoniu Miclaus #define ADE9000_REG_BWATTHR_LO		0x322
60*81de7b46SAntoniu Miclaus #define ADE9000_REG_BVAHR_LO		0x336
61*81de7b46SAntoniu Miclaus #define ADE9000_REG_BFVARHR_LO		0x34A
62*81de7b46SAntoniu Miclaus #define ADE9000_REG_CWATTHR_LO		0x35E
63*81de7b46SAntoniu Miclaus #define ADE9000_REG_CVAHR_LO		0x372
64*81de7b46SAntoniu Miclaus #define ADE9000_REG_CFVARHR_LO		0x386
65*81de7b46SAntoniu Miclaus #define ADE9000_REG_STATUS0		0x402
66*81de7b46SAntoniu Miclaus #define ADE9000_REG_STATUS1		0x403
67*81de7b46SAntoniu Miclaus #define ADE9000_REG_MASK0		0x405
68*81de7b46SAntoniu Miclaus #define ADE9000_REG_MASK1		0x406
69*81de7b46SAntoniu Miclaus #define ADE9000_REG_EVENT_MASK		0x407
70*81de7b46SAntoniu Miclaus #define ADE9000_REG_VLEVEL		0x40F
71*81de7b46SAntoniu Miclaus #define ADE9000_REG_DIP_LVL		0x410
72*81de7b46SAntoniu Miclaus #define ADE9000_REG_DIPA		0x411
73*81de7b46SAntoniu Miclaus #define ADE9000_REG_DIPB		0x412
74*81de7b46SAntoniu Miclaus #define ADE9000_REG_DIPC		0x413
75*81de7b46SAntoniu Miclaus #define ADE9000_REG_SWELL_LVL		0x414
76*81de7b46SAntoniu Miclaus #define ADE9000_REG_SWELLA		0x415
77*81de7b46SAntoniu Miclaus #define ADE9000_REG_SWELLB		0x416
78*81de7b46SAntoniu Miclaus #define ADE9000_REG_SWELLC		0x417
79*81de7b46SAntoniu Miclaus #define ADE9000_REG_APERIOD		0x418
80*81de7b46SAntoniu Miclaus #define ADE9000_REG_BPERIOD		0x419
81*81de7b46SAntoniu Miclaus #define ADE9000_REG_CPERIOD		0x41A
82*81de7b46SAntoniu Miclaus #define ADE9000_REG_RUN			0x480
83*81de7b46SAntoniu Miclaus #define ADE9000_REG_CONFIG1		0x481
84*81de7b46SAntoniu Miclaus #define ADE9000_REG_ACCMODE		0x492
85*81de7b46SAntoniu Miclaus #define ADE9000_REG_CONFIG3		0x493
86*81de7b46SAntoniu Miclaus #define ADE9000_REG_ZXTOUT		0x498
87*81de7b46SAntoniu Miclaus #define ADE9000_REG_ZX_LP_SEL		0x49A
88*81de7b46SAntoniu Miclaus #define ADE9000_REG_WFB_CFG		0x4A0
89*81de7b46SAntoniu Miclaus #define ADE9000_REG_WFB_PG_IRQEN	0x4A1
90*81de7b46SAntoniu Miclaus #define ADE9000_REG_WFB_TRG_CFG		0x4A2
91*81de7b46SAntoniu Miclaus #define ADE9000_REG_WFB_TRG_STAT	0x4A3
92*81de7b46SAntoniu Miclaus #define ADE9000_REG_CONFIG2		0x4AF
93*81de7b46SAntoniu Miclaus #define ADE9000_REG_EP_CFG		0x4B0
94*81de7b46SAntoniu Miclaus #define ADE9000_REG_EGY_TIME		0x4B2
95*81de7b46SAntoniu Miclaus #define ADE9000_REG_PGA_GAIN		0x4B9
96*81de7b46SAntoniu Miclaus #define ADE9000_REG_VERSION		0x4FE
97*81de7b46SAntoniu Miclaus #define ADE9000_REG_WF_BUFF		0x800
98*81de7b46SAntoniu Miclaus #define ADE9000_REG_WF_HALF_BUFF	0xC00
99*81de7b46SAntoniu Miclaus 
100*81de7b46SAntoniu Miclaus #define ADE9000_REG_ADDR_MASK		GENMASK(15, 4)
101*81de7b46SAntoniu Miclaus #define ADE9000_REG_READ_BIT_MASK	BIT(3)
102*81de7b46SAntoniu Miclaus 
103*81de7b46SAntoniu Miclaus #define ADE9000_WF_CAP_EN_MASK		BIT(4)
104*81de7b46SAntoniu Miclaus #define ADE9000_WF_CAP_SEL_MASK		BIT(5)
105*81de7b46SAntoniu Miclaus #define ADE9000_WF_MODE_MASK		GENMASK(7, 6)
106*81de7b46SAntoniu Miclaus #define ADE9000_WF_SRC_MASK		GENMASK(9, 8)
107*81de7b46SAntoniu Miclaus #define ADE9000_WF_IN_EN_MASK		BIT(12)
108*81de7b46SAntoniu Miclaus 
109*81de7b46SAntoniu Miclaus /* External reference selection bit in CONFIG1 */
110*81de7b46SAntoniu Miclaus #define ADE9000_EXT_REF_MASK		BIT(15)
111*81de7b46SAntoniu Miclaus 
112*81de7b46SAntoniu Miclaus /*
113*81de7b46SAntoniu Miclaus  * Configuration registers
114*81de7b46SAntoniu Miclaus  */
115*81de7b46SAntoniu Miclaus #define ADE9000_PGA_GAIN		0x0000
116*81de7b46SAntoniu Miclaus 
117*81de7b46SAntoniu Miclaus /* Default configuration */
118*81de7b46SAntoniu Miclaus 
119*81de7b46SAntoniu Miclaus #define ADE9000_CONFIG0			0x00000000
120*81de7b46SAntoniu Miclaus 
121*81de7b46SAntoniu Miclaus /* CF3/ZX pin outputs Zero crossing, CF4 = DREADY */
122*81de7b46SAntoniu Miclaus #define ADE9000_CONFIG1			0x000E
123*81de7b46SAntoniu Miclaus 
124*81de7b46SAntoniu Miclaus /* Default High pass corner frequency of 1.25Hz */
125*81de7b46SAntoniu Miclaus #define ADE9000_CONFIG2			0x0A00
126*81de7b46SAntoniu Miclaus 
127*81de7b46SAntoniu Miclaus /* Peak and overcurrent detection disabled */
128*81de7b46SAntoniu Miclaus #define ADE9000_CONFIG3			0x0000
129*81de7b46SAntoniu Miclaus 
130*81de7b46SAntoniu Miclaus /*
131*81de7b46SAntoniu Miclaus  * 50Hz operation, 3P4W Wye configuration, signed accumulation
132*81de7b46SAntoniu Miclaus  * 3P4W Wye = 3-Phase 4-Wire star configuration (3 phases + neutral wire)
133*81de7b46SAntoniu Miclaus  * Clear bit 8 i.e. ACCMODE=0x00xx for 50Hz operation
134*81de7b46SAntoniu Miclaus  * ACCMODE=0x0x9x for 3Wire delta when phase B is used as reference
135*81de7b46SAntoniu Miclaus  * 3Wire delta = 3-Phase 3-Wire triangle configuration (3 phases, no neutral)
136*81de7b46SAntoniu Miclaus  */
137*81de7b46SAntoniu Miclaus #define ADE9000_ACCMODE			0x0000
138*81de7b46SAntoniu Miclaus #define ADE9000_ACCMODE_60HZ		0x0100
139*81de7b46SAntoniu Miclaus 
140*81de7b46SAntoniu Miclaus /*Line period and zero crossing obtained from VA */
141*81de7b46SAntoniu Miclaus #define ADE9000_ZX_LP_SEL		0x0000
142*81de7b46SAntoniu Miclaus 
143*81de7b46SAntoniu Miclaus /* Interrupt mask values for initialization */
144*81de7b46SAntoniu Miclaus #define ADE9000_MASK0_ALL_INT_DIS	0
145*81de7b46SAntoniu Miclaus #define ADE9000_MASK1_ALL_INT_DIS	0x00000000
146*81de7b46SAntoniu Miclaus 
147*81de7b46SAntoniu Miclaus /* Events disabled */
148*81de7b46SAntoniu Miclaus #define ADE9000_EVENT_DISABLE		0x00000000
149*81de7b46SAntoniu Miclaus 
150*81de7b46SAntoniu Miclaus /*
151*81de7b46SAntoniu Miclaus  * Assuming Vnom=1/2 of full scale.
152*81de7b46SAntoniu Miclaus  * Refer to Technical reference manual for detailed calculations.
153*81de7b46SAntoniu Miclaus  */
154*81de7b46SAntoniu Miclaus #define ADE9000_VLEVEL			0x0022EA28
155*81de7b46SAntoniu Miclaus 
156*81de7b46SAntoniu Miclaus /* Set DICOEFF= 0xFFFFE000 when integrator is enabled */
157*81de7b46SAntoniu Miclaus #define ADE9000_DICOEFF			0x00000000
158*81de7b46SAntoniu Miclaus 
159*81de7b46SAntoniu Miclaus /* DSP ON */
160*81de7b46SAntoniu Miclaus #define ADE9000_RUN_ON			0xFFFFFFFF
161*81de7b46SAntoniu Miclaus 
162*81de7b46SAntoniu Miclaus /*
163*81de7b46SAntoniu Miclaus  * Energy Accumulation Settings
164*81de7b46SAntoniu Miclaus  * Enable energy accumulation, accumulate samples at 8ksps
165*81de7b46SAntoniu Miclaus  * latch energy accumulation after EGYRDY
166*81de7b46SAntoniu Miclaus  * If accumulation is changed to half line cycle mode, change EGY_TIME
167*81de7b46SAntoniu Miclaus  */
168*81de7b46SAntoniu Miclaus #define ADE9000_EP_CFG			0x0011
169*81de7b46SAntoniu Miclaus 
170*81de7b46SAntoniu Miclaus /* Accumulate 4000 samples */
171*81de7b46SAntoniu Miclaus #define ADE9000_EGY_TIME		7999
172*81de7b46SAntoniu Miclaus 
173*81de7b46SAntoniu Miclaus /*
174*81de7b46SAntoniu Miclaus  * Constant Definitions
175*81de7b46SAntoniu Miclaus  * ADE9000 FDSP: 8000sps, ADE9000 FDSP: 4000sps
176*81de7b46SAntoniu Miclaus  */
177*81de7b46SAntoniu Miclaus #define ADE9000_FDSP			4000
178*81de7b46SAntoniu Miclaus #define ADE9000_DEFAULT_CLK_FREQ_HZ	24576000
179*81de7b46SAntoniu Miclaus #define ADE9000_WFB_CFG			0x03E9
180*81de7b46SAntoniu Miclaus #define ADE9000_WFB_PAGE_SIZE		128
181*81de7b46SAntoniu Miclaus #define ADE9000_WFB_NR_OF_PAGES		16
182*81de7b46SAntoniu Miclaus #define ADE9000_WFB_MAX_CHANNELS	8
183*81de7b46SAntoniu Miclaus #define ADE9000_WFB_BYTES_IN_SAMPLE	4
184*81de7b46SAntoniu Miclaus #define ADE9000_WFB_SAMPLES_IN_PAGE	\
185*81de7b46SAntoniu Miclaus 	(ADE9000_WFB_PAGE_SIZE / ADE9000_WFB_MAX_CHANNELS)
186*81de7b46SAntoniu Miclaus #define ADE9000_WFB_MAX_SAMPLES_CHAN	\
187*81de7b46SAntoniu Miclaus 	(ADE9000_WFB_SAMPLES_IN_PAGE * ADE9000_WFB_NR_OF_PAGES)
188*81de7b46SAntoniu Miclaus #define ADE9000_WFB_FULL_BUFF_NR_SAMPLES \
189*81de7b46SAntoniu Miclaus 	(ADE9000_WFB_PAGE_SIZE * ADE9000_WFB_NR_OF_PAGES)
190*81de7b46SAntoniu Miclaus #define ADE9000_WFB_FULL_BUFF_SIZE	\
191*81de7b46SAntoniu Miclaus 	(ADE9000_WFB_FULL_BUFF_NR_SAMPLES * ADE9000_WFB_BYTES_IN_SAMPLE)
192*81de7b46SAntoniu Miclaus 
193*81de7b46SAntoniu Miclaus #define ADE9000_SWRST_BIT		BIT(0)
194*81de7b46SAntoniu Miclaus 
195*81de7b46SAntoniu Miclaus /* Status and Mask register bits*/
196*81de7b46SAntoniu Miclaus #define ADE9000_ST0_WFB_TRIG_BIT	BIT(16)
197*81de7b46SAntoniu Miclaus #define ADE9000_ST0_PAGE_FULL_BIT	BIT(17)
198*81de7b46SAntoniu Miclaus #define ADE9000_ST0_EGYRDY		BIT(0)
199*81de7b46SAntoniu Miclaus 
200*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXTOVA_BIT		BIT(6)
201*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXTOVB_BIT		BIT(7)
202*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXTOVC_BIT		BIT(8)
203*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXVA_BIT		BIT(9)
204*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXVB_BIT		BIT(10)
205*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXVC_BIT		BIT(11)
206*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXIA_BIT		BIT(13)
207*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXIB_BIT		BIT(14)
208*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ZXIC_BIT		BIT(15)
209*81de7b46SAntoniu Miclaus #define ADE9000_ST1_RSTDONE_BIT		BIT(16)
210*81de7b46SAntoniu Miclaus #define ADE9000_ST1_SEQERR_BIT		BIT(18)
211*81de7b46SAntoniu Miclaus #define ADE9000_ST1_SWELLA_BIT		BIT(20)
212*81de7b46SAntoniu Miclaus #define ADE9000_ST1_SWELLB_BIT		BIT(21)
213*81de7b46SAntoniu Miclaus #define ADE9000_ST1_SWELLC_BIT		BIT(22)
214*81de7b46SAntoniu Miclaus #define ADE9000_ST1_DIPA_BIT		BIT(23)
215*81de7b46SAntoniu Miclaus #define ADE9000_ST1_DIPB_BIT		BIT(24)
216*81de7b46SAntoniu Miclaus #define ADE9000_ST1_DIPC_BIT		BIT(25)
217*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ERROR0_BIT		BIT(28)
218*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ERROR1_BIT		BIT(29)
219*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ERROR2_BIT		BIT(30)
220*81de7b46SAntoniu Miclaus #define ADE9000_ST1_ERROR3_BIT		BIT(31)
221*81de7b46SAntoniu Miclaus #define ADE9000_ST_ERROR \
222*81de7b46SAntoniu Miclaus 	(ADE9000_ST1_ERROR0 | ADE9000_ST1_ERROR1 | \
223*81de7b46SAntoniu Miclaus 	 ADE9000_ST1_ERROR2 | ADE9000_ST1_ERROR3)
224*81de7b46SAntoniu Miclaus #define ADE9000_ST1_CROSSING_FIRST	6
225*81de7b46SAntoniu Miclaus #define ADE9000_ST1_CROSSING_DEPTH	25
226*81de7b46SAntoniu Miclaus 
227*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_DIP_BIT		BIT(0)
228*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_SWELL_BIT	BIT(1)
229*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_ZXIA_BIT	BIT(3)
230*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_ZXIB_BIT	BIT(4)
231*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_ZXIC_BIT	BIT(5)
232*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_ZXVA_BIT	BIT(6)
233*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_ZXVB_BIT	BIT(7)
234*81de7b46SAntoniu Miclaus #define ADE9000_WFB_TRG_ZXVC_BIT	BIT(8)
235*81de7b46SAntoniu Miclaus 
236*81de7b46SAntoniu Miclaus /* Stop when waveform buffer is full */
237*81de7b46SAntoniu Miclaus #define ADE9000_WFB_FULL_MODE		0x0
238*81de7b46SAntoniu Miclaus /* Continuous fill—stop only on enabled trigger events */
239*81de7b46SAntoniu Miclaus #define ADE9000_WFB_EN_TRIG_MODE	0x1
240*81de7b46SAntoniu Miclaus /* Continuous filling—center capture around enabled trigger events */
241*81de7b46SAntoniu Miclaus #define ADE9000_WFB_C_EN_TRIG_MODE	0x2
242*81de7b46SAntoniu Miclaus /* Continuous fill—used as streaming mode for continuous data output */
243*81de7b46SAntoniu Miclaus #define ADE9000_WFB_STREAMING_MODE	0x3
244*81de7b46SAntoniu Miclaus 
245*81de7b46SAntoniu Miclaus #define ADE9000_LAST_PAGE_BIT		BIT(15)
246*81de7b46SAntoniu Miclaus #define ADE9000_MIDDLE_PAGE_BIT		BIT(7)
247*81de7b46SAntoniu Miclaus 
248*81de7b46SAntoniu Miclaus /*
249*81de7b46SAntoniu Miclaus  * Full scale Codes referred from Datasheet. Respective digital codes are
250*81de7b46SAntoniu Miclaus  * produced when ADC inputs are at full scale.
251*81de7b46SAntoniu Miclaus  */
252*81de7b46SAntoniu Miclaus #define ADE9000_RMS_FULL_SCALE_CODES	52866837
253*81de7b46SAntoniu Miclaus #define ADE9000_WATT_FULL_SCALE_CODES	20694066
254*81de7b46SAntoniu Miclaus #define ADE9000_PCF_FULL_SCALE_CODES	74770000
255*81de7b46SAntoniu Miclaus 
256*81de7b46SAntoniu Miclaus /* Phase and channel definitions */
257*81de7b46SAntoniu Miclaus #define ADE9000_PHASE_A_NR		0
258*81de7b46SAntoniu Miclaus #define ADE9000_PHASE_B_NR		1
259*81de7b46SAntoniu Miclaus #define ADE9000_PHASE_C_NR		2
260*81de7b46SAntoniu Miclaus 
261*81de7b46SAntoniu Miclaus #define ADE9000_SCAN_POS_IA		BIT(0)
262*81de7b46SAntoniu Miclaus #define ADE9000_SCAN_POS_VA		BIT(1)
263*81de7b46SAntoniu Miclaus #define ADE9000_SCAN_POS_IB		BIT(2)
264*81de7b46SAntoniu Miclaus #define ADE9000_SCAN_POS_VB		BIT(3)
265*81de7b46SAntoniu Miclaus #define ADE9000_SCAN_POS_IC		BIT(4)
266*81de7b46SAntoniu Miclaus #define ADE9000_SCAN_POS_VC		BIT(5)
267*81de7b46SAntoniu Miclaus 
268*81de7b46SAntoniu Miclaus /* Waveform buffer configuration values */
269*81de7b46SAntoniu Miclaus enum ade9000_wfb_cfg {
270*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_ALL_CHAN = 0x0,
271*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_IA_VA = 0x1,
272*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_IB_VB = 0x2,
273*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_IC_VC = 0x3,
274*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_IA = 0x8,
275*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_VA = 0x9,
276*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_IB = 0xA,
277*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_VB = 0xB,
278*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_IC = 0xC,
279*81de7b46SAntoniu Miclaus 	ADE9000_WFB_CFG_VC = 0xD,
280*81de7b46SAntoniu Miclaus };
281*81de7b46SAntoniu Miclaus 
282*81de7b46SAntoniu Miclaus #define ADE9000_PHASE_B_POS_BIT		BIT(5)
283*81de7b46SAntoniu Miclaus #define ADE9000_PHASE_C_POS_BIT		BIT(6)
284*81de7b46SAntoniu Miclaus 
285*81de7b46SAntoniu Miclaus #define ADE9000_MAX_PHASE_NR		3
286*81de7b46SAntoniu Miclaus #define AD9000_CHANNELS_PER_PHASE	10
287*81de7b46SAntoniu Miclaus 
288*81de7b46SAntoniu Miclaus /*
289*81de7b46SAntoniu Miclaus  * Calculate register address for multi-phase device.
290*81de7b46SAntoniu Miclaus  * Phase A (chan 0): base address + 0x00
291*81de7b46SAntoniu Miclaus  * Phase B (chan 1): base address + 0x20
292*81de7b46SAntoniu Miclaus  * Phase C (chan 2): base address + 0x40
293*81de7b46SAntoniu Miclaus  */
294*81de7b46SAntoniu Miclaus #define ADE9000_ADDR_ADJUST(addr, chan)					\
295*81de7b46SAntoniu Miclaus 	(((chan) == 0 ? 0 : (chan) == 1 ? 2 : 4) << 4 | (addr))
296*81de7b46SAntoniu Miclaus 
297*81de7b46SAntoniu Miclaus struct ade9000_state {
298*81de7b46SAntoniu Miclaus 	struct completion reset_completion;
299*81de7b46SAntoniu Miclaus 	struct mutex lock; /* Protects SPI transactions */
300*81de7b46SAntoniu Miclaus 	u8 wf_src;
301*81de7b46SAntoniu Miclaus 	u32 wfb_trg;
302*81de7b46SAntoniu Miclaus 	u8 wfb_nr_activ_chan;
303*81de7b46SAntoniu Miclaus 	u32 wfb_nr_samples;
304*81de7b46SAntoniu Miclaus 	struct spi_device *spi;
305*81de7b46SAntoniu Miclaus 	struct clk *clkin;
306*81de7b46SAntoniu Miclaus 	struct spi_transfer xfer[2];
307*81de7b46SAntoniu Miclaus 	struct spi_message spi_msg;
308*81de7b46SAntoniu Miclaus 	struct regmap *regmap;
309*81de7b46SAntoniu Miclaus 	union{
310*81de7b46SAntoniu Miclaus 		u8 byte[ADE9000_WFB_FULL_BUFF_SIZE];
311*81de7b46SAntoniu Miclaus 		__be32 word[ADE9000_WFB_FULL_BUFF_NR_SAMPLES];
312*81de7b46SAntoniu Miclaus 	} rx_buff __aligned(IIO_DMA_MINALIGN);
313*81de7b46SAntoniu Miclaus 	u8 tx_buff[2] __aligned(IIO_DMA_MINALIGN);
314*81de7b46SAntoniu Miclaus 	unsigned int bulk_read_buf[2];
315*81de7b46SAntoniu Miclaus };
316*81de7b46SAntoniu Miclaus 
317*81de7b46SAntoniu Miclaus struct ade9000_irq1_event {
318*81de7b46SAntoniu Miclaus 	u32 bit_mask;
319*81de7b46SAntoniu Miclaus 	enum iio_chan_type chan_type;
320*81de7b46SAntoniu Miclaus 	u32 channel;
321*81de7b46SAntoniu Miclaus 	enum iio_event_type event_type;
322*81de7b46SAntoniu Miclaus 	enum iio_event_direction event_dir;
323*81de7b46SAntoniu Miclaus };
324*81de7b46SAntoniu Miclaus 
325*81de7b46SAntoniu Miclaus static const struct ade9000_irq1_event ade9000_irq1_events[] = {
326*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_ZXVA_BIT, IIO_VOLTAGE, ADE9000_PHASE_A_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER },
327*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_ZXIA_BIT, IIO_CURRENT, ADE9000_PHASE_A_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER },
328*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_ZXVB_BIT, IIO_VOLTAGE, ADE9000_PHASE_B_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER },
329*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_ZXIB_BIT, IIO_CURRENT, ADE9000_PHASE_B_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER },
330*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_ZXVC_BIT, IIO_VOLTAGE, ADE9000_PHASE_C_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER },
331*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_ZXIC_BIT, IIO_CURRENT, ADE9000_PHASE_C_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER },
332*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_SWELLA_BIT, IIO_ALTVOLTAGE, ADE9000_PHASE_A_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING },
333*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_SWELLB_BIT, IIO_ALTVOLTAGE, ADE9000_PHASE_B_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING },
334*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_SWELLC_BIT, IIO_ALTVOLTAGE, ADE9000_PHASE_C_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING },
335*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_DIPA_BIT, IIO_ALTVOLTAGE, ADE9000_PHASE_A_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING },
336*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_DIPB_BIT, IIO_ALTVOLTAGE, ADE9000_PHASE_B_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING },
337*81de7b46SAntoniu Miclaus 	{ ADE9000_ST1_DIPC_BIT, IIO_ALTVOLTAGE, ADE9000_PHASE_C_NR, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING },
338*81de7b46SAntoniu Miclaus };
339*81de7b46SAntoniu Miclaus 
340*81de7b46SAntoniu Miclaus /* Voltage events (zero crossing on instantaneous voltage) */
341*81de7b46SAntoniu Miclaus static const struct iio_event_spec ade9000_voltage_events[] = {
342*81de7b46SAntoniu Miclaus 	{
343*81de7b46SAntoniu Miclaus 		/* Zero crossing detection - datasheet: ZXV interrupts */
344*81de7b46SAntoniu Miclaus 		.type = IIO_EV_TYPE_THRESH,
345*81de7b46SAntoniu Miclaus 		.dir = IIO_EV_DIR_EITHER,
346*81de7b46SAntoniu Miclaus 		.mask_separate = BIT(IIO_EV_INFO_ENABLE),
347*81de7b46SAntoniu Miclaus 	},
348*81de7b46SAntoniu Miclaus };
349*81de7b46SAntoniu Miclaus 
350*81de7b46SAntoniu Miclaus /* Current events (zero crossing on instantaneous current) */
351*81de7b46SAntoniu Miclaus static const struct iio_event_spec ade9000_current_events[] = {
352*81de7b46SAntoniu Miclaus 	{
353*81de7b46SAntoniu Miclaus 		/* Zero crossing detection - datasheet: ZXI interrupts */
354*81de7b46SAntoniu Miclaus 		.type = IIO_EV_TYPE_THRESH,
355*81de7b46SAntoniu Miclaus 		.dir = IIO_EV_DIR_EITHER,
356*81de7b46SAntoniu Miclaus 		.mask_separate = BIT(IIO_EV_INFO_ENABLE),
357*81de7b46SAntoniu Miclaus 	},
358*81de7b46SAntoniu Miclaus };
359*81de7b46SAntoniu Miclaus 
360*81de7b46SAntoniu Miclaus /* RMS voltage events (swell/sag detection on RMS values) */
361*81de7b46SAntoniu Miclaus static const struct iio_event_spec ade9000_rms_voltage_events[] = {
362*81de7b46SAntoniu Miclaus 	{
363*81de7b46SAntoniu Miclaus 		.type = IIO_EV_TYPE_THRESH,
364*81de7b46SAntoniu Miclaus 		.dir = IIO_EV_DIR_RISING, /* RMS swell detection */
365*81de7b46SAntoniu Miclaus 		.mask_separate = BIT(IIO_EV_INFO_ENABLE) | BIT(IIO_EV_INFO_VALUE),
366*81de7b46SAntoniu Miclaus 	},
367*81de7b46SAntoniu Miclaus 	{
368*81de7b46SAntoniu Miclaus 		.type = IIO_EV_TYPE_THRESH,
369*81de7b46SAntoniu Miclaus 		.dir = IIO_EV_DIR_FALLING, /* RMS sag/dip detection */
370*81de7b46SAntoniu Miclaus 		.mask_separate = BIT(IIO_EV_INFO_ENABLE) | BIT(IIO_EV_INFO_VALUE),
371*81de7b46SAntoniu Miclaus 	},
372*81de7b46SAntoniu Miclaus };
373*81de7b46SAntoniu Miclaus 
374*81de7b46SAntoniu Miclaus static const char * const ade9000_filter_type_items[] = {
375*81de7b46SAntoniu Miclaus 	"sinc4", "sinc4+lp",
376*81de7b46SAntoniu Miclaus };
377*81de7b46SAntoniu Miclaus 
378*81de7b46SAntoniu Miclaus static const int ade9000_filter_type_values[] = {
379*81de7b46SAntoniu Miclaus 	0, 2,
380*81de7b46SAntoniu Miclaus };
381*81de7b46SAntoniu Miclaus 
382*81de7b46SAntoniu Miclaus static int ade9000_filter_type_get(struct iio_dev *indio_dev,
383*81de7b46SAntoniu Miclaus 				   const struct iio_chan_spec *chan)
384*81de7b46SAntoniu Miclaus {
385*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
386*81de7b46SAntoniu Miclaus 	u32 val;
387*81de7b46SAntoniu Miclaus 	int ret;
388*81de7b46SAntoniu Miclaus 	unsigned int i;
389*81de7b46SAntoniu Miclaus 
390*81de7b46SAntoniu Miclaus 	ret = regmap_read(st->regmap, ADE9000_REG_WFB_CFG, &val);
391*81de7b46SAntoniu Miclaus 	if (ret)
392*81de7b46SAntoniu Miclaus 		return ret;
393*81de7b46SAntoniu Miclaus 
394*81de7b46SAntoniu Miclaus 	val = FIELD_GET(ADE9000_WF_SRC_MASK, val);
395*81de7b46SAntoniu Miclaus 
396*81de7b46SAntoniu Miclaus 	for (i = 0; i < ARRAY_SIZE(ade9000_filter_type_values); i++) {
397*81de7b46SAntoniu Miclaus 		if (ade9000_filter_type_values[i] == val)
398*81de7b46SAntoniu Miclaus 			return i;
399*81de7b46SAntoniu Miclaus 	}
400*81de7b46SAntoniu Miclaus 
401*81de7b46SAntoniu Miclaus 	return -EINVAL;
402*81de7b46SAntoniu Miclaus }
403*81de7b46SAntoniu Miclaus 
404*81de7b46SAntoniu Miclaus static int ade9000_filter_type_set(struct iio_dev *indio_dev,
405*81de7b46SAntoniu Miclaus 				   const struct iio_chan_spec *chan,
406*81de7b46SAntoniu Miclaus 				   unsigned int index)
407*81de7b46SAntoniu Miclaus {
408*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
409*81de7b46SAntoniu Miclaus 	int ret, val;
410*81de7b46SAntoniu Miclaus 
411*81de7b46SAntoniu Miclaus 	if (index >= ARRAY_SIZE(ade9000_filter_type_values))
412*81de7b46SAntoniu Miclaus 		return -EINVAL;
413*81de7b46SAntoniu Miclaus 
414*81de7b46SAntoniu Miclaus 	val = ade9000_filter_type_values[index];
415*81de7b46SAntoniu Miclaus 
416*81de7b46SAntoniu Miclaus 	/* Update the WFB_CFG register with the new filter type */
417*81de7b46SAntoniu Miclaus 	ret = regmap_update_bits(st->regmap, ADE9000_REG_WFB_CFG,
418*81de7b46SAntoniu Miclaus 				 ADE9000_WF_SRC_MASK,
419*81de7b46SAntoniu Miclaus 				 FIELD_PREP(ADE9000_WF_SRC_MASK, val));
420*81de7b46SAntoniu Miclaus 	if (ret)
421*81de7b46SAntoniu Miclaus 		return ret;
422*81de7b46SAntoniu Miclaus 
423*81de7b46SAntoniu Miclaus 	/* Update cached value */
424*81de7b46SAntoniu Miclaus 	st->wf_src = val;
425*81de7b46SAntoniu Miclaus 
426*81de7b46SAntoniu Miclaus 	return 0;
427*81de7b46SAntoniu Miclaus }
428*81de7b46SAntoniu Miclaus 
429*81de7b46SAntoniu Miclaus static const struct iio_enum ade9000_filter_type_enum = {
430*81de7b46SAntoniu Miclaus 	.items = ade9000_filter_type_items,
431*81de7b46SAntoniu Miclaus 	.num_items = ARRAY_SIZE(ade9000_filter_type_items),
432*81de7b46SAntoniu Miclaus 	.get = ade9000_filter_type_get,
433*81de7b46SAntoniu Miclaus 	.set = ade9000_filter_type_set,
434*81de7b46SAntoniu Miclaus };
435*81de7b46SAntoniu Miclaus 
436*81de7b46SAntoniu Miclaus static const struct iio_chan_spec_ext_info ade9000_ext_info[] = {
437*81de7b46SAntoniu Miclaus 	IIO_ENUM("filter_type", IIO_SHARED_BY_ALL, &ade9000_filter_type_enum),
438*81de7b46SAntoniu Miclaus 	IIO_ENUM_AVAILABLE("filter_type", IIO_SHARED_BY_ALL, &ade9000_filter_type_enum),
439*81de7b46SAntoniu Miclaus 	{ }
440*81de7b46SAntoniu Miclaus };
441*81de7b46SAntoniu Miclaus 
442*81de7b46SAntoniu Miclaus #define ADE9000_CURRENT_CHANNEL(num) {					\
443*81de7b46SAntoniu Miclaus 	.type = IIO_CURRENT,						\
444*81de7b46SAntoniu Miclaus 	.channel = num,							\
445*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_AI_PCF, num),	\
446*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
447*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE) |		\
448*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_CALIBSCALE),		\
449*81de7b46SAntoniu Miclaus 	.event_spec = ade9000_current_events,				\
450*81de7b46SAntoniu Miclaus 	.num_event_specs = ARRAY_SIZE(ade9000_current_events),		\
451*81de7b46SAntoniu Miclaus 	.scan_index = num,						\
452*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
453*81de7b46SAntoniu Miclaus 	.scan_type = {							\
454*81de7b46SAntoniu Miclaus 		.sign = 's',						\
455*81de7b46SAntoniu Miclaus 		.realbits = 32,						\
456*81de7b46SAntoniu Miclaus 		.storagebits = 32,					\
457*81de7b46SAntoniu Miclaus 		.endianness = IIO_BE,					\
458*81de7b46SAntoniu Miclaus 	},								\
459*81de7b46SAntoniu Miclaus }
460*81de7b46SAntoniu Miclaus 
461*81de7b46SAntoniu Miclaus #define ADE9000_VOLTAGE_CHANNEL(num) {					\
462*81de7b46SAntoniu Miclaus 	.type = IIO_VOLTAGE,						\
463*81de7b46SAntoniu Miclaus 	.channel = num,							\
464*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_AV_PCF, num),	\
465*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
466*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE) |		\
467*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_CALIBSCALE) |		\
468*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_FREQUENCY),		\
469*81de7b46SAntoniu Miclaus 	.event_spec = ade9000_voltage_events,				\
470*81de7b46SAntoniu Miclaus 	.num_event_specs = ARRAY_SIZE(ade9000_voltage_events),		\
471*81de7b46SAntoniu Miclaus 	.scan_index = num + 1,	/* interleave with current channels */	\
472*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
473*81de7b46SAntoniu Miclaus 	.scan_type = {							\
474*81de7b46SAntoniu Miclaus 		.sign = 's',						\
475*81de7b46SAntoniu Miclaus 		.realbits = 32,						\
476*81de7b46SAntoniu Miclaus 		.storagebits = 32,					\
477*81de7b46SAntoniu Miclaus 		.endianness = IIO_BE,					\
478*81de7b46SAntoniu Miclaus 	},								\
479*81de7b46SAntoniu Miclaus 	.ext_info = ade9000_ext_info,					\
480*81de7b46SAntoniu Miclaus }
481*81de7b46SAntoniu Miclaus 
482*81de7b46SAntoniu Miclaus #define ADE9000_ALTCURRENT_RMS_CHANNEL(num) {				\
483*81de7b46SAntoniu Miclaus 	.type = IIO_ALTCURRENT,						\
484*81de7b46SAntoniu Miclaus 	.channel = num,							\
485*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_AIRMS, num),		\
486*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_RMS,					\
487*81de7b46SAntoniu Miclaus 	.modified = 1,							\
488*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
489*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
490*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE) |		\
491*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_CALIBBIAS),		\
492*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
493*81de7b46SAntoniu Miclaus }
494*81de7b46SAntoniu Miclaus 
495*81de7b46SAntoniu Miclaus #define ADE9000_ALTVOLTAGE_RMS_CHANNEL(num) {				\
496*81de7b46SAntoniu Miclaus 	.type = IIO_ALTVOLTAGE,						\
497*81de7b46SAntoniu Miclaus 	.channel = num,							\
498*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_AVRMS, num),		\
499*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_RMS,					\
500*81de7b46SAntoniu Miclaus 	.modified = 1,							\
501*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
502*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
503*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE) |		\
504*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_CALIBBIAS),		\
505*81de7b46SAntoniu Miclaus 	.event_spec = ade9000_rms_voltage_events,			\
506*81de7b46SAntoniu Miclaus 	.num_event_specs = ARRAY_SIZE(ade9000_rms_voltage_events),	\
507*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
508*81de7b46SAntoniu Miclaus }
509*81de7b46SAntoniu Miclaus 
510*81de7b46SAntoniu Miclaus #define ADE9000_POWER_ACTIVE_CHANNEL(num) {				\
511*81de7b46SAntoniu Miclaus 	.type = IIO_POWER,						\
512*81de7b46SAntoniu Miclaus 	.channel = num,							\
513*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_AWATT, num),		\
514*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_ACTIVE,					\
515*81de7b46SAntoniu Miclaus 	.modified = 1,							\
516*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
517*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
518*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE) |		\
519*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_CALIBBIAS) |		\
520*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_CALIBSCALE),		\
521*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
522*81de7b46SAntoniu Miclaus }
523*81de7b46SAntoniu Miclaus 
524*81de7b46SAntoniu Miclaus #define ADE9000_POWER_REACTIVE_CHANNEL(num) {				\
525*81de7b46SAntoniu Miclaus 	.type = IIO_POWER,						\
526*81de7b46SAntoniu Miclaus 	.channel = num,							\
527*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_AVAR, num),		\
528*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_REACTIVE,					\
529*81de7b46SAntoniu Miclaus 	.modified = 1,							\
530*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
531*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
532*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE) |		\
533*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_CALIBBIAS),		\
534*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
535*81de7b46SAntoniu Miclaus }
536*81de7b46SAntoniu Miclaus 
537*81de7b46SAntoniu Miclaus #define ADE9000_POWER_APPARENT_CHANNEL(num) {				\
538*81de7b46SAntoniu Miclaus 	.type = IIO_POWER,						\
539*81de7b46SAntoniu Miclaus 	.channel = num,							\
540*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_AVA, num),		\
541*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_APPARENT,					\
542*81de7b46SAntoniu Miclaus 	.modified = 1,							\
543*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
544*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
545*81de7b46SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE),			\
546*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
547*81de7b46SAntoniu Miclaus }
548*81de7b46SAntoniu Miclaus 
549*81de7b46SAntoniu Miclaus  #define ADE9000_ENERGY_ACTIVE_CHANNEL(num, addr) {			\
550*81de7b46SAntoniu Miclaus 	.type = IIO_ENERGY,						\
551*81de7b46SAntoniu Miclaus 	.channel = num,							\
552*81de7b46SAntoniu Miclaus 	.address = addr,						\
553*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_ACTIVE,					\
554*81de7b46SAntoniu Miclaus 	.modified = 1,							\
555*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
556*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
557*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
558*81de7b46SAntoniu Miclaus }
559*81de7b46SAntoniu Miclaus 
560*81de7b46SAntoniu Miclaus #define ADE9000_ENERGY_APPARENT_CHANNEL(num, addr) {			\
561*81de7b46SAntoniu Miclaus 	.type = IIO_ENERGY,						\
562*81de7b46SAntoniu Miclaus 	.channel = num,							\
563*81de7b46SAntoniu Miclaus 	.address = addr,						\
564*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_APPARENT,					\
565*81de7b46SAntoniu Miclaus 	.modified = 1,							\
566*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
567*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
568*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
569*81de7b46SAntoniu Miclaus }
570*81de7b46SAntoniu Miclaus 
571*81de7b46SAntoniu Miclaus #define ADE9000_ENERGY_REACTIVE_CHANNEL(num, addr) {			\
572*81de7b46SAntoniu Miclaus 	.type = IIO_ENERGY,						\
573*81de7b46SAntoniu Miclaus 	.channel = num,							\
574*81de7b46SAntoniu Miclaus 	.address = addr,						\
575*81de7b46SAntoniu Miclaus 	.channel2 = IIO_MOD_REACTIVE,					\
576*81de7b46SAntoniu Miclaus 	.modified = 1,							\
577*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
578*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
579*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
580*81de7b46SAntoniu Miclaus }
581*81de7b46SAntoniu Miclaus 
582*81de7b46SAntoniu Miclaus #define ADE9000_POWER_FACTOR_CHANNEL(num) {				\
583*81de7b46SAntoniu Miclaus 	.type = IIO_POWER,						\
584*81de7b46SAntoniu Miclaus 	.channel = num,							\
585*81de7b46SAntoniu Miclaus 	.address = ADE9000_ADDR_ADJUST(ADE9000_REG_APF, num),		\
586*81de7b46SAntoniu Miclaus 	.indexed = 1,							\
587*81de7b46SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_POWERFACTOR),		\
588*81de7b46SAntoniu Miclaus 	.scan_index = -1						\
589*81de7b46SAntoniu Miclaus }
590*81de7b46SAntoniu Miclaus 
591*81de7b46SAntoniu Miclaus static const struct iio_chan_spec ade9000_channels[] = {
592*81de7b46SAntoniu Miclaus 	/* Phase A channels */
593*81de7b46SAntoniu Miclaus 	ADE9000_CURRENT_CHANNEL(ADE9000_PHASE_A_NR),
594*81de7b46SAntoniu Miclaus 	ADE9000_VOLTAGE_CHANNEL(ADE9000_PHASE_A_NR),
595*81de7b46SAntoniu Miclaus 	ADE9000_ALTCURRENT_RMS_CHANNEL(ADE9000_PHASE_A_NR),
596*81de7b46SAntoniu Miclaus 	ADE9000_ALTVOLTAGE_RMS_CHANNEL(ADE9000_PHASE_A_NR),
597*81de7b46SAntoniu Miclaus 	ADE9000_POWER_ACTIVE_CHANNEL(ADE9000_PHASE_A_NR),
598*81de7b46SAntoniu Miclaus 	ADE9000_POWER_REACTIVE_CHANNEL(ADE9000_PHASE_A_NR),
599*81de7b46SAntoniu Miclaus 	ADE9000_POWER_APPARENT_CHANNEL(ADE9000_PHASE_A_NR),
600*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_ACTIVE_CHANNEL(ADE9000_PHASE_A_NR, ADE9000_REG_AWATTHR_LO),
601*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_APPARENT_CHANNEL(ADE9000_PHASE_A_NR, ADE9000_REG_AVAHR_LO),
602*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_REACTIVE_CHANNEL(ADE9000_PHASE_A_NR, ADE9000_REG_AFVARHR_LO),
603*81de7b46SAntoniu Miclaus 	ADE9000_POWER_FACTOR_CHANNEL(ADE9000_PHASE_A_NR),
604*81de7b46SAntoniu Miclaus 	/* Phase B channels */
605*81de7b46SAntoniu Miclaus 	ADE9000_CURRENT_CHANNEL(ADE9000_PHASE_B_NR),
606*81de7b46SAntoniu Miclaus 	ADE9000_VOLTAGE_CHANNEL(ADE9000_PHASE_B_NR),
607*81de7b46SAntoniu Miclaus 	ADE9000_ALTCURRENT_RMS_CHANNEL(ADE9000_PHASE_B_NR),
608*81de7b46SAntoniu Miclaus 	ADE9000_ALTVOLTAGE_RMS_CHANNEL(ADE9000_PHASE_B_NR),
609*81de7b46SAntoniu Miclaus 	ADE9000_POWER_ACTIVE_CHANNEL(ADE9000_PHASE_B_NR),
610*81de7b46SAntoniu Miclaus 	ADE9000_POWER_REACTIVE_CHANNEL(ADE9000_PHASE_B_NR),
611*81de7b46SAntoniu Miclaus 	ADE9000_POWER_APPARENT_CHANNEL(ADE9000_PHASE_B_NR),
612*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_ACTIVE_CHANNEL(ADE9000_PHASE_B_NR, ADE9000_REG_BWATTHR_LO),
613*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_APPARENT_CHANNEL(ADE9000_PHASE_B_NR, ADE9000_REG_BVAHR_LO),
614*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_REACTIVE_CHANNEL(ADE9000_PHASE_B_NR, ADE9000_REG_BFVARHR_LO),
615*81de7b46SAntoniu Miclaus 	ADE9000_POWER_FACTOR_CHANNEL(ADE9000_PHASE_B_NR),
616*81de7b46SAntoniu Miclaus 	/* Phase C channels */
617*81de7b46SAntoniu Miclaus 	ADE9000_CURRENT_CHANNEL(ADE9000_PHASE_C_NR),
618*81de7b46SAntoniu Miclaus 	ADE9000_VOLTAGE_CHANNEL(ADE9000_PHASE_C_NR),
619*81de7b46SAntoniu Miclaus 	ADE9000_ALTCURRENT_RMS_CHANNEL(ADE9000_PHASE_C_NR),
620*81de7b46SAntoniu Miclaus 	ADE9000_ALTVOLTAGE_RMS_CHANNEL(ADE9000_PHASE_C_NR),
621*81de7b46SAntoniu Miclaus 	ADE9000_POWER_ACTIVE_CHANNEL(ADE9000_PHASE_C_NR),
622*81de7b46SAntoniu Miclaus 	ADE9000_POWER_REACTIVE_CHANNEL(ADE9000_PHASE_C_NR),
623*81de7b46SAntoniu Miclaus 	ADE9000_POWER_APPARENT_CHANNEL(ADE9000_PHASE_C_NR),
624*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_ACTIVE_CHANNEL(ADE9000_PHASE_C_NR, ADE9000_REG_CWATTHR_LO),
625*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_APPARENT_CHANNEL(ADE9000_PHASE_C_NR, ADE9000_REG_CVAHR_LO),
626*81de7b46SAntoniu Miclaus 	ADE9000_ENERGY_REACTIVE_CHANNEL(ADE9000_PHASE_C_NR, ADE9000_REG_CFVARHR_LO),
627*81de7b46SAntoniu Miclaus 	ADE9000_POWER_FACTOR_CHANNEL(ADE9000_PHASE_C_NR),
628*81de7b46SAntoniu Miclaus };
629*81de7b46SAntoniu Miclaus 
630*81de7b46SAntoniu Miclaus static const struct reg_sequence ade9000_initialization_sequence[] = {
631*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_PGA_GAIN, ADE9000_PGA_GAIN },
632*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_CONFIG0, ADE9000_CONFIG0 },
633*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_CONFIG1, ADE9000_CONFIG1 },
634*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_CONFIG2, ADE9000_CONFIG2 },
635*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_CONFIG3, ADE9000_CONFIG3 },
636*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_ACCMODE, ADE9000_ACCMODE },
637*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_ZX_LP_SEL, ADE9000_ZX_LP_SEL },
638*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_MASK0, ADE9000_MASK0_ALL_INT_DIS },
639*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_MASK1, ADE9000_MASK1_ALL_INT_DIS },
640*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_EVENT_MASK, ADE9000_EVENT_DISABLE },
641*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_WFB_CFG, ADE9000_WFB_CFG },
642*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_VLEVEL, ADE9000_VLEVEL },
643*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_DICOEFF, ADE9000_DICOEFF },
644*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_EGY_TIME, ADE9000_EGY_TIME },
645*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_EP_CFG, ADE9000_EP_CFG },
646*81de7b46SAntoniu Miclaus 	/* Clear all pending status bits by writing 1s */
647*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_STATUS0, GENMASK(31, 0) },
648*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_STATUS1, GENMASK(31, 0) },
649*81de7b46SAntoniu Miclaus 	{ ADE9000_REG_RUN, ADE9000_RUN_ON }
650*81de7b46SAntoniu Miclaus };
651*81de7b46SAntoniu Miclaus 
652*81de7b46SAntoniu Miclaus static int ade9000_spi_write_reg(void *context, unsigned int reg,
653*81de7b46SAntoniu Miclaus 				 unsigned int val)
654*81de7b46SAntoniu Miclaus {
655*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = context;
656*81de7b46SAntoniu Miclaus 	u8 tx_buf[6];
657*81de7b46SAntoniu Miclaus 	u16 addr;
658*81de7b46SAntoniu Miclaus 	int ret, len;
659*81de7b46SAntoniu Miclaus 
660*81de7b46SAntoniu Miclaus 	guard(mutex)(&st->lock);
661*81de7b46SAntoniu Miclaus 
662*81de7b46SAntoniu Miclaus 	addr = FIELD_PREP(ADE9000_REG_ADDR_MASK, reg);
663*81de7b46SAntoniu Miclaus 	put_unaligned_be16(addr, tx_buf);
664*81de7b46SAntoniu Miclaus 
665*81de7b46SAntoniu Miclaus 	if (reg > ADE9000_REG_RUN && reg < ADE9000_REG_VERSION) {
666*81de7b46SAntoniu Miclaus 		put_unaligned_be16(val, &tx_buf[2]);
667*81de7b46SAntoniu Miclaus 		len = 4;
668*81de7b46SAntoniu Miclaus 	} else {
669*81de7b46SAntoniu Miclaus 		put_unaligned_be32(val, &tx_buf[2]);
670*81de7b46SAntoniu Miclaus 		len = 6;
671*81de7b46SAntoniu Miclaus 	}
672*81de7b46SAntoniu Miclaus 
673*81de7b46SAntoniu Miclaus 	ret = spi_write_then_read(st->spi, tx_buf, len, NULL, 0);
674*81de7b46SAntoniu Miclaus 	if (ret)
675*81de7b46SAntoniu Miclaus 		dev_err(&st->spi->dev, "problem when writing register 0x%x\n", reg);
676*81de7b46SAntoniu Miclaus 
677*81de7b46SAntoniu Miclaus 	return ret;
678*81de7b46SAntoniu Miclaus }
679*81de7b46SAntoniu Miclaus 
680*81de7b46SAntoniu Miclaus static int ade9000_spi_read_reg(void *context, unsigned int reg,
681*81de7b46SAntoniu Miclaus 				unsigned int *val)
682*81de7b46SAntoniu Miclaus {
683*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = context;
684*81de7b46SAntoniu Miclaus 	u8 tx_buf[2];
685*81de7b46SAntoniu Miclaus 	u8 rx_buf[4];
686*81de7b46SAntoniu Miclaus 	u16 addr;
687*81de7b46SAntoniu Miclaus 	int ret, rx_len;
688*81de7b46SAntoniu Miclaus 
689*81de7b46SAntoniu Miclaus 	guard(mutex)(&st->lock);
690*81de7b46SAntoniu Miclaus 
691*81de7b46SAntoniu Miclaus 	addr = FIELD_PREP(ADE9000_REG_ADDR_MASK, reg) |
692*81de7b46SAntoniu Miclaus 	       ADE9000_REG_READ_BIT_MASK;
693*81de7b46SAntoniu Miclaus 
694*81de7b46SAntoniu Miclaus 	put_unaligned_be16(addr, tx_buf);
695*81de7b46SAntoniu Miclaus 
696*81de7b46SAntoniu Miclaus 	/* Skip CRC bytes - only read actual data */
697*81de7b46SAntoniu Miclaus 	if (reg > ADE9000_REG_RUN && reg < ADE9000_REG_VERSION)
698*81de7b46SAntoniu Miclaus 		rx_len = 2;
699*81de7b46SAntoniu Miclaus 	else
700*81de7b46SAntoniu Miclaus 		rx_len = 4;
701*81de7b46SAntoniu Miclaus 
702*81de7b46SAntoniu Miclaus 	ret = spi_write_then_read(st->spi, tx_buf, 2, rx_buf, rx_len);
703*81de7b46SAntoniu Miclaus 	if (ret) {
704*81de7b46SAntoniu Miclaus 		dev_err(&st->spi->dev, "error reading register 0x%x\n", reg);
705*81de7b46SAntoniu Miclaus 		return ret;
706*81de7b46SAntoniu Miclaus 	}
707*81de7b46SAntoniu Miclaus 
708*81de7b46SAntoniu Miclaus 	if (reg > ADE9000_REG_RUN && reg < ADE9000_REG_VERSION)
709*81de7b46SAntoniu Miclaus 		*val = get_unaligned_be16(rx_buf);
710*81de7b46SAntoniu Miclaus 	else
711*81de7b46SAntoniu Miclaus 		*val = get_unaligned_be32(rx_buf);
712*81de7b46SAntoniu Miclaus 
713*81de7b46SAntoniu Miclaus 	return 0;
714*81de7b46SAntoniu Miclaus }
715*81de7b46SAntoniu Miclaus 
716*81de7b46SAntoniu Miclaus static bool ade9000_is_volatile_reg(struct device *dev, unsigned int reg)
717*81de7b46SAntoniu Miclaus {
718*81de7b46SAntoniu Miclaus 	switch (reg) {
719*81de7b46SAntoniu Miclaus 	/* Interrupt/error status registers - volatile */
720*81de7b46SAntoniu Miclaus 	case ADE9000_REG_STATUS0:
721*81de7b46SAntoniu Miclaus 	case ADE9000_REG_STATUS1:
722*81de7b46SAntoniu Miclaus 		return true;
723*81de7b46SAntoniu Miclaus 	default:
724*81de7b46SAntoniu Miclaus 		/* All other registers are non-volatile */
725*81de7b46SAntoniu Miclaus 		return false;
726*81de7b46SAntoniu Miclaus 	}
727*81de7b46SAntoniu Miclaus }
728*81de7b46SAntoniu Miclaus 
729*81de7b46SAntoniu Miclaus static void ade9000_configure_scan(struct iio_dev *indio_dev, u32 wfb_addr)
730*81de7b46SAntoniu Miclaus {
731*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
732*81de7b46SAntoniu Miclaus 	u16 addr;
733*81de7b46SAntoniu Miclaus 
734*81de7b46SAntoniu Miclaus 	addr = FIELD_PREP(ADE9000_REG_ADDR_MASK, wfb_addr) |
735*81de7b46SAntoniu Miclaus 	       ADE9000_REG_READ_BIT_MASK;
736*81de7b46SAntoniu Miclaus 
737*81de7b46SAntoniu Miclaus 	put_unaligned_be16(addr, st->tx_buff);
738*81de7b46SAntoniu Miclaus 
739*81de7b46SAntoniu Miclaus 	st->xfer[0].tx_buf = &st->tx_buff[0];
740*81de7b46SAntoniu Miclaus 	st->xfer[0].len = 2;
741*81de7b46SAntoniu Miclaus 
742*81de7b46SAntoniu Miclaus 	st->xfer[1].rx_buf = st->rx_buff.byte;
743*81de7b46SAntoniu Miclaus 
744*81de7b46SAntoniu Miclaus 	/* Always use streaming mode */
745*81de7b46SAntoniu Miclaus 	st->xfer[1].len = (st->wfb_nr_samples / 2) * 4;
746*81de7b46SAntoniu Miclaus 
747*81de7b46SAntoniu Miclaus 	spi_message_init_with_transfers(&st->spi_msg, st->xfer, ARRAY_SIZE(st->xfer));
748*81de7b46SAntoniu Miclaus }
749*81de7b46SAntoniu Miclaus 
750*81de7b46SAntoniu Miclaus static int ade9000_iio_push_streaming(struct iio_dev *indio_dev)
751*81de7b46SAntoniu Miclaus {
752*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
753*81de7b46SAntoniu Miclaus 	struct device *dev = &st->spi->dev;
754*81de7b46SAntoniu Miclaus 	u32 current_page, i;
755*81de7b46SAntoniu Miclaus 	int ret;
756*81de7b46SAntoniu Miclaus 
757*81de7b46SAntoniu Miclaus 	guard(mutex)(&st->lock);
758*81de7b46SAntoniu Miclaus 
759*81de7b46SAntoniu Miclaus 	ret = spi_sync(st->spi, &st->spi_msg);
760*81de7b46SAntoniu Miclaus 	if (ret) {
761*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(dev, "SPI fail in trigger handler\n");
762*81de7b46SAntoniu Miclaus 		return ret;
763*81de7b46SAntoniu Miclaus 	}
764*81de7b46SAntoniu Miclaus 
765*81de7b46SAntoniu Miclaus 	/* In streaming mode, only half the buffer is filled per interrupt */
766*81de7b46SAntoniu Miclaus 	for (i = 0; i < st->wfb_nr_samples / 2; i += st->wfb_nr_activ_chan)
767*81de7b46SAntoniu Miclaus 		iio_push_to_buffers(indio_dev, &st->rx_buff.word[i]);
768*81de7b46SAntoniu Miclaus 
769*81de7b46SAntoniu Miclaus 	ret = regmap_read(st->regmap, ADE9000_REG_WFB_PG_IRQEN, &current_page);
770*81de7b46SAntoniu Miclaus 	if (ret) {
771*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(dev, "IRQ0 WFB read fail\n");
772*81de7b46SAntoniu Miclaus 		return ret;
773*81de7b46SAntoniu Miclaus 	}
774*81de7b46SAntoniu Miclaus 
775*81de7b46SAntoniu Miclaus 	if (current_page & ADE9000_MIDDLE_PAGE_BIT) {
776*81de7b46SAntoniu Miclaus 		ret = regmap_write(st->regmap, ADE9000_REG_WFB_PG_IRQEN,
777*81de7b46SAntoniu Miclaus 				   ADE9000_LAST_PAGE_BIT);
778*81de7b46SAntoniu Miclaus 		if (ret) {
779*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(dev, "IRQ0 WFB write fail\n");
780*81de7b46SAntoniu Miclaus 			return ret;
781*81de7b46SAntoniu Miclaus 		}
782*81de7b46SAntoniu Miclaus 
783*81de7b46SAntoniu Miclaus 		ade9000_configure_scan(indio_dev,
784*81de7b46SAntoniu Miclaus 				       ADE9000_REG_WF_HALF_BUFF);
785*81de7b46SAntoniu Miclaus 	} else {
786*81de7b46SAntoniu Miclaus 		ret = regmap_write(st->regmap, ADE9000_REG_WFB_PG_IRQEN,
787*81de7b46SAntoniu Miclaus 				   ADE9000_MIDDLE_PAGE_BIT);
788*81de7b46SAntoniu Miclaus 		if (ret) {
789*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(dev, "IRQ0 WFB write fail");
790*81de7b46SAntoniu Miclaus 			return IRQ_HANDLED;
791*81de7b46SAntoniu Miclaus 		}
792*81de7b46SAntoniu Miclaus 
793*81de7b46SAntoniu Miclaus 		ade9000_configure_scan(indio_dev, ADE9000_REG_WF_BUFF);
794*81de7b46SAntoniu Miclaus 	}
795*81de7b46SAntoniu Miclaus 
796*81de7b46SAntoniu Miclaus 	return 0;
797*81de7b46SAntoniu Miclaus }
798*81de7b46SAntoniu Miclaus 
799*81de7b46SAntoniu Miclaus static int ade9000_iio_push_buffer(struct iio_dev *indio_dev)
800*81de7b46SAntoniu Miclaus {
801*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
802*81de7b46SAntoniu Miclaus 	int ret;
803*81de7b46SAntoniu Miclaus 	u32 i;
804*81de7b46SAntoniu Miclaus 
805*81de7b46SAntoniu Miclaus 	guard(mutex)(&st->lock);
806*81de7b46SAntoniu Miclaus 
807*81de7b46SAntoniu Miclaus 	ret = spi_sync(st->spi, &st->spi_msg);
808*81de7b46SAntoniu Miclaus 	if (ret) {
809*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(&st->spi->dev,
810*81de7b46SAntoniu Miclaus 				    "SPI fail in trigger handler\n");
811*81de7b46SAntoniu Miclaus 		return ret;
812*81de7b46SAntoniu Miclaus 	}
813*81de7b46SAntoniu Miclaus 
814*81de7b46SAntoniu Miclaus 	for (i = 0; i < st->wfb_nr_samples; i += st->wfb_nr_activ_chan)
815*81de7b46SAntoniu Miclaus 		iio_push_to_buffers(indio_dev, &st->rx_buff.word[i]);
816*81de7b46SAntoniu Miclaus 
817*81de7b46SAntoniu Miclaus 	return 0;
818*81de7b46SAntoniu Miclaus }
819*81de7b46SAntoniu Miclaus 
820*81de7b46SAntoniu Miclaus static irqreturn_t ade9000_irq0_thread(int irq, void *data)
821*81de7b46SAntoniu Miclaus {
822*81de7b46SAntoniu Miclaus 	struct iio_dev *indio_dev = data;
823*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
824*81de7b46SAntoniu Miclaus 	struct device *dev = &st->spi->dev;
825*81de7b46SAntoniu Miclaus 	u32 handled_irq = 0;
826*81de7b46SAntoniu Miclaus 	u32 interrupts, status;
827*81de7b46SAntoniu Miclaus 	int ret;
828*81de7b46SAntoniu Miclaus 
829*81de7b46SAntoniu Miclaus 	ret = regmap_read(st->regmap, ADE9000_REG_STATUS0, &status);
830*81de7b46SAntoniu Miclaus 	if (ret) {
831*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(dev, "IRQ0 read status fail\n");
832*81de7b46SAntoniu Miclaus 		return IRQ_HANDLED;
833*81de7b46SAntoniu Miclaus 	}
834*81de7b46SAntoniu Miclaus 
835*81de7b46SAntoniu Miclaus 	ret = regmap_read(st->regmap, ADE9000_REG_MASK0, &interrupts);
836*81de7b46SAntoniu Miclaus 	if (ret) {
837*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(dev, "IRQ0 read mask fail\n");
838*81de7b46SAntoniu Miclaus 		return IRQ_HANDLED;
839*81de7b46SAntoniu Miclaus 	}
840*81de7b46SAntoniu Miclaus 
841*81de7b46SAntoniu Miclaus 	if ((status & ADE9000_ST0_PAGE_FULL_BIT) &&
842*81de7b46SAntoniu Miclaus 	    (interrupts & ADE9000_ST0_PAGE_FULL_BIT)) {
843*81de7b46SAntoniu Miclaus 		/* Always use streaming mode */
844*81de7b46SAntoniu Miclaus 		ret = ade9000_iio_push_streaming(indio_dev);
845*81de7b46SAntoniu Miclaus 		if (ret) {
846*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(dev, "IRQ0 IIO push fail\n");
847*81de7b46SAntoniu Miclaus 			return IRQ_HANDLED;
848*81de7b46SAntoniu Miclaus 		}
849*81de7b46SAntoniu Miclaus 
850*81de7b46SAntoniu Miclaus 		handled_irq |= ADE9000_ST0_PAGE_FULL_BIT;
851*81de7b46SAntoniu Miclaus 	}
852*81de7b46SAntoniu Miclaus 
853*81de7b46SAntoniu Miclaus 	if ((status & ADE9000_ST0_WFB_TRIG_BIT) &&
854*81de7b46SAntoniu Miclaus 	    (interrupts & ADE9000_ST0_WFB_TRIG_BIT)) {
855*81de7b46SAntoniu Miclaus 		ret = regmap_update_bits(st->regmap, ADE9000_REG_WFB_CFG,
856*81de7b46SAntoniu Miclaus 					 ADE9000_WF_CAP_EN_MASK, 0);
857*81de7b46SAntoniu Miclaus 		if (ret) {
858*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(dev, "IRQ0 WFB fail\n");
859*81de7b46SAntoniu Miclaus 			return IRQ_HANDLED;
860*81de7b46SAntoniu Miclaus 		}
861*81de7b46SAntoniu Miclaus 
862*81de7b46SAntoniu Miclaus 		if (iio_buffer_enabled(indio_dev)) {
863*81de7b46SAntoniu Miclaus 			ret = ade9000_iio_push_buffer(indio_dev);
864*81de7b46SAntoniu Miclaus 			if (ret) {
865*81de7b46SAntoniu Miclaus 				dev_err_ratelimited(dev,
866*81de7b46SAntoniu Miclaus 						    "IRQ0 IIO push fail @ WFB TRIG\n");
867*81de7b46SAntoniu Miclaus 				return IRQ_HANDLED;
868*81de7b46SAntoniu Miclaus 			}
869*81de7b46SAntoniu Miclaus 		}
870*81de7b46SAntoniu Miclaus 
871*81de7b46SAntoniu Miclaus 		handled_irq |= ADE9000_ST0_WFB_TRIG_BIT;
872*81de7b46SAntoniu Miclaus 	}
873*81de7b46SAntoniu Miclaus 
874*81de7b46SAntoniu Miclaus 	ret = regmap_write(st->regmap, ADE9000_REG_STATUS0, handled_irq);
875*81de7b46SAntoniu Miclaus 	if (ret)
876*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(dev, "IRQ0 write status fail\n");
877*81de7b46SAntoniu Miclaus 
878*81de7b46SAntoniu Miclaus 	return IRQ_HANDLED;
879*81de7b46SAntoniu Miclaus }
880*81de7b46SAntoniu Miclaus 
881*81de7b46SAntoniu Miclaus static irqreturn_t ade9000_irq1_thread(int irq, void *data)
882*81de7b46SAntoniu Miclaus {
883*81de7b46SAntoniu Miclaus 	struct iio_dev *indio_dev = data;
884*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
885*81de7b46SAntoniu Miclaus 	unsigned int bit = ADE9000_ST1_CROSSING_FIRST;
886*81de7b46SAntoniu Miclaus 	s64 timestamp = iio_get_time_ns(indio_dev);
887*81de7b46SAntoniu Miclaus 	u32 handled_irq = 0;
888*81de7b46SAntoniu Miclaus 	u32 interrupts, result, status, tmp;
889*81de7b46SAntoniu Miclaus 	DECLARE_BITMAP(interrupt_bits, ADE9000_ST1_CROSSING_DEPTH);
890*81de7b46SAntoniu Miclaus 	const struct ade9000_irq1_event *event;
891*81de7b46SAntoniu Miclaus 	int ret, i;
892*81de7b46SAntoniu Miclaus 
893*81de7b46SAntoniu Miclaus 	if (!completion_done(&st->reset_completion)) {
894*81de7b46SAntoniu Miclaus 		ret = regmap_read(st->regmap, ADE9000_REG_STATUS1, &result);
895*81de7b46SAntoniu Miclaus 		if (ret) {
896*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(&st->spi->dev, "IRQ1 read status fail\n");
897*81de7b46SAntoniu Miclaus 			return IRQ_HANDLED;
898*81de7b46SAntoniu Miclaus 		}
899*81de7b46SAntoniu Miclaus 
900*81de7b46SAntoniu Miclaus 		if (result & ADE9000_ST1_RSTDONE_BIT) {
901*81de7b46SAntoniu Miclaus 			complete(&st->reset_completion);
902*81de7b46SAntoniu Miclaus 			/* Clear the reset done status bit */
903*81de7b46SAntoniu Miclaus 			ret = regmap_write(st->regmap, ADE9000_REG_STATUS1, ADE9000_ST1_RSTDONE_BIT);
904*81de7b46SAntoniu Miclaus 			if (ret)
905*81de7b46SAntoniu Miclaus 				dev_err_ratelimited(&st->spi->dev,
906*81de7b46SAntoniu Miclaus 						    "IRQ1 clear reset status fail\n");
907*81de7b46SAntoniu Miclaus 		} else {
908*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(&st->spi->dev,
909*81de7b46SAntoniu Miclaus 					    "Error testing reset done\n");
910*81de7b46SAntoniu Miclaus 		}
911*81de7b46SAntoniu Miclaus 
912*81de7b46SAntoniu Miclaus 		return IRQ_HANDLED;
913*81de7b46SAntoniu Miclaus 	}
914*81de7b46SAntoniu Miclaus 
915*81de7b46SAntoniu Miclaus 	ret = regmap_read(st->regmap, ADE9000_REG_STATUS1, &status);
916*81de7b46SAntoniu Miclaus 	if (ret) {
917*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(&st->spi->dev, "IRQ1 read status fail\n");
918*81de7b46SAntoniu Miclaus 		return IRQ_HANDLED;
919*81de7b46SAntoniu Miclaus 	}
920*81de7b46SAntoniu Miclaus 
921*81de7b46SAntoniu Miclaus 	ret = regmap_read(st->regmap, ADE9000_REG_MASK1, &interrupts);
922*81de7b46SAntoniu Miclaus 	if (ret) {
923*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(&st->spi->dev, "IRQ1 read mask fail\n");
924*81de7b46SAntoniu Miclaus 		return IRQ_HANDLED;
925*81de7b46SAntoniu Miclaus 	}
926*81de7b46SAntoniu Miclaus 
927*81de7b46SAntoniu Miclaus 	bitmap_from_arr32(interrupt_bits, &interrupts, ADE9000_ST1_CROSSING_DEPTH);
928*81de7b46SAntoniu Miclaus 	for_each_set_bit_from(bit, interrupt_bits,
929*81de7b46SAntoniu Miclaus 			      ADE9000_ST1_CROSSING_DEPTH) {
930*81de7b46SAntoniu Miclaus 		tmp = status & BIT(bit);
931*81de7b46SAntoniu Miclaus 		if (!tmp)
932*81de7b46SAntoniu Miclaus 			continue;
933*81de7b46SAntoniu Miclaus 
934*81de7b46SAntoniu Miclaus 		event = NULL;
935*81de7b46SAntoniu Miclaus 
936*81de7b46SAntoniu Miclaus 		/* Find corresponding event in lookup table */
937*81de7b46SAntoniu Miclaus 		for (i = 0; i < ARRAY_SIZE(ade9000_irq1_events); i++) {
938*81de7b46SAntoniu Miclaus 			if (ade9000_irq1_events[i].bit_mask == tmp) {
939*81de7b46SAntoniu Miclaus 				event = &ade9000_irq1_events[i];
940*81de7b46SAntoniu Miclaus 				break;
941*81de7b46SAntoniu Miclaus 			}
942*81de7b46SAntoniu Miclaus 		}
943*81de7b46SAntoniu Miclaus 
944*81de7b46SAntoniu Miclaus 		if (event) {
945*81de7b46SAntoniu Miclaus 			iio_push_event(indio_dev,
946*81de7b46SAntoniu Miclaus 				       IIO_UNMOD_EVENT_CODE(event->chan_type,
947*81de7b46SAntoniu Miclaus 							    event->channel,
948*81de7b46SAntoniu Miclaus 							    event->event_type,
949*81de7b46SAntoniu Miclaus 							    event->event_dir),
950*81de7b46SAntoniu Miclaus 							    timestamp);
951*81de7b46SAntoniu Miclaus 		}
952*81de7b46SAntoniu Miclaus 		handled_irq |= tmp;
953*81de7b46SAntoniu Miclaus 	}
954*81de7b46SAntoniu Miclaus 
955*81de7b46SAntoniu Miclaus 	ret = regmap_write(st->regmap, ADE9000_REG_STATUS1, handled_irq);
956*81de7b46SAntoniu Miclaus 	if (ret)
957*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(&st->spi->dev, "IRQ1 write status fail\n");
958*81de7b46SAntoniu Miclaus 
959*81de7b46SAntoniu Miclaus 	return IRQ_HANDLED;
960*81de7b46SAntoniu Miclaus }
961*81de7b46SAntoniu Miclaus 
962*81de7b46SAntoniu Miclaus static irqreturn_t ade9000_dready_thread(int irq, void *data)
963*81de7b46SAntoniu Miclaus {
964*81de7b46SAntoniu Miclaus 	struct iio_dev *indio_dev = data;
965*81de7b46SAntoniu Miclaus 
966*81de7b46SAntoniu Miclaus 	/* Handle data ready interrupt from C4/EVENT/DREADY pin */
967*81de7b46SAntoniu Miclaus 	if (!iio_device_claim_buffer_mode(indio_dev)) {
968*81de7b46SAntoniu Miclaus 		ade9000_iio_push_buffer(indio_dev);
969*81de7b46SAntoniu Miclaus 		iio_device_release_buffer_mode(indio_dev);
970*81de7b46SAntoniu Miclaus 	}
971*81de7b46SAntoniu Miclaus 
972*81de7b46SAntoniu Miclaus 	return IRQ_HANDLED;
973*81de7b46SAntoniu Miclaus }
974*81de7b46SAntoniu Miclaus 
975*81de7b46SAntoniu Miclaus static int ade9000_read_raw(struct iio_dev *indio_dev,
976*81de7b46SAntoniu Miclaus 			    struct iio_chan_spec const *chan,
977*81de7b46SAntoniu Miclaus 			    int *val,
978*81de7b46SAntoniu Miclaus 			    int *val2,
979*81de7b46SAntoniu Miclaus 			    long mask)
980*81de7b46SAntoniu Miclaus {
981*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
982*81de7b46SAntoniu Miclaus 	unsigned int measured;
983*81de7b46SAntoniu Miclaus 	int ret;
984*81de7b46SAntoniu Miclaus 
985*81de7b46SAntoniu Miclaus 	switch (mask) {
986*81de7b46SAntoniu Miclaus 	case IIO_CHAN_INFO_FREQUENCY:
987*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_VOLTAGE) {
988*81de7b46SAntoniu Miclaus 			int period_reg;
989*81de7b46SAntoniu Miclaus 			int period;
990*81de7b46SAntoniu Miclaus 
991*81de7b46SAntoniu Miclaus 			switch (chan->channel) {
992*81de7b46SAntoniu Miclaus 			case ADE9000_PHASE_A_NR:
993*81de7b46SAntoniu Miclaus 				period_reg = ADE9000_REG_APERIOD;
994*81de7b46SAntoniu Miclaus 				break;
995*81de7b46SAntoniu Miclaus 			case ADE9000_PHASE_B_NR:
996*81de7b46SAntoniu Miclaus 				period_reg = ADE9000_REG_BPERIOD;
997*81de7b46SAntoniu Miclaus 				break;
998*81de7b46SAntoniu Miclaus 			case ADE9000_PHASE_C_NR:
999*81de7b46SAntoniu Miclaus 				period_reg = ADE9000_REG_CPERIOD;
1000*81de7b46SAntoniu Miclaus 				break;
1001*81de7b46SAntoniu Miclaus 			default:
1002*81de7b46SAntoniu Miclaus 				return -EINVAL;
1003*81de7b46SAntoniu Miclaus 			}
1004*81de7b46SAntoniu Miclaus 			ret = regmap_read(st->regmap, period_reg, &period);
1005*81de7b46SAntoniu Miclaus 			if (ret)
1006*81de7b46SAntoniu Miclaus 				return ret;
1007*81de7b46SAntoniu Miclaus 			/*
1008*81de7b46SAntoniu Miclaus 			 * Frequency = (4MHz * 65536) / (PERIOD + 1)
1009*81de7b46SAntoniu Miclaus 			 * 4MHz = ADC sample rate, 65536 = 2^16 period register scaling
1010*81de7b46SAntoniu Miclaus 			 * See ADE9000 datasheet section on period measurement
1011*81de7b46SAntoniu Miclaus 			 */
1012*81de7b46SAntoniu Miclaus 			*val = 4000 * 65536;
1013*81de7b46SAntoniu Miclaus 			*val2 = period + 1;
1014*81de7b46SAntoniu Miclaus 			return IIO_VAL_FRACTIONAL;
1015*81de7b46SAntoniu Miclaus 		}
1016*81de7b46SAntoniu Miclaus 
1017*81de7b46SAntoniu Miclaus 		return -EINVAL;
1018*81de7b46SAntoniu Miclaus 	case IIO_CHAN_INFO_RAW:
1019*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_ENERGY) {
1020*81de7b46SAntoniu Miclaus 			u16 lo_reg = chan->address;
1021*81de7b46SAntoniu Miclaus 
1022*81de7b46SAntoniu Miclaus 			ret = regmap_bulk_read(st->regmap, lo_reg,
1023*81de7b46SAntoniu Miclaus 					       st->bulk_read_buf, 2);
1024*81de7b46SAntoniu Miclaus 			if (ret)
1025*81de7b46SAntoniu Miclaus 				return ret;
1026*81de7b46SAntoniu Miclaus 
1027*81de7b46SAntoniu Miclaus 			*val = st->bulk_read_buf[0];  /* Lower 32 bits */
1028*81de7b46SAntoniu Miclaus 			*val2 = st->bulk_read_buf[1]; /* Upper 32 bits */
1029*81de7b46SAntoniu Miclaus 			return IIO_VAL_INT_64;
1030*81de7b46SAntoniu Miclaus 		}
1031*81de7b46SAntoniu Miclaus 
1032*81de7b46SAntoniu Miclaus 		if (!iio_device_claim_direct(indio_dev))
1033*81de7b46SAntoniu Miclaus 			return -EBUSY;
1034*81de7b46SAntoniu Miclaus 
1035*81de7b46SAntoniu Miclaus 		ret = regmap_read(st->regmap, chan->address, &measured);
1036*81de7b46SAntoniu Miclaus 		iio_device_release_direct(indio_dev);
1037*81de7b46SAntoniu Miclaus 		if (ret)
1038*81de7b46SAntoniu Miclaus 			return ret;
1039*81de7b46SAntoniu Miclaus 
1040*81de7b46SAntoniu Miclaus 		*val = measured;
1041*81de7b46SAntoniu Miclaus 
1042*81de7b46SAntoniu Miclaus 		return IIO_VAL_INT;
1043*81de7b46SAntoniu Miclaus 
1044*81de7b46SAntoniu Miclaus 	case IIO_CHAN_INFO_POWERFACTOR:
1045*81de7b46SAntoniu Miclaus 		if (!iio_device_claim_direct(indio_dev))
1046*81de7b46SAntoniu Miclaus 			return -EBUSY;
1047*81de7b46SAntoniu Miclaus 
1048*81de7b46SAntoniu Miclaus 		ret = regmap_read(st->regmap, chan->address, &measured);
1049*81de7b46SAntoniu Miclaus 		iio_device_release_direct(indio_dev);
1050*81de7b46SAntoniu Miclaus 		if (ret)
1051*81de7b46SAntoniu Miclaus 			return ret;
1052*81de7b46SAntoniu Miclaus 
1053*81de7b46SAntoniu Miclaus 		*val = measured;
1054*81de7b46SAntoniu Miclaus 
1055*81de7b46SAntoniu Miclaus 		return IIO_VAL_INT;
1056*81de7b46SAntoniu Miclaus 
1057*81de7b46SAntoniu Miclaus 	case IIO_CHAN_INFO_SCALE:
1058*81de7b46SAntoniu Miclaus 		switch (chan->type) {
1059*81de7b46SAntoniu Miclaus 		case IIO_CURRENT:
1060*81de7b46SAntoniu Miclaus 		case IIO_VOLTAGE:
1061*81de7b46SAntoniu Miclaus 		case IIO_ALTVOLTAGE:
1062*81de7b46SAntoniu Miclaus 		case IIO_ALTCURRENT:
1063*81de7b46SAntoniu Miclaus 			switch (chan->address) {
1064*81de7b46SAntoniu Miclaus 			case ADE9000_REG_AI_PCF:
1065*81de7b46SAntoniu Miclaus 			case ADE9000_REG_AV_PCF:
1066*81de7b46SAntoniu Miclaus 			case ADE9000_REG_BI_PCF:
1067*81de7b46SAntoniu Miclaus 			case ADE9000_REG_BV_PCF:
1068*81de7b46SAntoniu Miclaus 			case ADE9000_REG_CI_PCF:
1069*81de7b46SAntoniu Miclaus 			case ADE9000_REG_CV_PCF:
1070*81de7b46SAntoniu Miclaus 				*val = 1;
1071*81de7b46SAntoniu Miclaus 				*val2 = ADE9000_PCF_FULL_SCALE_CODES;
1072*81de7b46SAntoniu Miclaus 				return IIO_VAL_FRACTIONAL;
1073*81de7b46SAntoniu Miclaus 			case ADE9000_REG_AIRMS:
1074*81de7b46SAntoniu Miclaus 			case ADE9000_REG_AVRMS:
1075*81de7b46SAntoniu Miclaus 			case ADE9000_REG_BIRMS:
1076*81de7b46SAntoniu Miclaus 			case ADE9000_REG_BVRMS:
1077*81de7b46SAntoniu Miclaus 			case ADE9000_REG_CIRMS:
1078*81de7b46SAntoniu Miclaus 			case ADE9000_REG_CVRMS:
1079*81de7b46SAntoniu Miclaus 				*val = 1;
1080*81de7b46SAntoniu Miclaus 				*val2 = ADE9000_RMS_FULL_SCALE_CODES;
1081*81de7b46SAntoniu Miclaus 				return IIO_VAL_FRACTIONAL;
1082*81de7b46SAntoniu Miclaus 			default:
1083*81de7b46SAntoniu Miclaus 				return -EINVAL;
1084*81de7b46SAntoniu Miclaus 			}
1085*81de7b46SAntoniu Miclaus 		case IIO_POWER:
1086*81de7b46SAntoniu Miclaus 			*val = 1;
1087*81de7b46SAntoniu Miclaus 			*val2 = ADE9000_WATT_FULL_SCALE_CODES;
1088*81de7b46SAntoniu Miclaus 			return IIO_VAL_FRACTIONAL;
1089*81de7b46SAntoniu Miclaus 		default:
1090*81de7b46SAntoniu Miclaus 			break;
1091*81de7b46SAntoniu Miclaus 		}
1092*81de7b46SAntoniu Miclaus 
1093*81de7b46SAntoniu Miclaus 		return -EINVAL;
1094*81de7b46SAntoniu Miclaus 	default:
1095*81de7b46SAntoniu Miclaus 		return -EINVAL;
1096*81de7b46SAntoniu Miclaus 	}
1097*81de7b46SAntoniu Miclaus }
1098*81de7b46SAntoniu Miclaus 
1099*81de7b46SAntoniu Miclaus static int ade9000_write_raw(struct iio_dev *indio_dev,
1100*81de7b46SAntoniu Miclaus 			     struct iio_chan_spec const *chan,
1101*81de7b46SAntoniu Miclaus 			     int val,
1102*81de7b46SAntoniu Miclaus 			     int val2,
1103*81de7b46SAntoniu Miclaus 			     long mask)
1104*81de7b46SAntoniu Miclaus {
1105*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1106*81de7b46SAntoniu Miclaus 	u32 tmp;
1107*81de7b46SAntoniu Miclaus 
1108*81de7b46SAntoniu Miclaus 	switch (mask) {
1109*81de7b46SAntoniu Miclaus 	case IIO_CHAN_INFO_CALIBBIAS:
1110*81de7b46SAntoniu Miclaus 		switch (chan->type) {
1111*81de7b46SAntoniu Miclaus 		case IIO_CURRENT:
1112*81de7b46SAntoniu Miclaus 			return regmap_write(st->regmap,
1113*81de7b46SAntoniu Miclaus 					    ADE9000_ADDR_ADJUST(ADE9000_REG_AIRMSOS,
1114*81de7b46SAntoniu Miclaus 								chan->channel), val);
1115*81de7b46SAntoniu Miclaus 		case IIO_VOLTAGE:
1116*81de7b46SAntoniu Miclaus 		case IIO_ALTVOLTAGE:
1117*81de7b46SAntoniu Miclaus 			return regmap_write(st->regmap,
1118*81de7b46SAntoniu Miclaus 					    ADE9000_ADDR_ADJUST(ADE9000_REG_AVRMSOS,
1119*81de7b46SAntoniu Miclaus 								chan->channel), val);
1120*81de7b46SAntoniu Miclaus 		case IIO_POWER:
1121*81de7b46SAntoniu Miclaus 			tmp = chan->address;
1122*81de7b46SAntoniu Miclaus 			tmp &= ~ADE9000_PHASE_B_POS_BIT;
1123*81de7b46SAntoniu Miclaus 			tmp &= ~ADE9000_PHASE_C_POS_BIT;
1124*81de7b46SAntoniu Miclaus 
1125*81de7b46SAntoniu Miclaus 			switch (tmp) {
1126*81de7b46SAntoniu Miclaus 			case ADE9000_REG_AWATTOS:
1127*81de7b46SAntoniu Miclaus 				return regmap_write(st->regmap,
1128*81de7b46SAntoniu Miclaus 						    ADE9000_ADDR_ADJUST(ADE9000_REG_AWATTOS,
1129*81de7b46SAntoniu Miclaus 									chan->channel), val);
1130*81de7b46SAntoniu Miclaus 			case ADE9000_REG_AVAR:
1131*81de7b46SAntoniu Miclaus 				return regmap_write(st->regmap,
1132*81de7b46SAntoniu Miclaus 						    ADE9000_ADDR_ADJUST(ADE9000_REG_AVAROS,
1133*81de7b46SAntoniu Miclaus 									chan->channel), val);
1134*81de7b46SAntoniu Miclaus 			case ADE9000_REG_AFVAR:
1135*81de7b46SAntoniu Miclaus 				return regmap_write(st->regmap,
1136*81de7b46SAntoniu Miclaus 						    ADE9000_ADDR_ADJUST(ADE9000_REG_AFVAROS,
1137*81de7b46SAntoniu Miclaus 									chan->channel), val);
1138*81de7b46SAntoniu Miclaus 			default:
1139*81de7b46SAntoniu Miclaus 				return -EINVAL;
1140*81de7b46SAntoniu Miclaus 			}
1141*81de7b46SAntoniu Miclaus 		default:
1142*81de7b46SAntoniu Miclaus 			return -EINVAL;
1143*81de7b46SAntoniu Miclaus 		}
1144*81de7b46SAntoniu Miclaus 	case IIO_CHAN_INFO_CALIBSCALE:
1145*81de7b46SAntoniu Miclaus 		/*
1146*81de7b46SAntoniu Miclaus 		 * Calibration gain registers for fine-tuning measurements.
1147*81de7b46SAntoniu Miclaus 		 * These are separate from PGA gain and applied in the digital domain.
1148*81de7b46SAntoniu Miclaus 		 */
1149*81de7b46SAntoniu Miclaus 		switch (chan->type) {
1150*81de7b46SAntoniu Miclaus 		case IIO_CURRENT:
1151*81de7b46SAntoniu Miclaus 			return regmap_write(st->regmap,
1152*81de7b46SAntoniu Miclaus 					    ADE9000_ADDR_ADJUST(ADE9000_REG_AIGAIN,
1153*81de7b46SAntoniu Miclaus 								chan->channel), val);
1154*81de7b46SAntoniu Miclaus 		case IIO_VOLTAGE:
1155*81de7b46SAntoniu Miclaus 			return regmap_write(st->regmap,
1156*81de7b46SAntoniu Miclaus 					    ADE9000_ADDR_ADJUST(ADE9000_REG_AVGAIN,
1157*81de7b46SAntoniu Miclaus 								chan->channel), val);
1158*81de7b46SAntoniu Miclaus 		case IIO_POWER:
1159*81de7b46SAntoniu Miclaus 			return regmap_write(st->regmap,
1160*81de7b46SAntoniu Miclaus 					    ADE9000_ADDR_ADJUST(ADE9000_REG_APGAIN,
1161*81de7b46SAntoniu Miclaus 								chan->channel), val);
1162*81de7b46SAntoniu Miclaus 		default:
1163*81de7b46SAntoniu Miclaus 			return -EINVAL;
1164*81de7b46SAntoniu Miclaus 		}
1165*81de7b46SAntoniu Miclaus 	case IIO_CHAN_INFO_SCALE:
1166*81de7b46SAntoniu Miclaus 		/* Per-channel scales are read-only */
1167*81de7b46SAntoniu Miclaus 		return -EINVAL;
1168*81de7b46SAntoniu Miclaus 	default:
1169*81de7b46SAntoniu Miclaus 		return -EINVAL;
1170*81de7b46SAntoniu Miclaus 	}
1171*81de7b46SAntoniu Miclaus }
1172*81de7b46SAntoniu Miclaus 
1173*81de7b46SAntoniu Miclaus static int ade9000_reg_access(struct iio_dev *indio_dev,
1174*81de7b46SAntoniu Miclaus 			      unsigned int reg,
1175*81de7b46SAntoniu Miclaus 			      unsigned int tx_val,
1176*81de7b46SAntoniu Miclaus 			      unsigned int *rx_val)
1177*81de7b46SAntoniu Miclaus {
1178*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1179*81de7b46SAntoniu Miclaus 
1180*81de7b46SAntoniu Miclaus 	if (rx_val)
1181*81de7b46SAntoniu Miclaus 		return regmap_read(st->regmap, reg, rx_val);
1182*81de7b46SAntoniu Miclaus 
1183*81de7b46SAntoniu Miclaus 	return regmap_write(st->regmap, reg, tx_val);
1184*81de7b46SAntoniu Miclaus }
1185*81de7b46SAntoniu Miclaus 
1186*81de7b46SAntoniu Miclaus static int ade9000_read_event_config(struct iio_dev *indio_dev,
1187*81de7b46SAntoniu Miclaus 				     const struct iio_chan_spec *chan,
1188*81de7b46SAntoniu Miclaus 				     enum iio_event_type type,
1189*81de7b46SAntoniu Miclaus 				     enum iio_event_direction dir)
1190*81de7b46SAntoniu Miclaus {
1191*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1192*81de7b46SAntoniu Miclaus 	u32 interrupts1;
1193*81de7b46SAntoniu Miclaus 	int ret;
1194*81de7b46SAntoniu Miclaus 
1195*81de7b46SAntoniu Miclaus 	/* All events use MASK1 register */
1196*81de7b46SAntoniu Miclaus 	ret = regmap_read(st->regmap, ADE9000_REG_MASK1, &interrupts1);
1197*81de7b46SAntoniu Miclaus 	if (ret)
1198*81de7b46SAntoniu Miclaus 		return ret;
1199*81de7b46SAntoniu Miclaus 
1200*81de7b46SAntoniu Miclaus 	switch (chan->channel) {
1201*81de7b46SAntoniu Miclaus 	case ADE9000_PHASE_A_NR:
1202*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_VOLTAGE && dir == IIO_EV_DIR_EITHER)
1203*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_ZXVA_BIT);
1204*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_CURRENT && dir == IIO_EV_DIR_EITHER)
1205*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_ZXIA_BIT);
1206*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_RISING)
1207*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_SWELLA_BIT);
1208*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_FALLING)
1209*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_DIPA_BIT);
1210*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(&indio_dev->dev,
1211*81de7b46SAntoniu Miclaus 				    "Invalid channel type %d or direction %d for phase A\n", chan->type, dir);
1212*81de7b46SAntoniu Miclaus 		return -EINVAL;
1213*81de7b46SAntoniu Miclaus 	case ADE9000_PHASE_B_NR:
1214*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_VOLTAGE && dir == IIO_EV_DIR_EITHER)
1215*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_ZXVB_BIT);
1216*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_CURRENT && dir == IIO_EV_DIR_EITHER)
1217*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_ZXIB_BIT);
1218*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_RISING)
1219*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_SWELLB_BIT);
1220*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_FALLING)
1221*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_DIPB_BIT);
1222*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(&indio_dev->dev,
1223*81de7b46SAntoniu Miclaus 				    "Invalid channel type %d or direction %d for phase B\n", chan->type, dir);
1224*81de7b46SAntoniu Miclaus 		return -EINVAL;
1225*81de7b46SAntoniu Miclaus 	case ADE9000_PHASE_C_NR:
1226*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_VOLTAGE && dir == IIO_EV_DIR_EITHER)
1227*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_ZXVC_BIT);
1228*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_CURRENT && dir == IIO_EV_DIR_EITHER)
1229*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_ZXIC_BIT);
1230*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_RISING)
1231*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_SWELLC_BIT);
1232*81de7b46SAntoniu Miclaus 		else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_FALLING)
1233*81de7b46SAntoniu Miclaus 			return !!(interrupts1 & ADE9000_ST1_DIPC_BIT);
1234*81de7b46SAntoniu Miclaus 		dev_err_ratelimited(&indio_dev->dev,
1235*81de7b46SAntoniu Miclaus 				    "Invalid channel type %d or direction %d for phase C\n", chan->type, dir);
1236*81de7b46SAntoniu Miclaus 		return -EINVAL;
1237*81de7b46SAntoniu Miclaus 	default:
1238*81de7b46SAntoniu Miclaus 		return -EINVAL;
1239*81de7b46SAntoniu Miclaus 	}
1240*81de7b46SAntoniu Miclaus }
1241*81de7b46SAntoniu Miclaus 
1242*81de7b46SAntoniu Miclaus static int ade9000_write_event_config(struct iio_dev *indio_dev,
1243*81de7b46SAntoniu Miclaus 				      const struct iio_chan_spec *chan,
1244*81de7b46SAntoniu Miclaus 				      enum iio_event_type type,
1245*81de7b46SAntoniu Miclaus 				      enum iio_event_direction dir,
1246*81de7b46SAntoniu Miclaus 				      bool state)
1247*81de7b46SAntoniu Miclaus {
1248*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1249*81de7b46SAntoniu Miclaus 	u32 bit_mask;
1250*81de7b46SAntoniu Miclaus 	int ret;
1251*81de7b46SAntoniu Miclaus 
1252*81de7b46SAntoniu Miclaus 	/* Clear all pending events in STATUS1 register (write 1 to clear) */
1253*81de7b46SAntoniu Miclaus 	ret = regmap_write(st->regmap, ADE9000_REG_STATUS1, GENMASK(31, 0));
1254*81de7b46SAntoniu Miclaus 	if (ret)
1255*81de7b46SAntoniu Miclaus 		return ret;
1256*81de7b46SAntoniu Miclaus 
1257*81de7b46SAntoniu Miclaus 	/* Determine which interrupt bit to enable/disable */
1258*81de7b46SAntoniu Miclaus 	switch (chan->channel) {
1259*81de7b46SAntoniu Miclaus 	case ADE9000_PHASE_A_NR:
1260*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_VOLTAGE && dir == IIO_EV_DIR_EITHER) {
1261*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_ZXVA_BIT;
1262*81de7b46SAntoniu Miclaus 			if (state)
1263*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_ZXVA_BIT;
1264*81de7b46SAntoniu Miclaus 			else
1265*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_ZXVA_BIT;
1266*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_CURRENT && dir == IIO_EV_DIR_EITHER) {
1267*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_ZXIA_BIT;
1268*81de7b46SAntoniu Miclaus 			if (state)
1269*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_ZXIA_BIT;
1270*81de7b46SAntoniu Miclaus 			else
1271*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_ZXIA_BIT;
1272*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_RISING) {
1273*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_SWELLA_BIT;
1274*81de7b46SAntoniu Miclaus 			if (state)
1275*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_SWELL_BIT;
1276*81de7b46SAntoniu Miclaus 			else
1277*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_SWELL_BIT;
1278*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_FALLING) {
1279*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_DIPA_BIT;
1280*81de7b46SAntoniu Miclaus 			if (state)
1281*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_DIP_BIT;
1282*81de7b46SAntoniu Miclaus 			else
1283*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_DIP_BIT;
1284*81de7b46SAntoniu Miclaus 		} else {
1285*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(&indio_dev->dev, "Invalid channel type %d or direction %d for phase A\n",
1286*81de7b46SAntoniu Miclaus 					    chan->type, dir);
1287*81de7b46SAntoniu Miclaus 			return -EINVAL;
1288*81de7b46SAntoniu Miclaus 		}
1289*81de7b46SAntoniu Miclaus 		break;
1290*81de7b46SAntoniu Miclaus 	case ADE9000_PHASE_B_NR:
1291*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_VOLTAGE && dir == IIO_EV_DIR_EITHER) {
1292*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_ZXVB_BIT;
1293*81de7b46SAntoniu Miclaus 			if (state)
1294*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_ZXVB_BIT;
1295*81de7b46SAntoniu Miclaus 			else
1296*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_ZXVB_BIT;
1297*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_CURRENT && dir == IIO_EV_DIR_EITHER) {
1298*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_ZXIB_BIT;
1299*81de7b46SAntoniu Miclaus 			if (state)
1300*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_ZXIB_BIT;
1301*81de7b46SAntoniu Miclaus 			else
1302*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_ZXIB_BIT;
1303*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_RISING) {
1304*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_SWELLB_BIT;
1305*81de7b46SAntoniu Miclaus 			if (state)
1306*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_SWELL_BIT;
1307*81de7b46SAntoniu Miclaus 			else
1308*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_SWELL_BIT;
1309*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_FALLING) {
1310*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_DIPB_BIT;
1311*81de7b46SAntoniu Miclaus 			if (state)
1312*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_DIP_BIT;
1313*81de7b46SAntoniu Miclaus 			else
1314*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_DIP_BIT;
1315*81de7b46SAntoniu Miclaus 		} else {
1316*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(&indio_dev->dev,
1317*81de7b46SAntoniu Miclaus 					    "Invalid channel type %d or direction %d for phase B\n",
1318*81de7b46SAntoniu Miclaus 					    chan->type, dir);
1319*81de7b46SAntoniu Miclaus 			return -EINVAL;
1320*81de7b46SAntoniu Miclaus 		}
1321*81de7b46SAntoniu Miclaus 		break;
1322*81de7b46SAntoniu Miclaus 	case ADE9000_PHASE_C_NR:
1323*81de7b46SAntoniu Miclaus 		if (chan->type == IIO_VOLTAGE && dir == IIO_EV_DIR_EITHER) {
1324*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_ZXVC_BIT;
1325*81de7b46SAntoniu Miclaus 			if (state)
1326*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_ZXVC_BIT;
1327*81de7b46SAntoniu Miclaus 			else
1328*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_ZXVC_BIT;
1329*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_CURRENT && dir == IIO_EV_DIR_EITHER) {
1330*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_ZXIC_BIT;
1331*81de7b46SAntoniu Miclaus 			if (state)
1332*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_ZXIC_BIT;
1333*81de7b46SAntoniu Miclaus 			else
1334*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_ZXIC_BIT;
1335*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_RISING) {
1336*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_SWELLC_BIT;
1337*81de7b46SAntoniu Miclaus 			if (state)
1338*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_SWELL_BIT;
1339*81de7b46SAntoniu Miclaus 			else
1340*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_SWELL_BIT;
1341*81de7b46SAntoniu Miclaus 		} else if (chan->type == IIO_ALTVOLTAGE && dir == IIO_EV_DIR_FALLING) {
1342*81de7b46SAntoniu Miclaus 			bit_mask = ADE9000_ST1_DIPC_BIT;
1343*81de7b46SAntoniu Miclaus 			if (state)
1344*81de7b46SAntoniu Miclaus 				st->wfb_trg |= ADE9000_WFB_TRG_DIP_BIT;
1345*81de7b46SAntoniu Miclaus 			else
1346*81de7b46SAntoniu Miclaus 				st->wfb_trg &= ~ADE9000_WFB_TRG_DIP_BIT;
1347*81de7b46SAntoniu Miclaus 		} else {
1348*81de7b46SAntoniu Miclaus 			dev_err_ratelimited(&indio_dev->dev,
1349*81de7b46SAntoniu Miclaus 					    "Invalid channel type %d or direction %d for phase C\n",
1350*81de7b46SAntoniu Miclaus 					    chan->type, dir);
1351*81de7b46SAntoniu Miclaus 			return -EINVAL;
1352*81de7b46SAntoniu Miclaus 		}
1353*81de7b46SAntoniu Miclaus 		break;
1354*81de7b46SAntoniu Miclaus 	default:
1355*81de7b46SAntoniu Miclaus 		return -EINVAL;
1356*81de7b46SAntoniu Miclaus 	}
1357*81de7b46SAntoniu Miclaus 
1358*81de7b46SAntoniu Miclaus 	/* Set bits if enabling event, clear bits if disabling */
1359*81de7b46SAntoniu Miclaus 	return regmap_assign_bits(st->regmap, ADE9000_REG_MASK1, bit_mask, state ? bit_mask : 0);
1360*81de7b46SAntoniu Miclaus }
1361*81de7b46SAntoniu Miclaus 
1362*81de7b46SAntoniu Miclaus static int ade9000_write_event_value(struct iio_dev *indio_dev,
1363*81de7b46SAntoniu Miclaus 				     const struct iio_chan_spec *chan,
1364*81de7b46SAntoniu Miclaus 				     enum iio_event_type type,
1365*81de7b46SAntoniu Miclaus 				     enum iio_event_direction dir,
1366*81de7b46SAntoniu Miclaus 				     enum iio_event_info info,
1367*81de7b46SAntoniu Miclaus 				     int val, int val2)
1368*81de7b46SAntoniu Miclaus {
1369*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1370*81de7b46SAntoniu Miclaus 
1371*81de7b46SAntoniu Miclaus 	switch (info) {
1372*81de7b46SAntoniu Miclaus 	case IIO_EV_INFO_VALUE:
1373*81de7b46SAntoniu Miclaus 		switch (dir) {
1374*81de7b46SAntoniu Miclaus 		case IIO_EV_DIR_FALLING:
1375*81de7b46SAntoniu Miclaus 			return regmap_write(st->regmap, ADE9000_REG_DIP_LVL, val);
1376*81de7b46SAntoniu Miclaus 		case IIO_EV_DIR_RISING:
1377*81de7b46SAntoniu Miclaus 			return regmap_write(st->regmap, ADE9000_REG_SWELL_LVL, val);
1378*81de7b46SAntoniu Miclaus 		default:
1379*81de7b46SAntoniu Miclaus 			return -EINVAL;
1380*81de7b46SAntoniu Miclaus 		}
1381*81de7b46SAntoniu Miclaus 	default:
1382*81de7b46SAntoniu Miclaus 		return -EINVAL;
1383*81de7b46SAntoniu Miclaus 	}
1384*81de7b46SAntoniu Miclaus }
1385*81de7b46SAntoniu Miclaus 
1386*81de7b46SAntoniu Miclaus static int ade9000_read_event_value(struct iio_dev *indio_dev,
1387*81de7b46SAntoniu Miclaus 				    const struct iio_chan_spec *chan,
1388*81de7b46SAntoniu Miclaus 				    enum iio_event_type type,
1389*81de7b46SAntoniu Miclaus 				    enum iio_event_direction dir,
1390*81de7b46SAntoniu Miclaus 				    enum iio_event_info info,
1391*81de7b46SAntoniu Miclaus 				    int *val, int *val2)
1392*81de7b46SAntoniu Miclaus {
1393*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1394*81de7b46SAntoniu Miclaus 	unsigned int data;
1395*81de7b46SAntoniu Miclaus 	int ret;
1396*81de7b46SAntoniu Miclaus 
1397*81de7b46SAntoniu Miclaus 	switch (info) {
1398*81de7b46SAntoniu Miclaus 	case IIO_EV_INFO_VALUE:
1399*81de7b46SAntoniu Miclaus 		switch (dir) {
1400*81de7b46SAntoniu Miclaus 		case IIO_EV_DIR_FALLING:
1401*81de7b46SAntoniu Miclaus 			ret = regmap_read(st->regmap, ADE9000_REG_DIP_LVL, &data);
1402*81de7b46SAntoniu Miclaus 			if (ret)
1403*81de7b46SAntoniu Miclaus 				return ret;
1404*81de7b46SAntoniu Miclaus 			*val = data;
1405*81de7b46SAntoniu Miclaus 			return IIO_VAL_INT;
1406*81de7b46SAntoniu Miclaus 		case IIO_EV_DIR_RISING:
1407*81de7b46SAntoniu Miclaus 			ret = regmap_read(st->regmap, ADE9000_REG_SWELL_LVL, &data);
1408*81de7b46SAntoniu Miclaus 			if (ret)
1409*81de7b46SAntoniu Miclaus 				return ret;
1410*81de7b46SAntoniu Miclaus 			*val = data;
1411*81de7b46SAntoniu Miclaus 			return IIO_VAL_INT;
1412*81de7b46SAntoniu Miclaus 		default:
1413*81de7b46SAntoniu Miclaus 			return -EINVAL;
1414*81de7b46SAntoniu Miclaus 		}
1415*81de7b46SAntoniu Miclaus 	default:
1416*81de7b46SAntoniu Miclaus 		return -EINVAL;
1417*81de7b46SAntoniu Miclaus 	}
1418*81de7b46SAntoniu Miclaus }
1419*81de7b46SAntoniu Miclaus 
1420*81de7b46SAntoniu Miclaus static int ade9000_waveform_buffer_config(struct iio_dev *indio_dev)
1421*81de7b46SAntoniu Miclaus {
1422*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1423*81de7b46SAntoniu Miclaus 	u32 wfb_cfg_val;
1424*81de7b46SAntoniu Miclaus 	u32 active_scans;
1425*81de7b46SAntoniu Miclaus 
1426*81de7b46SAntoniu Miclaus 	bitmap_to_arr32(&active_scans, indio_dev->active_scan_mask,
1427*81de7b46SAntoniu Miclaus 			iio_get_masklength(indio_dev));
1428*81de7b46SAntoniu Miclaus 
1429*81de7b46SAntoniu Miclaus 	switch (active_scans) {
1430*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_IA | ADE9000_SCAN_POS_VA:
1431*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_IA_VA;
1432*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 2;
1433*81de7b46SAntoniu Miclaus 		break;
1434*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_IB | ADE9000_SCAN_POS_VB:
1435*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_IB_VB;
1436*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 2;
1437*81de7b46SAntoniu Miclaus 		break;
1438*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_IC | ADE9000_SCAN_POS_VC:
1439*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_IC_VC;
1440*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 2;
1441*81de7b46SAntoniu Miclaus 		break;
1442*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_IA:
1443*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_IA;
1444*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 1;
1445*81de7b46SAntoniu Miclaus 		break;
1446*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_VA:
1447*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_VA;
1448*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 1;
1449*81de7b46SAntoniu Miclaus 		break;
1450*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_IB:
1451*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_IB;
1452*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 1;
1453*81de7b46SAntoniu Miclaus 		break;
1454*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_VB:
1455*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_VB;
1456*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 1;
1457*81de7b46SAntoniu Miclaus 		break;
1458*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_IC:
1459*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_IC;
1460*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 1;
1461*81de7b46SAntoniu Miclaus 		break;
1462*81de7b46SAntoniu Miclaus 	case ADE9000_SCAN_POS_VC:
1463*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_VC;
1464*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 1;
1465*81de7b46SAntoniu Miclaus 		break;
1466*81de7b46SAntoniu Miclaus 	case (ADE9000_SCAN_POS_IA | ADE9000_SCAN_POS_VA | ADE9000_SCAN_POS_IB |
1467*81de7b46SAntoniu Miclaus 	      ADE9000_SCAN_POS_VB | ADE9000_SCAN_POS_IC | ADE9000_SCAN_POS_VC):
1468*81de7b46SAntoniu Miclaus 		wfb_cfg_val = ADE9000_WFB_CFG_ALL_CHAN;
1469*81de7b46SAntoniu Miclaus 		st->wfb_nr_activ_chan = 6;
1470*81de7b46SAntoniu Miclaus 		break;
1471*81de7b46SAntoniu Miclaus 	default:
1472*81de7b46SAntoniu Miclaus 		dev_err(&st->spi->dev, "Unsupported combination of scans\n");
1473*81de7b46SAntoniu Miclaus 		return -EINVAL;
1474*81de7b46SAntoniu Miclaus 	}
1475*81de7b46SAntoniu Miclaus 
1476*81de7b46SAntoniu Miclaus 	wfb_cfg_val |= FIELD_PREP(ADE9000_WF_SRC_MASK, st->wf_src);
1477*81de7b46SAntoniu Miclaus 
1478*81de7b46SAntoniu Miclaus 	return regmap_write(st->regmap, ADE9000_REG_WFB_CFG, wfb_cfg_val);
1479*81de7b46SAntoniu Miclaus }
1480*81de7b46SAntoniu Miclaus 
1481*81de7b46SAntoniu Miclaus static int ade9000_waveform_buffer_interrupt_setup(struct ade9000_state *st)
1482*81de7b46SAntoniu Miclaus {
1483*81de7b46SAntoniu Miclaus 	int ret;
1484*81de7b46SAntoniu Miclaus 
1485*81de7b46SAntoniu Miclaus 	ret = regmap_write(st->regmap, ADE9000_REG_WFB_TRG_CFG, 0x0);
1486*81de7b46SAntoniu Miclaus 	if (ret)
1487*81de7b46SAntoniu Miclaus 		return ret;
1488*81de7b46SAntoniu Miclaus 
1489*81de7b46SAntoniu Miclaus 	/* Always use streaming mode setup */
1490*81de7b46SAntoniu Miclaus 	ret = regmap_write(st->regmap, ADE9000_REG_WFB_PG_IRQEN,
1491*81de7b46SAntoniu Miclaus 			   ADE9000_MIDDLE_PAGE_BIT);
1492*81de7b46SAntoniu Miclaus 	if (ret)
1493*81de7b46SAntoniu Miclaus 		return ret;
1494*81de7b46SAntoniu Miclaus 
1495*81de7b46SAntoniu Miclaus 	ret = regmap_write(st->regmap, ADE9000_REG_STATUS0, GENMASK(31, 0));
1496*81de7b46SAntoniu Miclaus 	if (ret)
1497*81de7b46SAntoniu Miclaus 		return ret;
1498*81de7b46SAntoniu Miclaus 
1499*81de7b46SAntoniu Miclaus 	return regmap_set_bits(st->regmap, ADE9000_REG_MASK0,
1500*81de7b46SAntoniu Miclaus 			       ADE9000_ST0_PAGE_FULL_BIT);
1501*81de7b46SAntoniu Miclaus }
1502*81de7b46SAntoniu Miclaus 
1503*81de7b46SAntoniu Miclaus static int ade9000_buffer_preenable(struct iio_dev *indio_dev)
1504*81de7b46SAntoniu Miclaus {
1505*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1506*81de7b46SAntoniu Miclaus 	int ret;
1507*81de7b46SAntoniu Miclaus 
1508*81de7b46SAntoniu Miclaus 	ret = ade9000_waveform_buffer_config(indio_dev);
1509*81de7b46SAntoniu Miclaus 	if (ret)
1510*81de7b46SAntoniu Miclaus 		return ret;
1511*81de7b46SAntoniu Miclaus 
1512*81de7b46SAntoniu Miclaus 	st->wfb_nr_samples = ADE9000_WFB_MAX_SAMPLES_CHAN * st->wfb_nr_activ_chan;
1513*81de7b46SAntoniu Miclaus 
1514*81de7b46SAntoniu Miclaus 	ade9000_configure_scan(indio_dev, ADE9000_REG_WF_BUFF);
1515*81de7b46SAntoniu Miclaus 
1516*81de7b46SAntoniu Miclaus 	ret = ade9000_waveform_buffer_interrupt_setup(st);
1517*81de7b46SAntoniu Miclaus 	if (ret)
1518*81de7b46SAntoniu Miclaus 		return ret;
1519*81de7b46SAntoniu Miclaus 
1520*81de7b46SAntoniu Miclaus 	ret = regmap_set_bits(st->regmap, ADE9000_REG_WFB_CFG,
1521*81de7b46SAntoniu Miclaus 			      ADE9000_WF_CAP_EN_MASK);
1522*81de7b46SAntoniu Miclaus 	if (ret) {
1523*81de7b46SAntoniu Miclaus 		dev_err(&st->spi->dev, "Post-enable waveform buffer enable fail\n");
1524*81de7b46SAntoniu Miclaus 		return ret;
1525*81de7b46SAntoniu Miclaus 	}
1526*81de7b46SAntoniu Miclaus 
1527*81de7b46SAntoniu Miclaus 	return 0;
1528*81de7b46SAntoniu Miclaus }
1529*81de7b46SAntoniu Miclaus 
1530*81de7b46SAntoniu Miclaus static int ade9000_buffer_postdisable(struct iio_dev *indio_dev)
1531*81de7b46SAntoniu Miclaus {
1532*81de7b46SAntoniu Miclaus 	struct ade9000_state *st = iio_priv(indio_dev);
1533*81de7b46SAntoniu Miclaus 	struct device *dev = &st->spi->dev;
1534*81de7b46SAntoniu Miclaus 	u32 interrupts;
1535*81de7b46SAntoniu Miclaus 	int ret;
1536*81de7b46SAntoniu Miclaus 
1537*81de7b46SAntoniu Miclaus 	ret = regmap_clear_bits(st->regmap, ADE9000_REG_WFB_CFG,
1538*81de7b46SAntoniu Miclaus 				ADE9000_WF_CAP_EN_MASK);
1539*81de7b46SAntoniu Miclaus 	if (ret) {
1540*81de7b46SAntoniu Miclaus 		dev_err(dev, "Post-disable waveform buffer disable fail\n");
1541*81de7b46SAntoniu Miclaus 		return ret;
1542*81de7b46SAntoniu Miclaus 	}
1543*81de7b46SAntoniu Miclaus 
1544*81de7b46SAntoniu Miclaus 	ret = regmap_write(st->regmap, ADE9000_REG_WFB_TRG_CFG, 0x0);
1545*81de7b46SAntoniu Miclaus 	if (ret)
1546*81de7b46SAntoniu Miclaus 		return ret;
1547*81de7b46SAntoniu Miclaus 
1548*81de7b46SAntoniu Miclaus 	interrupts = ADE9000_ST0_WFB_TRIG_BIT | ADE9000_ST0_PAGE_FULL_BIT;
1549*81de7b46SAntoniu Miclaus 
1550*81de7b46SAntoniu Miclaus 	ret = regmap_clear_bits(st->regmap, ADE9000_REG_MASK0, interrupts);
1551*81de7b46SAntoniu Miclaus 	if (ret) {
1552*81de7b46SAntoniu Miclaus 		dev_err(dev, "Post-disable update maks0 fail\n");
1553*81de7b46SAntoniu Miclaus 		return ret;
1554*81de7b46SAntoniu Miclaus 	}
1555*81de7b46SAntoniu Miclaus 
1556*81de7b46SAntoniu Miclaus 	return regmap_write(st->regmap, ADE9000_REG_STATUS0, GENMASK(31, 0));
1557*81de7b46SAntoniu Miclaus }
1558*81de7b46SAntoniu Miclaus 
1559*81de7b46SAntoniu Miclaus static const struct iio_buffer_setup_ops ade9000_buffer_ops = {
1560*81de7b46SAntoniu Miclaus 	.preenable = &ade9000_buffer_preenable,
1561*81de7b46SAntoniu Miclaus 	.postdisable = &ade9000_buffer_postdisable,
1562*81de7b46SAntoniu Miclaus };
1563*81de7b46SAntoniu Miclaus 
1564*81de7b46SAntoniu Miclaus static int ade9000_reset(struct ade9000_state *st)
1565*81de7b46SAntoniu Miclaus {
1566*81de7b46SAntoniu Miclaus 	struct device *dev = &st->spi->dev;
1567*81de7b46SAntoniu Miclaus 	struct gpio_desc *gpio_reset;
1568*81de7b46SAntoniu Miclaus 	int ret;
1569*81de7b46SAntoniu Miclaus 
1570*81de7b46SAntoniu Miclaus 	gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
1571*81de7b46SAntoniu Miclaus 	if (IS_ERR(gpio_reset))
1572*81de7b46SAntoniu Miclaus 		return PTR_ERR(gpio_reset);
1573*81de7b46SAntoniu Miclaus 
1574*81de7b46SAntoniu Miclaus 	/* Software reset via register if no GPIO available */
1575*81de7b46SAntoniu Miclaus 	if (!gpio_reset) {
1576*81de7b46SAntoniu Miclaus 		ret = regmap_set_bits(st->regmap, ADE9000_REG_CONFIG1,
1577*81de7b46SAntoniu Miclaus 				      ADE9000_SWRST_BIT);
1578*81de7b46SAntoniu Miclaus 		if (ret)
1579*81de7b46SAntoniu Miclaus 			return ret;
1580*81de7b46SAntoniu Miclaus 		fsleep(90);
1581*81de7b46SAntoniu Miclaus 		return 0;
1582*81de7b46SAntoniu Miclaus 	}
1583*81de7b46SAntoniu Miclaus 
1584*81de7b46SAntoniu Miclaus 	/* Hardware reset via GPIO */
1585*81de7b46SAntoniu Miclaus 	fsleep(10);
1586*81de7b46SAntoniu Miclaus 	gpiod_set_value_cansleep(gpio_reset, 0);
1587*81de7b46SAntoniu Miclaus 	fsleep(50000);
1588*81de7b46SAntoniu Miclaus 
1589*81de7b46SAntoniu Miclaus 	/* Only wait for completion if IRQ1 is available to signal reset done */
1590*81de7b46SAntoniu Miclaus 	if (fwnode_irq_get_byname(dev_fwnode(dev), "irq1") >= 0) {
1591*81de7b46SAntoniu Miclaus 		if (!wait_for_completion_timeout(&st->reset_completion,
1592*81de7b46SAntoniu Miclaus 						 msecs_to_jiffies(1000))) {
1593*81de7b46SAntoniu Miclaus 			dev_err(dev, "Reset timeout after 1s\n");
1594*81de7b46SAntoniu Miclaus 			return -ETIMEDOUT;
1595*81de7b46SAntoniu Miclaus 		}
1596*81de7b46SAntoniu Miclaus 	}
1597*81de7b46SAntoniu Miclaus 	/* If no IRQ available, reset is already complete after the 50ms delay above */
1598*81de7b46SAntoniu Miclaus 
1599*81de7b46SAntoniu Miclaus 	return 0;
1600*81de7b46SAntoniu Miclaus }
1601*81de7b46SAntoniu Miclaus 
1602*81de7b46SAntoniu Miclaus static int ade9000_setup(struct ade9000_state *st)
1603*81de7b46SAntoniu Miclaus {
1604*81de7b46SAntoniu Miclaus 	struct device *dev = &st->spi->dev;
1605*81de7b46SAntoniu Miclaus 	int ret;
1606*81de7b46SAntoniu Miclaus 
1607*81de7b46SAntoniu Miclaus 	ret = regmap_multi_reg_write(st->regmap, ade9000_initialization_sequence,
1608*81de7b46SAntoniu Miclaus 				     ARRAY_SIZE(ade9000_initialization_sequence));
1609*81de7b46SAntoniu Miclaus 	if (ret)
1610*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, ret, "Failed to write register sequence");
1611*81de7b46SAntoniu Miclaus 
1612*81de7b46SAntoniu Miclaus 	fsleep(2000);
1613*81de7b46SAntoniu Miclaus 
1614*81de7b46SAntoniu Miclaus 	return 0;
1615*81de7b46SAntoniu Miclaus }
1616*81de7b46SAntoniu Miclaus 
1617*81de7b46SAntoniu Miclaus static const struct iio_info ade9000_info = {
1618*81de7b46SAntoniu Miclaus 	.read_raw = ade9000_read_raw,
1619*81de7b46SAntoniu Miclaus 	.write_raw = ade9000_write_raw,
1620*81de7b46SAntoniu Miclaus 	.debugfs_reg_access = ade9000_reg_access,
1621*81de7b46SAntoniu Miclaus 	.write_event_config = ade9000_write_event_config,
1622*81de7b46SAntoniu Miclaus 	.read_event_config = ade9000_read_event_config,
1623*81de7b46SAntoniu Miclaus 	.write_event_value = ade9000_write_event_value,
1624*81de7b46SAntoniu Miclaus 	.read_event_value = ade9000_read_event_value,
1625*81de7b46SAntoniu Miclaus };
1626*81de7b46SAntoniu Miclaus 
1627*81de7b46SAntoniu Miclaus static const struct regmap_config ade9000_regmap_config = {
1628*81de7b46SAntoniu Miclaus 	.reg_bits = 16,
1629*81de7b46SAntoniu Miclaus 	.val_bits = 32,
1630*81de7b46SAntoniu Miclaus 	.max_register = 0x6bc,
1631*81de7b46SAntoniu Miclaus 	.zero_flag_mask = true,
1632*81de7b46SAntoniu Miclaus 	.cache_type = REGCACHE_RBTREE,
1633*81de7b46SAntoniu Miclaus 	.reg_read = ade9000_spi_read_reg,
1634*81de7b46SAntoniu Miclaus 	.reg_write = ade9000_spi_write_reg,
1635*81de7b46SAntoniu Miclaus 	.volatile_reg = ade9000_is_volatile_reg,
1636*81de7b46SAntoniu Miclaus };
1637*81de7b46SAntoniu Miclaus 
1638*81de7b46SAntoniu Miclaus static int ade9000_setup_clkout(struct device *dev, struct ade9000_state *st)
1639*81de7b46SAntoniu Miclaus {
1640*81de7b46SAntoniu Miclaus 	struct clk_hw *clkout_hw;
1641*81de7b46SAntoniu Miclaus 	int ret;
1642*81de7b46SAntoniu Miclaus 
1643*81de7b46SAntoniu Miclaus 	if (!IS_ENABLED(CONFIG_COMMON_CLK))
1644*81de7b46SAntoniu Miclaus 		return 0;
1645*81de7b46SAntoniu Miclaus 
1646*81de7b46SAntoniu Miclaus 	/*
1647*81de7b46SAntoniu Miclaus 	 * Only provide clock output when using external CMOS clock.
1648*81de7b46SAntoniu Miclaus 	 * When using crystal, CLKOUT is connected to crystal and shouldn't
1649*81de7b46SAntoniu Miclaus 	 * be used as clock provider for other devices.
1650*81de7b46SAntoniu Miclaus 	 */
1651*81de7b46SAntoniu Miclaus 	if (!device_property_present(dev, "#clock-cells") || !st->clkin)
1652*81de7b46SAntoniu Miclaus 		return 0;
1653*81de7b46SAntoniu Miclaus 
1654*81de7b46SAntoniu Miclaus 	/* CLKOUT passes through CLKIN with divider of 1 */
1655*81de7b46SAntoniu Miclaus 	clkout_hw = devm_clk_hw_register_divider(dev, "clkout", __clk_get_name(st->clkin),
1656*81de7b46SAntoniu Miclaus 						 CLK_SET_RATE_PARENT, NULL, 0, 1, 0, NULL);
1657*81de7b46SAntoniu Miclaus 	if (IS_ERR(clkout_hw))
1658*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, PTR_ERR(clkout_hw), "Failed to register clkout");
1659*81de7b46SAntoniu Miclaus 
1660*81de7b46SAntoniu Miclaus 	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, clkout_hw);
1661*81de7b46SAntoniu Miclaus 	if (ret)
1662*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, ret, "Failed to add clock provider");
1663*81de7b46SAntoniu Miclaus 
1664*81de7b46SAntoniu Miclaus 	return 0;
1665*81de7b46SAntoniu Miclaus }
1666*81de7b46SAntoniu Miclaus 
1667*81de7b46SAntoniu Miclaus static int ade9000_request_irq(struct device *dev, const char *name,
1668*81de7b46SAntoniu Miclaus 			       irq_handler_t handler, void *dev_id)
1669*81de7b46SAntoniu Miclaus {
1670*81de7b46SAntoniu Miclaus 	int irq, ret;
1671*81de7b46SAntoniu Miclaus 
1672*81de7b46SAntoniu Miclaus 	irq = fwnode_irq_get_byname(dev_fwnode(dev), name);
1673*81de7b46SAntoniu Miclaus 	if (irq == -EINVAL)
1674*81de7b46SAntoniu Miclaus 		return 0; /* interrupts are optional */
1675*81de7b46SAntoniu Miclaus 	if (irq < 0)
1676*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, irq, "Failed to get %s irq", name);
1677*81de7b46SAntoniu Miclaus 
1678*81de7b46SAntoniu Miclaus 	ret = devm_request_threaded_irq(dev, irq, NULL, handler,
1679*81de7b46SAntoniu Miclaus 					IRQF_ONESHOT, KBUILD_MODNAME, dev_id);
1680*81de7b46SAntoniu Miclaus 	if (ret)
1681*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, ret, "Failed to request %s irq", name);
1682*81de7b46SAntoniu Miclaus 
1683*81de7b46SAntoniu Miclaus 	return 0;
1684*81de7b46SAntoniu Miclaus }
1685*81de7b46SAntoniu Miclaus 
1686*81de7b46SAntoniu Miclaus static int ade9000_probe(struct spi_device *spi)
1687*81de7b46SAntoniu Miclaus {
1688*81de7b46SAntoniu Miclaus 	struct device *dev = &spi->dev;
1689*81de7b46SAntoniu Miclaus 	struct iio_dev *indio_dev;
1690*81de7b46SAntoniu Miclaus 	struct ade9000_state *st;
1691*81de7b46SAntoniu Miclaus 	struct regmap *regmap;
1692*81de7b46SAntoniu Miclaus 	int ret;
1693*81de7b46SAntoniu Miclaus 
1694*81de7b46SAntoniu Miclaus 	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
1695*81de7b46SAntoniu Miclaus 	if (!indio_dev)
1696*81de7b46SAntoniu Miclaus 		return -ENOMEM;
1697*81de7b46SAntoniu Miclaus 
1698*81de7b46SAntoniu Miclaus 	st = iio_priv(indio_dev);
1699*81de7b46SAntoniu Miclaus 
1700*81de7b46SAntoniu Miclaus 	regmap = devm_regmap_init(dev, NULL, st, &ade9000_regmap_config);
1701*81de7b46SAntoniu Miclaus 	if (IS_ERR(regmap))
1702*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, PTR_ERR(regmap), "Unable to allocate ADE9000 regmap");
1703*81de7b46SAntoniu Miclaus 
1704*81de7b46SAntoniu Miclaus 	st->regmap = regmap;
1705*81de7b46SAntoniu Miclaus 	st->spi = spi;
1706*81de7b46SAntoniu Miclaus 
1707*81de7b46SAntoniu Miclaus 	init_completion(&st->reset_completion);
1708*81de7b46SAntoniu Miclaus 
1709*81de7b46SAntoniu Miclaus 	ret = ade9000_request_irq(dev, "irq0", ade9000_irq0_thread, indio_dev);
1710*81de7b46SAntoniu Miclaus 	if (ret)
1711*81de7b46SAntoniu Miclaus 		return ret;
1712*81de7b46SAntoniu Miclaus 
1713*81de7b46SAntoniu Miclaus 	ret = ade9000_request_irq(dev, "irq1", ade9000_irq1_thread, indio_dev);
1714*81de7b46SAntoniu Miclaus 	if (ret)
1715*81de7b46SAntoniu Miclaus 		return ret;
1716*81de7b46SAntoniu Miclaus 
1717*81de7b46SAntoniu Miclaus 	ret = ade9000_request_irq(dev, "dready", ade9000_dready_thread, indio_dev);
1718*81de7b46SAntoniu Miclaus 	if (ret)
1719*81de7b46SAntoniu Miclaus 		return ret;
1720*81de7b46SAntoniu Miclaus 
1721*81de7b46SAntoniu Miclaus 	ret = devm_mutex_init(dev, &st->lock);
1722*81de7b46SAntoniu Miclaus 	if (ret)
1723*81de7b46SAntoniu Miclaus 		return ret;
1724*81de7b46SAntoniu Miclaus 
1725*81de7b46SAntoniu Miclaus 	/* External CMOS clock input (optional - crystal can be used instead) */
1726*81de7b46SAntoniu Miclaus 	st->clkin = devm_clk_get_optional_enabled(dev, NULL);
1727*81de7b46SAntoniu Miclaus 	if (IS_ERR(st->clkin))
1728*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, PTR_ERR(st->clkin), "Failed to get and enable clkin");
1729*81de7b46SAntoniu Miclaus 
1730*81de7b46SAntoniu Miclaus 	ret = ade9000_setup_clkout(dev, st);
1731*81de7b46SAntoniu Miclaus 	if (ret)
1732*81de7b46SAntoniu Miclaus 		return ret;
1733*81de7b46SAntoniu Miclaus 
1734*81de7b46SAntoniu Miclaus 	indio_dev->name = "ade9000";
1735*81de7b46SAntoniu Miclaus 	indio_dev->info = &ade9000_info;
1736*81de7b46SAntoniu Miclaus 	indio_dev->modes = INDIO_DIRECT_MODE;
1737*81de7b46SAntoniu Miclaus 	indio_dev->setup_ops = &ade9000_buffer_ops;
1738*81de7b46SAntoniu Miclaus 
1739*81de7b46SAntoniu Miclaus 	ret = devm_regulator_get_enable(&spi->dev, "vdd");
1740*81de7b46SAntoniu Miclaus 	if (ret)
1741*81de7b46SAntoniu Miclaus 		return dev_err_probe(&spi->dev, ret,
1742*81de7b46SAntoniu Miclaus 				     "Failed to get and enable vdd regulator\n");
1743*81de7b46SAntoniu Miclaus 
1744*81de7b46SAntoniu Miclaus 	indio_dev->channels = ade9000_channels;
1745*81de7b46SAntoniu Miclaus 	indio_dev->num_channels = ARRAY_SIZE(ade9000_channels);
1746*81de7b46SAntoniu Miclaus 
1747*81de7b46SAntoniu Miclaus 	ret = devm_iio_kfifo_buffer_setup(dev, indio_dev,
1748*81de7b46SAntoniu Miclaus 					  &ade9000_buffer_ops);
1749*81de7b46SAntoniu Miclaus 	if (ret)
1750*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, ret, "Failed to setup IIO buffer");
1751*81de7b46SAntoniu Miclaus 
1752*81de7b46SAntoniu Miclaus 	ret = ade9000_reset(st);
1753*81de7b46SAntoniu Miclaus 	if (ret)
1754*81de7b46SAntoniu Miclaus 		return ret;
1755*81de7b46SAntoniu Miclaus 
1756*81de7b46SAntoniu Miclaus 	/* Configure reference selection if vref regulator is available */
1757*81de7b46SAntoniu Miclaus 	ret = devm_regulator_get_enable_optional(dev, "vref");
1758*81de7b46SAntoniu Miclaus 	if (ret != -ENODEV && ret >= 0) {
1759*81de7b46SAntoniu Miclaus 		ret = regmap_set_bits(st->regmap, ADE9000_REG_CONFIG1,
1760*81de7b46SAntoniu Miclaus 				      ADE9000_EXT_REF_MASK);
1761*81de7b46SAntoniu Miclaus 		if (ret)
1762*81de7b46SAntoniu Miclaus 			return ret;
1763*81de7b46SAntoniu Miclaus 	} else if (ret < 0 && ret != -ENODEV) {
1764*81de7b46SAntoniu Miclaus 		return dev_err_probe(dev, ret,
1765*81de7b46SAntoniu Miclaus 				     "Failed to get and enable vref regulator\n");
1766*81de7b46SAntoniu Miclaus 	}
1767*81de7b46SAntoniu Miclaus 
1768*81de7b46SAntoniu Miclaus 	ret = ade9000_setup(st);
1769*81de7b46SAntoniu Miclaus 	if (ret)
1770*81de7b46SAntoniu Miclaus 		return ret;
1771*81de7b46SAntoniu Miclaus 
1772*81de7b46SAntoniu Miclaus 	return devm_iio_device_register(dev, indio_dev);
1773*81de7b46SAntoniu Miclaus };
1774*81de7b46SAntoniu Miclaus 
1775*81de7b46SAntoniu Miclaus static const struct spi_device_id ade9000_id[] = {
1776*81de7b46SAntoniu Miclaus 	{ "ade9000", 0 },
1777*81de7b46SAntoniu Miclaus 	{ }
1778*81de7b46SAntoniu Miclaus };
1779*81de7b46SAntoniu Miclaus MODULE_DEVICE_TABLE(spi, ade9000_id);
1780*81de7b46SAntoniu Miclaus 
1781*81de7b46SAntoniu Miclaus static const struct of_device_id ade9000_of_match[] = {
1782*81de7b46SAntoniu Miclaus 	{ .compatible = "adi,ade9000" },
1783*81de7b46SAntoniu Miclaus 	{ }
1784*81de7b46SAntoniu Miclaus };
1785*81de7b46SAntoniu Miclaus MODULE_DEVICE_TABLE(of, ade9000_of_match);
1786*81de7b46SAntoniu Miclaus 
1787*81de7b46SAntoniu Miclaus static struct spi_driver ade9000_driver = {
1788*81de7b46SAntoniu Miclaus 	.driver = {
1789*81de7b46SAntoniu Miclaus 		.name = "ade9000",
1790*81de7b46SAntoniu Miclaus 		.of_match_table = ade9000_of_match,
1791*81de7b46SAntoniu Miclaus 	},
1792*81de7b46SAntoniu Miclaus 	.probe = ade9000_probe,
1793*81de7b46SAntoniu Miclaus 	.id_table = ade9000_id,
1794*81de7b46SAntoniu Miclaus };
1795*81de7b46SAntoniu Miclaus module_spi_driver(ade9000_driver);
1796*81de7b46SAntoniu Miclaus 
1797*81de7b46SAntoniu Miclaus MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");
1798*81de7b46SAntoniu Miclaus MODULE_DESCRIPTION("Analog Devices ADE9000");
1799*81de7b46SAntoniu Miclaus MODULE_LICENSE("GPL");
1800