h8300 have simlar sh serial I/F.
It without FIFO.
This changes support of no FIFO.

Signed-off-by: Yoshinori Sato <ys...@users.sourceforge.jp>
---
 drivers/serial/serial_sh.c |   74 +++++++++++++++++++++++++++++++---
 drivers/serial/serial_sh.h |   93 +++++++++++++++-----------------------------
 2 files changed, 98 insertions(+), 69 deletions(-)

diff --git a/drivers/serial/serial_sh.c b/drivers/serial/serial_sh.c
index fcf69ab..b6c800d 100644
--- a/drivers/serial/serial_sh.c
+++ b/drivers/serial/serial_sh.c
@@ -39,18 +39,73 @@
 # error "Default SCIF doesn't set....."
 #endif
 
-#if defined(CONFIG_SCIF_A)
-       #define SCIF_BASE_PORT  PORT_SCIFA
+#if defined(CONFIG_SCI)
+# define PORT_TYPE     PORT_SCI
+#elif defined(CONFIG_SCIF_A)
+# define PORT_TYPE     PORT_SCIFA
 #else
-       #define SCIF_BASE_PORT  PORT_SCIF
+# define PORT_TYPE     PORT_SCIF
 #endif
 
 static struct uart_port sh_sci = {
        .membase        = (unsigned char*)SCIF_BASE,
        .mapbase        = SCIF_BASE,
-       .type           = SCIF_BASE_PORT,
+       .type           = PORT_TYPE,
 };
 
+/* TDRE / RDRF emulation for RX610 */
+/* RX610's SCI don't have TDRE and RDRF in SSR
+   This part emulate these flags of IR */
+#if defined(CONFIG_CPU_RX610)
+
+#define port_to_irq(port) ((((port)->mapbase - 0x88240) / 8) + 214)
+#define read_ir(irq) __raw_readb((unsigned char *)(0x00087000 + (irq)))
+#define clear_ir(irq) __raw_writeb(0, (unsigned char *)(0x00087000 + (irq)))
+
+#define write_ier(flg, irq)                    \
+do { \
+       unsigned char ier = __raw_readb((unsigned char *)(0x00087200 + ((irq) 
>> 3))); \
+       ier &= ~(1 << ((irq) & 7));                                     \
+       if (flg) \
+               ier |= (1 << ((irq) & 7));                             \
+       __raw_writeb(ier, (unsigned char *)(0x00087200 + ((irq) >> 3))); \
+} while(0)
+
+
+static unsigned int sci_SCxSR_in(struct uart_port *port)
+{
+       int irq = port_to_irq(port);
+       unsigned char ssr;
+       ssr = __raw_readb(port->membase + 4);
+       ssr &= ~0xc0;
+       /* map to RXI -> RDRF and TXI -> TDRE */
+       ssr |= read_ir(irq + 1) << 6 | read_ir(irq + 2) << 7;
+       return ssr;
+}
+
+static void sci_SCxSR_out(struct uart_port *port, unsigned int value)
+{
+       int irq = port_to_irq(port);
+       /* clear ir */
+       if ((value & 0x84) != 0x84)
+               clear_ir(irq + 2);
+       if ((value & 0x40) == 0)
+               clear_ir(irq + 1);
+       value |= 0xc0;          /* b7 and b6 is always 1 */
+       value &= ~0x01;         /* b0 is always 0 */
+       __raw_writeb(value, port->membase + 4);
+}
+
+static void sci_SCSCR_out(struct uart_port *port, unsigned int value)
+{
+       int irq = port_to_irq(port);
+       write_ier(value & 0x40, irq + 1);
+       write_ier(value & 0x80, irq + 2);
+       /* TXI and RXI always enabled */
+       __raw_writeb(value | 0xc0, port->membase + 2);
+}
+#endif
+
 void serial_setbrg(void)
 {
        DECLARE_GLOBAL_DATA_PTR;
@@ -99,6 +154,11 @@ static int scif_rxfill(struct uart_port *port)
        else
                return sci_in(port, SCRFDR);
 }
+#elif defined(CONFIG_SCI)
+static int scif_rxfill(struct uart_port *port)
+{
+       return (sci_in(port, SCxSR) & SCxSR_RDxF(port))?1:0;
+}
 #else
 static int scif_rxfill(struct uart_port *port)
 {
@@ -115,12 +175,12 @@ void serial_raw_putc(const char c)
 {
        while (1) {
                /* Tx fifo is empty */
-               if (sci_in(&sh_sci, SCxSR) & SCxSR_TEND(&sh_sci))
+               if (sci_in(&sh_sci, SCxSR) & SCxSR_TXRDY(&sh_sci))
                        break;
        }
 
        sci_out(&sh_sci, SCxTDR, c);
-       sci_out(&sh_sci, SCxSR, sci_in(&sh_sci, SCxSR) & ~SCxSR_TEND(&sh_sci));
+       sci_out(&sh_sci, SCxSR, sci_in(&sh_sci, SCxSR) & ~SCxSR_TXRDY(&sh_sci));
 }
 
 void serial_putc(const char c)
@@ -156,7 +216,7 @@ int serial_getc_check(void)
 
        status = sci_in(&sh_sci, SCxSR);
 
-       if (status & SCIF_ERRORS)
+       if (status & SCxSR_ERRORS(&sh_sci))
                handle_error();
        if (sci_in(&sh_sci, SCLSR) & SCxSR_ORER(&sh_sci))
                handle_error();
diff --git a/drivers/serial/serial_sh.h b/drivers/serial/serial_sh.h
index e19593c..069aa36 100644
--- a/drivers/serial/serial_sh.h
+++ b/drivers/serial/serial_sh.h
@@ -14,13 +14,6 @@ struct uart_port {
 #define PORT_SCIFA     83
 #define PORT_SCIFB     93
 
-#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
-#include <asm/regs306x.h>
-#endif
-#if defined(CONFIG_H8S2678)
-#include <asm/regs267x.h>
-#endif
-
 #if defined(CONFIG_CPU_SH7706) || \
        defined(CONFIG_CPU_SH7707) || \
        defined(CONFIG_CPU_SH7708) || \
@@ -126,12 +119,20 @@ struct uart_port {
 # define SCLSR2\
                ((port->mapbase)+SCIF_LSR2_OFFS) /* 16 bit SCIF */
 # define SCSCR_INIT(port)  0x38                /* TIE=0,RIE=0, 
TE=1,RE=1,REIE=1 */
-#elif defined(CONFIG_H83007) || defined(CONFIG_H83068)
+#elif defined(CONFIG_CPU_H83007) || \
+      defined(CONFIG_CPU_H83068) || \
+      defined(CONFIG_CPU_H83069)
 # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define H8300_SCI_DR(ch) (*(volatile char *)(P1DR + h8300_sci_pins[ch].port))
-#elif defined(CONFIG_H8S2678)
+# define SCIF0_BASE 0xffffb0 
+# define SCIF1_BASE 0xffffb8 
+# define SCIF2_BASE 0xffffc0 
+#elif defined(CONFIG_CPU_H8S2678)
 # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define H8300_SCI_DR(ch) (*(volatile char *)(P1DR + h8300_sci_pins[ch].port))
+# define SCIF0_BASE 0xffff78 
+# define SCIF1_BASE 0xffff80 
+# define SCIF2_BASE 0xffff88 
 #elif defined(CONFIG_CPU_SH7757)
 # define SCSPTR0 0xfe4b0020
 # define SCSPTR1 0xfe4b0020
@@ -202,6 +203,15 @@ struct uart_port {
 # define SCSPTR3 0xffc60020            /* 16 bit SCIF */
 # define SCIF_ORER 0x0001              /* Overrun error bit */
 # define SCSCR_INIT(port)      0x38    /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
+#elif defined(CONFIG_RX)
+# define SCSPTR0 0x00088240            /* 8 bit SCI */
+# define SCSPTR1 0x00088248            /* 8 bit SCI */
+# define SCSPTR2 0x00088250            /* 8 bit SCI */
+# define SCSPTR3 0x00088258            /* 8 bit SCI */
+# define SCSPTR4 0x00088260            /* 8 bit SCI */
+# define SCSPTR5 0x00088268            /* 8 bit SCI */
+# define SCSPTR6 0x00088270            /* 8 bit SCI */
+# define SCSCR_INIT(port)      0x38    /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
 #else
 # error CPU subtype not defined
 #endif
@@ -299,6 +309,8 @@ struct uart_port {
                ((port)->type == PORT_SCI) ? 0x00               : SCIF_BRK)
 #define SCxSR_ORER(port)\
                (((port)->type == PORT_SCI) ? SCI_ORER  : SCIF_ORER)
+#define SCxSR_TXRDY(port)\
+               (((port)->type == PORT_SCI) ? SCI_TDRE  : SCIF_TEND)
 
 #if defined(CONFIG_CPU_SH7705) || \
        defined(CONFIG_CPU_SH7720) || \
@@ -369,7 +381,7 @@ static inline void sci_##name##_out(struct uart_port *port,\
 
 #ifdef CONFIG_H8300
 /* h8300 don't have SCIF */
-#define CPU_SCIF_FNS(name)                                             \
+#define CPU_SCIF_FNS(name, scif_offset, scif_size)                     \
        static inline unsigned int sci_##name##_in(struct uart_port *port) {\
                return 0;\
        }\
@@ -437,7 +449,7 @@ static inline void sci_##name##_out(struct uart_port *port,\
                                sh4_scif_offset, sh4_scif_size) \
        CPU_SCIF_FNS(name, sh3_scif_offset, sh3_scif_size)
 #endif
-#elif defined(__H8300H__) || defined(__H8300S__)
+#elif defined(CONFIG_H8300) || defined(CONFIG_RX)
 #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size,\
                                sh4_sci_offset, sh4_sci_size, \
                                sh3_scif_offset, sh3_scif_size,\
@@ -446,7 +458,7 @@ static inline void sci_##name##_out(struct uart_port *port,\
        CPU_SCI_FNS(name, h8_sci_offset, h8_sci_size)
 #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size,\
                                        sh4_scif_offset, sh4_scif_size) \
-       CPU_SCIF_FNS(name)
+       CPU_SCIF_FNS(name, 0, 0)
 #elif defined(CONFIG_CPU_SH7723) || defined(CONFIG_CPU_SH7724)
                #define SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size,\
                                        sh4_scif_offset, sh4_scif_size) \
@@ -512,6 +524,13 @@ SCIF_FNS(SCFER,  0x10, 16)
 SCIF_FNS(SCFCR,  0x18, 16)
 SCIF_FNS(SCFDR,  0x1c, 16)
 SCIF_FNS(SCLSR,  0x24, 16)
+#elif defined(CONFIG_CPU_RX610)
+SCIx_FNS(SCSMR,  0x00,  8, 0x00,  8, 0x00,  8, 0x00, 16, 0x00,  8)
+SCIx_FNS(SCBRR,  0x02,  8, 0x04,  8, 0x02,  8, 0x04,  8, 0x01,  8)
+SCIx_FNS(SCxTDR, 0x06,  8, 0x0c,  8, 0x06,  8, 0x0C,  8, 0x03,  8)
+SCIx_FNS(SCxRDR, 0x0a,  8, 0x14,  8, 0x0A,  8, 0x14,  8, 0x05,  8)
+SCIF_FNS(SCFCR,                      0x0c,  8, 0x18, 16)
+SCIF_FNS(SCLSR,                                0,  0, 0x28, 16)
 #else
 /*      reg      SCI/SH3   SCI/SH4  SCIF/SH3   SCIF/SH4  SCI/H8*/
 /*      name     off  sz   off  sz   off  sz   off  sz   off  sz*/
@@ -552,48 +571,6 @@ SCIF_FNS(SCLSR,                         0,  0, 0x24, 16)
 #define sci_in(port, reg) sci_##reg##_in(port)
 #define sci_out(port, reg, value) sci_##reg##_out(port, value)
 
-/* H8/300 series SCI pins assignment */
-#if defined(__H8300H__) || defined(__H8300S__)
-static const struct __attribute__((packed)) {
-       int port;             /* GPIO port no */
-       unsigned short rx, tx; /* GPIO bit no */
-} h8300_sci_pins[] = {
-#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
-       {    /* SCI0 */
-               .port = H8300_GPIO_P9,
-               .rx   = H8300_GPIO_B2,
-               .tx   = H8300_GPIO_B0,
-       },
-       {    /* SCI1 */
-               .port = H8300_GPIO_P9,
-               .rx   = H8300_GPIO_B3,
-               .tx   = H8300_GPIO_B1,
-       },
-       {    /* SCI2 */
-               .port = H8300_GPIO_PB,
-               .rx   = H8300_GPIO_B7,
-               .tx   = H8300_GPIO_B6,
-       }
-#elif defined(CONFIG_H8S2678)
-       {    /* SCI0 */
-               .port = H8300_GPIO_P3,
-               .rx   = H8300_GPIO_B2,
-               .tx   = H8300_GPIO_B0,
-       },
-       {    /* SCI1 */
-               .port = H8300_GPIO_P3,
-               .rx   = H8300_GPIO_B3,
-               .tx   = H8300_GPIO_B1,
-       },
-       {    /* SCI2 */
-               .port = H8300_GPIO_P5,
-               .rx   = H8300_GPIO_B1,
-               .tx   = H8300_GPIO_B0,
-       }
-#endif
-};
-#endif
-
 #if defined(CONFIG_CPU_SH7706) || \
        defined(CONFIG_CPU_SH7707) || \
        defined(CONFIG_CPU_SH7708) || \
@@ -616,12 +593,6 @@ static inline int sci_rxd_in(struct uart_port *port)
                return __raw_readb(SCSPTR1)&0x01 ? 1 : 0; /* SCI */
        return 1;
 }
-#elif defined(__H8300H__) || defined(__H8300S__)
-static inline int sci_rxd_in(struct uart_port *port)
-{
-       int ch = (port->mapbase - SMR0) >> 3;
-       return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0;
-}
 #else /* default case for non-SCI processors */
 static inline int sci_rxd_in(struct uart_port *port)
 {
@@ -683,8 +654,6 @@ static inline int scbrr_calc(struct uart_port port, int 
bps, int clk)
                return ((clk*2)+16*bps)/(16*bps)-1;
 }
 #define SCBRR_VALUE(bps, clk) scbrr_calc(sh_sci, bps, clk)
-#elif defined(__H8300H__) || defined(__H8300S__)
-#define SCBRR_VALUE(bps, clk) (((clk*1000/32)/bps)-1)
 #else /* Generic SH */
 #define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
 #endif
-- 
1.7.2.3


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to