1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2d94a0a38SGeert Uytterhoeven #include <linux/bitops.h> 3ab4382d2SGreg Kroah-Hartman #include <linux/serial_core.h> 4ab4382d2SGreg Kroah-Hartman #include <linux/io.h> 5ab4382d2SGreg Kroah-Hartman 6c27ffc10SGeert Uytterhoeven #define SCI_MAJOR 204 7c27ffc10SGeert Uytterhoeven #define SCI_MINOR_START 8 8c27ffc10SGeert Uytterhoeven 9c27ffc10SGeert Uytterhoeven 10c27ffc10SGeert Uytterhoeven /* 11c27ffc10SGeert Uytterhoeven * SCI register subset common for all port types. 12c27ffc10SGeert Uytterhoeven * Not all registers will exist on all parts. 13c27ffc10SGeert Uytterhoeven */ 14c27ffc10SGeert Uytterhoeven enum { 15c27ffc10SGeert Uytterhoeven SCSMR, /* Serial Mode Register */ 16c27ffc10SGeert Uytterhoeven SCBRR, /* Bit Rate Register */ 17c27ffc10SGeert Uytterhoeven SCSCR, /* Serial Control Register */ 18c27ffc10SGeert Uytterhoeven SCxSR, /* Serial Status Register */ 19c27ffc10SGeert Uytterhoeven SCFCR, /* FIFO Control Register */ 20c27ffc10SGeert Uytterhoeven SCFDR, /* FIFO Data Count Register */ 21c27ffc10SGeert Uytterhoeven SCxTDR, /* Transmit (FIFO) Data Register */ 22c27ffc10SGeert Uytterhoeven SCxRDR, /* Receive (FIFO) Data Register */ 23c27ffc10SGeert Uytterhoeven SCLSR, /* Line Status Register */ 24c27ffc10SGeert Uytterhoeven SCTFDR, /* Transmit FIFO Data Count Register */ 25c27ffc10SGeert Uytterhoeven SCRFDR, /* Receive FIFO Data Count Register */ 26c27ffc10SGeert Uytterhoeven SCSPTR, /* Serial Port Register */ 27c27ffc10SGeert Uytterhoeven HSSRR, /* Sampling Rate Register */ 28c097abc3SGeert Uytterhoeven SCPCR, /* Serial Port Control Register */ 29c097abc3SGeert Uytterhoeven SCPDR, /* Serial Port Data Register */ 30b8bbd6b2SGeert Uytterhoeven SCDL, /* BRG Frequency Division Register */ 31b8bbd6b2SGeert Uytterhoeven SCCKS, /* BRG Clock Select Register */ 3254e14ae2SUlrich Hecht HSRTRGR, /* Rx FIFO Data Count Trigger Register */ 3354e14ae2SUlrich Hecht HSTTRGR, /* Tx FIFO Data Count Trigger Register */ 343b2cd606SBiju Das SEMR, /* Serial extended mode register */ 35c27ffc10SGeert Uytterhoeven 36c27ffc10SGeert Uytterhoeven SCIx_NR_REGS, 37c27ffc10SGeert Uytterhoeven }; 38c27ffc10SGeert Uytterhoeven 39c27ffc10SGeert Uytterhoeven 40c27ffc10SGeert Uytterhoeven /* SCSMR (Serial Mode Register) */ 4195ee05c7SGeert Uytterhoeven #define SCSMR_C_A BIT(7) /* Communication Mode */ 4295ee05c7SGeert Uytterhoeven #define SCSMR_CSYNC BIT(7) /* - Clocked synchronous mode */ 4395ee05c7SGeert Uytterhoeven #define SCSMR_ASYNC 0 /* - Asynchronous mode */ 44d94a0a38SGeert Uytterhoeven #define SCSMR_CHR BIT(6) /* 7-bit Character Length */ 45d94a0a38SGeert Uytterhoeven #define SCSMR_PE BIT(5) /* Parity Enable */ 46d94a0a38SGeert Uytterhoeven #define SCSMR_ODD BIT(4) /* Odd Parity */ 47d94a0a38SGeert Uytterhoeven #define SCSMR_STOP BIT(3) /* Stop Bit Length */ 48c27ffc10SGeert Uytterhoeven #define SCSMR_CKS 0x0003 /* Clock Select */ 49c27ffc10SGeert Uytterhoeven 5095ee05c7SGeert Uytterhoeven /* Serial Mode Register, SCIFA/SCIFB only bits */ 5195ee05c7SGeert Uytterhoeven #define SCSMR_CKEDG BIT(12) /* Transmit/Receive Clock Edge Select */ 5295ee05c7SGeert Uytterhoeven #define SCSMR_SRC_MASK 0x0700 /* Sampling Control */ 5395ee05c7SGeert Uytterhoeven #define SCSMR_SRC_16 0x0000 /* Sampling rate 1/16 */ 5495ee05c7SGeert Uytterhoeven #define SCSMR_SRC_5 0x0100 /* Sampling rate 1/5 */ 5595ee05c7SGeert Uytterhoeven #define SCSMR_SRC_7 0x0200 /* Sampling rate 1/7 */ 5695ee05c7SGeert Uytterhoeven #define SCSMR_SRC_11 0x0300 /* Sampling rate 1/11 */ 5795ee05c7SGeert Uytterhoeven #define SCSMR_SRC_13 0x0400 /* Sampling rate 1/13 */ 5895ee05c7SGeert Uytterhoeven #define SCSMR_SRC_17 0x0500 /* Sampling rate 1/17 */ 5995ee05c7SGeert Uytterhoeven #define SCSMR_SRC_19 0x0600 /* Sampling rate 1/19 */ 6095ee05c7SGeert Uytterhoeven #define SCSMR_SRC_27 0x0700 /* Sampling rate 1/27 */ 6195ee05c7SGeert Uytterhoeven 62*d61ae331SBiju Das /* Serial Control Register, SCI only bits */ 63*d61ae331SBiju Das #define SCSCR_TEIE BIT(2) /* Transmit End Interrupt Enable */ 64*d61ae331SBiju Das 65c27ffc10SGeert Uytterhoeven /* Serial Control Register, SCIFA/SCIFB only bits */ 66d94a0a38SGeert Uytterhoeven #define SCSCR_TDRQE BIT(15) /* Tx Data Transfer Request Enable */ 67d94a0a38SGeert Uytterhoeven #define SCSCR_RDRQE BIT(14) /* Rx Data Transfer Request Enable */ 68c27ffc10SGeert Uytterhoeven 69fa2abb03SUlrich Hecht /* Serial Control Register, HSCIF-only bits */ 70fa2abb03SUlrich Hecht #define HSSCR_TOT_SHIFT 14 71fa2abb03SUlrich Hecht 72c27ffc10SGeert Uytterhoeven /* SCxSR (Serial Status Register) on SCI */ 73d94a0a38SGeert Uytterhoeven #define SCI_TDRE BIT(7) /* Transmit Data Register Empty */ 74d94a0a38SGeert Uytterhoeven #define SCI_RDRF BIT(6) /* Receive Data Register Full */ 75d94a0a38SGeert Uytterhoeven #define SCI_ORER BIT(5) /* Overrun Error */ 76d94a0a38SGeert Uytterhoeven #define SCI_FER BIT(4) /* Framing Error */ 77d94a0a38SGeert Uytterhoeven #define SCI_PER BIT(3) /* Parity Error */ 78d94a0a38SGeert Uytterhoeven #define SCI_TEND BIT(2) /* Transmit End */ 792922598cSGeert Uytterhoeven #define SCI_RESERVED 0x03 /* All reserved bits */ 80c27ffc10SGeert Uytterhoeven 81c27ffc10SGeert Uytterhoeven #define SCI_DEFAULT_ERROR_MASK (SCI_PER | SCI_FER) 82c27ffc10SGeert Uytterhoeven 83a9efeca6SGeert Uytterhoeven #define SCI_RDxF_CLEAR (u32)(~(SCI_RESERVED | SCI_RDRF)) 84a9efeca6SGeert Uytterhoeven #define SCI_ERROR_CLEAR (u32)(~(SCI_RESERVED | SCI_PER | SCI_FER | SCI_ORER)) 85a9efeca6SGeert Uytterhoeven #define SCI_TDxE_CLEAR (u32)(~(SCI_RESERVED | SCI_TEND | SCI_TDRE)) 86a9efeca6SGeert Uytterhoeven #define SCI_BREAK_CLEAR (u32)(~(SCI_RESERVED | SCI_PER | SCI_FER | SCI_ORER)) 872922598cSGeert Uytterhoeven 882922598cSGeert Uytterhoeven /* SCxSR (Serial Status Register) on SCIF, SCIFA, SCIFB, HSCIF */ 89d94a0a38SGeert Uytterhoeven #define SCIF_ER BIT(7) /* Receive Error */ 90d94a0a38SGeert Uytterhoeven #define SCIF_TEND BIT(6) /* Transmission End */ 91d94a0a38SGeert Uytterhoeven #define SCIF_TDFE BIT(5) /* Transmit FIFO Data Empty */ 92d94a0a38SGeert Uytterhoeven #define SCIF_BRK BIT(4) /* Break Detect */ 93d94a0a38SGeert Uytterhoeven #define SCIF_FER BIT(3) /* Framing Error */ 94d94a0a38SGeert Uytterhoeven #define SCIF_PER BIT(2) /* Parity Error */ 95d94a0a38SGeert Uytterhoeven #define SCIF_RDF BIT(1) /* Receive FIFO Data Full */ 96d94a0a38SGeert Uytterhoeven #define SCIF_DR BIT(0) /* Receive Data Ready */ 972922598cSGeert Uytterhoeven /* SCIF only (optional) */ 982922598cSGeert Uytterhoeven #define SCIF_PERC 0xf000 /* Number of Parity Errors */ 992922598cSGeert Uytterhoeven #define SCIF_FERC 0x0f00 /* Number of Framing Errors */ 1002922598cSGeert Uytterhoeven /*SCIFA/SCIFB and SCIF on SH7705/SH7720/SH7721 only */ 1012922598cSGeert Uytterhoeven #define SCIFA_ORER BIT(9) /* Overrun Error */ 102c27ffc10SGeert Uytterhoeven 1032922598cSGeert Uytterhoeven #define SCIF_DEFAULT_ERROR_MASK (SCIF_PER | SCIF_FER | SCIF_BRK | SCIF_ER) 1042922598cSGeert Uytterhoeven 105a9efeca6SGeert Uytterhoeven #define SCIF_RDxF_CLEAR (u32)(~(SCIF_DR | SCIF_RDF)) 1065da0f468SGeert Uytterhoeven #define SCIF_ERROR_CLEAR (u32)(~(SCIF_PER | SCIF_FER | SCIF_ER)) 107a9efeca6SGeert Uytterhoeven #define SCIF_TDxE_CLEAR (u32)(~(SCIF_TDFE)) 108a9efeca6SGeert Uytterhoeven #define SCIF_BREAK_CLEAR (u32)(~(SCIF_PER | SCIF_FER | SCIF_BRK)) 109c27ffc10SGeert Uytterhoeven 110c27ffc10SGeert Uytterhoeven /* SCFCR (FIFO Control Register) */ 11154e14ae2SUlrich Hecht #define SCFCR_RTRG1 BIT(7) /* Receive FIFO Data Count Trigger */ 11254e14ae2SUlrich Hecht #define SCFCR_RTRG0 BIT(6) 11354e14ae2SUlrich Hecht #define SCFCR_TTRG1 BIT(5) /* Transmit FIFO Data Count Trigger */ 11454e14ae2SUlrich Hecht #define SCFCR_TTRG0 BIT(4) 115d94a0a38SGeert Uytterhoeven #define SCFCR_MCE BIT(3) /* Modem Control Enable */ 116d94a0a38SGeert Uytterhoeven #define SCFCR_TFRST BIT(2) /* Transmit FIFO Data Register Reset */ 117d94a0a38SGeert Uytterhoeven #define SCFCR_RFRST BIT(1) /* Receive FIFO Data Register Reset */ 118d94a0a38SGeert Uytterhoeven #define SCFCR_LOOP BIT(0) /* Loopback Test */ 119c27ffc10SGeert Uytterhoeven 12075c249fdSGeert Uytterhoeven /* SCLSR (Line Status Register) on (H)SCIF */ 121fc2af334SGeert Uytterhoeven #define SCLSR_TO BIT(2) /* Timeout */ 12275c249fdSGeert Uytterhoeven #define SCLSR_ORER BIT(0) /* Overrun Error */ 12375c249fdSGeert Uytterhoeven 124c27ffc10SGeert Uytterhoeven /* SCSPTR (Serial Port Register), optional */ 125ef5e90e8SGeert Uytterhoeven #define SCSPTR_RTSIO BIT(7) /* Serial Port RTS# Pin Input/Output */ 126ef5e90e8SGeert Uytterhoeven #define SCSPTR_RTSDT BIT(6) /* Serial Port RTS# Pin Data */ 127ef5e90e8SGeert Uytterhoeven #define SCSPTR_CTSIO BIT(5) /* Serial Port CTS# Pin Input/Output */ 128ef5e90e8SGeert Uytterhoeven #define SCSPTR_CTSDT BIT(4) /* Serial Port CTS# Pin Data */ 129ef5e90e8SGeert Uytterhoeven #define SCSPTR_SCKIO BIT(3) /* Serial Port Clock Pin Input/Output */ 130ef5e90e8SGeert Uytterhoeven #define SCSPTR_SCKDT BIT(2) /* Serial Port Clock Pin Data */ 131d94a0a38SGeert Uytterhoeven #define SCSPTR_SPB2IO BIT(1) /* Serial Port Break Input/Output */ 132d94a0a38SGeert Uytterhoeven #define SCSPTR_SPB2DT BIT(0) /* Serial Port Break Data */ 133c27ffc10SGeert Uytterhoeven 134c27ffc10SGeert Uytterhoeven /* HSSRR HSCIF */ 135d94a0a38SGeert Uytterhoeven #define HSCIF_SRE BIT(15) /* Sampling Rate Register Enable */ 13663ba1e00SUlrich Hecht #define HSCIF_SRDE BIT(14) /* Sampling Point Register Enable */ 13763ba1e00SUlrich Hecht 13863ba1e00SUlrich Hecht #define HSCIF_SRHP_SHIFT 8 13963ba1e00SUlrich Hecht #define HSCIF_SRHP_MASK 0x0f00 140c27ffc10SGeert Uytterhoeven 141c097abc3SGeert Uytterhoeven /* SCPCR (Serial Port Control Register), SCIFA/SCIFB only */ 1424780c09fSGeert Uytterhoeven #define SCPCR_RTSC BIT(4) /* Serial Port RTS# Pin / Output Pin */ 1434780c09fSGeert Uytterhoeven #define SCPCR_CTSC BIT(3) /* Serial Port CTS# Pin / Input Pin */ 1444780c09fSGeert Uytterhoeven #define SCPCR_SCKC BIT(2) /* Serial Port SCK Pin / Output Pin */ 1454780c09fSGeert Uytterhoeven #define SCPCR_RXDC BIT(1) /* Serial Port RXD Pin / Input Pin */ 1464780c09fSGeert Uytterhoeven #define SCPCR_TXDC BIT(0) /* Serial Port TXD Pin / Output Pin */ 147c097abc3SGeert Uytterhoeven 148c097abc3SGeert Uytterhoeven /* SCPDR (Serial Port Data Register), SCIFA/SCIFB only */ 1494780c09fSGeert Uytterhoeven #define SCPDR_RTSD BIT(4) /* Serial Port RTS# Output Pin Data */ 1504780c09fSGeert Uytterhoeven #define SCPDR_CTSD BIT(3) /* Serial Port CTS# Input Pin Data */ 1514780c09fSGeert Uytterhoeven #define SCPDR_SCKD BIT(2) /* Serial Port SCK Output Pin Data */ 1524780c09fSGeert Uytterhoeven #define SCPDR_RXDD BIT(1) /* Serial Port RXD Input Pin Data */ 1534780c09fSGeert Uytterhoeven #define SCPDR_TXDD BIT(0) /* Serial Port TXD Output Pin Data */ 154c097abc3SGeert Uytterhoeven 155b8bbd6b2SGeert Uytterhoeven /* 156b8bbd6b2SGeert Uytterhoeven * BRG Clock Select Register (Some SCIF and HSCIF) 157b8bbd6b2SGeert Uytterhoeven * The Baud Rate Generator for external clock can provide a clock source for 158b8bbd6b2SGeert Uytterhoeven * the sampling clock. It outputs either its frequency divided clock, or the 159b8bbd6b2SGeert Uytterhoeven * (undivided) (H)SCK external clock. 160b8bbd6b2SGeert Uytterhoeven */ 161b8bbd6b2SGeert Uytterhoeven #define SCCKS_CKS BIT(15) /* Select (H)SCK (1) or divided SC_CLK (0) */ 162b8bbd6b2SGeert Uytterhoeven #define SCCKS_XIN BIT(14) /* SC_CLK uses bus clock (1) or SCIF_CLK (0) */ 163c27ffc10SGeert Uytterhoeven 164ab4382d2SGreg Kroah-Hartman #define SCxSR_TEND(port) (((port)->type == PORT_SCI) ? SCI_TEND : SCIF_TEND) 16588641c79SUlrich Hecht #define SCxSR_RDxF(port) (((port)->type == PORT_SCI) ? SCI_RDRF : SCIF_DR | SCIF_RDF) 166ab4382d2SGreg Kroah-Hartman #define SCxSR_TDxE(port) (((port)->type == PORT_SCI) ? SCI_TDRE : SCIF_TDFE) 167ab4382d2SGreg Kroah-Hartman #define SCxSR_FER(port) (((port)->type == PORT_SCI) ? SCI_FER : SCIF_FER) 168ab4382d2SGreg Kroah-Hartman #define SCxSR_PER(port) (((port)->type == PORT_SCI) ? SCI_PER : SCIF_PER) 169ab4382d2SGreg Kroah-Hartman #define SCxSR_BRK(port) (((port)->type == PORT_SCI) ? 0x00 : SCIF_BRK) 170debf9507SPaul Mundt 171b2f20ed9SLaurent Pinchart #define SCxSR_ERRORS(port) (to_sci_port(port)->params->error_mask) 172ab4382d2SGreg Kroah-Hartman 1732922598cSGeert Uytterhoeven #define SCxSR_RDxF_CLEAR(port) \ 174a1b5b43fSGeert Uytterhoeven (((port)->type == PORT_SCI) ? SCI_RDxF_CLEAR : SCIF_RDxF_CLEAR) 1752922598cSGeert Uytterhoeven #define SCxSR_ERROR_CLEAR(port) \ 176b2f20ed9SLaurent Pinchart (to_sci_port(port)->params->error_clear) 1772922598cSGeert Uytterhoeven #define SCxSR_TDxE_CLEAR(port) \ 178a1b5b43fSGeert Uytterhoeven (((port)->type == PORT_SCI) ? SCI_TDxE_CLEAR : SCIF_TDxE_CLEAR) 1792922598cSGeert Uytterhoeven #define SCxSR_BREAK_CLEAR(port) \ 180a1b5b43fSGeert Uytterhoeven (((port)->type == PORT_SCI) ? SCI_BREAK_CLEAR : SCIF_BREAK_CLEAR) 181