|
@@ -24,71 +24,80 @@
|
|
|
# define BFIN_DEBUG_EARLY_SERIAL 0
|
|
|
#endif
|
|
|
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
+
|
|
|
#define LOB(x) ((x) & 0xFF)
|
|
|
#define HIB(x) (((x) >> 8) & 0xFF)
|
|
|
|
|
|
+/*
|
|
|
+ * 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_mmr_serial {
|
|
|
+#ifdef __ADSPBF54x__
|
|
|
+ __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 __spad0;
|
|
|
+ union {
|
|
|
+ u16 dlh;
|
|
|
+ u16 ier;
|
|
|
+ };
|
|
|
+ const u16 __spad1;
|
|
|
+ const __BFP(iir);
|
|
|
+ __BFP(lcr);
|
|
|
+ __BFP(mcr);
|
|
|
+ __BFP(lsr);
|
|
|
+ __BFP(msr);
|
|
|
+ __BFP(scr);
|
|
|
+ const u32 __spad2;
|
|
|
+ __BFP(gctl);
|
|
|
+#endif
|
|
|
+};
|
|
|
+#undef __BFP
|
|
|
+
|
|
|
#ifndef UART_LSR
|
|
|
# if (CONFIG_UART_CONSOLE == 3)
|
|
|
-# define pUART_DLH pUART3_DLH
|
|
|
-# define pUART_DLL pUART3_DLL
|
|
|
-# define pUART_GCTL pUART3_GCTL
|
|
|
-# define pUART_IER pUART3_IER
|
|
|
-# define pUART_IERC pUART3_IER_CLEAR
|
|
|
-# define pUART_LCR pUART3_LCR
|
|
|
-# define pUART_LSR pUART3_LSR
|
|
|
-# define pUART_RBR pUART3_RBR
|
|
|
-# define pUART_THR pUART3_THR
|
|
|
-# define UART_THR UART3_THR
|
|
|
-# define UART_LSR UART3_LSR
|
|
|
+# define UART_BASE UART3_DLL
|
|
|
# elif (CONFIG_UART_CONSOLE == 2)
|
|
|
-# define pUART_DLH pUART2_DLH
|
|
|
-# define pUART_DLL pUART2_DLL
|
|
|
-# define pUART_GCTL pUART2_GCTL
|
|
|
-# define pUART_IER pUART2_IER
|
|
|
-# define pUART_IERC pUART2_IER_CLEAR
|
|
|
-# define pUART_LCR pUART2_LCR
|
|
|
-# define pUART_LSR pUART2_LSR
|
|
|
-# define pUART_RBR pUART2_RBR
|
|
|
-# define pUART_THR pUART2_THR
|
|
|
-# define UART_THR UART2_THR
|
|
|
-# define UART_LSR UART2_LSR
|
|
|
+# define UART_BASE UART2_DLL
|
|
|
# elif (CONFIG_UART_CONSOLE == 1)
|
|
|
-# define pUART_DLH pUART1_DLH
|
|
|
-# define pUART_DLL pUART1_DLL
|
|
|
-# define pUART_GCTL pUART1_GCTL
|
|
|
-# define pUART_IER pUART1_IER
|
|
|
-# define pUART_IERC pUART1_IER_CLEAR
|
|
|
-# define pUART_LCR pUART1_LCR
|
|
|
-# define pUART_LSR pUART1_LSR
|
|
|
-# define pUART_RBR pUART1_RBR
|
|
|
-# define pUART_THR pUART1_THR
|
|
|
-# define UART_THR UART1_THR
|
|
|
-# define UART_LSR UART1_LSR
|
|
|
+# define UART_BASE UART1_DLL
|
|
|
# elif (CONFIG_UART_CONSOLE == 0)
|
|
|
-# define pUART_DLH pUART0_DLH
|
|
|
-# define pUART_DLL pUART0_DLL
|
|
|
-# define pUART_GCTL pUART0_GCTL
|
|
|
-# define pUART_IER pUART0_IER
|
|
|
-# define pUART_IERC pUART0_IER_CLEAR
|
|
|
-# define pUART_LCR pUART0_LCR
|
|
|
-# define pUART_LSR pUART0_LSR
|
|
|
-# define pUART_RBR pUART0_RBR
|
|
|
-# define pUART_THR pUART0_THR
|
|
|
-# define UART_THR UART0_THR
|
|
|
-# define UART_LSR UART0_LSR
|
|
|
+# define UART_BASE UART0_DLL
|
|
|
+# endif
|
|
|
+#else
|
|
|
+# if CONFIG_UART_CONSOLE != 0
|
|
|
+# error CONFIG_UART_CONSOLE must be 0 on parts with only one UART
|
|
|
# endif
|
|
|
+# define UART_BASE UART_DLL
|
|
|
#endif
|
|
|
-
|
|
|
-#ifndef __ASSEMBLY__
|
|
|
+#define pUART ((volatile struct bfin_mmr_serial *)UART_BASE)
|
|
|
|
|
|
#ifdef __ADSPBF54x__
|
|
|
# define ACCESS_LATCH()
|
|
|
# define ACCESS_PORT_IER()
|
|
|
-# define CLEAR_IER() (*pUART_IERC = 0)
|
|
|
#else
|
|
|
-# define ACCESS_LATCH() (*pUART_LCR |= DLAB)
|
|
|
-# define ACCESS_PORT_IER() (*pUART_LCR &= ~DLAB)
|
|
|
-# define CLEAR_IER() (*pUART_IER = 0)
|
|
|
+# define ACCESS_LATCH() \
|
|
|
+ bfin_write16(&pUART->lcr, bfin_read16(&pUART->lcr) | DLAB)
|
|
|
+# define ACCESS_PORT_IER() \
|
|
|
+ bfin_write16(&pUART->lcr, bfin_read16(&pUART->lcr) & ~DLAB)
|
|
|
#endif
|
|
|
|
|
|
__attribute__((always_inline))
|
|
@@ -142,10 +151,10 @@ static inline void serial_early_init(void)
|
|
|
serial_do_portmux();
|
|
|
|
|
|
/* always enable UART -- avoids anomalies 05000309 and 05000350 */
|
|
|
- *pUART_GCTL = UCEN;
|
|
|
+ bfin_write16(&pUART->gctl, UCEN);
|
|
|
|
|
|
/* Set LCR to Word Lengh 8-bit word select */
|
|
|
- *pUART_LCR = WLS_8;
|
|
|
+ bfin_write16(&pUART->lcr, WLS_8);
|
|
|
|
|
|
SSYNC();
|
|
|
}
|
|
@@ -158,8 +167,8 @@ static inline void serial_early_put_div(uint16_t divisor)
|
|
|
SSYNC();
|
|
|
|
|
|
/* Program the divisor to get the baud rate we want */
|
|
|
- *pUART_DLL = LOB(divisor);
|
|
|
- *pUART_DLH = HIB(divisor);
|
|
|
+ bfin_write16(&pUART->dll, LOB(divisor));
|
|
|
+ bfin_write16(&pUART->dlh, HIB(divisor));
|
|
|
SSYNC();
|
|
|
|
|
|
/* Clear DLAB in LCR to Access THR RBR IER */
|
|
@@ -174,8 +183,8 @@ static inline uint16_t serial_early_get_div(void)
|
|
|
ACCESS_LATCH();
|
|
|
SSYNC();
|
|
|
|
|
|
- uint8_t dll = *pUART_DLL;
|
|
|
- uint8_t dlh = *pUART_DLH;
|
|
|
+ uint8_t dll = bfin_read16(&pUART->dll);
|
|
|
+ uint8_t dlh = bfin_read16(&pUART->dlh);
|
|
|
uint16_t divisor = (dlh << 8) | dll;
|
|
|
|
|
|
/* Clear DLAB in LCR to Access THR RBR IER */
|