summaryrefslogtreecommitdiff
path: root/target/linux/s3c24xx/patches/0227-fix-s3c2410-serial-fwd-ref.patch.patch.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/s3c24xx/patches/0227-fix-s3c2410-serial-fwd-ref.patch.patch.patch')
-rwxr-xr-xtarget/linux/s3c24xx/patches/0227-fix-s3c2410-serial-fwd-ref.patch.patch.patch167
1 files changed, 167 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches/0227-fix-s3c2410-serial-fwd-ref.patch.patch.patch b/target/linux/s3c24xx/patches/0227-fix-s3c2410-serial-fwd-ref.patch.patch.patch
new file mode 100755
index 0000000000..ffc521b7ff
--- /dev/null
+++ b/target/linux/s3c24xx/patches/0227-fix-s3c2410-serial-fwd-ref.patch.patch.patch
@@ -0,0 +1,167 @@
+From 0535fda1958587000a4abe711a50d221e0f82379 Mon Sep 17 00:00:00 2001
+From: Andy Green <andy@openmoko.com>
+Date: Fri, 25 Jul 2008 23:16:57 +0100
+Subject: [PATCH] fix-s3c2410-serial-fwd-ref.patch.patch
+
+Signed-off-by: Andy Green <andy@openmoko.com>
+---
+ drivers/serial/s3c2410.c | 129 +++++++++++++++++++++++----------------------
+ 1 files changed, 66 insertions(+), 63 deletions(-)
+
+diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c
+index f20f63b..b4833bd 100644
+--- a/drivers/serial/s3c2410.c
++++ b/drivers/serial/s3c2410.c
+@@ -1167,6 +1167,10 @@ static int s3c24xx_serial_resume(struct platform_device *dev)
+ #define s3c24xx_serial_resume NULL
+ #endif
+
++static void s3c24xx_serial_force_debug_port_up(void);
++static void s3c2410_printascii(const char *sz);
++
++
+ static int s3c24xx_serial_init(struct platform_driver *drv,
+ struct s3c24xx_uart_info *info)
+ {
+@@ -1521,6 +1525,68 @@ static struct platform_driver s3c2440_serial_drv = {
+ };
+
+
++static void s3c24xx_serial_force_debug_port_up(void)
++{
++ struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
++ CONFIG_DEBUG_S3C_UART];
++ struct s3c24xx_uart_clksrc *clksrc = NULL;
++ struct clk *clk = NULL;
++ unsigned long tmp;
++
++ s3c24xx_serial_getclk(&ourport->port, &clksrc, &clk, 115200);
++
++ tmp = __raw_readl(S3C2410_CLKCON);
++
++ /* re-start uart clocks */
++ tmp |= S3C2410_CLKCON_UART0;
++ tmp |= S3C2410_CLKCON_UART1;
++ tmp |= S3C2410_CLKCON_UART2;
++
++ __raw_writel(tmp, S3C2410_CLKCON);
++ udelay(10);
++
++ s3c24xx_serial_setsource(&ourport->port, clksrc);
++
++ if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {
++ clk_disable(ourport->baudclk);
++ ourport->baudclk = NULL;
++ }
++
++ clk_enable(clk);
++
++ ourport->clksrc = clksrc;
++ ourport->baudclk = clk;
++}
++
++static void s3c2410_printascii(const char *sz)
++{
++ struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
++ CONFIG_DEBUG_S3C_UART];
++ struct uart_port *port = &ourport->port;
++
++ /* 8 N 1 */
++ wr_regl(port, S3C2410_ULCON, (rd_regl(port, S3C2410_ULCON)) | 3);
++ /* polling mode */
++ wr_regl(port, S3C2410_UCON, (rd_regl(port, S3C2410_UCON) & ~0xc0f) | 5);
++ /* disable FIFO */
++ wr_regl(port, S3C2410_UFCON, (rd_regl(port, S3C2410_UFCON) & ~0x01));
++ /* fix baud rate */
++ wr_regl(port, S3C2410_UBRDIV, 26);
++
++ while (*sz) {
++ int timeout = 10000000;
++
++ /* spin on it being busy */
++ while ((!(rd_regl(port, S3C2410_UTRSTAT) & 2)) && timeout--)
++ ;
++
++ /* transmit register */
++ wr_regl(port, S3C2410_UTXH, *sz);
++
++ sz++;
++ }
++}
++
+ static inline int s3c2440_serial_init(void)
+ {
+ return s3c24xx_serial_init(&s3c2440_serial_drv, &s3c2440_uart_inf);
+@@ -1654,69 +1720,6 @@ static struct platform_driver s3c2412_serial_drv = {
+ },
+ };
+
+-static void s3c24xx_serial_force_debug_port_up(void)
+-{
+- struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
+- CONFIG_DEBUG_S3C_UART];
+- struct s3c24xx_uart_clksrc *clksrc = NULL;
+- struct clk *clk = NULL;
+- unsigned long tmp;
+-
+- s3c24xx_serial_getclk(&ourport->port, &clksrc, &clk, 115200);
+-
+- tmp = __raw_readl(S3C2410_CLKCON);
+-
+- /* re-start uart clocks */
+- tmp |= S3C2410_CLKCON_UART0;
+- tmp |= S3C2410_CLKCON_UART1;
+- tmp |= S3C2410_CLKCON_UART2;
+-
+- __raw_writel(tmp, S3C2410_CLKCON);
+- udelay(10);
+-
+- s3c24xx_serial_setsource(&ourport->port, clksrc);
+-
+- if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {
+- clk_disable(ourport->baudclk);
+- ourport->baudclk = NULL;
+- }
+-
+- clk_enable(clk);
+-
+- ourport->clksrc = clksrc;
+- ourport->baudclk = clk;
+-}
+-
+-static void s3c2410_printascii(const char *sz)
+-{
+- struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
+- CONFIG_DEBUG_S3C_UART];
+- struct uart_port *port = &ourport->port;
+-
+- /* 8 N 1 */
+- wr_regl(port, S3C2410_ULCON, (rd_regl(port, S3C2410_ULCON)) | 3);
+- /* polling mode */
+- wr_regl(port, S3C2410_UCON, (rd_regl(port, S3C2410_UCON) & ~0xc0f) | 5);
+- /* disable FIFO */
+- wr_regl(port, S3C2410_UFCON, (rd_regl(port, S3C2410_UFCON) & ~0x01));
+- /* fix baud rate */
+- wr_regl(port, S3C2410_UBRDIV, 26);
+-
+- while (*sz) {
+- int timeout = 10000000;
+-
+- /* spin on it being busy */
+- while ((!(rd_regl(port, S3C2410_UTRSTAT) & 2)) && timeout--)
+- ;
+-
+- /* transmit register */
+- wr_regl(port, S3C2410_UTXH, *sz);
+-
+- sz++;
+- }
+-}
+-
+-
+ /* s3c24xx_serial_resetport
+ *
+ * wrapper to call the specific reset for this port (reset the fifos
+--
+1.5.6.3
+