> On Mar 24, 2018, at 8:18 AM, Jonathan Cameron <ji...@kernel.org> wrote:
>
> On Mon, 19 Mar 2018 23:28:45 -0700
> John Syne <john3...@gmail.com> wrote:
>
>> Hi Jonathan,
>>
>> I broke out the {Direction}_{Type}_{Index}_{Modifier}_{Info_Mask} into
>> separate columns to make sure I understand your instructions. Good way to
>> check the results.
>>
>> Probably easier to copy and paste this table into a spreadsheet. Let me know
>> if there is anything I got wrong. Thank you again for all your help.
> Yeah, we need to shrink this if we do it again.
I’ll send an updated copy after this e-mail. Can you accept a spreadsheet
attachment or a CSV file?
>
> Can drop anything not related to ABI (so RW mask address etc and just have the
> register name and the bits around ABI.
Done
>
> Note I mentioned the altvoltage stuff in the previous email, so we need
> to think about whether that is useful to distinguish the instantaneous
> measurements from the multi cycle AC ones.
> Actually I think we are fine here as we explicitly describe all
> alt measurements as mav or rms which going to be handled in our
> new computedvalue description.
Yeah, I don’t see how anyone would use these registers, so I propose
we just drop them.
>
>
>>
>> Address Register IIO Attribute Device Tree or Code
>> Direction Type Index Modifier Info Mask R/W Bit
>> Length Bit Length During Communications Type Default Value
>> Description
>> 0x4380 AIGAIN in_current0_phaseA_scale in current
>> 0 phaseA scale R/W 24 32 ZPSE S 0x000000
>> Phase A current gain adjust.
>> 0x4381 AVGAIN in_voltage0_phaseA_scale in voltage
>> 0 phaseA scale R/W 24 32 ZPSE S 0x000000
>> Phase A voltage gain adjust.
>> 0x4382 BIGAIN in_current0_phaseB_scale in current
>> 0 phaseB scale R/W 24 32 ZPSE S 0x000000
>> Phase B current gain adjust.
>> 0x4383 BVGAIN in_voltage0_phaseB_scale in voltage
>> 0 phaseB scale R/W 24 32 ZPSE S 0x000000
>> Phase B voltage gain adjust.
>> 0x4384 CIGAIN in_current0_phaseC_scale in current
>> 0 phaseC scale R/W 24 32 ZPSE S 0x000000
>> Phase C current gain adjust.
>> 0x4385 CVGAIN in_voltage0_phaseC_scale in voltage
>> 0 phaseC scale R/W 24 32 ZPSE S 0x000000
>> Phase C voltage gain adjust.
>> 0x4386 NIGAIN in_current0_neutral_scale in current
>> 0 neutral scale R/W 24 32 ZPSE S 0x000000
>> Neutral current gain adjust (ADE7868 and ADE7878 only).
>> 0x4387 AIRMSOS in_current0_phaseA_rms_offset in current
>> 0 phaseA offset R/W 24 32 ZPSE S 0x000000
>> Phase A current rms offset.
>> 0x4388 AVRMSOS in_voltage0_phaseA_rms_offset in voltage
>> 0 phaseA offset R/W 24 32 ZPSE S 0x000000
>> Phase A voltage rms offset.
>> 0x4389 BIRMSOS in_current0_phaseB_rms_offset in current
>> 0 phaseB offset R/W 24 32 ZPSE S 0x000000
>> Phase B current rms offset.
>> 0x438A BVRMSOS in_voltage0_phaseB_rms_offset in voltage
>> 0 phaseB offset R/W 24 32 ZPSE S 0x000000
>> Phase B voltage rms offset.
>> 0x438B CIRMSOS in_current0_phaseC_rms_offset in current
>> 0 phaseC offset R/W 24 32 ZPSE S 0x000000
>> Phase C current rms offset.
>> 0x438C CVRMSOS in_voltage0_phaseC_rms_offset in voltage
>> 0 phaseC offset R/W 24 32 ZPSE S 0x000000
>> Phase C voltage rms offset.
>> 0x438D NIRMSOS in_current0_neutral_rms_offset in current
>> 0 neutral offset R/W 24 32 ZPSE S 0x000000
>> Neutral current rms offset (ADE7868 and ADE7878 only).
>> 0x438E AVAGAIN in_powerapparent0_phaseA_scale in
>> powerapparent 0 phaseA scale R/W 24 32 ZPSE S
>> 0x000000 Phase A apparent power gain adjust.
>> 0x438F BVAGAIN in_powerapparent0_phaseB_scale in
>> powerapparent 0 phaseB scale R/W 24 32 ZPSE S
>> 0x000000 Phase B apparent power gain adjust.
>> 0x4390 CVAGAIN in_powerapparent0_phaseC_scale in
>> powerapparent 0 phaseC scale R/W 24 32 ZPSE S
>> 0x000000 Phase C apparent power gain adjust.
>> 0x4391 AWGAIN in_power0_phaseA_scale in power 0
>> phaseA scale R/W 24 32 ZPSE S 0x000000 Phase A
>> total active power gain adjust.
>> 0x4392 AWATTOS in_power0_phaseA_offset in power 0
>> phaseA offset R/W 24 32 ZPSE S 0x000000 Phase A
>> total active power offset adjust.
>> 0x4393 BWGAIN in_power0_phaseB_scale in power 0
>> phaseB scale R/W 24 32 ZPSE S 0x000000 Phase B
>> total active power gain adjust.
>> 0x4394 BWATTOS in_power0_phaseB_offset in power 0
>> phaseB offset R/W 24 32 ZPSE S 0x000000 Phase B
>> total active power offset adjust.
>> 0x4395 CWGAIN in_power0_PhaseC_scale in power 0
>> phaseC scale R/W 24 32 ZPSE S 0x000000 Phase C
>> total active power gain adjust.
>> 0x4396 CWATTOS in_power0_phaseC_offset in power 0
>> phaseC offset R/W 24 32 ZPSE S 0x000000 Phase C
>> total active power offset adjust.
>> 0x4397 AVARGAIN in_powerreactive0_phaseA_scale in
>> powerreactive 0 phaseA scale R/W 24 32 ZPSE S
>> 0x000000 Phase A total reactive power gain adjust (ADE7858, ADE7868,
>> and ADE7878).
>> 0x4398 AVAROS in_powerreactive0_phaseA_offset in
>> powerreactive 0 phaseA offset R/W 24 32 ZPSE S
>> 0x000000 Phase A total reactive power offset adjust (ADE7858,
>> ADE7868, and ADE7878).
>> 0x4399 BVARGAIN in_powerreactive0_phaseB_scale in
>> powerreactive 0 phaseB scale R/W 24 32 ZPSE S
>> 0x000000 Phase B total reactive power gain adjust (ADE7858, ADE7868,
>> and ADE7878).
>> 0x439A BVAROS in_powerreactive0_phaseB_offset in
>> powerreactive 0 phaseB offset R/W 24 32 ZPSE S
>> 0x000000 Phase B total reactive power offset adjust (ADE7858,
>> ADE7868, and ADE7878).
>> 0x439B CVARGAIN in_powerreactive0_phaseC_scale in
>> powerreactive 0 phaseC scale R/W 24 32 ZPSE S
>> 0x000000 Phase C total reactive power gain adjust (ADE7858, ADE7868,
>> and ADE7878).
>> 0x439C CVAROS in_powerreactive0_phaseC_offset in
>> powerreactive 0 phaseC offset R/W 24 32 ZPSE S
>> 0x000000 Phase C total reactive power offset adjust (ADE7858,
>> ADE7868, and ADE7878).
>> 0x439D AFWGAIN in_power0_phaseA_fundamental_scale in
>> power 0 phaseA_fundamental scale R/W 24 32 ZPSE S
>> 0x000000 Phase A fundamental active power gain adjust. Location
>> reserved for ADE7854, ADE7858, and ADE7868.
> Hmm. Fundamental needs to be represented using a separate channel index
> and description of the frequency filters applied. That should map it
> a generic way.
How do I do this?
> I assume we will at some point have fundamental RMS?
>
>> 0x439E AFWATTOS in_power0_phaseA_fundamental_offset
>> in power 0 phaseA_fundamental offset R/W 24 32
>> ZPSE S 0x000000 Phase A fundamental active power offset adjust.
>> Location reserved for ADE7854, ADE7858, and ADE7868.
>> 0x439F BFWGAIN in_power0_phaseB_fundamental_scale in
>> power 0 phaseB_fundamental scale R/W 24 32 ZPSE S
>> 0x000000 Phase B fundamental active power gain adjust (ADE7878
>> only).
>> 0x43A0 BFWATTOS in_power0_phaseB_fundamental_offset
>> in power 0 phaseB_fundamental offset R/W 24 32
>> ZPSE S 0x000000 Phase B fundamental active power offset adjust
>> (ADE7878 only).
>> 0x43A1 CFWGAIN in_power0_phaseC_fundamental_scale in
>> power 0 phaseC_fundamental scale R/W 24 32 ZPSE S
>> 0x000000 Phase C fundamental active power gain adjust.
>> 0x43A2 CFWATTOS in_power0_phaseC_fundamental_offset
>> in power 0 phaseC_fundamental offset R/W 24 32
>> ZPSE S 0x000000 Phase C fundamental active power offset adjust
>> (ADE7878 only).
>> 0x43A3 AFVARGAIN in_powerreactive0_phaseA_fundamental_scale
>> in powerreactive 0 phaseA_fundamental scale R/W
>> 24 32 ZPSE S 0x000000 Phase A fundamental reactive
>> power gain adjust (ADE7878 only).
>> 0x43A4 AFVAROS in_powerreactive0_phaseA_fundamental_offset
>> in powerreactive 0 phaseA_fundamental offset R/W 24
>> 32 ZPSE S 0x000000 Phase A fundamental reactive power offset
>> adjust (ADE7878 only).
>> 0x43A5 BFVARGAIN in_powerreactive0_phaseB_fundamental_scale
>> in powerreactive 0 phaseB_fundamental scale R/W
>> 24 32 ZPSE S 0x000000 Phase B fundamental reactive
>> power gain adjust (ADE7878 only).
>> 0x43A6 BFVAROS in_powerreactive0_phaseB_fundamental_offset
>> in powerreactive 0 phaseB_fundamental offset R/W 24
>> 32 ZPSE S 0x000000 Phase B fundamental reactive power offset
>> adjust (ADE7878 only).
>> 0x43A7 CFVARGAIN in_powerreactive0_phaseC_fundamental_scale
>> in powerreactive 0 phaseC_fundamental scale R/W
>> 24 32 ZPSE S 0x000000 Phase C fundamental reactive
>> power gain adjust (ADE7878 only).
>> 0x43A8 CFVAROS in_powerreactive0_phaseC_fundamental_offset
>> in powerreactive 0 phaseC_fundamental offset R/W 24
>> 32 ZPSE S 0x000000 Phase C fundamental reactive power offset
>> adjust (ADE7878 only).
>
> From further versions drop anything we aren't exposing to userspace. Makes
> this easier to read.
Done
>
>> 0x43A9 VATHR1 VATHR1 DT in
>> R/W 24 32 ZP U 0x000000 Most significant 24 bits of
>> VATHR[47:0] threshold used in phase apparent power datapath.
>> 0x43AA VATHR0 VATHR0 DT in
>> R/W 24 32 ZP U 0x000000 Less significant 24 bits of
>> VATHR[47:0] threshold used in phase apparent power datapath.
>> 0x43AB WTHR1 WTHR1 DT in
>> R/W 24 32 ZP U 0x000000 Most significant 24 bits of
>> WTHR[47:0] threshold used in phase total/fundamental active power datapath.
>> 0x43AC WTHR0 WTHR0 DT in
>> R/W 24 32 ZP U 0x000000 Less significant 24 bits of
>> WTHR[47:0] threshold used in phase total/fundamental active power datapath.
>> 0x43AD VARTHR1 VARTHR1 DT in
>> R/W 24 32 ZP U 0x000000 Most significant 24 bits of
>> VARTHR[47:0] threshold used in phase total/fundamental reactive power
>> datapath (ADE7858, ADE7868, and ADE7878).
>> 0x43AE VARTHR0 VARTHR0 DT in
>> R/W 24 32 ZP U 0x000000 Less significant 24 bits of
>> VARTHR[47:0] threshold used in phase total/fundamental reactive power
>> datapath (ADE7858, ADE7868, and ADE7878).
>> 0x43AF Reserved Reserved
>> N/A4 N/A4 N/A4 N/A4 0x000000 This memory
>> location should be kept at 0x000000 for proper operation.
>> 0x43B0 VANOLOAD VANOLOAD DT in
>> R/W 24 32 ZPSE S 0x0000000 No load
>> threshold in the apparent power datapath.
>> 0x43B1 APNOLOAD APNOLOAD DT in
>> R/W 24 32 ZPSE S 0x0000000 No load
>> threshold in the total/fundamental active power datapath.
>> 0x43B3 VLEVEL VLEVEL DT in
>> R/W 24 32 ZPSE S 0x000000 Register used in the
>> algorithm that computes the fundamental active and reactive powers (ADE7878
>> only).
>> 0x43B5 DICOEFF DICOEFF DT in
>> R/W 24 32 ZPSE S 0x0000000 Register used in the digital
>> integrator algorithm. If the integrator is turned on, it must be set at
>> 0xFF8000. In practice, it is transmitted as 0xFFF8000.
>> 0x43B6 HPFDIS HPFDIS DT in
>> R/W 24 32 ZP U 0x000000 Disables/enables the HPF in
>> the current datapath (see Table 34).
>> 0x43B8 ISUMLVL ISUMLVL in
>> R/W 24 32 ZPSE S 0x000000 Threshold used in comparison
>> between the sum of phase currents and the neutral current (ADE7868 and
>> ADE7878 only).
>> 0x43BF ISUM in_current0_phaseA&phaseB&phaseC_sum in
>> current 0 phaseA&phaseB&phaseC sum R 28 32 ZP S
>> N/A4 Sum of IAWV, IBWV, and ICWV registers (ADE7868 and ADE7878 only).
> Hehe, I'll get compaints about defining very long ABI again. Pah, it says
> what
> it does on the tin.
>
>> 0x43C0 AIRMS in_current0_phaseA_rms in current 0
>> phaseA_rms R 24 32 ZP S N/A4 Phase A
>> current rms value.
> in_current0_phaseA_rms_raw as otherwise we don't know we need to apply
> in_current0_phaseA_rms_scale to it (or the shared value that maps to that).
Yeah, this is still confusion to me. This should read
in_current0_phaseA_rms_gain
as it directly affects the value in_current0_phaseA_rms_raw. We still have to
apply
a scale value to turn this cryptic number into something meaningful.
>
>
>> 0x43C1 AVRMS in_voltage0_phaseA_rms in voltage 0
>> phaseA_rms R 24 32 ZP S N/A4 Phase A
>> voltage rms value.
>> 0x43C2 BIRMS in_current0_phaseB_rms in current 0
>> phaseB_rms R 24 32 ZP S N/A4 Phase B
>> current rms value.
>> 0x43C3 BVRMS in_voltage0_phaseB_rms in voltage 0
>> phaseB_rms R 24 32 ZP S N/A4 Phase B
>> voltage rms value.
>> 0x43C4 CIRMS in_current0_phaseC_rms in current 0
>> phaseC_rms R 24 32 ZP S N/A4 Phase C
>> current rms value.
>> 0x43C5 CVRMS in_voltage0_phaseC_rms in voltage 0
>> phaseC_rms R 24 32 ZP S N/A4 Phase C
>> voltage rms value.
>> 0x43C6 NIRMS in_current0_neutral_rms in current 0
>> neutral_rms R 24 32 ZP S N/A4 Neutral
>> current rms value (ADE7868 and ADE7878 only).
>> 0xE228 Run Code in
>> R/W 16 16 U 0x0000 Run register starts and stops the
>> DSP. See the Digital Signal Processor section for more details.
>> 0xE400 AWATTHR in_energy0_phaseA_raw in energy 0
>> phaseA raw R 32 32 S 0x00000000 Phase A
>> total active energy accumulation.
>> 0xE401 BWATTHR in_energy0_phaseB_raw in energy 0
>> phaseB raw R 32 32 S 0x00000000 Phase B
>> total active energy accumulation.
>> 0xE402 CWATTHR in_energy0_phaseC_raw in energy 0
>> phaseC raw R 32 32 S 0x00000000 Phase C
>> total active energy accumulation.
>> 0xE403 AFWATTHR in_energy0_phaseA_fundamental_raw
>> in energy 0 phaseA_fundamental raw R 32 32
>> S 0x00000000 Phase A fundamental active energy accumulation
>> (ADE7878 only).
>> 0xE404 BFWATTHR in_energy0_phaseB_fundamental_raw
>> in energy 0 phaseB_fundamental raw R 32 32
>> S 0x00000000 Phase B fundamental active energy accumulation
>> (ADE7878 only).
>> 0xE405 CFWATTHR in_energy0_phaseC_fundamental_raw
>> in energy 0 phaseC_fundamental raw R 32 32
>> S 0x00000000 Phase C fundamental active energy accumulation
>> (ADE7878 only).
>> 0xE406 AVARHR in_energyreactive0_phaseA_raw in
>> energyreactive 0 phaseA raw R 32 32 S
>> 0x00000000 Phase A total reactive energy accumulation (ADE7858,
>> ADE7868, and ADE7878 only).
>> 0xE407 BVARHR in_energyreactive0_phaseB_raw in
>> energyreactive 0 phaseB raw R 32 32 S
>> 0x00000000 Phase B total reactive energy accumulation (ADE7858,
>> ADE7868, and ADE7878 only).
>> 0xE408 CVARHR in_energyreactive0_phaseC_raw in
>> energyreactive 0 phaseC raw R 32 32 S
>> 0x00000000 Phase C total reactive energy accumulation (ADE7858,
>> ADE7868, and ADE7878 only).
>> 0xE409 AFVARHR in_energyreactive0_phaseA_fundamental_raw
>> in energyreactive 0 phaseA_fundamental raw R 32
>> 32 S 0x00000000 Phase A fundamental reactive energy
>> accumulation (ADE7878 only).
>> 0xE40A BFVARHR in_energyreactive0_phaseB_fundamental_raw
>> in energyreactive 0 phaseB_fundamental raw R 32
>> 32 S 0x00000000 Phase B fundamental reactive energy
>> accumulation (ADE7878 only).
>> 0xE40B CFVARHR in_energyreactive0_phaseC_fundamental_raw
>> in energyreactive 0 phaseC_fundamental raw R 32
>> 32 S 0x00000000 Phase C fundamental reactive energy
>> accumulation (ADE7878 only).
>> 0xE40C AVAHR in_energyapparent0_phaseA_raw in
>> energyapparent 0 phaseA raw R 32 32 S
>> 0x00000000 Phase A apparent energy accumulation.
>> 0xE40D BVAHR in_energyapparent0_phaseB_raw in
>> energyapparent 0 phaseB raw R 32 32 S
>> 0x00000000 Phase B apparent energy accumulation.
>> 0xE40E CVAHR in_energyapparent0_phaseC_raw in
>> energyapparent 0 phaseC raw R 32 32 S
>> 0x00000000 Phase C apparent energy accumulation.
>> 0xE500 IPEAK in_current0_peak in current 0
>> peak R 32 32 U N/A Current peak
>> register. See Figure 50 and Table 35 for details about its composition.
>> 0xE501 VPEAK in_voltage0_peak in voltage 0
>> peak R 32 32 U N/A Voltage peak
>> register. See Figure 50 and Table 36 for details about its composition.
>
>> 0xE502 STATUS0 mapped to events event in status 0
>> raw R/W 32 32 U N/A Interrupt Status
>> Register 0. See Table 37.
>> 0xE503 STATUS1 mapped to events event in status 1
>> raw R/W 32 32 U N/A Interrupt Status
>> Register 1. See Table 38.
>> 0xE504 AIMAV in_current0_phaseA_mav in current
>> phaseA_mav R 20 32 ZP U N/A Phase A
>> current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and
>> ADE7878 only).
> in_current0_phaseA_mav_raw
>
>> 0xE505 BIMAV in_current0_phaseB_mav in current
>> phaseB_mav R 20 32 ZP U N/A Phase B
>> current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and
>> ADE7878 only).
>> 0xE506 CIMAV in_current0_phaseC_mav in current
>> phaseC_mav R 20 32 ZP U N/A Phase C
>> current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and
>> ADE7878 only).
>> 0xE507 OILVL OILVL DT in
>> R/W 24 32 ZP U 0xFFFFFF Overcurrent threshold.
>> 0xE508 OVLVL OVLVL DT in
>> R/W 24 32 ZP U 0xFFFFFF Overvoltage threshold.
>> 0xE509 SAGLVL SAGLVL DT in
>> R/W 24 32 ZP U 0x000000 Voltage SAG level threshold.
>> 0xE50A MASK0 in_mask0_raw in mask 0
>> raw R/W 32 32 U 0x00000000 Interrupt Enable
>> Register 0. See Table 39.
>> 0xE50B MASK1 in_mask1_raw in mask 1
>> raw R/W 32 32 U 0x00000000 Interrupt Enable
>> Register 1. See Table 40.
>> 0xE50C IAWV in_current0_phaseA_instantaneous in
>> current phaseA instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase A current.
> As mentioned before. This is the 'expectation' for in_currentX
> So it is the other case we need to represent by describing filtering
> or using the altvoltage equivalent.
>
>> 0xE50D IBWV in_current0_phaseB_instantaneous in
>> current phaseB instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase B current.
>> 0xE50E ICWV in_current0_phaseC_instantaneous in
>> current phaseC instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase C current.
>> 0xE50F INWV in_current0_phaseN_instantaneous in
>> current neutral instantaneous R 24 32 SE S N/A
>> Instantaneous value of neutral current (ADE7868 and ADE7878 only).
>> 0xE510 VAWV in_voltage0_phaseA_instantaneous in
>> voltage phaseA instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase A voltage.
>> 0xE511 VBWV in_voltage0_phaseB_instantaneous in
>> voltage phaseB instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase B voltage.
>> 0xE512 VCWV in_voltage0_phaseC_instantaneous in
>> voltage phaseC instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase C voltage.
>> 0xE513 AWATT in_power0_phaseA_instantaneous in power
>> phaseA instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase A total active power.
>> 0xE514 BWATT in_power0_phaseB_instantaneous in power
>> phaseB instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase B total active power.
>> 0xE515 CWATT in_power0_phaseC_instantaneous in power
>> phaseC instantaneous R 24 32 SE S N/A
>> Instantaneous value of Phase C total active power.
>> 0xE516 AVAR in_powerreactive0_phaseA_instantaneous in
>> powerreactive phaseA instantaneous R 24 32 SE S
>> N/A Instantaneous value of Phase A total reactive power (ADE7858,
>> ADE7868, and ADE7878 only).
>> 0xE517 BVAR in_powerreactive0_phaseB_instantaneous in
>> powerreactive phaseB instantaneous R 24 32 SE S
>> N/A Instantaneous value of Phase B total reactive power (ADE7858,
>> ADE7868, and ADE7878 only).
>> 0xE518 CVAR in_powerreactive0_phaseC_instantaneous in
>> powerreactive phaseC instantaneous R 24 32 SE S
>> N/A Instantaneous value of Phase C total reactive power (ADE7858,
>> ADE7868, and ADE7878 only).
>> 0xE519 AVA in_powerapparent0_phaseA_instantaneous in
>> powerapparent phaseA instantaneous R 24 32 SE S
>> N/A Instantaneous value of Phase A apparent power.
>> 0xE51A BVA in_powerapparent0_phaseB_instantaneous in
>> powerapparent phaseB instantaneous R 24 32 SE S
>> N/A Instantaneous value of Phase B apparent power.
>> 0xE51B CVA in_powerappatent0_phaseC_instantaneous in
>> powerapparent phaseC instantaneous R 24 32 SE S
>> N/A Instantaneous value of Phase C apparent power.
>> 0xE51F CHECKSUM register_CHECKSUM Code in
>> R 32 32 U 0x33666787
>> Checksum verification. See the Checksum Register section for details.
>> 0xE520 VNOM in_voltage0_phase_rms_nominal in voltage
>> phase_rms nominal R/W 24 32 ZP S 0x000000
>> Nominal phase voltage rms used in the alternative computation of the
>> apparent power. When the VNOMxEN bit is set, the applied voltage input in
>> the corresponding phase is ignored and all corresponding rms voltage
>> instances are replaced by the value in the VNOM register.
> This one is an oddity. I'm not sure we want to expose it to userspace at all.
We could just move this to DT. Not sure if a user would need to set this from a
user space app.
>
>> 0xE600 PHSTATUS mapped to events event in
>> R 16 16 U N/A Phase peak
>> register. See Table 41.
>> 0xE601 ANGLE0 ANGLE0 DT in
>> R 16 16 U N/A Time Delay 0. See the Time Interval
>> Between Phases section for details.
>> 0xE602 ANGLE1 ANGLE1 DT in
>> R 16 16 U N/A Time Delay 1. See the Time Interval
>> Between Phases section for details.
>> 0xE603 ANGLE2 ANGLE2 DT in
>> R 16 16 U N/A Time Delay 2. See the Time Interval
>> Between Phases section for details.
>> 0xE604 to 0xE606 Reserved
>> These addresses
>> should not be written for proper operation.
>> 0xE607 PERIOD in_period_raw in period
>> raw R 16 16 U N/A Network line period.
>> 0xE608 PHNOLOAD mapped to events event in
>> R 16 16 U N/A Phase no
>> load register. See Table 42.
>> 0xE60C LINECYC in_count0_cycle in count 0 cycle
>> raw R/W 16 16 U 0xFFFF Line cycle accumulation mode
>> count.
>> 0xE60D ZXTOUT ZXTOUT DT in
>> R/W 16 16 U 0xFFFF Zero-crossing timeout count.
>> 0xE60E COMPMODE COMPMODE DT in
>> R/W 16 16 U 0x01FF Computation-mode
>> register. See Table 43.
>> 0xE60F Gain Gain DT in
>> R/W 16 16 U 0x0000 PGA gains at ADC inputs. See Table
>> 44.
>> 0xE610 CFMODE CFMODE DT in
>> R/W 16 16 U 0x0E88 CFx configuration register. See
>> Table 45.
>> 0xE611 CF1DEN CF1DEN DT in
>> R/W 16 16 U 0x0000 CF1 denominator.
>> 0xE612 CF2DEN CF2DEN DT in
>> R/W 16 16 U 0x0000 CF2 denominator.
>> 0xE613 CF3DEN CF3DEN DT in
>> R/W 16 16 U 0x0000 CF3 denominator.
>> 0xE614 APHCAL APHCAL DT in
>> R/W 10 16 ZP S 0x0000 Phase calibration of Phase A. See
>> Table 46.
>> 0xE615 BPHCAL BPHCAL DT in
>> R/W 10 16 ZP S 0x0000 Phase calibration of Phase B. See
>> Table 46.
>> 0xE616 CPHCAL CPHCAL DT in
>> R/W 10 16 ZP S 0x0000 Phase calibration of Phase C. See
>> Table 46.
>> 0xE617 PHSIGN PHSIGN DT in
>> R 16 16 U N/A Power sign register. See Table 47.
>> 0xE618 CONFIG CONFIG DT in
>> R/W 16 16 U 0x0000 ADE7878 configuration register. See
>> Table 48.
>> 0xE700 MMODE MMODE DT in
>> R/W 8 8 U 0x1C Measurement mode register. See Table
>> 49.
>> 0xE701 ACCMODE ACCMODE DT in
>> R/W 8 8 U 0x00 Accumulation mode register. See
>> Table 50.
>> 0xE702 LCYCMODE LCYCMODE DT in
>> R/W 8 8 U 0x78 Line accumulation
>> mode behavior. See Table 52.
>> 0xE703 PEAKCYC PEAKCYC DT in
>> R/W 8 8 U 0x00 Peak detection half line cycles.
>> 0xE704 SAGCYC SAGCYC DT in
>> R/W 8 8 U 0x00 SAG detection half line cycles.
>> 0xE705 CFCYC CFCYC DT in
>> R/W 8 8 U 0x01 Number of CF pulses between two
>> consecutive energy latches. See the Synchronizing Energy Registers with CFx
>> Outputs section.
>> 0xE706 HSDC_CFG HSDC_CFG DT in
>> R/W 8 8 U 0x00 HSDC configuration
>> register. See Table 53.
>> 0xE707 Version in_version_raw in version
>> raw R 8 8 U Version of die.
>> 0xEBFF Reserved DT in
>> 8 8 This address can be used in
>> manipulating the SS/HSA pin when SPI is chosen as the active port. See the
>> Serial Interfaces section for details.
>> 0xEC00 LPOILVL LPOILVL DT in
>> R/W 8 8 U 0x07 "Overcurrent threshold used during
>> PSM2 mode (ADE7868 and ADE7878 only). See Table 54 in which the register is
>> detailed.”
>> 0xEC01 CONFIG2 CONFIG2 DT in
>> R/W 8 8 U 0x00 Configuration register used during
>> PSM1 mode. See Table 55.
>
> So other than fundamental, instantaneous and the distinction between
> what would be considered DC measurements and AC ones (over several cycles)
> that all looks good to me ;)
>
> So in brief, I don't think we need instantaneous at all.
Agreed
>
> Fundamental should be done as a parallel channel (different index)
> with the filters described to make it fundamental only.
How do I do this. Is there a good implementation of this anywhere?
>
> So next step may be proposing the core changes to add the
> handling for computed values and change the events description
> to allow for events based on them. We do that with some
> examples added to the dummy driver (so anyone can play with it
> without hardware). After that we can start moving the
> driver over by adding the basic channels and then building
> up to support all the oddities (dropping the custom
> attributes as we go).
>
> It's a big job so fingers crossed.
>
> Thanks,
>
> Jonathan
>
>
>>
>> Regards,
>> John
>>
>>
>>
>>
>>
>>> On Mar 18, 2018, at 5:23 AM, Jonathan Cameron <ji...@kernel.org> wrote:
>>>
>>> On Sat, 17 Mar 2018 23:11:45 -0700
>>> John Syne <john3...@gmail.com> wrote:
>>>
>>>> Hi Jonathan,
>>> Hi John and All,
>>>
>>> I'd love to get some additional input on this from anyone interested.
>>> There are a lot of weird and wonderful derived quantities in an energy
>>> meter and it seems we need to make some fundamental changes to support
>>> them - including potentially a userspace breaking change to the event
>>> code description.
>>>
>>>>
>>>> Here is the complete list of registers for the ADE7878 which I copied from
>>>> the data sheet. I added a column “IIO Attribute” which I hope follows your
>>>> IIO ABI. Please make any changes you feel are incorrect. BTW, there are
>>>> several registers that cannot be generalized and are used purely for chip
>>>> configuration. I think we should add a new naming convention, namely
>>>> {register}_{<chip-register-name>}. Also, I see in the sys_bus_iio doc
>>>> in_accel_x_peak_raw
>>>>
>>>> so shouldn’t the phase be represented as follows:
>>>>
>>>> in_current_A_scale
>>> I'm still confused. What does A represent here? I assumed that was a wild
>>> card for the channel number before but clearly not.
>>>
>>> Ah, you are labelling the 3 separate phases as A, B and C. Hmm.
>>> I guess they sort of look like axis, and sort of like independent channels.
>>> So could be indexed or done via modifiers depending on how you look at it.
>>>
>>> Hmm. With neutral in there as well I guess we need to make them
>>> modifiers (but might change my mind later ;)
>>>
>>> Particularly as we are using the the modifier for RMS under the previous
>>> plan... It appears we should treat that instead like we did for peak
>>> and do it as an additional info mask element. The problem with doing that
>>> on a continuous measurement is that we can't treat it as a channel to
>>> be output through the buffered interface.
>>>
>>> So again we have run out of space. It's increasingly looking like we need
>>> room for another field in the events - to cleanly represent computed values.
>>>
>>> Hmm. What is the current usage? - it's been a while so I had to go
>>> look in the header.
>>>
>>> 0-15 Channel (lots of channels)
>>> 31-16 Channel 2 (36 modifiers - lots of channels)
>>> 47-32 Channel Type (31 used so far - this looks most likely to run out of
>>> space in the long run so leave this one alone).
>>> 54-48 Event Direction (4 used)
>>> 55 Differential (1: channel 2 as differential pair 0: as a modifier)
>>> 63-56 Event Type (6 used)
>>>
>>> So I think we can pinch bit 53 as another flag to indicate we have
>>> a computed value or possibly bit 63 as event types are few and
>>> far between as well.
>>>
>>> Probably reasonable to assume we never have 16 bits worth
>>> of channels and computed channels at the same time?
>>> Hence I think we can steal bits off the top of Channel.
>>> How many do we need? Not sure unfortunately but feels like
>>> 8 should be plenty.
>>>
>>> The other element of this is we add a new field to iio_chan_spec
>>> to contain 'derived_type' or something like that which has
>>> rms and sum squared etc. Over time we can move some of those
>>> from the modifiers and free up a few entires there.
>>> So modifier might be "X and Y and Z" with a derived_type of
>>> sum_squared to give existing sum_squared_x_y_z but no
>>> rush on that.
>>>
>>> Anyhow so now we have an extra element to play that will result
>>> in a different channel.
>>>
>>> Whilst here we should think about any other mods needed to
>>> that event structure. It is a little unfortunate that this
>>> will be a breaking change for any old userspace code playing
>>> with new drivers but it can't be helped as we didn't have
>>> reserved values in the original definition (oops).
>>>
>>> At somepoint we may need to add the 'shared by derived_value'
>>> info mask but I think we can ignore that for now (seems
>>> moderately unlikely to have anything in it!)
>>>>
>>>> But for now, I followed your instructions from your reply.
>>>>
>>>> After finalizing this one, I will work on the ADE9000, which as way more
>>>> registers ;-)
>>>>
>>>> Once we can agree on the register naming, I will update the ADE7854 driver
>>>> for Rodrigo, which will go a long way to getting it out of staging.
>>> I'll edit to fit with new scheme and insert indexes which I think would be
>>> preferred though optional under the ABI as we only have one of each type/
>>>>
>>>> Address Register IIO Attribute R/W Bit Length Bit
>>>> Length During Communications Type Default Value Description
>>>> 0x4380 AIGAIN in_current0_phaseA_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase A current gain adjust.
>>> A, B, C, N aren't obvious to the lay reader so I suggest we burn a few
>>> characters and stick phase in for ABC and just have neutral for
>>> the neutral one. Not sure about capitalization or not though.
>>>
>>>> 0x4381 AVGAIN in_voltage0_phaseA_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase A voltage gain adjust.
>>>> 0x4382 BIGAIN in_current0_phaseB_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase B current gain adjust.
>>>> 0x4383 BVGAIN in_voltage0_phaseB_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase B voltage gain adjust.
>>>> 0x4384 CIGAIN in_current0_phaseC_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase C current gain adjust.
>>>> 0x4385 CVGAIN in_voltage0_phaseC_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase C voltage gain adjust.
>>>> 0x4386 NIGAIN in_current0_neutral_scale R/W 24 32 ZPSE
>>>> S 0x000000 Neutral current gain adjust (ADE7868 and ADE7878
>>>> only).
>>>> 0x4387 AIRMSOS in_current0_phaseA_rms_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase A current rms offset.
>>>> 0x4388 AVRMSOS in_voltage0_phaseA_rms_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase A voltage rms offset.
>>>> 0x4389 BIRMSOS in_current0_phaseB_rms_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase B current rms offset.
>>>> 0x438A BVRMSOS in_voltage0_phaseB_rms_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase B voltage rms offset.
>>>> 0x438B CIRMSOS in_current0_phaseC_rms_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase C current rms offset.
>>>> 0x438C CVRMSOS in_voltage0_phaseC_rms_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase C voltage rms offset.
>>>> 0x438D NIRMSOS in_current0_neutral_rms_offset R/W 24 32 ZPSE
>>>> S 0x000000 Neutral current rms offset (ADE7868 and ADE7878
>>>> only).
>>>> 0x438E AVAGAIN in_powerapparent0_phaseA_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase A apparent power gain adjust.
>>>> 0x438F BVAGAIN in_powerapparent0_phaseB_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase B apparent power gain adjust.
>>>> 0x4390 CVAGAIN in_powerapparent0_phaseC_scale R/W 24 32 ZPSE
>>>> S 0x000000 Phase C apparent power gain adjust.
>>>> 0x4391 AWGAIN in_power0_phaseA_scale R/W 24 32 ZPSE S
>>>> 0x000000 Phase A total active power gain adjust.
>>>> 0x4392 AWATTOS in_power0_phaseA_offset R/W 24 32 ZPSE S
>>>> 0x000000 Phase A total active power offset adjust.
>>>> 0x4393 BWGAIN in_power0_phaseB_scale R/W 24 32 ZPSE S
>>>> 0x000000 Phase B total active power gain adjust.
>>>> 0x4394 BWATTOS in_power0_phaseB_offset R/W 24 32 ZPSE S
>>>> 0x000000 Phase B total active power offset adjust.
>>>> 0x4395 CWGAIN in_power0_PhaseC_scale R/W 24 32 ZPSE S
>>>> 0x000000 Phase C total active power gain adjust.
>>>> 0x4396 CWATTOS in_power0_phaseC_offset R/W 24 32 ZPSE S
>>>> 0x000000 Phase C total active power offset adjust.
>>>> 0x4397 AVARGAIN in_powerreactive0_phaseA_scale R/W 24
>>>> 32 ZPSE S 0x000000 Phase A total reactive power gain adjust
>>>> (ADE7858, ADE7868, and ADE7878).
>>>> 0x4398 AVAROS in_powerreactive0_phaseA_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase A total reactive power offset adjust
>>>> (ADE7858, ADE7868, and ADE7878).
>>>> 0x4399 BVARGAIN in_powerreactive0_phaseB_scale R/W 24
>>>> 32 ZPSE S 0x000000 Phase B total reactive power gain adjust
>>>> (ADE7858, ADE7868, and ADE7878).
>>>> 0x439A BVAROS in_powerreactive0_phaseB_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase B total reactive power offset adjust
>>>> (ADE7858, ADE7868, and ADE7878).
>>>> 0x439B CVARGAIN in_powerreactive0_phaseC_scale R/W 24
>>>> 32 ZPSE S 0x000000 Phase C total reactive power gain adjust
>>>> (ADE7858, ADE7868, and ADE7878).
>>>> 0x439C CVAROS in_powerreactive0_phaseC_offset R/W 24 32 ZPSE
>>>> S 0x000000 Phase C total reactive power offset adjust
>>>> (ADE7858, ADE7868, and ADE7878).
>>>> 0x439D AFWGAIN in_power0_phaseA_fundamental_scale R/W 24
>>>> 32 ZPSE S 0x000000 Phase A fundamental active power gain
>>>> adjust. Location reserved for ADE7854, ADE7858, and ADE7868.
>>> Hmm. fundamental is the oddity here. I here because it is sort of a
>>> derived value
>>> and sort of a filter applied. Can it be sensible combined with RMS?
>>> probably not but
>>> it can be combined with peak for example (which I'd also ideally move into
>>> the derived representation.).
>>>
>>>> 0x439E AFWATTOS in_power0_phaseA_fundamental_offset R/W
>>>> 24 32 ZPSE S 0x000000 Phase A fundamental active power
>>>> offset adjust. Location reserved for ADE7854, ADE7858, and ADE7868.
>>>> 0x439F BFWGAIN in_power0_phaseB_fundamental_scale R/W 24
>>>> 32 ZPSE S 0x000000 Phase B fundamental active power gain
>>>> adjust (ADE7878 only).
>>>> 0x43A0 BFWATTOS in_power0_phaseB_fundamental_offset R/W
>>>> 24 32 ZPSE S 0x000000 Phase B fundamental active power
>>>> offset adjust (ADE7878 only).
>>>> 0x43A1 CFWGAIN in_power0_phaseC_fundamental_scale R/W 24
>>>> 32 ZPSE S 0x000000 Phase C fundamental active power gain
>>>> adjust.
>>>> 0x43A2 CFWATTOS in_power0_phaseC_fundamental_offset R/W
>>>> 24 32 ZPSE S 0x000000 Phase C fundamental active power
>>>> offset adjust (ADE7878 only).
>>>> 0x43A3 AFVARGAIN in_powerreactive0_phaseA_fundamental_scale
>>>> R/W 24 32 ZPSE S 0x000000 Phase A fundamental
>>>> reactive power gain adjust (ADE7878 only).
>>>> 0x43A4 AFVAROS in_powerreactive0_phaseA_fundamental_offset R/W
>>>> 24 32 ZPSE S 0x000000 Phase A fundamental reactive power
>>>> offset adjust (ADE7878 only).
>>>> 0x43A5 BFVARGAIN in_powerreactive0_phaseB_fundamental_scale
>>>> R/W 24 32 ZPSE S 0x000000 Phase B fundamental
>>>> reactive power gain adjust (ADE7878 only).
>>>> 0x43A6 BFVAROS in_powerreactive0_phaseB_fundamental_offset R/W
>>>> 24 32 ZPSE S 0x000000 Phase B fundamental reactive power
>>>> offset adjust (ADE7878 only).
>>>> 0x43A7 CFVARGAIN in_powerreactive0_phaseC_fundamental_scale
>>>> R/W 24 32 ZPSE S 0x000000 Phase C fundamental
>>>> reactive power gain adjust (ADE7878 only).
>>>> 0x43A8 CFVAROS in_powerreactive0_phaseC_fundamental_offset R/W
>>>> 24 32 ZPSE S 0x000000 Phase C fundamental reactive power
>>>> offset adjust (ADE7878 only).
>>>> 0x43A9 VATHR1 regiister_VATHR1 R/W 24 32 ZP U
>>>> 0x000000 Most significant 24 bits of VATHR[47:0] threshold used in
>>>> phase apparent power datapath.
>>> Do not expose these to userspace. Why would it care?
>>>
>>>> 0x43AA VATHR0 register_VATHR0 R/W 24 32 ZP U
>>>> 0x000000 Less significant 24 bits of VATHR[47:0] threshold used in
>>>> phase apparent power datapath.
>>>> 0x43AB WTHR1 register_WTHR1 R/W 24 32 ZP U
>>>> 0x000000 Most significant 24 bits of WTHR[47:0] threshold used in
>>>> phase total/fundamental active power datapath.
>>>> 0x43AC WTHR0 register_WTHR0 R/W 24 32 ZP U
>>>> 0x000000 Less significant 24 bits of WTHR[47:0] threshold used in
>>>> phase total/fundamental active power datapath.
>>>> 0x43AD VARTHR1 register_VARTHR1 R/W 24 32 ZP U
>>>> 0x000000 Most significant 24 bits of VARTHR[47:0] threshold used in
>>>> phase total/fundamental reactive power datapath (ADE7858, ADE7868, and
>>>> ADE7878).
>>>> 0x43AE VARTHR0 register_VARTHR0 R/W 24 32 ZP U
>>>> 0x000000 Less significant 24 bits of VARTHR[47:0] threshold used in
>>>> phase total/fundamental reactive power datapath (ADE7858, ADE7868, and
>>>> ADE7878).
>>>> 0x43AF Reserved N/A4 N/A4 N/A4 N/A4
>>>> 0x000000 This memory location should be kept at 0x000000 for proper
>>>> operation.
>>>> 0x43B0 VANOLOAD register_VANOLOAD R/W 24 32 ZPSE
>>>> S 0x0000000 No load threshold in the apparent power datapath.
>>> This one is kind of an event parameter, but one that controls internal
>>> creep prevention.
>>> This will be a driver specific attr I think for now. We may add it to
>>> info_mask
>>> later if we get lots of meter drivers.
>>> Something like
>>> in_power0_no_load_thresh though I haven't really thought about it or looked
>>> for similar precedence.
>>>
>>>
>>>> 0x43B1 APNOLOAD register_APNOLOAD R/W 24 32 ZPSE
>>>> S 0x0000000 No load threshold in the total/fundamental active
>>>> power datapath.
>>> in_activepower0_no_load_thresh
>>>> 0x43B2 VARNOLOAD register_VARNOLOAD R/W 24 32 ZPSE
>>>> S 0x0000000 No load threshold in the total/fundamental
>>>> reactive power datapath. Location reserved for ADE7854.
>>> in_reactivpower0_no_load_thresh
>>>
>>>> 0x43B3 VLEVEL register_VLEVEL R/W 24 32 ZPSE S
>>>> 0x000000 Register used in the algorithm that computes the
>>>> fundamental active and reactive powers (ADE7878 only).
>>> This one looks like a characteristic of the circuit attached. So should be
>>> devicetree
>>> or similar and not exposed to userspace.
>>>
>>>> 0x43B5 DICOEFF register_DICOEFF R/W 24 32 ZPSE S
>>>> 0x0000000 Register used in the digital integrator algorithm. If the
>>>> integrator is turned on, it must be set at 0xFF8000. In practice, it is
>>>> transmitted as 0xFFF8000.
>>> no userspace interface.
>>>
>>>> 0x43B6 HPFDIS register_HPFDIS R/W 24 32 ZP U
>>>> 0x000000 Disables/enables the HPF in the current datapath (see
>>>> Table 34).
>>> We have controls for high pass filters, you'll need to map on to them.
>>> Disable is usually setting 3DB point to 0 IIRC.
>>>
>>>> 0x43B8 ISUMLVL register_ISUMLVL R/W 24 32 ZPSE S
>>>> 0x000000 Threshold used in comparison between the sum of phase
>>>> currents and the neutral current (ADE7868 and ADE7878 only).
>>> This is an event threshold so needs to map to the events infrastructure
>>> as best we can. It's actually a pain to describe so may be device specific
>>> ABI.
>>>
>>>> 0x43BF ISUM register_ISUM R 28 32 ZP S N/A4
>>>> Sum of IAWV, IBWV, and ICWV registers (ADE7868 and ADE7878 only).
>>> So this would be using a modifier for AandBandC phases (similar to the
>>> XandYanZ ones for mems devices and
>>> a derived value of sum I think So would look something like.
>>> in_current0_phaseA&phaseB&phaseC_sum and yet another channel
>>>
>>>> 0x43C0 AIRMS in_current0_phaseA_rms R 24 32 ZP S
>>>> N/A4 Phase A current rms value.
>>>> 0x43C1 AVRMS in_voltage0_phaseA_rms R 24 32 ZP S
>>>> N/A4 Phase A voltage rms value.
>>>> 0x43C2 BIRMS in_current0_phaseB_rms R 24 32 ZP S
>>>> N/A4 Phase B current rms value.
>>>> 0x43C3 BVRMS in_voltage0_phaseB_rms R 24 32 ZP S
>>>> N/A4 Phase B voltage rms value.
>>>> 0x43C4 CIRMS in_current0_phaseC_rms R 24 32 ZP S
>>>> N/A4 Phase C current rms value.
>>>> 0x43C5 CVRMS in_voltage0_phaseC_rms R 24 32 ZP S
>>>> N/A4 Phase C voltage rms value.
>>>> 0x43C6 NIRMS in_current0_neutral_rms R 24 32 ZP S
>>>> N/A4 Neutral current rms value (ADE7868 and ADE7878 only).
>>>> 0xE228 Run register_Run R/W 16 16 U 0x0000
>>>> Run register starts and stops the DSP. See the Digital Signal Processor
>>>> section for more details.
>>> Not exposed to userspace.
>>>
>>>> 0xE400 AWATTHR in_energy0_phaseA_raw R 32 32 S
>>>> 0x00000000 Phase A total active energy accumulation.
>>>> 0xE401 BWATTHR in_energy0_phaseB_raw R 32 32 S
>>>> 0x00000000 Phase B total active energy accumulation.
>>>> 0xE402 CWATTHR in_energy0_phaseC_raw R 32 32 S
>>>> 0x00000000 Phase C total active energy accumulation.
>>>> 0xE403 AFWATTHR in_energy0_phaseA_fundamental_raw R
>>>> 32 32 S 0x00000000 Phase A fundamental active energy
>>>> accumulation (ADE7878 only).
>>>> 0xE404 BFWATTHR in_energy0_phaseB_fundamental_raw R
>>>> 32 32 S 0x00000000 Phase B fundamental active energy
>>>> accumulation (ADE7878 only).
>>>> 0xE405 CFWATTHR in_energy0_phaseC_fundamental_raw R
>>>> 32 32 S 0x00000000 Phase C fundamental active energy
>>>> accumulation (ADE7878 only).
>>>> 0xE406 AVARHR in_energyreactive0_phaseA_raw R 32 32
>>>> S 0x00000000 Phase A total reactive energy accumulation
>>>> (ADE7858, ADE7868, and ADE7878 only).
>>>> 0xE407 BVARHR in_energyreactive0_phaseB_raw R 32 32
>>>> S 0x00000000 Phase B total reactive energy accumulation
>>>> (ADE7858, ADE7868, and ADE7878 only).
>>>> 0xE408 CVARHR in_energyreactive0_phaseC_raw R 32 32
>>>> S 0x00000000 Phase C total reactive energy accumulation
>>>> (ADE7858, ADE7868, and ADE7878 only).
>>>> 0xE409 AFVARHR in_energyreactive0_phaseA_fundamental_raw R
>>>> 32 32 S 0x00000000 Phase A fundamental reactive
>>>> energy accumulation (ADE7878 only).
>>>> 0xE40A BFVARHR in_energyreactive0_phaseB_fundamental_raw R
>>>> 32 32 S 0x00000000 Phase B fundamental reactive
>>>> energy accumulation (ADE7878 only).
>>>> 0xE40B CFVARHR in_energyreactive0_phaseC_fundamental_raw R
>>>> 32 32 S 0x00000000 Phase C fundamental reactive
>>>> energy accumulation (ADE7878 only).
>>>> 0xE40C AVAHR in_energyapparent0_phaseA_raw R 32 32
>>>> S 0x00000000 Phase A apparent energy accumulation.
>>>> 0xE40D BVAHR in_energyapparent0_phaseB_raw R 32 32
>>>> S 0x00000000 Phase B apparent energy accumulation.
>>>> 0xE40E CVAHR in_energyapparent0_phaseC_raw R 32 32
>>>> S 0x00000000 Phase C apparent energy accumulation.
>>>> 0xE500 IPEAK in_current0_peak R 32 32 U
>>>> N/A Current peak register. See Figure 50 and Table 35 for details
>>>> about its composition.
>>> Oh goody. I have no idea how we expose the which phase element of this
>>> cleanly. One option I suppose is to have in_current0_phaseA_peak etc
>>> and have all but the current peak return an error when read? It is a bit
>>> nasty but only so much we can do and keep with a consistent interface.
>>>
>>>> 0xE501 VPEAK in_voltage_peak R 32 32 U N/A
>>>> Voltage peak register. See Figure 50 and Table 36 for details about its
>>>> composition.
>>> Same as peak.
>>>
>>>> 0xE502 STATUS0 register_STATUS0 R/W 32 32 U
>>>> N/A Interrupt Status Register 0. See Table 37.
>>>> 0xE503 STATUS1 register_STATUS1 R/W 32 32 U
>>>> N/A Interrupt Status Register 1. See Table 38.
>>> No userspace interface except via events interface or error reports.
>>>
>>>> 0xE504 AIMAV in_currentA_mav R 20 32 ZP U N/A
>>>> Phase A current mean absolute value computed during PSM0 and PSM1 modes
>>>> (ADE7868 and ADE7878 only).
>>> Probably a longer name as mav is cryptic.
>>> in_current0_phaseA_meanabs_raw - it could have a scale and all sorts of fun.
>>> So I think this needs to be using the new derived infrastructure proposed
>>> here
>>> rather than being an info_mask element.
>>>
>>>> 0xE505 BIMAV in_currentB_mav R 20 32 ZP U N/A
>>>> Phase B current mean absolute value computed during PSM0 and PSM1 modes
>>>> (ADE7868 and ADE7878 only).
>>>> 0xE506 CIMAV in_currentC_mav R 20 32 ZP U N/A
>>>> Phase C current mean absolute value computed during PSM0 and PSM1 modes
>>>> (ADE7868 and ADE7878 only).
>>>> 0xE507 OILVL register_OILVL R/W 24 32 ZP U
>>>> 0xFFFFFF Overcurrent threshold.
>>>> 0xE508 OVLVL register_OVLVL R/W 24 32 ZP U
>>>> 0xFFFFFF Overvoltage threshold.
>>> These presumably result in interrupts? (I'm running out of time so not
>>> checking)
>>> In which case standard event interface should work.
>>>
>>>> 0xE509 SAGLVL register_SAGLVL R/W 24 32 ZP U
>>>> 0x000000 Voltage SAG level threshold.
>>> That's another event I think...
>>>
>>>> 0xE50A MASK0 register_MASK0 R/W 32 32 U
>>>> 0x00000000 Interrupt Enable Register 0. See Table 39.
>>>> 0xE50B MASK1 register_MASK1 R/W 32 32 U
>>>> 0x00000000 Interrupt Enable Register 1. See Table 40.
>>>
>>>> 0xE50C IAWV in_currentA_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase A current.
>>>> 0xE50D IBWV in_currentB_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase B current.
>>>> 0xE50E ICWV in_currentC_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase C current.
>>>> 0xE50F INWV in_currentN_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of neutral current (ADE7868 and
>>>> ADE7878 only).
>>>> 0xE510 VAWV in_voltageA_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase A voltage.
>>>> 0xE511 VBWV in_voltageB_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase B voltage.
>>>> 0xE512 VCWV in_voltageC_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase C voltage.
>>> OK, this is getting silly. I presume this means the values above are
>>> filtered and these
>>> aren't? If so you need to have channels for both and different filter
>>> values.
>>>
>>>> 0xE513 AWATT in_powerA_instantaneous R 24 32 SE S
>>>> N/A Instantaneous value of Phase A total active power.
>>>> 0xE514 BWATT in_powerB_instantaneous R 24 32 SE S
>>>> N/A Instantaneous value of Phase B total active power.
>>>> 0xE515 CWATT in_powerC_instantaneous R 24 32 SE S
>>>> N/A Instantaneous value of Phase C total active power.
>>>> 0xE516 AVAR in_powerreactiveA_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase A total reactive power
>>>> (ADE7858, ADE7868, and ADE7878 only).
>>>> 0xE517 BVAR in_powerreactiveB_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase B total reactive power
>>>> (ADE7858, ADE7868, and ADE7878 only).
>>>> 0xE518 CVAR in_powerreactiveC_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase C total reactive power
>>>> (ADE7858, ADE7868, and ADE7878 only).
>>>> 0xE519 AVA in_powerapparentA_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase A apparent power.
>>>> 0xE51A BVA in_powerapparentB_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase B apparent power.
>>>> 0xE51B CVA in_powerappatentC_instantaneous R 24 32 SE
>>>> S N/A Instantaneous value of Phase C apparent power.
>>> Same for all of these.
>>>
>>>> 0xE51F CHECKSUM register_CHECKSUM R 32 32
>>>> U 0x33666787 Checksum verification. See the Checksum Register
>>>> section for details.
>>> Not exposed to userspace.
>>>
>>>> 0xE520 VNOM in_voltage_rms_nominal R/W 24 32 ZP S
>>>> 0x000000 Nominal phase voltage rms used in the alternative
>>>> computation of the apparent power. When the VNOMxEN bit is set, the
>>>> applied voltage input in the corresponding phase is ignored and all
>>>> corresponding rms voltage instances are replaced by the value in the VNOM
>>>> register.
>>> Why would this be done? Sounds like something that is a circuit design time
>>> decision so a job for DT to me.
>>>
>>>> 0xE600 PHSTATUS in_current_phase_peak R 16 16
>>>> U N/A Phase peak register. See Table 41.
>>>> 0xE601 ANGLE0 register_ANGLE0 R 16 16 U N/A
>>>> Time Delay 0. See the Time Interval Between Phases section for details.
>>>> 0xE602 ANGLE1 register_ANGLE1 R 16 16 U N/A
>>>> Time Delay 1. See the Time Interval Between Phases section for details.
>>>> 0xE603 ANGLE2 register_ANGLE2 R 16 16 U N/A
>>>> Time Delay 2. See the Time Interval Between Phases section for details.
>>> Hmm. More fun. These are derived values between to phase measurements.
>>> The phase as a modifier falls down a bit here - if we had just treated
>>> them as channels we could have done this a differential angle channel.
>>> Right now I'm not sure how we do this, could do it as a derived values so
>>> something like
>>> in_angle0_phaseA&phaseB_diff_raw etc but that feels odd.
>>> This one needs more thought.
>>>
>>>> 0xE604 to 0xE606 Reserved
>>>> These addresses should not be written for proper operation.
>>>> 0xE607 PERIOD register_PERIOD R 16 16 U N/A
>>>> Network line period.
>>> Superficially this sounds like a channel free element so shared_by_all.
>>>
>>>> 0xE608 PHNOLOAD register_PHNOLOAD R 16 16
>>>> U N/A Phase no load register. See Table 42.
>>> Hmm. So this is kind of a set of events with but without I think an
>>> interrupt.
>>> Odd.
>>>
>>>> 0xE60C LINECYC register_LINECYC R/W 16 16 U
>>>> 0xFFFF Line cycle accumulation mode count.
>>> in_count0_raw probably though it's a bit of a stretch.
>>>
>>>> 0xE60D ZXTOUT register_ZXTOUT R/W 16 16 U 0xFFFF
>>>> Zero-crossing timeout count.
>>> This is going to be another top level one I think and device specific for
>>> now.
>>>
>>>> 0xE60E COMPMODE register_COMPMODE R/W 16 16
>>>> U 0x01FF Computation-mode register. See Table 43.
>>> If there is stuff to control in here it need breaking out.
>>>
>>>> 0xE60F Gain register_Gain R/W 16 16 U 0x0000
>>>> PGA gains at ADC inputs. See Table 44.
>>> Oh goody another scale value. Needs breaking up into separate controls.
>>> Do these directly effect the measured output voltage etc? If they do then
>>> I'm not sure how to separate the two gains, there ought to be a 'right'
>>> answer. If this is about matching to the circuit present then they
>>> should probably be coming from DT or simillar.
>>>
>>>
>>>> 0xE610 CFMODE register_CFMODE R/W 16 16 U 0x0E88
>>>> CFx configuration register. See Table 45.
>>>> 0xE611 CF1DEN register_CF1DEN R/W 16 16 U 0x0000
>>>> CF1 denominator.
>>>> 0xE612 CF2DEN register_CF2DEN R/W 16 16 U 0x0000
>>>> CF2 denominator.
>>>> 0xE613 CF3DEN register_CF3DEN R/W 16 16 U 0x0000
>>>> CF3 denominator.
>>> Are these things that should be in DT? Look very quickly like they are
>>> todo with other circuits nearby.
>>>
>>>> 0xE614 APHCAL register_APHCAL R/W 10 16 ZP S 0x0000
>>>> Phase calibration of Phase A. See Table 46.
>>>> 0xE615 BPHCAL register_BPHCAL R/W 10 16 ZP S 0x0000
>>>> Phase calibration of Phase B. See Table 46.
>>>> 0xE616 CPHCAL register__CPHCAL R/W 10 16 ZP S
>>>> 0x0000 Phase calibration of Phase C. See Table 46.
>>> I'm not actually sure how you would set these. Per circuit design?
>>>
>>>> 0xE617 PHSIGN register_PHSIGN R 16 16 U N/A
>>>> Power sign register. See Table 47.
>>>> 0xE618 CONFIG register_CONFIG R/W 16 16 U 0x0000
>>>> ADE7878 configuration register. See Table 48.
>>>> 0xE700 MMODE register__MMODE R/W 8 8 U 0x1C
>>>> Measurement mode register. See Table 49.
>>>> 0xE701 ACCMODE register__ACCMODE R/W 8 8 U
>>>> 0x00 Accumulation mode register. See Table 50.
>>>> 0xE702 LCYCMODE register_LCYCMODE R/W 8 8
>>>> U 0x78 Line accumulation mode behavior. See Table 52.
>>>> 0xE703 PEAKCYC register_PEAKCYC R/W 8 8 U
>>>> 0x00 Peak detection half line cycles.
>>>> 0xE704 SAGCYC register_SAGCYC R/W 8 8 U 0x00
>>>> SAG detection half line cycles.
>>> Some of these are event controls. Map them as such.
>>>
>>>> 0xE705 CFCYC register_CFCYC R/W 8 8 U 0x01
>>>> Number of CF pulses between two consecutive energy latches. See the
>>>> Synchronizing Energy Registers with CFx Outputs section.
>>>> 0xE706 HSDC_CFG register_HSDC_CFG R/W 8 8
>>>> U 0x00 HSDC configuration register. See Table 53.
>>>> 0xE707 Version register_Version R 8 8 U
>>>> Version of die.
>>>> 0xEBFF Reserved 8 8
>>>> This address can be used in manipulating the SS/HSA pin when SPI is chosen
>>>> as the active port. See the Serial Interfaces section for details.
>>>> 0xEC00 LPOILVL register_LPOILVL R/W 8 8 U
>>>> 0x07 "Overcurrent threshold used during PSM2 mode (ADE7868 and ADE7878
>>>> only). See Table 54 in which the register is detailed."
>>>> 0xEC01 CONFIG2 register_CONFIG2 R/W 8 8 U
>>>> 0x00 Configuration register used during PSM1 mode. See Table 55.
>>>
>>> As you can guess I was running out of stamina towards the end of that.
>>>
>>> I'm not totally sure of the answer I provided. It may take some more
>>> thought.
>>> Ideally some others will give input on this question.
>>>
>>> Jonathan
>>>>
>>>> Regards,
>>>> John
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>> On Mar 17, 2018, at 1:30 PM, Jonathan Cameron <ji...@kernel.org> wrote:
>>>>>
>>>>> On Wed, 14 Mar 2018 23:12:02 -0700
>>>>> John Syne <john3...@gmail.com> wrote:
>>>>>
>>>>>> Hi Jonathan,
>>>>>>
>>>>>> I have been looking at the IIO ABI docs and if I understand
>>>>>> correctly, the idea is to use consistent naming conventions? So for
>>>>>> example, looking at the ADE7854 datasheet, the naming matching the
>>>>>> ADE7854 registers would be as follows:
>>>>>
>>>>> Welcome to one of the big reasons no one tidied these drivers
>>>>> up originally. Still we have moved on somewhat since then
>>>>> so similar circumstances have come up in other types of sensor.
>>>>>
>>>>>>
>>>>>> {direction}_{type}_{index}_{modifier}_{info_mask}
>>>>>>
>>>>>> AIGAIN - In_current_a_gain
>>>>> Other than the fact that gain isn't an ABI element and that index
>>>>> doesn't have
>>>>> _ before it that is right.
>>>>> in_voltageA_scale
>>>>>
>>>>> That was a weird quirk a long time back which we should probably
>>>>> not have done (copied it from hwmon)
>>>>>
>>>>>> AVGAIN - in_voltage_a_gain
>>>>>> BIGAIN - in_current_b_gain
>>>>>> BVGAIN - in_voltage_b_gain
>>>>>> —
>>>>>> How do we represent the rms and offset
>>>>>> AIRMSOS - in_current_a_rmsoffset
>>>>>> AVRMSOS - in_voltage_a_rmsoffset
>>>>>
>>>>> Right now we can't unfortunately though this one is easier to fix.
>>>>> We already have modifiers for multi axis devices doing sum_squared
>>>>> so add one of those for root_mean_square - this one is well known
>>>>> enough that rms is fine in the string.
>>>>>
>>>>> It's a effectively a different channel be it one derived from a simple
>>>>> one. This is going to get tricky however as we would normally use
>>>>> modifier to specialise a channel type - thoughts on this below.
>>>>>
>>>>>> —
>>>>>> Here I don’t understand how to represent both the phase and the
>>>>>> active/reactive/apparent power components. Do we combine the phase and
>>>>>> quadrature part like this
>>>>>> AVAGAIN - in_power_a_gain /*
>>>>>> apparent power */
>>>>>> —
>>>>>> AWGAIN - in_power_ai_gain
>>>>>> /* active power */
>>>>> And that is the problem. How do we represent the various power types.
>>>>> Hmm. We could do it with modifiers but above we show that we have already
>>>>> used them.
>>>>>
>>>>> It would be easy enough to add yet another field to the channel spec to
>>>>> specify
>>>>> this but there is a problem - Events. The event format is already pretty
>>>>> full
>>>>> so where do we put this extra element if we need to define a channel
>>>>> separated
>>>>> only by it.
>>>>>
>>>>> One thought is we could instead define these as different top level
>>>>> IIO_CHAN_TYPES in a similar fashion to we do for relative humidity vs
>>>>> the proposed absolute humidity.
>>>>>
>>>>> in_powerreactiveA_scale
>>>>> in_poweractivceA_scale
>>>>> (or in_powerrealA_scale to match with what I got taught years ago?)
>>>>>
>>>>> I presume we keep in_powerA_scale etc for the apparent power and
>>>>> modify any docs to make that clear.
>>>>>
>>>>>> —
>>>>>> AVARGAIN - in_power_aq_gain /*
>>>>>> reactive power */
>>>>>> —
>>>>>> Now here it becomes more complicated. Not sure how this gets handled.
>>>>>> AFWATTOS - in_power_a_active/fundamental/offset
>>>>> Yeah, some of these are getting odd.
>>>>> If I read this correctly this is the active power estimate based on only
>>>>> the fundamental frequency - so no harmonics?
>>>>>
>>>>> Hmm. This then becomes a separate channel with additional properties
>>>>> specifying it is only the fundamental. This feels a bit like a filter
>>>>> be it an unusual one? Might just be necessary to add a _fundamental_only
>>>>> element on the end (would be info_mask if this is common enough to
>>>>> justify that rather than using the extended methods to define it.).
>>>>>
>>>>>
>>>>>> —
>>>>>> AWATTHR - in_energy_ai_accumulation
>>>>> Great, just when I thought we had gone far enough they define reactive
>>>>> energy which is presumably roughly the same as reactivepower * time?
>>>>> In that case we need types for that as well.
>>>>> in_energyreactiveA_*
>>>>> in_energyactiveA_*
>>>>>
>>>>>> —
>>>>>> AVARHR - in_energy_aq_accumulation
>>>>>> —
>>>>>> IPEAK - in_current_peak
>>>>> That one is easy as we have an info_mask element for peak and one
>>>>> for peak_scale that has always been a bit odd but was needed somewhere.
>>>>>
>>>>>> —
>>>>>>
>>>>>> I’ll leave it there, because there are some even more complicated
>>>>>> register naming issues.
>>>>> Something to look forward to. Gah, I always hated power engineering
>>>>> though I taught it very briefly (I really pity those students :(
>>>>>
>>>>> Jonathan
>>>>>
>>>>>>
>>>>>> Regards,
>>>>>> John
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> On Mar 10, 2018, at 7:10 AM, Jonathan Cameron <ji...@kernel.org> wrote:
>>>>>>>
>>>>>>> On Thu, 8 Mar 2018 21:37:33 -0300
>>>>>>> Rodrigo Siqueira <rodrigosiqueiram...@gmail.com> wrote:
>>>>>>>
>>>>>>>> On 03/07, Jonathan Cameron wrote:
>>>>>>>>> On Tue, 6 Mar 2018 21:43:47 -0300
>>>>>>>>> Rodrigo Siqueira <rodrigosiqueiram...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> The macro IIO_DEV_ATTR_CH_OFF is a wrapper for IIO_DEVICE_ATTR, with
>>>>>>>>>> a
>>>>>>>>>> tiny change in the name definition. This extra macro does not improve
>>>>>>>>>> the readability and also creates some checkpatch errors.
>>>>>>>>>>
>>>>>>>>>> This patch fixes the checkpatch.pl errors:
>>>>>>>>>>
>>>>>>>>>> staging/iio/meter/ade7753.c:391: ERROR: Use 4 digit octal (0777) not
>>>>>>>>>> decimal permissions
>>>>>>>>>> staging/iio/meter/ade7753.c:395: ERROR: Use 4 digit octal (0777) not
>>>>>>>>>> decimal permissions
>>>>>>>>>> staging/iio/meter/ade7759.c:331: ERROR: Use 4 digit octal (0777) not
>>>>>>>>>> decimal permissions
>>>>>>>>>> staging/iio/meter/ade7759.c:335: ERROR: Use 4 digit octal (0777) not
>>>>>>>>>> decimal permissions
>>>>>>>>>>
>>>>>>>>>> Signed-off-by: Rodrigo Siqueira <rodrigosiqueiram...@gmail.com>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hmm. I wondered a bit about this one. It's a correct patch in of
>>>>>>>>> itself but the interface in question doesn't even vaguely conform
>>>>>>>>> to any of defined IIO ABI. Anyhow, it's still and improvement so
>>>>>>>>> I'll take it.
>>>>>>>>
>>>>>>>> I am not sure if I understood the comment about the ABI. The meter
>>>>>>>> interface is wrong because it uses things like IIO_DEVICE_ATTR? It
>>>>>>>> should use iio_info together with *write_raw and *read_raw. Right? Is
>>>>>>>> it
>>>>>>>> the ABI problem that you refer?
>>>>>>> The ABI is about the userspace interface of IIO. It is defined
>>>>>>> in Documentation/ABI/testing/sysfs-bus-iio*
>>>>>>> So this documents the naming of sysfs attributes and (more or less)
>>>>>>> describes a consistent interface to userspace across lots of different
>>>>>>> types of devices.
>>>>>>>
>>>>>>> A lot of these older drivers in staging involve a good deal of ABI that
>>>>>>> was not reviewed or discussed. That is one of the biggest reasons we
>>>>>>> didn't take them out of staging in the first place.
>>>>>>>
>>>>>>> In order for generic userspace programs to have any idea what to do
>>>>>>> with these devices this all needs to be fixed.
>>>>>>>
>>>>>>> There may well be cases where we need to expand the existing ABI to
>>>>>>> cover new things. That's fine, but it has to be done with full
>>>>>>> review of the relevant documentation patches.
>>>>>>>
>>>>>>> Incidentally if you want an easy driver to work on moving out of staging
>>>>>>> then first thing to do is to compare what it shows to userspace with
>>>>>>> these
>>>>>>> docs. If it's totally different then you have a big job on your hands
>>>>>>> as often ABI can take a lot of discussion and a long time to establish
>>>>>>> a consensus.
>>>>>>>
>>>>>>> Jonathan
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> Thanks :)
>>>>>>>>
>>>>>>>>> Applied to the togreg branch of iio.git and pushed out as testing
>>>>>>>>> for the autobuilders to play with it.
>>>>>>>>>
>>>>>>>>> I also added the removal of the header define which is no
>>>>>>>>> longer used.
>>>>>>>>>
>>>>>>>>> Please note, following discussions with Michael, I am going to send
>>>>>>>>> an email announcing an intent to drop these meter drivers next
>>>>>>>>> cycle unless someone can provide testing for any attempt to
>>>>>>>>> move them out of staging. I'm still taking patches on the basis
>>>>>>>>> that 'might' happen - but I wouldn't focus on these until we
>>>>>>>>> have some certainty on whether they will be around long term!
>>>>>>>>>
>>>>>>>>> Jonathan
>>>>>>>>>
>>>>>>>>>> ---
>>>>>>>>>> drivers/staging/iio/meter/ade7753.c | 18 ++++++++++--------
>>>>>>>>>> drivers/staging/iio/meter/ade7759.c | 18 ++++++++++--------
>>>>>>>>>> 2 files changed, 20 insertions(+), 16 deletions(-)
>>>>>>>>>>
>>>>>>>>>> diff --git a/drivers/staging/iio/meter/ade7753.c
>>>>>>>>>> b/drivers/staging/iio/meter/ade7753.c
>>>>>>>>>> index c44eb577dc35..275e8dfff836 100644
>>>>>>>>>> --- a/drivers/staging/iio/meter/ade7753.c
>>>>>>>>>> +++ b/drivers/staging/iio/meter/ade7753.c
>>>>>>>>>> @@ -388,14 +388,16 @@ static IIO_DEV_ATTR_VPERIOD(0444,
>>>>>>>>>> ade7753_read_16bit,
>>>>>>>>>> NULL,
>>>>>>>>>> ADE7753_PERIOD);
>>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644,
>>>>>>>>>> - ade7753_read_8bit,
>>>>>>>>>> - ade7753_write_8bit,
>>>>>>>>>> - ADE7753_CH1OS);
>>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644,
>>>>>>>>>> - ade7753_read_8bit,
>>>>>>>>>> - ade7753_write_8bit,
>>>>>>>>>> - ADE7753_CH2OS);
>>>>>>>>>> +
>>>>>>>>>> +static IIO_DEVICE_ATTR(choff_1, 0644,
>>>>>>>>>> + ade7753_read_8bit,
>>>>>>>>>> + ade7753_write_8bit,
>>>>>>>>>> + ADE7753_CH1OS);
>>>>>>>>>> +
>>>>>>>>>> +static IIO_DEVICE_ATTR(choff_2, 0644,
>>>>>>>>>> + ade7753_read_8bit,
>>>>>>>>>> + ade7753_write_8bit,
>>>>>>>>>> + ADE7753_CH2OS);
>>>>>>>>>>
>>>>>>>>>> static int ade7753_set_irq(struct device *dev, bool enable)
>>>>>>>>>> {
>>>>>>>>>> diff --git a/drivers/staging/iio/meter/ade7759.c
>>>>>>>>>> b/drivers/staging/iio/meter/ade7759.c
>>>>>>>>>> index 1decb2b8afab..c078b770fa53 100644
>>>>>>>>>> --- a/drivers/staging/iio/meter/ade7759.c
>>>>>>>>>> +++ b/drivers/staging/iio/meter/ade7759.c
>>>>>>>>>> @@ -328,14 +328,16 @@ static IIO_DEV_ATTR_ACTIVE_POWER_GAIN(0644,
>>>>>>>>>> ade7759_read_16bit,
>>>>>>>>>> ade7759_write_16bit,
>>>>>>>>>> ADE7759_APGAIN);
>>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644,
>>>>>>>>>> - ade7759_read_8bit,
>>>>>>>>>> - ade7759_write_8bit,
>>>>>>>>>> - ADE7759_CH1OS);
>>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644,
>>>>>>>>>> - ade7759_read_8bit,
>>>>>>>>>> - ade7759_write_8bit,
>>>>>>>>>> - ADE7759_CH2OS);
>>>>>>>>>> +
>>>>>>>>>> +static IIO_DEVICE_ATTR(choff_1, 0644,
>>>>>>>>>> + ade7759_read_8bit,
>>>>>>>>>> + ade7759_write_8bit,
>>>>>>>>>> + ADE7759_CH1OS);
>>>>>>>>>> +
>>>>>>>>>> +static IIO_DEVICE_ATTR(choff_2, 0644,
>>>>>>>>>> + ade7759_read_8bit,
>>>>>>>>>> + ade7759_write_8bit,
>>>>>>>>>> + ADE7759_CH2OS);
>>>>>>>>>>
>>>>>>>>>> static int ade7759_set_irq(struct device *dev, bool enable)
>>>>>>>>>> {
>>>>>>>>>
>>>>>>>> --
>>>>>>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>>>>>>>> the body of a message to majord...@vger.kernel.org
>>>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> devel mailing list
>>>>>>> de...@linuxdriverproject.org
>>>>>>> http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
>>>>>>>