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