1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __HD64570_H 3*4882a593Smuzhiyun #define __HD64570_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* SCA HD64570 register definitions - all addresses for mode 0 (8086 MPU) 6*4882a593Smuzhiyun and 1 (64180 MPU). For modes 2 and 3, XOR the address with 0x01. 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun Source: HD64570 SCA User's Manual 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* SCA Control Registers */ 14*4882a593Smuzhiyun #define LPR 0x00 /* Low Power */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* Wait controller registers */ 17*4882a593Smuzhiyun #define PABR0 0x02 /* Physical Address Boundary 0 */ 18*4882a593Smuzhiyun #define PABR1 0x03 /* Physical Address Boundary 1 */ 19*4882a593Smuzhiyun #define WCRL 0x04 /* Wait Control L */ 20*4882a593Smuzhiyun #define WCRM 0x05 /* Wait Control M */ 21*4882a593Smuzhiyun #define WCRH 0x06 /* Wait Control H */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define PCR 0x08 /* DMA Priority Control */ 24*4882a593Smuzhiyun #define DMER 0x09 /* DMA Master Enable */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* Interrupt registers */ 28*4882a593Smuzhiyun #define ISR0 0x10 /* Interrupt Status 0 */ 29*4882a593Smuzhiyun #define ISR1 0x11 /* Interrupt Status 1 */ 30*4882a593Smuzhiyun #define ISR2 0x12 /* Interrupt Status 2 */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define IER0 0x14 /* Interrupt Enable 0 */ 33*4882a593Smuzhiyun #define IER1 0x15 /* Interrupt Enable 1 */ 34*4882a593Smuzhiyun #define IER2 0x16 /* Interrupt Enable 2 */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define ITCR 0x18 /* Interrupt Control */ 37*4882a593Smuzhiyun #define IVR 0x1A /* Interrupt Vector */ 38*4882a593Smuzhiyun #define IMVR 0x1C /* Interrupt Modified Vector */ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* MSCI channel (port) 0 registers - offset 0x20 43*4882a593Smuzhiyun MSCI channel (port) 1 registers - offset 0x40 */ 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define MSCI0_OFFSET 0x20 46*4882a593Smuzhiyun #define MSCI1_OFFSET 0x40 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define TRBL 0x00 /* TX/RX buffer L */ 49*4882a593Smuzhiyun #define TRBH 0x01 /* TX/RX buffer H */ 50*4882a593Smuzhiyun #define ST0 0x02 /* Status 0 */ 51*4882a593Smuzhiyun #define ST1 0x03 /* Status 1 */ 52*4882a593Smuzhiyun #define ST2 0x04 /* Status 2 */ 53*4882a593Smuzhiyun #define ST3 0x05 /* Status 3 */ 54*4882a593Smuzhiyun #define FST 0x06 /* Frame Status */ 55*4882a593Smuzhiyun #define IE0 0x08 /* Interrupt Enable 0 */ 56*4882a593Smuzhiyun #define IE1 0x09 /* Interrupt Enable 1 */ 57*4882a593Smuzhiyun #define IE2 0x0A /* Interrupt Enable 2 */ 58*4882a593Smuzhiyun #define FIE 0x0B /* Frame Interrupt Enable */ 59*4882a593Smuzhiyun #define CMD 0x0C /* Command */ 60*4882a593Smuzhiyun #define MD0 0x0E /* Mode 0 */ 61*4882a593Smuzhiyun #define MD1 0x0F /* Mode 1 */ 62*4882a593Smuzhiyun #define MD2 0x10 /* Mode 2 */ 63*4882a593Smuzhiyun #define CTL 0x11 /* Control */ 64*4882a593Smuzhiyun #define SA0 0x12 /* Sync/Address 0 */ 65*4882a593Smuzhiyun #define SA1 0x13 /* Sync/Address 1 */ 66*4882a593Smuzhiyun #define IDL 0x14 /* Idle Pattern */ 67*4882a593Smuzhiyun #define TMC 0x15 /* Time Constant */ 68*4882a593Smuzhiyun #define RXS 0x16 /* RX Clock Source */ 69*4882a593Smuzhiyun #define TXS 0x17 /* TX Clock Source */ 70*4882a593Smuzhiyun #define TRC0 0x18 /* TX Ready Control 0 */ 71*4882a593Smuzhiyun #define TRC1 0x19 /* TX Ready Control 1 */ 72*4882a593Smuzhiyun #define RRC 0x1A /* RX Ready Control */ 73*4882a593Smuzhiyun #define CST0 0x1C /* Current Status 0 */ 74*4882a593Smuzhiyun #define CST1 0x1D /* Current Status 1 */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* Timer channel 0 (port 0 RX) registers - offset 0x60 78*4882a593Smuzhiyun Timer channel 1 (port 0 TX) registers - offset 0x68 79*4882a593Smuzhiyun Timer channel 2 (port 1 RX) registers - offset 0x70 80*4882a593Smuzhiyun Timer channel 3 (port 1 TX) registers - offset 0x78 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define TIMER0RX_OFFSET 0x60 84*4882a593Smuzhiyun #define TIMER0TX_OFFSET 0x68 85*4882a593Smuzhiyun #define TIMER1RX_OFFSET 0x70 86*4882a593Smuzhiyun #define TIMER1TX_OFFSET 0x78 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define TCNTL 0x00 /* Up-counter L */ 89*4882a593Smuzhiyun #define TCNTH 0x01 /* Up-counter H */ 90*4882a593Smuzhiyun #define TCONRL 0x02 /* Constant L */ 91*4882a593Smuzhiyun #define TCONRH 0x03 /* Constant H */ 92*4882a593Smuzhiyun #define TCSR 0x04 /* Control/Status */ 93*4882a593Smuzhiyun #define TEPR 0x05 /* Expand Prescale */ 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* DMA channel 0 (port 0 RX) registers - offset 0x80 98*4882a593Smuzhiyun DMA channel 1 (port 0 TX) registers - offset 0xA0 99*4882a593Smuzhiyun DMA channel 2 (port 1 RX) registers - offset 0xC0 100*4882a593Smuzhiyun DMA channel 3 (port 1 TX) registers - offset 0xE0 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define DMAC0RX_OFFSET 0x80 104*4882a593Smuzhiyun #define DMAC0TX_OFFSET 0xA0 105*4882a593Smuzhiyun #define DMAC1RX_OFFSET 0xC0 106*4882a593Smuzhiyun #define DMAC1TX_OFFSET 0xE0 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define BARL 0x00 /* Buffer Address L (chained block) */ 109*4882a593Smuzhiyun #define BARH 0x01 /* Buffer Address H (chained block) */ 110*4882a593Smuzhiyun #define BARB 0x02 /* Buffer Address B (chained block) */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define DARL 0x00 /* RX Destination Addr L (single block) */ 113*4882a593Smuzhiyun #define DARH 0x01 /* RX Destination Addr H (single block) */ 114*4882a593Smuzhiyun #define DARB 0x02 /* RX Destination Addr B (single block) */ 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define SARL 0x04 /* TX Source Address L (single block) */ 117*4882a593Smuzhiyun #define SARH 0x05 /* TX Source Address H (single block) */ 118*4882a593Smuzhiyun #define SARB 0x06 /* TX Source Address B (single block) */ 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define CPB 0x06 /* Chain Pointer Base (chained block) */ 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define CDAL 0x08 /* Current Descriptor Addr L (chained block) */ 123*4882a593Smuzhiyun #define CDAH 0x09 /* Current Descriptor Addr H (chained block) */ 124*4882a593Smuzhiyun #define EDAL 0x0A /* Error Descriptor Addr L (chained block) */ 125*4882a593Smuzhiyun #define EDAH 0x0B /* Error Descriptor Addr H (chained block) */ 126*4882a593Smuzhiyun #define BFLL 0x0C /* RX Receive Buffer Length L (chained block)*/ 127*4882a593Smuzhiyun #define BFLH 0x0D /* RX Receive Buffer Length H (chained block)*/ 128*4882a593Smuzhiyun #define BCRL 0x0E /* Byte Count L */ 129*4882a593Smuzhiyun #define BCRH 0x0F /* Byte Count H */ 130*4882a593Smuzhiyun #define DSR 0x10 /* DMA Status */ 131*4882a593Smuzhiyun #define DSR_RX(node) (DSR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) 132*4882a593Smuzhiyun #define DSR_TX(node) (DSR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) 133*4882a593Smuzhiyun #define DMR 0x11 /* DMA Mode */ 134*4882a593Smuzhiyun #define DMR_RX(node) (DMR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) 135*4882a593Smuzhiyun #define DMR_TX(node) (DMR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) 136*4882a593Smuzhiyun #define FCT 0x13 /* Frame End Interrupt Counter */ 137*4882a593Smuzhiyun #define FCT_RX(node) (FCT + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) 138*4882a593Smuzhiyun #define FCT_TX(node) (FCT + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) 139*4882a593Smuzhiyun #define DIR 0x14 /* DMA Interrupt Enable */ 140*4882a593Smuzhiyun #define DIR_RX(node) (DIR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) 141*4882a593Smuzhiyun #define DIR_TX(node) (DIR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) 142*4882a593Smuzhiyun #define DCR 0x15 /* DMA Command */ 143*4882a593Smuzhiyun #define DCR_RX(node) (DCR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) 144*4882a593Smuzhiyun #define DCR_TX(node) (DCR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* Descriptor Structure */ 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun typedef struct { 152*4882a593Smuzhiyun u16 cp; /* Chain Pointer */ 153*4882a593Smuzhiyun u32 bp; /* Buffer Pointer (24 bits) */ 154*4882a593Smuzhiyun u16 len; /* Data Length */ 155*4882a593Smuzhiyun u8 stat; /* Status */ 156*4882a593Smuzhiyun u8 unused; /* pads to 2-byte boundary */ 157*4882a593Smuzhiyun }__packed pkt_desc; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* Packet Descriptor Status bits */ 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun #define ST_TX_EOM 0x80 /* End of frame */ 163*4882a593Smuzhiyun #define ST_TX_EOT 0x01 /* End of transmission */ 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define ST_RX_EOM 0x80 /* End of frame */ 166*4882a593Smuzhiyun #define ST_RX_SHORT 0x40 /* Short frame */ 167*4882a593Smuzhiyun #define ST_RX_ABORT 0x20 /* Abort */ 168*4882a593Smuzhiyun #define ST_RX_RESBIT 0x10 /* Residual bit */ 169*4882a593Smuzhiyun #define ST_RX_OVERRUN 0x08 /* Overrun */ 170*4882a593Smuzhiyun #define ST_RX_CRC 0x04 /* CRC */ 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define ST_ERROR_MASK 0x7C 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #define DIR_EOTE 0x80 /* Transfer completed */ 175*4882a593Smuzhiyun #define DIR_EOME 0x40 /* Frame Transfer Completed (chained-block) */ 176*4882a593Smuzhiyun #define DIR_BOFE 0x20 /* Buffer Overflow/Underflow (chained-block)*/ 177*4882a593Smuzhiyun #define DIR_COFE 0x10 /* Counter Overflow (chained-block) */ 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #define DSR_EOT 0x80 /* Transfer completed */ 181*4882a593Smuzhiyun #define DSR_EOM 0x40 /* Frame Transfer Completed (chained-block) */ 182*4882a593Smuzhiyun #define DSR_BOF 0x20 /* Buffer Overflow/Underflow (chained-block)*/ 183*4882a593Smuzhiyun #define DSR_COF 0x10 /* Counter Overflow (chained-block) */ 184*4882a593Smuzhiyun #define DSR_DE 0x02 /* DMA Enable */ 185*4882a593Smuzhiyun #define DSR_DWE 0x01 /* DMA Write Disable */ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* DMA Master Enable Register (DMER) bits */ 188*4882a593Smuzhiyun #define DMER_DME 0x80 /* DMA Master Enable */ 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #define CMD_RESET 0x21 /* Reset Channel */ 192*4882a593Smuzhiyun #define CMD_TX_ENABLE 0x02 /* Start transmitter */ 193*4882a593Smuzhiyun #define CMD_RX_ENABLE 0x12 /* Start receiver */ 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define MD0_HDLC 0x80 /* Bit-sync HDLC mode */ 196*4882a593Smuzhiyun #define MD0_CRC_ENA 0x04 /* Enable CRC code calculation */ 197*4882a593Smuzhiyun #define MD0_CRC_CCITT 0x02 /* CCITT CRC instead of CRC-16 */ 198*4882a593Smuzhiyun #define MD0_CRC_PR1 0x01 /* Initial all-ones instead of all-zeros */ 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #define MD0_CRC_NONE 0x00 201*4882a593Smuzhiyun #define MD0_CRC_16_0 0x04 202*4882a593Smuzhiyun #define MD0_CRC_16 0x05 203*4882a593Smuzhiyun #define MD0_CRC_ITU_0 0x06 204*4882a593Smuzhiyun #define MD0_CRC_ITU 0x07 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun #define MD2_NRZ 0x00 207*4882a593Smuzhiyun #define MD2_NRZI 0x20 208*4882a593Smuzhiyun #define MD2_MANCHESTER 0x80 209*4882a593Smuzhiyun #define MD2_FM_MARK 0xA0 210*4882a593Smuzhiyun #define MD2_FM_SPACE 0xC0 211*4882a593Smuzhiyun #define MD2_LOOPBACK 0x03 /* Local data Loopback */ 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun #define CTL_NORTS 0x01 214*4882a593Smuzhiyun #define CTL_IDLE 0x10 /* Transmit an idle pattern */ 215*4882a593Smuzhiyun #define CTL_UDRNC 0x20 /* Idle after CRC or FCS+flag transmission */ 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun #define ST0_TXRDY 0x02 /* TX ready */ 218*4882a593Smuzhiyun #define ST0_RXRDY 0x01 /* RX ready */ 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #define ST1_UDRN 0x80 /* MSCI TX underrun */ 221*4882a593Smuzhiyun #define ST1_CDCD 0x04 /* DCD level changed */ 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun #define ST3_CTS 0x08 /* modem input - /CTS */ 224*4882a593Smuzhiyun #define ST3_DCD 0x04 /* modem input - /DCD */ 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define IE0_TXINT 0x80 /* TX INT MSCI interrupt enable */ 227*4882a593Smuzhiyun #define IE0_RXINTA 0x40 /* RX INT A MSCI interrupt enable */ 228*4882a593Smuzhiyun #define IE1_UDRN 0x80 /* TX underrun MSCI interrupt enable */ 229*4882a593Smuzhiyun #define IE1_CDCD 0x04 /* DCD level changed */ 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun #define DCR_ABORT 0x01 /* Software abort command */ 232*4882a593Smuzhiyun #define DCR_CLEAR_EOF 0x02 /* Clear EOF interrupt */ 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* TX and RX Clock Source - RXS and TXS */ 235*4882a593Smuzhiyun #define CLK_BRG_MASK 0x0F 236*4882a593Smuzhiyun #define CLK_LINE_RX 0x00 /* TX/RX clock line input */ 237*4882a593Smuzhiyun #define CLK_LINE_TX 0x00 /* TX/RX line input */ 238*4882a593Smuzhiyun #define CLK_BRG_RX 0x40 /* internal baud rate generator */ 239*4882a593Smuzhiyun #define CLK_BRG_TX 0x40 /* internal baud rate generator */ 240*4882a593Smuzhiyun #define CLK_RXCLK_TX 0x60 /* TX clock from RX clock */ 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #endif 243