|
@@ -160,3 +160,173 @@ struct bfin_serial_port {
|
|
|
|
|
|
/* UART_IER Masks */
|
|
|
#define ERBFI 0x01 /* Enable Receive Buffer Full Interrupt */
|
|
|
+#define ETBEI 0x02 /* Enable Transmit Buffer Empty Interrupt */
|
|
|
+#define ELSI 0x04 /* Enable RX Status Interrupt */
|
|
|
+#define EDSSI 0x08 /* Enable Modem Status Interrupt */
|
|
|
+#define EDTPTI 0x10 /* Enable DMA Transmit PIRQ Interrupt */
|
|
|
+#define ETFI 0x20 /* Enable Transmission Finished Interrupt */
|
|
|
+#define ERFCI 0x40 /* Enable Receive FIFO Count Interrupt */
|
|
|
+
|
|
|
+#if defined(BFIN_UART_BF60X_STYLE)
|
|
|
+# define OFFSET_REDIV 0x00 /* Version ID Register */
|
|
|
+# define OFFSET_CTL 0x04 /* Control Register */
|
|
|
+# define OFFSET_STAT 0x08 /* Status Register */
|
|
|
+# define OFFSET_SCR 0x0C /* SCR Scratch Register */
|
|
|
+# define OFFSET_CLK 0x10 /* Clock Rate Register */
|
|
|
+# define OFFSET_IER 0x14 /* Interrupt Enable Register */
|
|
|
+# define OFFSET_IER_SET 0x18 /* Set Interrupt Enable Register */
|
|
|
+# define OFFSET_IER_CLEAR 0x1C /* Clear Interrupt Enable Register */
|
|
|
+# define OFFSET_RBR 0x20 /* Receive Buffer register */
|
|
|
+# define OFFSET_THR 0x24 /* Transmit Holding register */
|
|
|
+#elif defined(BFIN_UART_BF54X_STYLE)
|
|
|
+# define OFFSET_DLL 0x00 /* Divisor Latch (Low-Byte) */
|
|
|
+# define OFFSET_DLH 0x04 /* Divisor Latch (High-Byte) */
|
|
|
+# define OFFSET_GCTL 0x08 /* Global Control Register */
|
|
|
+# define OFFSET_LCR 0x0C /* Line Control Register */
|
|
|
+# define OFFSET_MCR 0x10 /* Modem Control Register */
|
|
|
+# define OFFSET_LSR 0x14 /* Line Status Register */
|
|
|
+# define OFFSET_MSR 0x18 /* Modem Status Register */
|
|
|
+# define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
|
|
+# define OFFSET_IER_SET 0x20 /* Set Interrupt Enable Register */
|
|
|
+# define OFFSET_IER_CLEAR 0x24 /* Clear Interrupt Enable Register */
|
|
|
+# define OFFSET_THR 0x28 /* Transmit Holding register */
|
|
|
+# define OFFSET_RBR 0x2C /* Receive Buffer register */
|
|
|
+#else /* BF533 style */
|
|
|
+# define OFFSET_THR 0x00 /* Transmit Holding register */
|
|
|
+# define OFFSET_RBR 0x00 /* Receive Buffer register */
|
|
|
+# define OFFSET_DLL 0x00 /* Divisor Latch (Low-Byte) */
|
|
|
+# define OFFSET_DLH 0x04 /* Divisor Latch (High-Byte) */
|
|
|
+# define OFFSET_IER 0x04 /* Interrupt Enable Register */
|
|
|
+# define OFFSET_IIR 0x08 /* Interrupt Identification Register */
|
|
|
+# define OFFSET_LCR 0x0C /* Line Control Register */
|
|
|
+# define OFFSET_MCR 0x10 /* Modem Control Register */
|
|
|
+# define OFFSET_LSR 0x14 /* Line Status Register */
|
|
|
+# define OFFSET_MSR 0x18 /* Modem Status Register */
|
|
|
+# define OFFSET_SCR 0x1C /* SCR Scratch Register */
|
|
|
+# define OFFSET_GCTL 0x24 /* Global Control Register */
|
|
|
+/* code should not need IIR, so force build error if they use it */
|
|
|
+# undef OFFSET_IIR
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * All Blackfin system MMRs are padded to 32bits even if the register
|
|
|
+ * itself is only 16bits. So use a helper macro to streamline this.
|
|
|
+ */
|
|
|
+#define __BFP(m) u16 m; u16 __pad_##m
|
|
|
+struct bfin_uart_regs {
|
|
|
+#if defined(BFIN_UART_BF60X_STYLE)
|
|
|
+ u32 revid;
|
|
|
+ u32 ctl;
|
|
|
+ u32 stat;
|
|
|
+ u32 scr;
|
|
|
+ u32 clk;
|
|
|
+ u32 ier;
|
|
|
+ u32 ier_set;
|
|
|
+ u32 ier_clear;
|
|
|
+ u32 rbr;
|
|
|
+ u32 thr;
|
|
|
+ u32 taip;
|
|
|
+ u32 tsr;
|
|
|
+ u32 rsr;
|
|
|
+ u32 txdiv;
|
|
|
+ u32 rxdiv;
|
|
|
+#elif defined(BFIN_UART_BF54X_STYLE)
|
|
|
+ __BFP(dll);
|
|
|
+ __BFP(dlh);
|
|
|
+ __BFP(gctl);
|
|
|
+ __BFP(lcr);
|
|
|
+ __BFP(mcr);
|
|
|
+ __BFP(lsr);
|
|
|
+ __BFP(msr);
|
|
|
+ __BFP(scr);
|
|
|
+ __BFP(ier_set);
|
|
|
+ __BFP(ier_clear);
|
|
|
+ __BFP(thr);
|
|
|
+ __BFP(rbr);
|
|
|
+#else
|
|
|
+ union {
|
|
|
+ u16 dll;
|
|
|
+ u16 thr;
|
|
|
+ const u16 rbr;
|
|
|
+ };
|
|
|
+ const u16 __pad0;
|
|
|
+ union {
|
|
|
+ u16 dlh;
|
|
|
+ u16 ier;
|
|
|
+ };
|
|
|
+ const u16 __pad1;
|
|
|
+ const __BFP(iir);
|
|
|
+ __BFP(lcr);
|
|
|
+ __BFP(mcr);
|
|
|
+ __BFP(lsr);
|
|
|
+ __BFP(msr);
|
|
|
+ __BFP(scr);
|
|
|
+ const u32 __pad2;
|
|
|
+ __BFP(gctl);
|
|
|
+#endif
|
|
|
+};
|
|
|
+#undef __BFP
|
|
|
+
|
|
|
+#define port_membase(uart) (((struct bfin_serial_port *)(uart))->port.membase)
|
|
|
+
|
|
|
+/*
|
|
|
+#ifndef port_membase
|
|
|
+# define port_membase(p) 0
|
|
|
+#endif
|
|
|
+*/
|
|
|
+#ifdef BFIN_UART_BF60X_STYLE
|
|
|
+
|
|
|
+#define UART_GET_CHAR(p) bfin_read32(port_membase(p) + OFFSET_RBR)
|
|
|
+#define UART_GET_CLK(p) bfin_read32(port_membase(p) + OFFSET_CLK)
|
|
|
+#define UART_GET_CTL(p) bfin_read32(port_membase(p) + OFFSET_CTL)
|
|
|
+#define UART_GET_GCTL(p) UART_GET_CTL(p)
|
|
|
+#define UART_GET_LCR(p) UART_GET_CTL(p)
|
|
|
+#define UART_GET_MCR(p) UART_GET_CTL(p)
|
|
|
+#if ANOMALY_16000030
|
|
|
+#define UART_GET_STAT(p) \
|
|
|
+({ \
|
|
|
+ u32 __ret; \
|
|
|
+ unsigned long flags; \
|
|
|
+ flags = hard_local_irq_save(); \
|
|
|
+ __ret = bfin_read32(port_membase(p) + OFFSET_STAT); \
|
|
|
+ hard_local_irq_restore(flags); \
|
|
|
+ __ret; \
|
|
|
+})
|
|
|
+#else
|
|
|
+#define UART_GET_STAT(p) bfin_read32(port_membase(p) + OFFSET_STAT)
|
|
|
+#endif
|
|
|
+#define UART_GET_MSR(p) UART_GET_STAT(p)
|
|
|
+
|
|
|
+#define UART_PUT_CHAR(p, v) bfin_write32(port_membase(p) + OFFSET_THR, v)
|
|
|
+#define UART_PUT_CLK(p, v) bfin_write32(port_membase(p) + OFFSET_CLK, v)
|
|
|
+#define UART_PUT_CTL(p, v) bfin_write32(port_membase(p) + OFFSET_CTL, v)
|
|
|
+#define UART_PUT_GCTL(p, v) UART_PUT_CTL(p, v)
|
|
|
+#define UART_PUT_LCR(p, v) UART_PUT_CTL(p, v)
|
|
|
+#define UART_PUT_MCR(p, v) UART_PUT_CTL(p, v)
|
|
|
+#define UART_PUT_STAT(p, v) bfin_write32(port_membase(p) + OFFSET_STAT, v)
|
|
|
+
|
|
|
+#define UART_CLEAR_IER(p, v) bfin_write32(port_membase(p) + OFFSET_IER_CLEAR, v)
|
|
|
+#define UART_GET_IER(p) bfin_read32(port_membase(p) + OFFSET_IER)
|
|
|
+#define UART_SET_IER(p, v) bfin_write32(port_membase(p) + OFFSET_IER_SET, v)
|
|
|
+
|
|
|
+#define UART_CLEAR_DLAB(p) /* MMRs not muxed on BF60x */
|
|
|
+#define UART_SET_DLAB(p) /* MMRs not muxed on BF60x */
|
|
|
+
|
|
|
+#define UART_CLEAR_LSR(p) UART_PUT_STAT(p, -1)
|
|
|
+#define UART_GET_LSR(p) UART_GET_STAT(p)
|
|
|
+#define UART_PUT_LSR(p, v) UART_PUT_STAT(p, v)
|
|
|
+
|
|
|
+/* This handles hard CTS/RTS */
|
|
|
+#define BFIN_UART_CTSRTS_HARD
|
|
|
+#define UART_CLEAR_SCTS(p) UART_PUT_STAT(p, SCTS)
|
|
|
+#define UART_GET_CTS(x) (UART_GET_MSR(x) & CTS)
|
|
|
+#define UART_DISABLE_RTS(x) UART_PUT_MCR(x, UART_GET_MCR(x) & ~(ARTS | MRTS))
|
|
|
+#define UART_ENABLE_RTS(x) UART_PUT_MCR(x, UART_GET_MCR(x) | MRTS | ARTS)
|
|
|
+#define UART_ENABLE_INTS(x, v) UART_SET_IER(x, v)
|
|
|
+#define UART_DISABLE_INTS(x) UART_CLEAR_IER(x, 0xF)
|
|
|
+
|
|
|
+#else /* BFIN_UART_BF60X_STYLE */
|
|
|
+
|
|
|
+#define UART_GET_CHAR(p) bfin_read16(port_membase(p) + OFFSET_RBR)
|
|
|
+#define UART_GET_DLL(p) bfin_read16(port_membase(p) + OFFSET_DLL)
|
|
|
+#define UART_GET_DLH(p) bfin_read16(port_membase(p) + OFFSET_DLH)
|