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, ¤t_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