#ifndef HARDWARE_ADFEDA_H_
#define HARDWARE_ADFEDA_H_

typedef struct
{
	volatile unsigned dpk;
	volatile unsigned mxt;
	volatile unsigned encomp0;
	volatile unsigned outcomp0;
	volatile unsigned encomp1;
	volatile unsigned outcomp1;
	volatile unsigned adcfil;
	volatile unsigned adcmux;
	volatile unsigned chmxad00;
	volatile unsigned chmxad01;
	volatile unsigned chmxad10;
	volatile unsigned chmxad11;

	struct Agm
	{
		volatile unsigned mx;
		volatile unsigned r1;
		volatile unsigned r5;
		volatile unsigned c1;
		volatile unsigned c5;
		volatile unsigned sw;
		volatile unsigned oa11;
		volatile unsigned oa12;
		volatile unsigned oa21;
		volatile unsigned oa22;
		volatile unsigned oa31;
		volatile unsigned oa32;
		volatile unsigned oa41;
		volatile unsigned oa42;
		volatile unsigned camx;
		volatile unsigned ca1;
		volatile unsigned ca2;
		volatile unsigned ibgen;
		volatile unsigned clk;
	} agm0;
	struct Agm agm1;
	struct Agm agm2;
	struct Agm agm3;

	struct Adc
	{
		volatile unsigned ctrl;
		volatile unsigned data;
		volatile unsigned clk;
		volatile unsigned cfg;
	} adc0;
	struct Adc adc1;
	struct Adc adc2;
	struct Adc adc3;
	volatile unsigned radc;

	struct Dac
	{
		volatile unsigned data;
		volatile unsigned ctrl;
		volatile unsigned clk;
	} dac0;
	struct Dac dac1;
	struct Dac dac2;
	struct Dac dac3;
	struct Dac dac4;
	struct Dac dac5;

	volatile unsigned : 32;
	volatile unsigned : 32;
	volatile unsigned : 32;
	volatile unsigned : 32;
	volatile unsigned rfu;
} AdfedaRegs;

#define ADFEDA_DPK_DPK1OUT  (1U << 3)
#define ADFEDA_DPK_DPK1EN   (1U << 2)
#define ADFEDA_DPK_DPK0OUT  (1U << 1)
#define ADFEDA_DPK_DPK0EN   (1U << 0)

#define ADFEDA_MXT_CHMXT1(_x)   (((_x) & 0xF) << 9)
#define ADFEDA_MXT_ENMXT1       (1U << 8)
#define ADFEDA_MXT_CHMXT0(_x)   (((_x) & 0xF) << 1)
#define ADFEDA_MXT_ENMXT0       (1U << 0)

#define ADFEDA_ENCOMP_31    (1U << 5)
#define ADFEDA_ENCOMP_21    (1U << 4)
#define ADFEDA_ENCOMP_11    (1U << 3)
#define ADFEDA_ENCOMP_30    (1U << 2)
#define ADFEDA_ENCOMP_20    (1U << 1)
#define ADFEDA_ENCOMP_10    (1U << 0)

#define ADFEDA_OUTCOMP_31   (1U << 5)
#define ADFEDA_OUTCOMP_21   (1U << 4)
#define ADFEDA_OUTCOMP_11   (1U << 3)
#define ADFEDA_OUTCOMP_30   (1U << 2)
#define ADFEDA_OUTCOMP_20   (1U << 1)
#define ADFEDA_OUTCOMP_10   (1U << 0)

#define ADFEDA_ENCOMP0_310  ADFEDA_ENCOMP_31
#define ADFEDA_ENCOMP0_210  ADFEDA_ENCOMP_21
#define ADFEDA_ENCOMP0_110  ADFEDA_ENCOMP_11
#define ADFEDA_ENCOMP0_300  ADFEDA_ENCOMP_30
#define ADFEDA_ENCOMP0_200  ADFEDA_ENCOMP_20
#define ADFEDA_ENCOMP0_100  ADFEDA_ENCOMP_10

#define ADFEDA_OUTCOMP0_310 ADFEDA_OUTCOMP_31
#define ADFEDA_OUTCOMP0_210 ADFEDA_OUTCOMP_21
#define ADFEDA_OUTCOMP0_110 ADFEDA_OUTCOMP_11
#define ADFEDA_OUTCOMP0_300 ADFEDA_OUTCOMP_30
#define ADFEDA_OUTCOMP0_200 ADFEDA_OUTCOMP_20
#define ADFEDA_OUTCOMP0_100 ADFEDA_OUTCOMP_10

#define ADFEDA_ENCOMP1_311  ADFEDA_ENCOMP_31
#define ADFEDA_ENCOMP1_211  ADFEDA_ENCOMP_21
#define ADFEDA_ENCOMP1_111  ADFEDA_ENCOMP_11
#define ADFEDA_ENCOMP1_301  ADFEDA_ENCOMP_30
#define ADFEDA_ENCOMP1_201  ADFEDA_ENCOMP_20
#define ADFEDA_ENCOMP1_101  ADFEDA_ENCOMP_10

#define ADFEDA_OUTCOMP1_311 ADFEDA_OUTCOMP_31
#define ADFEDA_OUTCOMP1_211 ADFEDA_OUTCOMP_21
#define ADFEDA_OUTCOMP1_111 ADFEDA_OUTCOMP_11
#define ADFEDA_OUTCOMP1_301 ADFEDA_OUTCOMP_30
#define ADFEDA_OUTCOMP1_201 ADFEDA_OUTCOMP_20
#define ADFEDA_OUTCOMP1_101 ADFEDA_OUTCOMP_10

#define ADFEDA_ADCFIL(_x)   (1U << (_x))
#define ADFEDA_ADCFIL_3     ADFEDA_ADCFIL(3)
#define ADFEDA_ADCFIL_2     ADFEDA_ADCFIL(2)
#define ADFEDA_ADCFIL_1     ADFEDA_ADCFIL(1)
#define ADFEDA_ADCFIL_0     ADFEDA_ADCFIL(0)

#define ADFEDA_ADCMUX(_x)   (1U << (_x))
#define ADFEDA_ADCMUX_3     ADFEDA_ADCMUX(3)
#define ADFEDA_ADCMUX_2     ADFEDA_ADCMUX(2)
#define ADFEDA_ADCMUX_1     ADFEDA_ADCMUX(1)
#define ADFEDA_ADCMUX_0     ADFEDA_ADCMUX(0)

#define ADFEDA_AGM_MX_MX2CH(_x) (((_x) & 0xF) << 17)
#define ADFEDA_AGM_MX_MX2EN     (1U << 16)
#define ADFEDA_AGM_MX_MX1CH(_x) (((_x) & 0xF) << 11)
#define ADFEDA_AGM_MX_MX1EN     (1U << 0)

#define ADFEDA_AGM_R_VAL(_no, _val) (((_val) & 0x1F) << ((((_no) - 1) & 3) * 8 + 1))
#define ADFEDA_AGM_R_EN(_no)        (1U << (((_no) - 1) & 3))

#define ADFERDA_AGM_R1_R4VAL(_x)    ADFEDA_AGM_R_VAL(4, _x)
#define ADFERDA_AGM_R1_R4EN         ADFEDA_AGM_R_EN(4)
#define ADFERDA_AGM_R1_R3VAL(_x)    ADFEDA_AGM_R_VAL(3, _x)
#define ADFERDA_AGM_R1_R3EN         ADFEDA_AGM_R_EN(3)
#define ADFERDA_AGM_R1_R2VAL(_x)    ADFEDA_AGM_R_VAL(2, _x)
#define ADFERDA_AGM_R1_R2EN         ADFEDA_AGM_R_EN(2)
#define ADFERDA_AGM_R1_R1VAL(_x)    ADFEDA_AGM_R_VAL(1, _x)
#define ADFERDA_AGM_R1_R1EN         ADFEDA_AGM_R_EN(1)

#define ADFERDA_AGM_R5_R8VAL(_x)    ADFEDA_AGM_R_VAL(8, _x)
#define ADFERDA_AGM_R5_R8EN         ADFEDA_AGM_R_EN(8)
#define ADFERDA_AGM_R5_R7VAL(_x)    ADFEDA_AGM_R_VAL(7, _x)
#define ADFERDA_AGM_R5_R7EN         ADFEDA_AGM_R_EN(7)
#define ADFERDA_AGM_R5_R6VAL(_x)    ADFEDA_AGM_R_VAL(6, _x)
#define ADFERDA_AGM_R5_R6EN         ADFEDA_AGM_R_EN(6)
#define ADFERDA_AGM_R5_R5VAL(_x)    ADFEDA_AGM_R_VAL(5, _x)
#define ADFERDA_AGM_R5_R5EN         ADFEDA_AGM_R_EN(5)

#define ADFEDA_AGM_C_VAL(_no, _val)  ADFEDA_AGM_R_VAL(_no, _val)
#define ADFEDA_AGM_C_EN(_no)         ADFEDA_AGM_R_EN(_no)

#define ADFERDA_AGM_C1_C4VAL(_x)    ADFEDA_AGM_C_VAL(4, _x)
#define ADFERDA_AGM_C1_C4EN         ADFEDA_AGM_C_EN(4)
#define ADFERDA_AGM_C1_C3VAL(_x)    ADFEDA_AGM_C_VAL(3, _x)
#define ADFERDA_AGM_C1_C3EN         ADFEDA_AGM_C_EN(3)
#define ADFERDA_AGM_C1_C2VAL(_x)    ADFEDA_AGM_C_VAL(2, _x)
#define ADFERDA_AGM_C1_C2EN         ADFEDA_AGM_C_EN(2)
#define ADFERDA_AGM_C1_C1VAL(_x)    ADFEDA_AGM_C_VAL(1, _x)
#define ADFERDA_AGM_C1_C1EN         ADFEDA_AGM_C_EN(1)

#define ADFERDA_AGM_C5_C8VAL(_x)    ADFEDA_AGM_C_VAL(8, _x)
#define ADFERDA_AGM_C5_C8EN         ADFEDA_AGM_C_EN(8)
#define ADFERDA_AGM_C5_C7VAL(_x)    ADFEDA_AGM_C_VAL(7, _x)
#define ADFERDA_AGM_C5_C7EN         ADFEDA_AGM_C_EN(7)
#define ADFERDA_AGM_C5_C6VAL(_x)    ADFEDA_AGM_C_VAL(6, _x)
#define ADFERDA_AGM_C5_C6EN         ADFEDA_AGM_C_EN(6)
#define ADFERDA_AGM_C5_C5VAL(_x)    ADFEDA_AGM_C_VAL(5, _x)
#define ADFERDA_AGM_C5_C5EN         ADFEDA_AGM_C_EN(5)

#define ADFEDA_AGM_SW_TK2   (1U << 4)
#define ADFEDA_AGM_SW_TK1   (1U << 3)
#define ADFEDA_AGM_SW_OA3   (1U << 2)
#define ADFEDA_AGM_SW_OA2   (1U << 1)
#define ADFEDA_AGM_SW_OA1   (1U << 0)

#define ADFEDA_AGM_OA2_ENTOPA   (1U << 6)
#define ADFEDA_AGM_OA2_ENCOAC   (1U << 5)

#define ADFEDA_AGM_OA12_ENTOPA  ADFEDA_AGM_OA2_ENTOPA
#define ADFEDA_AGM_OA12_ENCOAC  ADFEDA_AGM_OA2_ENCOAC

#define ADFEDA_AGM_OA22_ENTOPA  ADFEDA_AGM_OA2_ENTOPA
#define ADFEDA_AGM_OA22_ENCOAC  ADFEDA_AGM_OA2_ENCOAC

#define ADFEDA_AGM_OA32_ENTOPA  ADFEDA_AGM_OA2_ENTOPA
#define ADFEDA_AGM_OA32_ENCOAC  ADFEDA_AGM_OA2_ENCOAC

#define ADFEDA_AGM_OA42_ENTOPA  ADFEDA_AGM_OA2_ENTOPA
#define ADFEDA_AGM_OA42_ENCOAC  ADFEDA_AGM_OA2_ENCOAC

#define ADFEDA_AGM_CAMX_MXC2_CH(_x) (((_x) & 0xF) << 17)
#define ADFEDA_AGM_CAMX_MXC2_EN     (1U << 16)
#define ADFEDA_AGM_CAMX_MXC1_CH(_x) (((_x) & 0xF) << 1)
#define ADFEDA_AGM_CAMX_MXC1_EN     (1U << 0)

#define ADFEDA_AGM_CA_NCA_EN        (1U << 26)
#define ADFEDA_AGM_CA_NCA_CG(_x)    (((_x) & 0x3FF) << 16)
#define ADFEDA_AGM_CA_PCA_EN        (1U << 10)
#define ADFEDA_AGM_CA_PCA_CG(_x)    (((_x) & 0x3FF) << 0)

#define ADFEDA_AGM_CA1_NCA1_EN      ADFEDA_AGM_CA_NCA_EN
#define ADFEDA_AGM_CA1_NCA1_CG(_x)  ADFEDA_AGM_CA_NCA_CG(_x)
#define ADFEDA_AGM_CA1_PCA1_EN      ADFEDA_AGM_CA_PCA_EN
#define ADFEDA_AGM_CA1_PCA1_CG(_x)  ADFEDA_AGM_CA_PCA_CG(_x)

#define ADFEDA_AGM_CA2_NCA2_EN      ADFEDA_AGM_CA_NCA_EN
#define ADFEDA_AGM_CA2_NCA2_CG(_x)  ADFEDA_AGM_CA_NCA_CG(_x)
#define ADFEDA_AGM_CA2_PCA2_EN      ADFEDA_AGM_CA_PCA_EN
#define ADFEDA_AGM_CA2_PCA2_CG(_x)  ADFEDA_AGM_CA_PCA_CG(_x)

#define ADFEDA_AGM_IBGEN_EN         (1U << 12)
#define ADFEDA_AGM_IBGEN_PR(_x)     (((_x) & 0xF) << 8)
#define ADFEDA_AGM_IBGEN_PB1(_x)    (((_x) & 0xF) << 4)
#define ADFEDA_AGM_IBGEN_PB0(_x)    (((_x) & 0xF) << 0)

#define ADFEDA_AGM_CLK_CLKEN        (1U << 11)
#define ADFEDA_AGM_CLK_CLKDIV(_x)   ((_x) & 0x3FF)

#define ADFEDA_ADC_CTRL_ADCREAD (1U << 2)
#define ADFEDA_ADC_CTRL_ENADC   (1U << 1)
#define ADFEDA_ADC_CTRL_STARTAD (1U << 0)

#define ADFEDA_ADC_CLK_CLKEN        (1U << 6)
#define ADFEDA_ADC_CLK_CLKDIV(_x)   ((_x) & 0x3F)

#define ADFEDA_ADC_RADC_RB11    (1U << 7)
#define ADFEDA_ADC_RADC_RA11    (1U << 6)
#define ADFEDA_ADC_RADC_RB10    (1U << 5)
#define ADFEDA_ADC_RADC_RA10    (1U << 4)
#define ADFEDA_ADC_RADC_RB01    (1U << 3)
#define ADFEDA_ADC_RADC_RA01    (1U << 2)
#define ADFEDA_ADC_RADC_RB00    (1U << 1)
#define ADFEDA_ADC_RADC_RA00    (1U << 0)

#define ADFEDA_DAC_HW_CTRL  (1U << 2)
#define ADFEDA_DAC_DACLOAD  (1U << 1)
#define ADFEDA_DAC_ENDAC    (1U << 0)

#endif /* HARDWARE_ADFEDA_H_ */
