1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * linux/sound/arm/aaci.c - ARM PrimeCell AACI PL041 driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #ifndef AACI_H 8*4882a593Smuzhiyun #define AACI_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* 11*4882a593Smuzhiyun * Control and status register offsets 12*4882a593Smuzhiyun * P39. 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun #define AACI_CSCH1 0x000 15*4882a593Smuzhiyun #define AACI_CSCH2 0x014 16*4882a593Smuzhiyun #define AACI_CSCH3 0x028 17*4882a593Smuzhiyun #define AACI_CSCH4 0x03c 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define AACI_RXCR 0x000 /* 29 bits Control Rx FIFO */ 20*4882a593Smuzhiyun #define AACI_TXCR 0x004 /* 17 bits Control Tx FIFO */ 21*4882a593Smuzhiyun #define AACI_SR 0x008 /* 12 bits Status */ 22*4882a593Smuzhiyun #define AACI_ISR 0x00c /* 7 bits Int Status */ 23*4882a593Smuzhiyun #define AACI_IE 0x010 /* 7 bits Int Enable */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* 26*4882a593Smuzhiyun * Other registers 27*4882a593Smuzhiyun */ 28*4882a593Smuzhiyun #define AACI_SL1RX 0x050 29*4882a593Smuzhiyun #define AACI_SL1TX 0x054 30*4882a593Smuzhiyun #define AACI_SL2RX 0x058 31*4882a593Smuzhiyun #define AACI_SL2TX 0x05c 32*4882a593Smuzhiyun #define AACI_SL12RX 0x060 33*4882a593Smuzhiyun #define AACI_SL12TX 0x064 34*4882a593Smuzhiyun #define AACI_SLFR 0x068 /* slot flags */ 35*4882a593Smuzhiyun #define AACI_SLISTAT 0x06c /* slot interrupt status */ 36*4882a593Smuzhiyun #define AACI_SLIEN 0x070 /* slot interrupt enable */ 37*4882a593Smuzhiyun #define AACI_INTCLR 0x074 /* interrupt clear */ 38*4882a593Smuzhiyun #define AACI_MAINCR 0x078 /* main control */ 39*4882a593Smuzhiyun #define AACI_RESET 0x07c /* reset control */ 40*4882a593Smuzhiyun #define AACI_SYNC 0x080 /* sync control */ 41*4882a593Smuzhiyun #define AACI_ALLINTS 0x084 /* all fifo interrupt status */ 42*4882a593Smuzhiyun #define AACI_MAINFR 0x088 /* main flag register */ 43*4882a593Smuzhiyun #define AACI_DR1 0x090 /* data read/written fifo 1 */ 44*4882a593Smuzhiyun #define AACI_DR2 0x0b0 /* data read/written fifo 2 */ 45*4882a593Smuzhiyun #define AACI_DR3 0x0d0 /* data read/written fifo 3 */ 46*4882a593Smuzhiyun #define AACI_DR4 0x0f0 /* data read/written fifo 4 */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* 49*4882a593Smuzhiyun * TX/RX fifo control register (CR). P48 50*4882a593Smuzhiyun */ 51*4882a593Smuzhiyun #define CR_FEN (1 << 16) /* fifo enable */ 52*4882a593Smuzhiyun #define CR_COMPACT (1 << 15) /* compact mode */ 53*4882a593Smuzhiyun #define CR_SZ16 (0 << 13) /* 16 bits */ 54*4882a593Smuzhiyun #define CR_SZ18 (1 << 13) /* 18 bits */ 55*4882a593Smuzhiyun #define CR_SZ20 (2 << 13) /* 20 bits */ 56*4882a593Smuzhiyun #define CR_SZ12 (3 << 13) /* 12 bits */ 57*4882a593Smuzhiyun #define CR_SL12 (1 << 12) 58*4882a593Smuzhiyun #define CR_SL11 (1 << 11) 59*4882a593Smuzhiyun #define CR_SL10 (1 << 10) 60*4882a593Smuzhiyun #define CR_SL9 (1 << 9) 61*4882a593Smuzhiyun #define CR_SL8 (1 << 8) 62*4882a593Smuzhiyun #define CR_SL7 (1 << 7) 63*4882a593Smuzhiyun #define CR_SL6 (1 << 6) 64*4882a593Smuzhiyun #define CR_SL5 (1 << 5) 65*4882a593Smuzhiyun #define CR_SL4 (1 << 4) 66*4882a593Smuzhiyun #define CR_SL3 (1 << 3) 67*4882a593Smuzhiyun #define CR_SL2 (1 << 2) 68*4882a593Smuzhiyun #define CR_SL1 (1 << 1) 69*4882a593Smuzhiyun #define CR_EN (1 << 0) /* transmit enable */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* 72*4882a593Smuzhiyun * status register bits. P49 73*4882a593Smuzhiyun */ 74*4882a593Smuzhiyun #define SR_RXTOFE (1 << 11) /* rx timeout fifo empty */ 75*4882a593Smuzhiyun #define SR_TXTO (1 << 10) /* rx timeout fifo nonempty */ 76*4882a593Smuzhiyun #define SR_TXU (1 << 9) /* tx underrun */ 77*4882a593Smuzhiyun #define SR_RXO (1 << 8) /* rx overrun */ 78*4882a593Smuzhiyun #define SR_TXB (1 << 7) /* tx busy */ 79*4882a593Smuzhiyun #define SR_RXB (1 << 6) /* rx busy */ 80*4882a593Smuzhiyun #define SR_TXFF (1 << 5) /* tx fifo full */ 81*4882a593Smuzhiyun #define SR_RXFF (1 << 4) /* rx fifo full */ 82*4882a593Smuzhiyun #define SR_TXHE (1 << 3) /* tx fifo half empty */ 83*4882a593Smuzhiyun #define SR_RXHF (1 << 2) /* rx fifo half full */ 84*4882a593Smuzhiyun #define SR_TXFE (1 << 1) /* tx fifo empty */ 85*4882a593Smuzhiyun #define SR_RXFE (1 << 0) /* rx fifo empty */ 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* 88*4882a593Smuzhiyun * interrupt status register bits. 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun #define ISR_RXTOFEINTR (1 << 6) /* rx fifo empty */ 91*4882a593Smuzhiyun #define ISR_URINTR (1 << 5) /* tx underflow */ 92*4882a593Smuzhiyun #define ISR_ORINTR (1 << 4) /* rx overflow */ 93*4882a593Smuzhiyun #define ISR_RXINTR (1 << 3) /* rx fifo */ 94*4882a593Smuzhiyun #define ISR_TXINTR (1 << 2) /* tx fifo intr */ 95*4882a593Smuzhiyun #define ISR_RXTOINTR (1 << 1) /* tx timeout */ 96*4882a593Smuzhiyun #define ISR_TXCINTR (1 << 0) /* tx complete */ 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* 99*4882a593Smuzhiyun * interrupt enable register bits. 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun #define IE_RXTOIE (1 << 6) 102*4882a593Smuzhiyun #define IE_URIE (1 << 5) 103*4882a593Smuzhiyun #define IE_ORIE (1 << 4) 104*4882a593Smuzhiyun #define IE_RXIE (1 << 3) 105*4882a593Smuzhiyun #define IE_TXIE (1 << 2) 106*4882a593Smuzhiyun #define IE_RXTIE (1 << 1) 107*4882a593Smuzhiyun #define IE_TXCIE (1 << 0) 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* 110*4882a593Smuzhiyun * interrupt status. P51 111*4882a593Smuzhiyun */ 112*4882a593Smuzhiyun #define ISR_RXTOFE (1 << 6) /* rx timeout fifo empty */ 113*4882a593Smuzhiyun #define ISR_UR (1 << 5) /* tx fifo underrun */ 114*4882a593Smuzhiyun #define ISR_OR (1 << 4) /* rx fifo overrun */ 115*4882a593Smuzhiyun #define ISR_RX (1 << 3) /* rx interrupt status */ 116*4882a593Smuzhiyun #define ISR_TX (1 << 2) /* tx interrupt status */ 117*4882a593Smuzhiyun #define ISR_RXTO (1 << 1) /* rx timeout */ 118*4882a593Smuzhiyun #define ISR_TXC (1 << 0) /* tx complete */ 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* 121*4882a593Smuzhiyun * interrupt enable. P52 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun #define IE_RXTOFE (1 << 6) /* rx timeout fifo empty */ 124*4882a593Smuzhiyun #define IE_UR (1 << 5) /* tx fifo underrun */ 125*4882a593Smuzhiyun #define IE_OR (1 << 4) /* rx fifo overrun */ 126*4882a593Smuzhiyun #define IE_RX (1 << 3) /* rx interrupt status */ 127*4882a593Smuzhiyun #define IE_TX (1 << 2) /* tx interrupt status */ 128*4882a593Smuzhiyun #define IE_RXTO (1 << 1) /* rx timeout */ 129*4882a593Smuzhiyun #define IE_TXC (1 << 0) /* tx complete */ 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* 132*4882a593Smuzhiyun * slot flag register bits. P56 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun #define SLFR_RWIS (1 << 13) /* raw wake-up interrupt status */ 135*4882a593Smuzhiyun #define SLFR_RGPIOINTR (1 << 12) /* raw gpio interrupt */ 136*4882a593Smuzhiyun #define SLFR_12TXE (1 << 11) /* slot 12 tx empty */ 137*4882a593Smuzhiyun #define SLFR_12RXV (1 << 10) /* slot 12 rx valid */ 138*4882a593Smuzhiyun #define SLFR_2TXE (1 << 9) /* slot 2 tx empty */ 139*4882a593Smuzhiyun #define SLFR_2RXV (1 << 8) /* slot 2 rx valid */ 140*4882a593Smuzhiyun #define SLFR_1TXE (1 << 7) /* slot 1 tx empty */ 141*4882a593Smuzhiyun #define SLFR_1RXV (1 << 6) /* slot 1 rx valid */ 142*4882a593Smuzhiyun #define SLFR_12TXB (1 << 5) /* slot 12 tx busy */ 143*4882a593Smuzhiyun #define SLFR_12RXB (1 << 4) /* slot 12 rx busy */ 144*4882a593Smuzhiyun #define SLFR_2TXB (1 << 3) /* slot 2 tx busy */ 145*4882a593Smuzhiyun #define SLFR_2RXB (1 << 2) /* slot 2 rx busy */ 146*4882a593Smuzhiyun #define SLFR_1TXB (1 << 1) /* slot 1 tx busy */ 147*4882a593Smuzhiyun #define SLFR_1RXB (1 << 0) /* slot 1 rx busy */ 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* 150*4882a593Smuzhiyun * Interrupt clear register. 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun #define ICLR_RXTOFEC4 (1 << 12) 153*4882a593Smuzhiyun #define ICLR_RXTOFEC3 (1 << 11) 154*4882a593Smuzhiyun #define ICLR_RXTOFEC2 (1 << 10) 155*4882a593Smuzhiyun #define ICLR_RXTOFEC1 (1 << 9) 156*4882a593Smuzhiyun #define ICLR_TXUEC4 (1 << 8) 157*4882a593Smuzhiyun #define ICLR_TXUEC3 (1 << 7) 158*4882a593Smuzhiyun #define ICLR_TXUEC2 (1 << 6) 159*4882a593Smuzhiyun #define ICLR_TXUEC1 (1 << 5) 160*4882a593Smuzhiyun #define ICLR_RXOEC4 (1 << 4) 161*4882a593Smuzhiyun #define ICLR_RXOEC3 (1 << 3) 162*4882a593Smuzhiyun #define ICLR_RXOEC2 (1 << 2) 163*4882a593Smuzhiyun #define ICLR_RXOEC1 (1 << 1) 164*4882a593Smuzhiyun #define ICLR_WISC (1 << 0) 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* 167*4882a593Smuzhiyun * Main control register bits. P62 168*4882a593Smuzhiyun */ 169*4882a593Smuzhiyun #define MAINCR_SCRA(x) ((x) << 10) /* secondary codec reg access */ 170*4882a593Smuzhiyun #define MAINCR_DMAEN (1 << 9) /* dma enable */ 171*4882a593Smuzhiyun #define MAINCR_SL12TXEN (1 << 8) /* slot 12 transmit enable */ 172*4882a593Smuzhiyun #define MAINCR_SL12RXEN (1 << 7) /* slot 12 receive enable */ 173*4882a593Smuzhiyun #define MAINCR_SL2TXEN (1 << 6) /* slot 2 transmit enable */ 174*4882a593Smuzhiyun #define MAINCR_SL2RXEN (1 << 5) /* slot 2 receive enable */ 175*4882a593Smuzhiyun #define MAINCR_SL1TXEN (1 << 4) /* slot 1 transmit enable */ 176*4882a593Smuzhiyun #define MAINCR_SL1RXEN (1 << 3) /* slot 1 receive enable */ 177*4882a593Smuzhiyun #define MAINCR_LPM (1 << 2) /* low power mode */ 178*4882a593Smuzhiyun #define MAINCR_LOOPBK (1 << 1) /* loopback */ 179*4882a593Smuzhiyun #define MAINCR_IE (1 << 0) /* aaci interface enable */ 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* 182*4882a593Smuzhiyun * Reset register bits. P65 183*4882a593Smuzhiyun */ 184*4882a593Smuzhiyun #define RESET_NRST (1 << 0) 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* 187*4882a593Smuzhiyun * Sync register bits. P65 188*4882a593Smuzhiyun */ 189*4882a593Smuzhiyun #define SYNC_FORCE (1 << 0) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* 192*4882a593Smuzhiyun * Main flag register bits. P66 193*4882a593Smuzhiyun */ 194*4882a593Smuzhiyun #define MAINFR_TXB (1 << 1) /* transmit busy */ 195*4882a593Smuzhiyun #define MAINFR_RXB (1 << 0) /* receive busy */ 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun struct aaci_runtime { 200*4882a593Smuzhiyun void __iomem *base; 201*4882a593Smuzhiyun void __iomem *fifo; 202*4882a593Smuzhiyun spinlock_t lock; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct ac97_pcm *pcm; 205*4882a593Smuzhiyun int pcm_open; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun u32 cr; 208*4882a593Smuzhiyun struct snd_pcm_substream *substream; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun unsigned int period; /* byte size of a "period" */ 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* 213*4882a593Smuzhiyun * PIO support 214*4882a593Smuzhiyun */ 215*4882a593Smuzhiyun void *start; 216*4882a593Smuzhiyun void *end; 217*4882a593Smuzhiyun void *ptr; 218*4882a593Smuzhiyun int bytes; 219*4882a593Smuzhiyun unsigned int fifo_bytes; 220*4882a593Smuzhiyun }; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun struct aaci { 223*4882a593Smuzhiyun struct amba_device *dev; 224*4882a593Smuzhiyun struct snd_card *card; 225*4882a593Smuzhiyun void __iomem *base; 226*4882a593Smuzhiyun unsigned int fifo_depth; 227*4882a593Smuzhiyun unsigned int users; 228*4882a593Smuzhiyun struct mutex irq_lock; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun /* AC'97 */ 231*4882a593Smuzhiyun struct mutex ac97_sem; 232*4882a593Smuzhiyun struct snd_ac97_bus *ac97_bus; 233*4882a593Smuzhiyun struct snd_ac97 *ac97; 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun u32 maincr; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun struct aaci_runtime playback; 238*4882a593Smuzhiyun struct aaci_runtime capture; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun struct snd_pcm *pcm; 241*4882a593Smuzhiyun }; 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun #define ACSTREAM_FRONT 0 244*4882a593Smuzhiyun #define ACSTREAM_SURROUND 1 245*4882a593Smuzhiyun #define ACSTREAM_LFE 2 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun #endif 248