xref: /OK3568_Linux_fs/kernel/drivers/iio/adc/stm32-dfsdm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * This file is part of STM32 DFSDM driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
6*4882a593Smuzhiyun  * Author(s): Arnaud Pouliquen <arnaud.pouliquen@st.com>.
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef MDF_STM32_DFSDM__H
10*4882a593Smuzhiyun #define MDF_STM32_DFSDM__H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/bitfield.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun  * STM32 DFSDM - global register map
16*4882a593Smuzhiyun  * ________________________________________________________
17*4882a593Smuzhiyun  * | Offset |                 Registers block             |
18*4882a593Smuzhiyun  * --------------------------------------------------------
19*4882a593Smuzhiyun  * | 0x000  |      CHANNEL 0 + COMMON CHANNEL FIELDS      |
20*4882a593Smuzhiyun  * --------------------------------------------------------
21*4882a593Smuzhiyun  * | 0x020  |                CHANNEL 1                    |
22*4882a593Smuzhiyun  * --------------------------------------------------------
23*4882a593Smuzhiyun  * | ...    |                .....                        |
24*4882a593Smuzhiyun  * --------------------------------------------------------
25*4882a593Smuzhiyun  * | 0x0E0  |                CHANNEL 7                    |
26*4882a593Smuzhiyun  * --------------------------------------------------------
27*4882a593Smuzhiyun  * | 0x100  |      FILTER  0 + COMMON  FILTER FIELDs      |
28*4882a593Smuzhiyun  * --------------------------------------------------------
29*4882a593Smuzhiyun  * | 0x200  |                FILTER  1                    |
30*4882a593Smuzhiyun  * --------------------------------------------------------
31*4882a593Smuzhiyun  * | 0x300  |                FILTER  2                    |
32*4882a593Smuzhiyun  * --------------------------------------------------------
33*4882a593Smuzhiyun  * | 0x400  |                FILTER  3                    |
34*4882a593Smuzhiyun  * --------------------------------------------------------
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun  * Channels register definitions
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun #define DFSDM_CHCFGR1(y)  ((y) * 0x20 + 0x00)
41*4882a593Smuzhiyun #define DFSDM_CHCFGR2(y)  ((y) * 0x20 + 0x04)
42*4882a593Smuzhiyun #define DFSDM_AWSCDR(y)   ((y) * 0x20 + 0x08)
43*4882a593Smuzhiyun #define DFSDM_CHWDATR(y)  ((y) * 0x20 + 0x0C)
44*4882a593Smuzhiyun #define DFSDM_CHDATINR(y) ((y) * 0x20 + 0x10)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /* CHCFGR1: Channel configuration register 1 */
47*4882a593Smuzhiyun #define DFSDM_CHCFGR1_SITP_MASK     GENMASK(1, 0)
48*4882a593Smuzhiyun #define DFSDM_CHCFGR1_SITP(v)       FIELD_PREP(DFSDM_CHCFGR1_SITP_MASK, v)
49*4882a593Smuzhiyun #define DFSDM_CHCFGR1_SPICKSEL_MASK GENMASK(3, 2)
50*4882a593Smuzhiyun #define DFSDM_CHCFGR1_SPICKSEL(v)   FIELD_PREP(DFSDM_CHCFGR1_SPICKSEL_MASK, v)
51*4882a593Smuzhiyun #define DFSDM_CHCFGR1_SCDEN_MASK    BIT(5)
52*4882a593Smuzhiyun #define DFSDM_CHCFGR1_SCDEN(v)      FIELD_PREP(DFSDM_CHCFGR1_SCDEN_MASK, v)
53*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CKABEN_MASK   BIT(6)
54*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CKABEN(v)     FIELD_PREP(DFSDM_CHCFGR1_CKABEN_MASK, v)
55*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CHEN_MASK     BIT(7)
56*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CHEN(v)       FIELD_PREP(DFSDM_CHCFGR1_CHEN_MASK, v)
57*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CHINSEL_MASK  BIT(8)
58*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CHINSEL(v)    FIELD_PREP(DFSDM_CHCFGR1_CHINSEL_MASK, v)
59*4882a593Smuzhiyun #define DFSDM_CHCFGR1_DATMPX_MASK   GENMASK(13, 12)
60*4882a593Smuzhiyun #define DFSDM_CHCFGR1_DATMPX(v)     FIELD_PREP(DFSDM_CHCFGR1_DATMPX_MASK, v)
61*4882a593Smuzhiyun #define DFSDM_CHCFGR1_DATPACK_MASK  GENMASK(15, 14)
62*4882a593Smuzhiyun #define DFSDM_CHCFGR1_DATPACK(v)    FIELD_PREP(DFSDM_CHCFGR1_DATPACK_MASK, v)
63*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CKOUTDIV_MASK GENMASK(23, 16)
64*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CKOUTDIV(v)   FIELD_PREP(DFSDM_CHCFGR1_CKOUTDIV_MASK, v)
65*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CKOUTSRC_MASK BIT(30)
66*4882a593Smuzhiyun #define DFSDM_CHCFGR1_CKOUTSRC(v)   FIELD_PREP(DFSDM_CHCFGR1_CKOUTSRC_MASK, v)
67*4882a593Smuzhiyun #define DFSDM_CHCFGR1_DFSDMEN_MASK  BIT(31)
68*4882a593Smuzhiyun #define DFSDM_CHCFGR1_DFSDMEN(v)    FIELD_PREP(DFSDM_CHCFGR1_DFSDMEN_MASK, v)
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /* CHCFGR2: Channel configuration register 2 */
71*4882a593Smuzhiyun #define DFSDM_CHCFGR2_DTRBS_MASK    GENMASK(7, 3)
72*4882a593Smuzhiyun #define DFSDM_CHCFGR2_DTRBS(v)      FIELD_PREP(DFSDM_CHCFGR2_DTRBS_MASK, v)
73*4882a593Smuzhiyun #define DFSDM_CHCFGR2_OFFSET_MASK   GENMASK(31, 8)
74*4882a593Smuzhiyun #define DFSDM_CHCFGR2_OFFSET(v)     FIELD_PREP(DFSDM_CHCFGR2_OFFSET_MASK, v)
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /* AWSCDR: Channel analog watchdog and short circuit detector */
77*4882a593Smuzhiyun #define DFSDM_AWSCDR_SCDT_MASK    GENMASK(7, 0)
78*4882a593Smuzhiyun #define DFSDM_AWSCDR_SCDT(v)      FIELD_PREP(DFSDM_AWSCDR_SCDT_MASK, v)
79*4882a593Smuzhiyun #define DFSDM_AWSCDR_BKSCD_MASK   GENMASK(15, 12)
80*4882a593Smuzhiyun #define DFSDM_AWSCDR_BKSCD(v)	  FIELD_PREP(DFSDM_AWSCDR_BKSCD_MASK, v)
81*4882a593Smuzhiyun #define DFSDM_AWSCDR_AWFOSR_MASK  GENMASK(20, 16)
82*4882a593Smuzhiyun #define DFSDM_AWSCDR_AWFOSR(v)    FIELD_PREP(DFSDM_AWSCDR_AWFOSR_MASK, v)
83*4882a593Smuzhiyun #define DFSDM_AWSCDR_AWFORD_MASK  GENMASK(23, 22)
84*4882a593Smuzhiyun #define DFSDM_AWSCDR_AWFORD(v)    FIELD_PREP(DFSDM_AWSCDR_AWFORD_MASK, v)
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /*
87*4882a593Smuzhiyun  * Filters register definitions
88*4882a593Smuzhiyun  */
89*4882a593Smuzhiyun #define DFSDM_FILTER_BASE_ADR		0x100
90*4882a593Smuzhiyun #define DFSDM_FILTER_REG_MASK		0x7F
91*4882a593Smuzhiyun #define DFSDM_FILTER_X_BASE_ADR(x)	((x) * 0x80 + DFSDM_FILTER_BASE_ADR)
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun #define DFSDM_CR1(x)     (DFSDM_FILTER_X_BASE_ADR(x)  + 0x00)
94*4882a593Smuzhiyun #define DFSDM_CR2(x)     (DFSDM_FILTER_X_BASE_ADR(x)  + 0x04)
95*4882a593Smuzhiyun #define DFSDM_ISR(x)     (DFSDM_FILTER_X_BASE_ADR(x)  + 0x08)
96*4882a593Smuzhiyun #define DFSDM_ICR(x)     (DFSDM_FILTER_X_BASE_ADR(x)  + 0x0C)
97*4882a593Smuzhiyun #define DFSDM_JCHGR(x)   (DFSDM_FILTER_X_BASE_ADR(x)  + 0x10)
98*4882a593Smuzhiyun #define DFSDM_FCR(x)     (DFSDM_FILTER_X_BASE_ADR(x)  + 0x14)
99*4882a593Smuzhiyun #define DFSDM_JDATAR(x)  (DFSDM_FILTER_X_BASE_ADR(x)  + 0x18)
100*4882a593Smuzhiyun #define DFSDM_RDATAR(x)  (DFSDM_FILTER_X_BASE_ADR(x)  + 0x1C)
101*4882a593Smuzhiyun #define DFSDM_AWHTR(x)   (DFSDM_FILTER_X_BASE_ADR(x)  + 0x20)
102*4882a593Smuzhiyun #define DFSDM_AWLTR(x)   (DFSDM_FILTER_X_BASE_ADR(x)  + 0x24)
103*4882a593Smuzhiyun #define DFSDM_AWSR(x)    (DFSDM_FILTER_X_BASE_ADR(x)  + 0x28)
104*4882a593Smuzhiyun #define DFSDM_AWCFR(x)   (DFSDM_FILTER_X_BASE_ADR(x)  + 0x2C)
105*4882a593Smuzhiyun #define DFSDM_EXMAX(x)   (DFSDM_FILTER_X_BASE_ADR(x)  + 0x30)
106*4882a593Smuzhiyun #define DFSDM_EXMIN(x)   (DFSDM_FILTER_X_BASE_ADR(x)  + 0x34)
107*4882a593Smuzhiyun #define DFSDM_CNVTIMR(x) (DFSDM_FILTER_X_BASE_ADR(x)  + 0x38)
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /* CR1 Control register 1 */
110*4882a593Smuzhiyun #define DFSDM_CR1_DFEN_MASK	BIT(0)
111*4882a593Smuzhiyun #define DFSDM_CR1_DFEN(v)	FIELD_PREP(DFSDM_CR1_DFEN_MASK, v)
112*4882a593Smuzhiyun #define DFSDM_CR1_JSWSTART_MASK	BIT(1)
113*4882a593Smuzhiyun #define DFSDM_CR1_JSWSTART(v)	FIELD_PREP(DFSDM_CR1_JSWSTART_MASK, v)
114*4882a593Smuzhiyun #define DFSDM_CR1_JSYNC_MASK	BIT(3)
115*4882a593Smuzhiyun #define DFSDM_CR1_JSYNC(v)	FIELD_PREP(DFSDM_CR1_JSYNC_MASK, v)
116*4882a593Smuzhiyun #define DFSDM_CR1_JSCAN_MASK	BIT(4)
117*4882a593Smuzhiyun #define DFSDM_CR1_JSCAN(v)	FIELD_PREP(DFSDM_CR1_JSCAN_MASK, v)
118*4882a593Smuzhiyun #define DFSDM_CR1_JDMAEN_MASK	BIT(5)
119*4882a593Smuzhiyun #define DFSDM_CR1_JDMAEN(v)	FIELD_PREP(DFSDM_CR1_JDMAEN_MASK, v)
120*4882a593Smuzhiyun #define DFSDM_CR1_JEXTSEL_MASK	GENMASK(12, 8)
121*4882a593Smuzhiyun #define DFSDM_CR1_JEXTSEL(v)	FIELD_PREP(DFSDM_CR1_JEXTSEL_MASK, v)
122*4882a593Smuzhiyun #define DFSDM_CR1_JEXTEN_MASK	GENMASK(14, 13)
123*4882a593Smuzhiyun #define DFSDM_CR1_JEXTEN(v)	FIELD_PREP(DFSDM_CR1_JEXTEN_MASK, v)
124*4882a593Smuzhiyun #define DFSDM_CR1_RSWSTART_MASK	BIT(17)
125*4882a593Smuzhiyun #define DFSDM_CR1_RSWSTART(v)	FIELD_PREP(DFSDM_CR1_RSWSTART_MASK, v)
126*4882a593Smuzhiyun #define DFSDM_CR1_RCONT_MASK	BIT(18)
127*4882a593Smuzhiyun #define DFSDM_CR1_RCONT(v)	FIELD_PREP(DFSDM_CR1_RCONT_MASK, v)
128*4882a593Smuzhiyun #define DFSDM_CR1_RSYNC_MASK	BIT(19)
129*4882a593Smuzhiyun #define DFSDM_CR1_RSYNC(v)	FIELD_PREP(DFSDM_CR1_RSYNC_MASK, v)
130*4882a593Smuzhiyun #define DFSDM_CR1_RDMAEN_MASK	BIT(21)
131*4882a593Smuzhiyun #define DFSDM_CR1_RDMAEN(v)	FIELD_PREP(DFSDM_CR1_RDMAEN_MASK, v)
132*4882a593Smuzhiyun #define DFSDM_CR1_RCH_MASK	GENMASK(26, 24)
133*4882a593Smuzhiyun #define DFSDM_CR1_RCH(v)	FIELD_PREP(DFSDM_CR1_RCH_MASK, v)
134*4882a593Smuzhiyun #define DFSDM_CR1_FAST_MASK	BIT(29)
135*4882a593Smuzhiyun #define DFSDM_CR1_FAST(v)	FIELD_PREP(DFSDM_CR1_FAST_MASK, v)
136*4882a593Smuzhiyun #define DFSDM_CR1_AWFSEL_MASK	BIT(30)
137*4882a593Smuzhiyun #define DFSDM_CR1_AWFSEL(v)	FIELD_PREP(DFSDM_CR1_AWFSEL_MASK, v)
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun /* CR2: Control register 2 */
140*4882a593Smuzhiyun #define DFSDM_CR2_IE_MASK	GENMASK(6, 0)
141*4882a593Smuzhiyun #define DFSDM_CR2_IE(v)		FIELD_PREP(DFSDM_CR2_IE_MASK, v)
142*4882a593Smuzhiyun #define DFSDM_CR2_JEOCIE_MASK	BIT(0)
143*4882a593Smuzhiyun #define DFSDM_CR2_JEOCIE(v)	FIELD_PREP(DFSDM_CR2_JEOCIE_MASK, v)
144*4882a593Smuzhiyun #define DFSDM_CR2_REOCIE_MASK	BIT(1)
145*4882a593Smuzhiyun #define DFSDM_CR2_REOCIE(v)	FIELD_PREP(DFSDM_CR2_REOCIE_MASK, v)
146*4882a593Smuzhiyun #define DFSDM_CR2_JOVRIE_MASK	BIT(2)
147*4882a593Smuzhiyun #define DFSDM_CR2_JOVRIE(v)	FIELD_PREP(DFSDM_CR2_JOVRIE_MASK, v)
148*4882a593Smuzhiyun #define DFSDM_CR2_ROVRIE_MASK	BIT(3)
149*4882a593Smuzhiyun #define DFSDM_CR2_ROVRIE(v)	FIELD_PREP(DFSDM_CR2_ROVRIE_MASK, v)
150*4882a593Smuzhiyun #define DFSDM_CR2_AWDIE_MASK	BIT(4)
151*4882a593Smuzhiyun #define DFSDM_CR2_AWDIE(v)	FIELD_PREP(DFSDM_CR2_AWDIE_MASK, v)
152*4882a593Smuzhiyun #define DFSDM_CR2_SCDIE_MASK	BIT(5)
153*4882a593Smuzhiyun #define DFSDM_CR2_SCDIE(v)	FIELD_PREP(DFSDM_CR2_SCDIE_MASK, v)
154*4882a593Smuzhiyun #define DFSDM_CR2_CKABIE_MASK	BIT(6)
155*4882a593Smuzhiyun #define DFSDM_CR2_CKABIE(v)	FIELD_PREP(DFSDM_CR2_CKABIE_MASK, v)
156*4882a593Smuzhiyun #define DFSDM_CR2_EXCH_MASK	GENMASK(15, 8)
157*4882a593Smuzhiyun #define DFSDM_CR2_EXCH(v)	FIELD_PREP(DFSDM_CR2_EXCH_MASK, v)
158*4882a593Smuzhiyun #define DFSDM_CR2_AWDCH_MASK	GENMASK(23, 16)
159*4882a593Smuzhiyun #define DFSDM_CR2_AWDCH(v)	FIELD_PREP(DFSDM_CR2_AWDCH_MASK, v)
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /* ISR: Interrupt status register */
162*4882a593Smuzhiyun #define DFSDM_ISR_JEOCF_MASK	BIT(0)
163*4882a593Smuzhiyun #define DFSDM_ISR_JEOCF(v)	FIELD_PREP(DFSDM_ISR_JEOCF_MASK, v)
164*4882a593Smuzhiyun #define DFSDM_ISR_REOCF_MASK	BIT(1)
165*4882a593Smuzhiyun #define DFSDM_ISR_REOCF(v)	FIELD_PREP(DFSDM_ISR_REOCF_MASK, v)
166*4882a593Smuzhiyun #define DFSDM_ISR_JOVRF_MASK	BIT(2)
167*4882a593Smuzhiyun #define DFSDM_ISR_JOVRF(v)	FIELD_PREP(DFSDM_ISR_JOVRF_MASK, v)
168*4882a593Smuzhiyun #define DFSDM_ISR_ROVRF_MASK	BIT(3)
169*4882a593Smuzhiyun #define DFSDM_ISR_ROVRF(v)	FIELD_PREP(DFSDM_ISR_ROVRF_MASK, v)
170*4882a593Smuzhiyun #define DFSDM_ISR_AWDF_MASK	BIT(4)
171*4882a593Smuzhiyun #define DFSDM_ISR_AWDF(v)	FIELD_PREP(DFSDM_ISR_AWDF_MASK, v)
172*4882a593Smuzhiyun #define DFSDM_ISR_JCIP_MASK	BIT(13)
173*4882a593Smuzhiyun #define DFSDM_ISR_JCIP(v)	FIELD_PREP(DFSDM_ISR_JCIP_MASK, v)
174*4882a593Smuzhiyun #define DFSDM_ISR_RCIP_MASK	BIT(14)
175*4882a593Smuzhiyun #define DFSDM_ISR_RCIP(v)	FIELD_PREP(DFSDM_ISR_RCIP, v)
176*4882a593Smuzhiyun #define DFSDM_ISR_CKABF_MASK	GENMASK(23, 16)
177*4882a593Smuzhiyun #define DFSDM_ISR_CKABF(v)	FIELD_PREP(DFSDM_ISR_CKABF_MASK, v)
178*4882a593Smuzhiyun #define DFSDM_ISR_SCDF_MASK	GENMASK(31, 24)
179*4882a593Smuzhiyun #define DFSDM_ISR_SCDF(v)	FIELD_PREP(DFSDM_ISR_SCDF_MASK, v)
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /* ICR: Interrupt flag clear register */
182*4882a593Smuzhiyun #define DFSDM_ICR_CLRJOVRF_MASK	      BIT(2)
183*4882a593Smuzhiyun #define DFSDM_ICR_CLRJOVRF(v)	      FIELD_PREP(DFSDM_ICR_CLRJOVRF_MASK, v)
184*4882a593Smuzhiyun #define DFSDM_ICR_CLRROVRF_MASK	      BIT(3)
185*4882a593Smuzhiyun #define DFSDM_ICR_CLRROVRF(v)	      FIELD_PREP(DFSDM_ICR_CLRROVRF_MASK, v)
186*4882a593Smuzhiyun #define DFSDM_ICR_CLRCKABF_MASK	      GENMASK(23, 16)
187*4882a593Smuzhiyun #define DFSDM_ICR_CLRCKABF(v)	      FIELD_PREP(DFSDM_ICR_CLRCKABF_MASK, v)
188*4882a593Smuzhiyun #define DFSDM_ICR_CLRCKABF_CH_MASK(y) BIT(16 + (y))
189*4882a593Smuzhiyun #define DFSDM_ICR_CLRCKABF_CH(v, y)   \
190*4882a593Smuzhiyun 			   (((v) << (16 + (y))) & DFSDM_ICR_CLRCKABF_CH_MASK(y))
191*4882a593Smuzhiyun #define DFSDM_ICR_CLRSCDF_MASK	      GENMASK(31, 24)
192*4882a593Smuzhiyun #define DFSDM_ICR_CLRSCDF(v)	      FIELD_PREP(DFSDM_ICR_CLRSCDF_MASK, v)
193*4882a593Smuzhiyun #define DFSDM_ICR_CLRSCDF_CH_MASK(y)  BIT(24 + (y))
194*4882a593Smuzhiyun #define DFSDM_ICR_CLRSCDF_CH(v, y)    \
195*4882a593Smuzhiyun 			       (((v) << (24 + (y))) & DFSDM_ICR_CLRSCDF_MASK(y))
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun /* FCR: Filter control register */
198*4882a593Smuzhiyun #define DFSDM_FCR_IOSR_MASK	GENMASK(7, 0)
199*4882a593Smuzhiyun #define DFSDM_FCR_IOSR(v)	FIELD_PREP(DFSDM_FCR_IOSR_MASK, v)
200*4882a593Smuzhiyun #define DFSDM_FCR_FOSR_MASK	GENMASK(25, 16)
201*4882a593Smuzhiyun #define DFSDM_FCR_FOSR(v)	FIELD_PREP(DFSDM_FCR_FOSR_MASK, v)
202*4882a593Smuzhiyun #define DFSDM_FCR_FORD_MASK	GENMASK(31, 29)
203*4882a593Smuzhiyun #define DFSDM_FCR_FORD(v)	FIELD_PREP(DFSDM_FCR_FORD_MASK, v)
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun /* RDATAR: Filter data register for regular channel */
206*4882a593Smuzhiyun #define DFSDM_DATAR_CH_MASK	GENMASK(2, 0)
207*4882a593Smuzhiyun #define DFSDM_DATAR_DATA_OFFSET 8
208*4882a593Smuzhiyun #define DFSDM_DATAR_DATA_MASK	GENMASK(31, DFSDM_DATAR_DATA_OFFSET)
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun /* AWLTR: Filter analog watchdog low threshold register */
211*4882a593Smuzhiyun #define DFSDM_AWLTR_BKAWL_MASK	GENMASK(3, 0)
212*4882a593Smuzhiyun #define DFSDM_AWLTR_BKAWL(v)	FIELD_PREP(DFSDM_AWLTR_BKAWL_MASK, v)
213*4882a593Smuzhiyun #define DFSDM_AWLTR_AWLT_MASK	GENMASK(31, 8)
214*4882a593Smuzhiyun #define DFSDM_AWLTR_AWLT(v)	FIELD_PREP(DFSDM_AWLTR_AWLT_MASK, v)
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun /* AWHTR: Filter analog watchdog low threshold register */
217*4882a593Smuzhiyun #define DFSDM_AWHTR_BKAWH_MASK	GENMASK(3, 0)
218*4882a593Smuzhiyun #define DFSDM_AWHTR_BKAWH(v)	FIELD_PREP(DFSDM_AWHTR_BKAWH_MASK, v)
219*4882a593Smuzhiyun #define DFSDM_AWHTR_AWHT_MASK	GENMASK(31, 8)
220*4882a593Smuzhiyun #define DFSDM_AWHTR_AWHT(v)	FIELD_PREP(DFSDM_AWHTR_AWHT_MASK, v)
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun /* AWSR: Filter watchdog status register */
223*4882a593Smuzhiyun #define DFSDM_AWSR_AWLTF_MASK	GENMASK(7, 0)
224*4882a593Smuzhiyun #define DFSDM_AWSR_AWLTF(v)	FIELD_PREP(DFSDM_AWSR_AWLTF_MASK, v)
225*4882a593Smuzhiyun #define DFSDM_AWSR_AWHTF_MASK	GENMASK(15, 8)
226*4882a593Smuzhiyun #define DFSDM_AWSR_AWHTF(v)	FIELD_PREP(DFSDM_AWSR_AWHTF_MASK, v)
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun /* AWCFR: Filter watchdog status register */
229*4882a593Smuzhiyun #define DFSDM_AWCFR_AWLTF_MASK	GENMASK(7, 0)
230*4882a593Smuzhiyun #define DFSDM_AWCFR_AWLTF(v)	FIELD_PREP(DFSDM_AWCFR_AWLTF_MASK, v)
231*4882a593Smuzhiyun #define DFSDM_AWCFR_AWHTF_MASK	GENMASK(15, 8)
232*4882a593Smuzhiyun #define DFSDM_AWCFR_AWHTF(v)	FIELD_PREP(DFSDM_AWCFR_AWHTF_MASK, v)
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun /* DFSDM filter order  */
235*4882a593Smuzhiyun enum stm32_dfsdm_sinc_order {
236*4882a593Smuzhiyun 	DFSDM_FASTSINC_ORDER, /* FastSinc filter type */
237*4882a593Smuzhiyun 	DFSDM_SINC1_ORDER,    /* Sinc 1 filter type */
238*4882a593Smuzhiyun 	DFSDM_SINC2_ORDER,    /* Sinc 2 filter type */
239*4882a593Smuzhiyun 	DFSDM_SINC3_ORDER,    /* Sinc 3 filter type */
240*4882a593Smuzhiyun 	DFSDM_SINC4_ORDER,    /* Sinc 4 filter type (N.A. for watchdog) */
241*4882a593Smuzhiyun 	DFSDM_SINC5_ORDER,    /* Sinc 5 filter type (N.A. for watchdog) */
242*4882a593Smuzhiyun 	DFSDM_NB_SINC_ORDER,
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /**
246*4882a593Smuzhiyun  * struct stm32_dfsdm_filter_osr - DFSDM filter settings linked to oversampling
247*4882a593Smuzhiyun  * @iosr: integrator oversampling
248*4882a593Smuzhiyun  * @fosr: filter oversampling
249*4882a593Smuzhiyun  * @rshift: output sample right shift (hardware shift)
250*4882a593Smuzhiyun  * @lshift: output sample left shift (software shift)
251*4882a593Smuzhiyun  * @res: output sample resolution
252*4882a593Smuzhiyun  * @bits: output sample resolution in bits
253*4882a593Smuzhiyun  * @max: output sample maximum positive value
254*4882a593Smuzhiyun  */
255*4882a593Smuzhiyun struct stm32_dfsdm_filter_osr {
256*4882a593Smuzhiyun 	unsigned int iosr;
257*4882a593Smuzhiyun 	unsigned int fosr;
258*4882a593Smuzhiyun 	unsigned int rshift;
259*4882a593Smuzhiyun 	unsigned int lshift;
260*4882a593Smuzhiyun 	u64 res;
261*4882a593Smuzhiyun 	u32 bits;
262*4882a593Smuzhiyun 	s32 max;
263*4882a593Smuzhiyun };
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun /**
266*4882a593Smuzhiyun  * struct stm32_dfsdm_filter - structure relative to stm32 FDSDM filter
267*4882a593Smuzhiyun  * @ford: filter order
268*4882a593Smuzhiyun  * @flo: filter oversampling data table indexed by fast mode flag
269*4882a593Smuzhiyun  * @sync_mode: filter synchronized with filter 0
270*4882a593Smuzhiyun  * @fast: filter fast mode
271*4882a593Smuzhiyun  */
272*4882a593Smuzhiyun struct stm32_dfsdm_filter {
273*4882a593Smuzhiyun 	enum stm32_dfsdm_sinc_order ford;
274*4882a593Smuzhiyun 	struct stm32_dfsdm_filter_osr flo[2];
275*4882a593Smuzhiyun 	unsigned int sync_mode;
276*4882a593Smuzhiyun 	unsigned int fast;
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun /**
280*4882a593Smuzhiyun  * struct stm32_dfsdm_channel - structure relative to stm32 FDSDM channel
281*4882a593Smuzhiyun  * @id: id of the channel
282*4882a593Smuzhiyun  * @type: interface type linked to stm32_dfsdm_chan_type
283*4882a593Smuzhiyun  * @src: interface type linked to stm32_dfsdm_chan_src
284*4882a593Smuzhiyun  * @alt_si: alternative serial input interface
285*4882a593Smuzhiyun  */
286*4882a593Smuzhiyun struct stm32_dfsdm_channel {
287*4882a593Smuzhiyun 	unsigned int id;
288*4882a593Smuzhiyun 	unsigned int type;
289*4882a593Smuzhiyun 	unsigned int src;
290*4882a593Smuzhiyun 	unsigned int alt_si;
291*4882a593Smuzhiyun };
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun /**
294*4882a593Smuzhiyun  * struct stm32_dfsdm - stm32 FDSDM driver common data (for all instances)
295*4882a593Smuzhiyun  * @base:	control registers base cpu addr
296*4882a593Smuzhiyun  * @phys_base:	DFSDM IP register physical address
297*4882a593Smuzhiyun  * @regmap:	regmap for register read/write
298*4882a593Smuzhiyun  * @fl_list:	filter resources list
299*4882a593Smuzhiyun  * @num_fls:	number of filter resources available
300*4882a593Smuzhiyun  * @ch_list:	channel resources list
301*4882a593Smuzhiyun  * @num_chs:	number of channel resources available
302*4882a593Smuzhiyun  * @spi_master_freq: SPI clock out frequency
303*4882a593Smuzhiyun  */
304*4882a593Smuzhiyun struct stm32_dfsdm {
305*4882a593Smuzhiyun 	void __iomem	*base;
306*4882a593Smuzhiyun 	phys_addr_t	phys_base;
307*4882a593Smuzhiyun 	struct regmap *regmap;
308*4882a593Smuzhiyun 	struct stm32_dfsdm_filter *fl_list;
309*4882a593Smuzhiyun 	unsigned int num_fls;
310*4882a593Smuzhiyun 	struct stm32_dfsdm_channel *ch_list;
311*4882a593Smuzhiyun 	unsigned int num_chs;
312*4882a593Smuzhiyun 	unsigned int spi_master_freq;
313*4882a593Smuzhiyun };
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun /* DFSDM channel serial spi clock source */
316*4882a593Smuzhiyun enum stm32_dfsdm_spi_clk_src {
317*4882a593Smuzhiyun 	DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL,
318*4882a593Smuzhiyun 	DFSDM_CHANNEL_SPI_CLOCK_INTERNAL,
319*4882a593Smuzhiyun 	DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING,
320*4882a593Smuzhiyun 	DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING
321*4882a593Smuzhiyun };
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm);
324*4882a593Smuzhiyun int stm32_dfsdm_stop_dfsdm(struct stm32_dfsdm *dfsdm);
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun #endif
327