Skip to contentSkip to conversation

Add poll_get_char & poll_put_char to uart_ops for the samsung UARTS.

PATCH In review Julien Pichon 4 participants 6 messages Feb 12, 2012 – Sep 22, 2012 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Add poll_get_char & poll_put_char to uart_ops for the samsung UARTS.

(please CC me in your replies as I am not suscribed to the ML)

The following patch allows users to use KGDB over serial console on board based on Samsung SOC. It has been tested on a mini2440.

---
 drivers/tty/serial/samsung.c |   50 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+), 0 deletions(-)
drivers/tty/serial/samsung.c +50 -0
index f96f37b..9f703ca 100644
@@ -877,11 +877,24 @@ s3c24xx_serial_verify_port(struct uart_port *port, struct serial_struct *ser)
 
 static struct console s3c24xx_serial_console;
 
+static int __init s3c24xx_serial_console_init(void)
+{
+	register_console(&s3c24xx_serial_console);
+	return 0;
+}
+console_initcall(s3c24xx_serial_console_init);
+
 #define S3C24XX_SERIAL_CONSOLE &s3c24xx_serial_console
 #else
 #define S3C24XX_SERIAL_CONSOLE NULL
 #endif
 
+#ifdef CONFIG_CONSOLE_POLL
+static int s3c24xx_serial_get_poll_char(struct uart_port *port);
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+			 unsigned char c);
+#endif
+
 static struct uart_ops s3c24xx_serial_ops = {
 	.pm		= s3c24xx_serial_pm,
 	.tx_empty	= s3c24xx_serial_tx_empty,
@@ -900,6 +913,10 @@ static struct uart_ops s3c24xx_serial_ops = {
 	.request_port	= s3c24xx_serial_request_port,
 	.config_port	= s3c24xx_serial_config_port,
 	.verify_port	= s3c24xx_serial_verify_port,
+#ifdef CONFIG_CONSOLE_POLL
+	.poll_get_char = s3c24xx_serial_get_poll_char,
+	.poll_put_char = s3c24xx_serial_put_poll_char,
+#endif
 };
 
 static struct uart_driver s3c24xx_uart_drv = {
@@ -1311,6 +1328,39 @@ s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon)
 	return (utrstat & S3C2410_UTRSTAT_TXE) ? 1 : 0;
 }
 
+#ifdef CONFIG_CONSOLE_POLL
+/*
+ * Console polling routines for writing and reading from the uart while
+ * in an interrupt or debug context.
+ */
+
+static int s3c24xx_serial_get_poll_char(struct uart_port *port)
+{
+	struct s3c24xx_uart_port *ourport = to_ourport(port);
+	unsigned int ufstat, count;
+
+	do {
+		ufstat = rd_regl(port, S3C2410_UFSTAT);
+		count = s3c24xx_serial_rx_fifocnt(ourport, ufstat);
+		if (!count)
+			cpu_relax();
+	} while (!count);
+
+	return rd_regb(port, S3C2410_URXH);
+}
+
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+		unsigned char c)
+{
+	unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
+
+	while (!s3c24xx_serial_console_txrdy(port, ufcon))
+		cpu_relax();
+	wr_regb(cons_uart, S3C2410_UTXH, c);
+}
+
+#endif /* CONFIG_CONSOLE_POLL */
+
 static void
 s3c24xx_serial_console_putchar(struct uart_port *port, int ch)
 {
Signature · 1 line
1.7.2.5

A message that is not in the archive (sent off-list or not yet received): CAHQa92X=9kiVhxCspcAR+dK-NbFqaUW2xTCjjDOAHGfDx_yMBQ@mail.gmail.com

#2 lore raw
Quoted 87 lines

(please CC me in your replies as I am not suscribed to the ML)

The following patch allows users to use KGDB over serial console on board based on Samsung SOC. It has been tested on a mini2440.

---
 drivers/tty/serial/samsung.c |   50 ++++++++++++++++++++++++++++++++++++++++++

 1 files changed, 50 insertions(+), 0 deletions(-)
drivers/tty/serial/samsung.c +50 -0
index f96f37b..9f703ca 100644
@@ -877,11 +877,24 @@ s3c24xx_serial_verify_port(struct uart_port *port, struct serial_struct *ser)
 
  static struct console s3c24xx_serial_console;
 
+static int __init s3c24xx_serial_console_init(void)
+{
+     register_console(&s3c24xx_serial_console);
+     return 0;
+}
+console_initcall(s3c24xx_serial_console_init);
+
  #define S3C24XX_SERIAL_CONSOLE &s3c24xx_serial_console
  #else
  #define S3C24XX_SERIAL_CONSOLE NULL
  #endif
 
+#ifdef CONFIG_CONSOLE_POLL
+static int s3c24xx_serial_get_poll_char(struct uart_port *port);
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+                      unsigned char c);
+#endif
+
  static struct uart_ops s3c24xx_serial_ops = {
       .pm             = s3c24xx_serial_pm,
       .tx_empty       = s3c24xx_serial_tx_empty,
@@ -900,6 +913,10 @@ static struct uart_ops s3c24xx_serial_ops = {
       .request_port   = s3c24xx_serial_request_port,
       .config_port    = s3c24xx_serial_config_port,
       .verify_port    = s3c24xx_serial_verify_port,
+#ifdef CONFIG_CONSOLE_POLL
+     .poll_get_char = s3c24xx_serial_get_poll_char,
+     .poll_put_char = s3c24xx_serial_put_poll_char,
+#endif
  };
 
  static struct uart_driver s3c24xx_uart_drv = {
@@ -1311,6 +1328,39 @@ s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon)
       return (utrstat & S3C2410_UTRSTAT_TXE) ? 1 : 0;
  }
 
+#ifdef CONFIG_CONSOLE_POLL
+/*
+ * Console polling routines for writing and reading from the uart while
+ * in an interrupt or debug context.
+ */
+
+static int s3c24xx_serial_get_poll_char(struct uart_port *port)
+{
+     struct s3c24xx_uart_port *ourport = to_ourport(port);
+     unsigned int ufstat, count;
+
+     do {
+             ufstat = rd_regl(port, S3C2410_UFSTAT);
+             count = s3c24xx_serial_rx_fifocnt(ourport, ufstat);
+             if (!count)
+                     cpu_relax();
+     } while (!count);
+
+     return rd_regb(port, S3C2410_URXH);
+}
+
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+             unsigned char c)
+{
+     unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
+
+     while (!s3c24xx_serial_console_txrdy(port, ufcon))
+             cpu_relax();
+     wr_regb(cons_uart, S3C2410_UTXH, c);
+}
+
+#endif /* CONFIG_CONSOLE_POLL */
+
Quoted 7 lines

 static void
 s3c24xx_serial_console_putchar(struct uart_port *port, int ch) {
--
1.7.2.5

(CC maintainers)
Someone has time to review this patch ?

#3 lore raw

PATCH 1/1 Add poll_get_char & poll_put_char to uart_ops for the samsung UARTS.

Am Samstag 25 Februar 2012, 12:05:56 schrieb Pichon Julien:

Quoted 90 lines
Quoted 90 lines

(please CC me in your replies as I am not suscribed to the ML)

The following patch allows users to use KGDB over serial console on board based on Samsung SOC. It has been tested on a mini2440.

---
 drivers/tty/serial/samsung.c |   50

++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 50 insertions(+), 0 deletions(-)

drivers/tty/serial/samsung.c +13 -0
index f96f37b..9f703ca 100644
@@ -877,11 +877,24 @@ s3c24xx_serial_verify_port(struct uart_port *port,
 struct serial_struct *ser)
 
 static struct console s3c24xx_serial_console;
 
+static int __init s3c24xx_serial_console_init(void)
+{
+     register_console(&s3c24xx_serial_console);
+     return 0;
+}
+console_initcall(s3c24xx_serial_console_init);
+
 #define S3C24XX_SERIAL_CONSOLE &s3c24xx_serial_console
 #else
 #define S3C24XX_SERIAL_CONSOLE NULL
 #endif
 
+#ifdef CONFIG_CONSOLE_POLL
+static int s3c24xx_serial_get_poll_char(struct uart_port *port);
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+                      unsigned char c);
+#endif
+
 static struct uart_ops s3c24xx_serial_ops = {
      .pm             = s3c24xx_serial_pm,

.tx_empty = s3c24xx_serial_tx_empty,

drivers/tty/serial/samsung.c +37 -0
@@ -900,6 +913,10 @@ static struct uart_ops s3c24xx_serial_ops = {
      .request_port   = s3c24xx_serial_request_port,
      .config_port    = s3c24xx_serial_config_port,
      .verify_port    = s3c24xx_serial_verify_port,
+#ifdef CONFIG_CONSOLE_POLL
+     .poll_get_char = s3c24xx_serial_get_poll_char,
+     .poll_put_char = s3c24xx_serial_put_poll_char,
+#endif
 };
 
 static struct uart_driver s3c24xx_uart_drv = {
@@ -1311,6 +1328,39 @@ s3c24xx_serial_console_txrdy(struct uart_port
 *port, unsigned int ufcon) return (utrstat & S3C2410_UTRSTAT_TXE) ? 1 :
 0;
 }
 
+#ifdef CONFIG_CONSOLE_POLL
+/*
+ * Console polling routines for writing and reading from the uart while
+ * in an interrupt or debug context.
+ */
+
+static int s3c24xx_serial_get_poll_char(struct uart_port *port)
+{
+     struct s3c24xx_uart_port *ourport = to_ourport(port);
+     unsigned int ufstat, count;
+
+     do {
+             ufstat = rd_regl(port, S3C2410_UFSTAT);
+             count = s3c24xx_serial_rx_fifocnt(ourport, ufstat);
+             if (!count)
+                     cpu_relax();
+     } while (!count);
+
+     return rd_regb(port, S3C2410_URXH);
+}
+
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+             unsigned char c)
+{
+     unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
+
+     while (!s3c24xx_serial_console_txrdy(port, ufcon))
+             cpu_relax();
+     wr_regb(cons_uart, S3C2410_UTXH, c);
+}
+
+#endif /* CONFIG_CONSOLE_POLL */
+
Quoted 8 lines
Quoted 5 lines
drivers/tty/serial/samsung.c +0 -0
 static void
 s3c24xx_serial_console_putchar(struct uart_port *port, int ch)

{
--
1.7.2.5

(CC maintainers)
Someone has time to review this patch ?

It might be goot to included the linux-arm-kernel list to get a wider audience. I always felt, that the samsung ml isn't read by many.

Heiko

#4 lore raw

PATCH 1/1 Add poll_get_char & poll_put_char to uart_ops for the samsung UARTS.

Quoted 2 lines

It might be goot to included the linux-arm-kernel list to get a wider audience. I always felt, that the samsung ml isn't read by many.

Why not the linux-serial mailing list?
I sent a patch there and it was accepted in Greg Kroah-Hartman's tree really fast(it didn't hit linux-next yet tough).

Denis.

Tested-by on v1 1/1
#5 lore raw
In reply to Julien Pichon

Hi Julien,

Quoted 2 lines

The following patch allows users to use KGDB over serial console on board based on Samsung SOC. It has been tested on a mini2440.

(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0 kgdb_breakpoint () at kernel/debug/debug_core.c:959
959 arch_kgdb_breakpoint();

It works on a gta02 machine too...

Thanks a lot for working on that, it will help me a lot for continuing to fix things in mainline for gta02, It already was very usefull with debugging an alsa problem.

Denis.

#6 lore raw

PATCH 1/1 serial: samsung: Add poll_get_char & poll_put_char

In reply to Julien Pichon

From: Julien Pichon <[email protected]>

The following patch allows users to use KGDB over serial console on board based on Samsung SOC. It has been tested on a board using exynos5.

(dianders changed poll to return NO_POLL_CHAR, which appears to fix 'help' in kgdb; also updated commit message)
---
This is pulled from an email on <[email protected]> from Feb 18, 2012. It's never landed anywhere. I've made a small modification that make it so that kgdb's "help" doesn't crash.

See: http://comments.gmane.org/gmane.linux.kernel.samsung-soc/9477

 drivers/tty/serial/samsung.c |   47 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)
drivers/tty/serial/samsung.c +47 -0
index 8eef114..7f04717 100644
@@ -876,11 +876,24 @@ s3c24xx_serial_verify_port(struct uart_port *port, struct serial_struct *ser)
 
 static struct console s3c24xx_serial_console;
 
+static int __init s3c24xx_serial_console_init(void)
+{
+	register_console(&s3c24xx_serial_console);
+	return 0;
+}
+console_initcall(s3c24xx_serial_console_init);
+
 #define S3C24XX_SERIAL_CONSOLE &s3c24xx_serial_console
 #else
 #define S3C24XX_SERIAL_CONSOLE NULL
 #endif
 
+#ifdef CONFIG_CONSOLE_POLL
+static int s3c24xx_serial_get_poll_char(struct uart_port *port);
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+			 unsigned char c);
+#endif
+
 static struct uart_ops s3c24xx_serial_ops = {
 	.pm		= s3c24xx_serial_pm,
 	.tx_empty	= s3c24xx_serial_tx_empty,
@@ -899,6 +912,10 @@ static struct uart_ops s3c24xx_serial_ops = {
 	.request_port	= s3c24xx_serial_request_port,
 	.config_port	= s3c24xx_serial_config_port,
 	.verify_port	= s3c24xx_serial_verify_port,
+#ifdef CONFIG_CONSOLE_POLL
+	.poll_get_char = s3c24xx_serial_get_poll_char,
+	.poll_put_char = s3c24xx_serial_put_poll_char,
+#endif
 };
 
 static struct uart_driver s3c24xx_uart_drv = {
@@ -1316,6 +1333,36 @@ s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon)
 	return (utrstat & S3C2410_UTRSTAT_TXE) ? 1 : 0;
 }
 
+#ifdef CONFIG_CONSOLE_POLL
+/*
+ * Console polling routines for writing and reading from the uart while
+ * in an interrupt or debug context.
+ */
+
+static int s3c24xx_serial_get_poll_char(struct uart_port *port)
+{
+	struct s3c24xx_uart_port *ourport = to_ourport(port);
+	unsigned int ufstat;
+
+	ufstat = rd_regl(port, S3C2410_UFSTAT);
+	if (s3c24xx_serial_rx_fifocnt(ourport, ufstat) == 0)
+		return NO_POLL_CHAR;
+
+	return rd_regb(port, S3C2410_URXH);
+}
+
+static void s3c24xx_serial_put_poll_char(struct uart_port *port,
+		unsigned char c)
+{
+	unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
+
+	while (!s3c24xx_serial_console_txrdy(port, ufcon))
+		cpu_relax();
+	wr_regb(cons_uart, S3C2410_UTXH, c);
+}
+
+#endif /* CONFIG_CONSOLE_POLL */
+
 static void
 s3c24xx_serial_console_putchar(struct uart_port *port, int ch)
 {
Signature · 1 line
1.7.7.3