imx: move serial driver to drivers/serial
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Mon, 30 Mar 2009 16:58:38 +0000 (18:58 +0200)
committerJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Mon, 30 Mar 2009 16:58:38 +0000 (18:58 +0200)
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
cpu/arm920t/imx/Makefile
cpu/arm920t/imx/serial.c [deleted file]
drivers/serial/Makefile
drivers/serial/serial_imx.c [new file with mode: 0644]
include/configs/mx1ads.h
include/configs/mx1fs2.h
include/configs/scb9328.h

index 9207ec1bcb33b06ade146a222778816d991642ed..d3352deb4b67539c08b2666824885159de2ad9ff 100644 (file)
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(SOC).a
 
-COBJS  = generic.o interrupts.o serial.o speed.o
+COBJS  = generic.o interrupts.o speed.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
diff --git a/cpu/arm920t/imx/serial.c b/cpu/arm920t/imx/serial.c
deleted file mode 100644 (file)
index 85f1167..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * (c) 2004 Sascha Hauer <sascha@saschahauer.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include <common.h>
-#if defined (CONFIG_IMX)
-
-#include <asm/arch/imx-regs.h>
-
-#ifndef CONFIG_IMX_SERIAL_NONE
-
-#if defined CONFIG_IMX_SERIAL1
-#define UART_BASE IMX_UART1_BASE
-#elif defined CONFIG_IMX_SERIAL2
-#define UART_BASE IMX_UART2_BASE
-#else
-#error "define CONFIG_IMX_SERIAL1, CONFIG_IMX_SERIAL2 or CONFIG_IMX_SERIAL_NONE"
-#endif
-
-struct imx_serial {
-       volatile uint32_t urxd[16];
-       volatile uint32_t utxd[16];
-       volatile uint32_t ucr1;
-       volatile uint32_t ucr2;
-       volatile uint32_t ucr3;
-       volatile uint32_t ucr4;
-       volatile uint32_t ufcr;
-       volatile uint32_t usr1;
-       volatile uint32_t usr2;
-       volatile uint32_t uesc;
-       volatile uint32_t utim;
-       volatile uint32_t ubir;
-       volatile uint32_t ubmr;
-       volatile uint32_t ubrc;
-       volatile uint32_t bipr[4];
-       volatile uint32_t bmpr[4];
-       volatile uint32_t uts;
-};
-
-DECLARE_GLOBAL_DATA_PTR;
-
-void serial_setbrg (void)
-{
-       serial_init();
-}
-
-extern void imx_gpio_mode(int gpio_mode);
-
-/*
- * Initialise the serial port with the given baudrate. The settings
- * are always 8 data bits, no parity, 1 stop bit, no start bits.
- *
- */
-int serial_init (void)
-{
-       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
-       unsigned int ufcr_rfdiv;
-       unsigned int refclk;
-
-#ifdef CONFIG_IMX_SERIAL1
-       imx_gpio_mode(PC11_PF_UART1_TXD);
-       imx_gpio_mode(PC12_PF_UART1_RXD);
-#else
-       imx_gpio_mode(PB30_PF_UART2_TXD);
-       imx_gpio_mode(PB31_PF_UART2_RXD);
-#endif
-
-       /* Disable UART */
-       base->ucr1 &= ~UCR1_UARTEN;
-
-       /* Set to default POR state */
-
-       base->ucr1 = 0x00000004;
-       base->ucr2 = 0x00000000;
-       base->ucr3 = 0x00000000;
-       base->ucr4 = 0x00008040;
-       base->uesc = 0x0000002B;
-       base->utim = 0x00000000;
-       base->ubir = 0x00000000;
-       base->ubmr = 0x00000000;
-       base->uts  = 0x00000000;
-       /* Set clocks */
-       base->ucr4 |= UCR4_REF16;
-
-       /* Configure FIFOs */
-       base->ufcr = 0xa81;
-
-       /* set the baud rate.
-        *
-        * baud * 16   x
-        * --------- = -
-        *  refclk     y
-        *
-        * x - 1 = UBIR
-        * y - 1 = UBMR
-        *
-        * each register is 16 bits wide. refclk max is 96 MHz
-        *
-        */
-
-       ufcr_rfdiv = ((base->ufcr) & UFCR_RFDIV) >> 7;
-       if (ufcr_rfdiv == 6)
-               ufcr_rfdiv = 7;
-       else
-               ufcr_rfdiv = 6 - ufcr_rfdiv;
-
-       refclk = get_PERCLK1();
-       refclk /= ufcr_rfdiv;
-
-       /* Set the numerator value minus one of the BRM ratio */
-       base->ubir = (gd->baudrate / 100) - 1;
-
-       /* Set the denominator value minus one of the BRM ratio */
-       base->ubmr = (refclk/(16 * 100)) - 1;
-
-       /* Set to 8N1 */
-       base->ucr2 &= ~UCR2_PREN;
-       base->ucr2 |= UCR2_WS;
-       base->ucr2 &= ~UCR2_STPB;
-
-       /* Ignore RTS */
-       base->ucr2 |= UCR2_IRTS;
-
-       /* Enable UART */
-       base->ucr1 |= UCR1_UARTEN | UCR1_UARTCLKEN;
-
-       /* Enable FIFOs */
-       base->ucr2 |= UCR2_SRST | UCR2_RXEN | UCR2_TXEN;
-
-       /* Clear status flags */
-       base->usr2 |= USR2_ADET  |
-                     USR2_DTRF  |
-                     USR2_IDLE  |
-                     USR2_IRINT |
-                     USR2_WAKE  |
-                     USR2_RTSF  |
-                     USR2_BRCD  |
-                     USR2_ORE;
-
-       /* Clear status flags */
-       base->usr1 |= USR1_PARITYERR |
-                     USR1_RTSD      |
-                     USR1_ESCF      |
-                     USR1_FRAMERR   |
-                     USR1_AIRINT    |
-                     USR1_AWAKE;
-       return (0);
-}
-
-/*
- * Read a single byte from the serial port. Returns 1 on success, 0
- * otherwise. When the function is successful, the character read is
- * written into its argument c.
- */
-int serial_getc (void)
-{
-       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
-       unsigned char ch;
-
-       while(base->uts & UTS_RXEMPTY);
-
-       ch = (char)base->urxd[0];
-
-       return ch;
-}
-
-#ifdef CONFIG_HWFLOW
-static int hwflow = 0; /* turned off by default */
-int hwflow_onoff(int on)
-{
-}
-#endif
-
-/*
- * Output a single byte to the serial port.
- */
-void serial_putc (const char c)
-{
-       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
-
-       /* Wait for Tx FIFO not full */
-       while (base->uts & UTS_TXFULL);
-
-       base->utxd[0] = c;
-
-       /* If \n, also do \r */
-       if (c == '\n')
-               serial_putc ('\r');
-}
-
-/*
- * Test whether a character is in the RX buffer
- */
-int serial_tstc (void)
-{
-       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
-
-       /* If receive fifo is empty, return false */
-       if (base->uts & UTS_RXEMPTY)
-               return 0;
-       return 1;
-}
-
-void
-serial_puts (const char *s)
-{
-       while (*s) {
-               serial_putc (*s++);
-       }
-}
-#endif /* CONFIG_IMX_SERIAL_NONE */
-#endif /* defined CONFIG_IMX */
index 6ab847f00f858b44695cf59438c4f7cc60f6829a..705ae473b9c4ee64701ffd9946b4f1c7518e99e0 100644 (file)
@@ -34,6 +34,7 @@ COBJS-$(CONFIG_DRIVER_S3C4510_UART) += s3c4510b_uart.o
 COBJS-$(CONFIG_S3C64XX) += s3c64xx.o
 COBJS-$(CONFIG_SYS_NS16550_SERIAL) += serial.o
 COBJS-$(CONFIG_CLPS7111_SERIAL) += serial_clps7111.o
+COBJS-$(CONFIG_IMX_SERIAL) += serial_imx.o
 COBJS-$(CONFIG_IXP_SERIAL) += serial_ixp.o
 COBJS-$(CONFIG_KS8695_SERIAL) += serial_ks8695.o
 COBJS-$(CONFIG_LPC2292_SERIAL) += serial_lpc2292.o
diff --git a/drivers/serial/serial_imx.c b/drivers/serial/serial_imx.c
new file mode 100644 (file)
index 0000000..b9ca748
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * (c) 2004 Sascha Hauer <sascha@saschahauer.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <common.h>
+#include <asm/arch/imx-regs.h>
+
+#if defined CONFIG_IMX_SERIAL1
+#define UART_BASE IMX_UART1_BASE
+#elif defined CONFIG_IMX_SERIAL2
+#define UART_BASE IMX_UART2_BASE
+#else
+#error "define CONFIG_IMX_SERIAL1, CONFIG_IMX_SERIAL2 or CONFIG_IMX_SERIAL_NONE"
+#endif
+
+struct imx_serial {
+       volatile uint32_t urxd[16];
+       volatile uint32_t utxd[16];
+       volatile uint32_t ucr1;
+       volatile uint32_t ucr2;
+       volatile uint32_t ucr3;
+       volatile uint32_t ucr4;
+       volatile uint32_t ufcr;
+       volatile uint32_t usr1;
+       volatile uint32_t usr2;
+       volatile uint32_t uesc;
+       volatile uint32_t utim;
+       volatile uint32_t ubir;
+       volatile uint32_t ubmr;
+       volatile uint32_t ubrc;
+       volatile uint32_t bipr[4];
+       volatile uint32_t bmpr[4];
+       volatile uint32_t uts;
+};
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void serial_setbrg (void)
+{
+       serial_init();
+}
+
+extern void imx_gpio_mode(int gpio_mode);
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ *
+ */
+int serial_init (void)
+{
+       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
+       unsigned int ufcr_rfdiv;
+       unsigned int refclk;
+
+#ifdef CONFIG_IMX_SERIAL1
+       imx_gpio_mode(PC11_PF_UART1_TXD);
+       imx_gpio_mode(PC12_PF_UART1_RXD);
+#else
+       imx_gpio_mode(PB30_PF_UART2_TXD);
+       imx_gpio_mode(PB31_PF_UART2_RXD);
+#endif
+
+       /* Disable UART */
+       base->ucr1 &= ~UCR1_UARTEN;
+
+       /* Set to default POR state */
+
+       base->ucr1 = 0x00000004;
+       base->ucr2 = 0x00000000;
+       base->ucr3 = 0x00000000;
+       base->ucr4 = 0x00008040;
+       base->uesc = 0x0000002B;
+       base->utim = 0x00000000;
+       base->ubir = 0x00000000;
+       base->ubmr = 0x00000000;
+       base->uts  = 0x00000000;
+       /* Set clocks */
+       base->ucr4 |= UCR4_REF16;
+
+       /* Configure FIFOs */
+       base->ufcr = 0xa81;
+
+       /* set the baud rate.
+        *
+        * baud * 16   x
+        * --------- = -
+        *  refclk     y
+        *
+        * x - 1 = UBIR
+        * y - 1 = UBMR
+        *
+        * each register is 16 bits wide. refclk max is 96 MHz
+        *
+        */
+
+       ufcr_rfdiv = ((base->ufcr) & UFCR_RFDIV) >> 7;
+       if (ufcr_rfdiv == 6)
+               ufcr_rfdiv = 7;
+       else
+               ufcr_rfdiv = 6 - ufcr_rfdiv;
+
+       refclk = get_PERCLK1();
+       refclk /= ufcr_rfdiv;
+
+       /* Set the numerator value minus one of the BRM ratio */
+       base->ubir = (gd->baudrate / 100) - 1;
+
+       /* Set the denominator value minus one of the BRM ratio */
+       base->ubmr = (refclk/(16 * 100)) - 1;
+
+       /* Set to 8N1 */
+       base->ucr2 &= ~UCR2_PREN;
+       base->ucr2 |= UCR2_WS;
+       base->ucr2 &= ~UCR2_STPB;
+
+       /* Ignore RTS */
+       base->ucr2 |= UCR2_IRTS;
+
+       /* Enable UART */
+       base->ucr1 |= UCR1_UARTEN | UCR1_UARTCLKEN;
+
+       /* Enable FIFOs */
+       base->ucr2 |= UCR2_SRST | UCR2_RXEN | UCR2_TXEN;
+
+       /* Clear status flags */
+       base->usr2 |= USR2_ADET  |
+                     USR2_DTRF  |
+                     USR2_IDLE  |
+                     USR2_IRINT |
+                     USR2_WAKE  |
+                     USR2_RTSF  |
+                     USR2_BRCD  |
+                     USR2_ORE;
+
+       /* Clear status flags */
+       base->usr1 |= USR1_PARITYERR |
+                     USR1_RTSD      |
+                     USR1_ESCF      |
+                     USR1_FRAMERR   |
+                     USR1_AIRINT    |
+                     USR1_AWAKE;
+       return (0);
+}
+
+/*
+ * Read a single byte from the serial port. Returns 1 on success, 0
+ * otherwise. When the function is successful, the character read is
+ * written into its argument c.
+ */
+int serial_getc (void)
+{
+       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
+       unsigned char ch;
+
+       while(base->uts & UTS_RXEMPTY);
+
+       ch = (char)base->urxd[0];
+
+       return ch;
+}
+
+#ifdef CONFIG_HWFLOW
+static int hwflow = 0; /* turned off by default */
+int hwflow_onoff(int on)
+{
+}
+#endif
+
+/*
+ * Output a single byte to the serial port.
+ */
+void serial_putc (const char c)
+{
+       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
+
+       /* Wait for Tx FIFO not full */
+       while (base->uts & UTS_TXFULL);
+
+       base->utxd[0] = c;
+
+       /* If \n, also do \r */
+       if (c == '\n')
+               serial_putc ('\r');
+}
+
+/*
+ * Test whether a character is in the RX buffer
+ */
+int serial_tstc (void)
+{
+       volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
+
+       /* If receive fifo is empty, return false */
+       if (base->uts & UTS_RXEMPTY)
+               return 0;
+       return 1;
+}
+
+void
+serial_puts (const char *s)
+{
+       while (*s) {
+               serial_putc (*s++);
+       }
+}
index c3812e6c326480c4dbde0191e58f7db98bb5bbb8..12e567bf7d4f4ca1893022685ee467e4aaf430ab 100644 (file)
@@ -40,6 +40,7 @@
 /*
  * Select serial console configuration
   */
+#define CONFIG_IMX_SERIAL
 #define CONFIG_IMX_SERIAL1             /* internal uart 1 */
 /* #define _CONFIG_UART2 */            /* internal uart 2 */
 /* #define CONFIG_SILENT_CONSOLE */    /* use this to disable output */
index b174b5fdf551b394081753d4604d2e6d1b26959f..431e6695e325b6d5beee2cb5c667d50ec274ef6d 100644 (file)
    0x000b00b ->3<- -> 64MHz/4=16MHz */
 
 #ifdef _CONFIG_UART1
+#define CONFIG_IMX_SERIAL
 #define CONFIG_IMX_SERIAL1
 #elif defined _CONFIG_UART2
+#define CONFIG_IMX_SERIAL
 #define CONFIG_IMX_SERIAL2
 #elif defined _CONFIG_UART3 | defined _CONFIG_UART4
-#define CONFIG_IMX_SERIAL_NONE
 #define CONFIG_SYS_NS16550
 #define CONFIG_SYS_NS16550_SERIAL
 #define CONFIG_SYS_NS16550_CLK         3686400
index 10db53531b5332793d38b2672369378606a0a7d2..2f166c9d861051881ccc89501fba2d7e29fe027f 100644 (file)
@@ -29,6 +29,7 @@
 #define CONFIG_SCB9328         1     /* on a scb9328tronix board */
 #undef CONFIG_USE_IRQ                /* don't need use IRQ/FIQ    */
 
+#define CONFIG_IMX_SERIAL
 #define CONFIG_IMX_SERIAL1
 /*
  * Select serial console configuration