Skip to contentSkip to conversation

serial: samsung: add support for early console

PATCH Superseded Marek Szyprowski 3 participants 5 messages Oct 20, 2014 – Dec 16, 2014

Subsystems (4)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover serial: samsung: add support for early console

This patchset adds support for early console defined in device tree. As an example, DTS files for all Exynos4 based machines are updated with the correct value for common chosen/sdtout property.

To get it fully functional on ARM architecture, additional improvements (support for early_ioremap) are needed in early console code.

Best regards
Marek Szyprowski
Samsung R&D Institute Poland

Change log:

v3:
- rebased onto v3.18-rc1
- removed options from documentation (they are not yet supported)

v2: http://www.spinics.net/lists/linux-samsung-soc/msg37278.html
- added support for command line based initialization

v1: http://www.spinics.net/lists/linux-samsung-soc/msg37094.html
- initial version

Tomasz Figa (2):
serial: samsung: Add support for early console
ARM: dts: exynos4: Add stdout-path properties

 Documentation/kernel-parameters.txt             |  12 +++
 arch/arm/boot/dts/exynos4210-origen.dts         |   1 +
 arch/arm/boot/dts/exynos4210-smdkv310.dts       |   1 +
 arch/arm/boot/dts/exynos4210-trats.dts          |   1 +
 arch/arm/boot/dts/exynos4210-universal_c210.dts |   1 +
 arch/arm/boot/dts/exynos4412-odroid-common.dtsi |   4 +
 arch/arm/boot/dts/exynos4412-origen.dts         |   1 +
 arch/arm/boot/dts/exynos4412-smdk4412.dts       |   1 +
 arch/arm/boot/dts/exynos4412-tiny4412.dts       |   4 +
 arch/arm/boot/dts/exynos4412-trats2.dts         |   1 +
 drivers/tty/serial/Kconfig                      |   1 +
 drivers/tty/serial/samsung.c                    | 103 ++++++++++++++++++++++++
 12 files changed, 131 insertions(+)
Signature · 1 line
1.9.2
#1 lore raw

PATCH v3 1/2 serial: samsung: Add support for early console

From: Tomasz Figa <[email protected]>

This patch adds support for early console initialized from device tree and kernel command line to all variants of Samsung serial driver.

[mszyprow: added support for command line based initialization,
fixed comments, added documentation]

---
 Documentation/kernel-parameters.txt |  12 +++++
 drivers/tty/serial/Kconfig          |   1 +
 drivers/tty/serial/samsung.c        | 103 ++++++++++++++++++++++++++++++++++++
 3 files changed, 116 insertions(+)
Documentation/kernel-parameters.txt +12 -0
index 7dbe5ec9d9cd..24f363108ab3 100644
@@ -961,6 +961,18 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 
 		smh	Use ARM semihosting calls for early console.
 
+		s3c2410,<addr>
+		s3c2412,<addr>
+		s3c2440,<addr>
+		s3c6400,<addr>
+		s5pv210,<addr>
+		exynos4210,<addr>
+			Use early console provided by serial driver available
+			on Samsung SoCs, requires selecting proper type and
+			a correct base address of the selected UART port. The
+			serial port must already be setup and configured.
+			Options are not yet supported.
+
 	earlyprintk=	[X86,SH,BLACKFIN,ARM,M68k]
 			earlyprintk=vga
 			earlyprintk=efi
drivers/tty/serial/Kconfig +1 -0
index 649b784081c7..50997be6cf6d 100644
@@ -241,6 +241,7 @@ config SERIAL_SAMSUNG
 	tristate "Samsung SoC serial support"
 	depends on PLAT_SAMSUNG || ARCH_EXYNOS
 	select SERIAL_CORE
+	select SERIAL_EARLYCON
 	help
 	  Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,
 	  providing /dev/ttySAC0, 1 and 2 (note, some machines may not
drivers/tty/serial/samsung.c +103 -0

109 lines not on this page · raw message

Signature · 1 line
1.9.2
#2 lore raw

PATCH v3 1/2 serial: samsung: Add support for early console

Quoted 11 lines · Marek Szyprowski

From: Tomasz Figa <[email protected]>

This patch adds support for early console initialized from device tree and kernel command line to all variants of Samsung serial driver.

[mszyprow: added support for command line based initialization,
fixed comments, added documentation]

I tested this patchset with Exynos5 SoC.

Thanks,
Chanwoo Choi

Quoted 156 lines
---
 Documentation/kernel-parameters.txt |  12 +++++
 drivers/tty/serial/Kconfig          |   1 +
 drivers/tty/serial/samsung.c        | 103 ++++++++++++++++++++++++++++++++++++
 3 files changed, 116 insertions(+)
Documentation/kernel-parameters.txt +12 -0
index 7dbe5ec9d9cd..24f363108ab3 100644
@@ -961,6 +961,18 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 
 		smh	Use ARM semihosting calls for early console.
 
+		s3c2410,<addr>
+		s3c2412,<addr>
+		s3c2440,<addr>
+		s3c6400,<addr>
+		s5pv210,<addr>
+		exynos4210,<addr>
+			Use early console provided by serial driver available
+			on Samsung SoCs, requires selecting proper type and
+			a correct base address of the selected UART port. The
+			serial port must already be setup and configured.
+			Options are not yet supported.
+
 	earlyprintk=	[X86,SH,BLACKFIN,ARM,M68k]
 			earlyprintk=vga
 			earlyprintk=efi
drivers/tty/serial/Kconfig +1 -0
index 649b784081c7..50997be6cf6d 100644
@@ -241,6 +241,7 @@ config SERIAL_SAMSUNG
 	tristate "Samsung SoC serial support"
 	depends on PLAT_SAMSUNG || ARCH_EXYNOS
 	select SERIAL_CORE
+	select SERIAL_EARLYCON
 	help
 	  Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,
 	  providing /dev/ttySAC0, 1 and 2 (note, some machines may not
drivers/tty/serial/samsung.c +103 -0
index c78f43a481ce..8ad453a5d845 100644
@@ -1856,6 +1856,109 @@ static struct platform_driver samsung_serial_driver = {
 
 module_platform_driver(samsung_serial_driver);
 
+/*
+ * Early console.
+ */
+
+struct samsung_early_console_data {
+	u32 txfull_mask;
+};
+
+static void samsung_early_busyuart(struct uart_port *port)
+{
+	while (!(readl(port->membase + S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXFE))
+		;
+}
+
+static void samsung_early_busyuart_fifo(struct uart_port *port)
+{
+	struct samsung_early_console_data *data = port->private_data;
+
+	while (readl(port->membase + S3C2410_UFSTAT) & data->txfull_mask)
+		;
+}
+
+static void samsung_early_putc(struct uart_port *port, int c)
+{
+	if (readl(port->membase + S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE)
+		samsung_early_busyuart_fifo(port);
+	else
+		samsung_early_busyuart(port);
+
+	writeb(c, port->membase + S3C2410_UTXH);
+}
+
+static void samsung_early_write(struct console *con, const char *s, unsigned n)
+{
+	struct earlycon_device *dev = con->data;
+
+	uart_console_write(&dev->port, s, n, samsung_early_putc);
+}
+
+static int __init samsung_early_console_setup(struct earlycon_device *device,
+					      const char *opt)
+{
+	if (!device->port.membase)
+		return -ENODEV;
+
+	device->con->write = samsung_early_write;
+	return 0;
+}
+
+/* S3C2410 */
+static struct samsung_early_console_data s3c2410_early_console_data = {
+	.txfull_mask = S3C2410_UFSTAT_TXFULL,
+};
+
+static int __init s3c2410_early_console_setup(struct earlycon_device *device,
+					      const char *opt)
+{
+	device->port.private_data = &s3c2410_early_console_data;
+	return samsung_early_console_setup(device, opt);
+}
+OF_EARLYCON_DECLARE(s3c2410, "samsung,s3c2410-uart",
+			s3c2410_early_console_setup);
+EARLYCON_DECLARE(s3c2410, s3c2410_early_console_setup);
+
+/* S3C2412, S3C2440, S3C64xx */
+static struct samsung_early_console_data s3c2440_early_console_data = {
+	.txfull_mask = S3C2440_UFSTAT_TXFULL,
+};
+
+static int __init s3c2440_early_console_setup(struct earlycon_device *device,
+					      const char *opt)
+{
+	device->port.private_data = &s3c2440_early_console_data;
+	return samsung_early_console_setup(device, opt);
+}
+OF_EARLYCON_DECLARE(s3c2412, "samsung,s3c2412-uart",
+			s3c2440_early_console_setup);
+OF_EARLYCON_DECLARE(s3c2440, "samsung,s3c2440-uart",
+			s3c2440_early_console_setup);
+OF_EARLYCON_DECLARE(s3c6400, "samsung,s3c6400-uart",
+			s3c2440_early_console_setup);
+EARLYCON_DECLARE(s3c2412, s3c2440_early_console_setup);
+EARLYCON_DECLARE(s3c2440, s3c2440_early_console_setup);
+EARLYCON_DECLARE(s3c6400, s3c2440_early_console_setup);
+
+/* S5PV210, EXYNOS */
+static struct samsung_early_console_data s5pv210_early_console_data = {
+	.txfull_mask = S5PV210_UFSTAT_TXFULL,
+};
+
+static int __init s5pv210_early_console_setup(struct earlycon_device *device,
+					      const char *opt)
+{
+	device->port.private_data = &s5pv210_early_console_data;
+	return samsung_early_console_setup(device, opt);
+}
+OF_EARLYCON_DECLARE(s5pv210, "samsung,s5pv210-uart",
+			s5pv210_early_console_setup);
+OF_EARLYCON_DECLARE(exynos4210, "samsung,exynos4210-uart",
+			s5pv210_early_console_setup);
+EARLYCON_DECLARE(s5pv210, s5pv210_early_console_setup);
+EARLYCON_DECLARE(exynos4210, s5pv210_early_console_setup);
+
 MODULE_ALIAS("platform:samsung-uart");
 MODULE_DESCRIPTION("Samsung SoC Serial port driver");
 MODULE_AUTHOR("Ben Dooks <[email protected]>");
#3 lore raw

PATCH v3 2/2 ARM: dts: exynos4: Add stdout-path properties

In reply to Marek Szyprowski

From: Tomasz Figa <[email protected]>

This patch adds stdout-path property to chosen nodes of Exynos4 boards to enable use of earlycon feature without the need to hardcode port number in kernel itself.

---
 arch/arm/boot/dts/exynos4210-origen.dts         | 1 +
 arch/arm/boot/dts/exynos4210-smdkv310.dts       | 1 +
 arch/arm/boot/dts/exynos4210-trats.dts          | 1 +
 arch/arm/boot/dts/exynos4210-universal_c210.dts | 1 +
 arch/arm/boot/dts/exynos4412-odroid-common.dtsi | 4 ++++
 arch/arm/boot/dts/exynos4412-origen.dts         | 1 +
 arch/arm/boot/dts/exynos4412-smdk4412.dts       | 1 +
 arch/arm/boot/dts/exynos4412-tiny4412.dts       | 4 ++++
 arch/arm/boot/dts/exynos4412-trats2.dts         | 1 +
 9 files changed, 15 insertions(+)
arch/arm/boot/dts/exynos4210-origen.dts +1 -0
index f767c425d0b5..b81146141402 100644
@@ -31,6 +31,7 @@
 
 	chosen {
 		bootargs ="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC2,115200 init=/linuxrc";
+		stdout-path = &serial_2;
 	};
 
 	regulators {
arch/arm/boot/dts/exynos4210-smdkv310.dts +1 -0
index 676e6e0c8cf3..86216fff1b4f 100644
@@ -27,6 +27,7 @@
 
 	chosen {
 		bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc";
+		stdout-path = &serial_1;
 	};
 
 	sdhci at 12530000 {
arch/arm/boot/dts/exynos4210-trats.dts +1 -0
index f516da9e8b3a..b351c7bddf2d 100644
@@ -28,6 +28,7 @@
 
 	chosen {
 		bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rootwait earlyprintk panic=5";
+		stdout-path = &serial_2;
 	};
 
 	regulators {
arch/arm/boot/dts/exynos4210-universal_c210.dts +1 -0
index d50eb3aa708e..e65ee3cb36c3 100644
@@ -26,6 +26,7 @@
 
 	chosen {
 		bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rw rootwait earlyprintk panic=5 maxcpus=1";
+		stdout-path = &serial_2;
 	};
 
 	sysram at 02020000 {
arch/arm/boot/dts/exynos4412-odroid-common.dtsi +4 -0
index c697ff01ae8d..7c49bddf44b6 100644
@@ -11,6 +11,10 @@
 #include "exynos4412.dtsi"
 
 / {
+	chosen {
+		stdout-path = &serial_1;
+	};
+
 	firmware at 0204F000 {
 		compatible = "samsung,secure-firmware";
 		reg = <0x0204F000 0x1000>;
arch/arm/boot/dts/exynos4412-origen.dts +1 -0
index de15114fd07c..bd8b73077d41 100644
@@ -26,6 +26,7 @@
 
 	chosen {
 		bootargs ="console=ttySAC2,115200";
+		stdout-path = &serial_2;
 	};
 
 	firmware at 0203F000 {
arch/arm/boot/dts/exynos4412-smdk4412.dts +1 -0
index ded0b70f7644..b9256afbcc68 100644
@@ -25,6 +25,7 @@
 
 	chosen {
 		bootargs ="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc";
+		stdout-path = &serial_1;
 	};
 
 	g2d at 10800000 {
arch/arm/boot/dts/exynos4412-tiny4412.dts +4 -0
index ea6929d9c621..d46fd4c2aeaa 100644
@@ -18,6 +18,10 @@
 	model = "FriendlyARM TINY4412 board based on Exynos4412";
 	compatible = "friendlyarm,tiny4412", "samsung,exynos4412", "samsung,exynos4";
 
+	chosen {
+		stdout-path = &serial_0;
+	};
+
 	memory {
 		reg = <0x40000000 0x40000000>;
 	};
arch/arm/boot/dts/exynos4412-trats2.dts +1 -0
index 5e066cd87f66..c8b38359d54e 100644
@@ -30,6 +30,7 @@
 
 	chosen {
 		bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rootwait earlyprintk panic=5";
+		stdout-path = &serial_2;
 	};
 
 	firmware at 0204F000 {
Signature · 1 line
1.9.2
#4 lore raw

v3 cover serial: samsung: add support for early console

In reply to Marek Szyprowski

Hi,

I found this patchset was not merget even 3.19 merge window. As you know, there is no support of legacy early_printk on arm64. I need this patchset to support exynos arm64 board properly.

Dear Kukjin,

Could you pick up this patchset in your tree?

Best Regards,
Chanho Park

Quoted 60 lines

-----Original Message-----
From: linux-arm-kernel [mailto:linux-arm-kernel- [email protected]] On Behalf Of Marek Szyprowski
Sent: Monday, October 20, 2014 8:28 PM
To: [email protected]; linux-arm- [email protected]
Cc: Tomasz Figa; Kyungmin Park; [email protected]; Alim Akhtar; Marek Szyprowski
Subject: [PATCH v3 0/2] serial: samsung: add support for early console

This patchset adds support for early console defined in device tree. As an example, DTS files for all Exynos4 based machines are updated with the correct value for common chosen/sdtout property.

To get it fully functional on ARM architecture, additional improvements (support for early_ioremap) are needed in early console code.

Best regards
Marek Szyprowski
Samsung R&D Institute Poland

Change log:

v3:
- rebased onto v3.18-rc1
- removed options from documentation (they are not yet supported)

v2: http://www.spinics.net/lists/linux-samsung-soc/msg37278.html
- added support for command line based initialization

v1: http://www.spinics.net/lists/linux-samsung-soc/msg37094.html
- initial version

Tomasz Figa (2):
serial: samsung: Add support for early console
ARM: dts: exynos4: Add stdout-path properties

 Documentation/kernel-parameters.txt             |  12 +++
 arch/arm/boot/dts/exynos4210-origen.dts         |   1 +
 arch/arm/boot/dts/exynos4210-smdkv310.dts       |   1 +
 arch/arm/boot/dts/exynos4210-trats.dts          |   1 +
 arch/arm/boot/dts/exynos4210-universal_c210.dts |   1 +
 arch/arm/boot/dts/exynos4412-odroid-common.dtsi |   4 +
 arch/arm/boot/dts/exynos4412-origen.dts         |   1 +
 arch/arm/boot/dts/exynos4412-smdk4412.dts       |   1 +
 arch/arm/boot/dts/exynos4412-tiny4412.dts       |   4 +
 arch/arm/boot/dts/exynos4412-trats2.dts         |   1 +
 drivers/tty/serial/Kconfig                      |   1 +
 drivers/tty/serial/samsung.c                    | 103
++++++++++++++++++++++++
 12 files changed, 131 insertions(+)

--
1.9.2

_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel