All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chanwoo Choi <cw00.choi@samsung.com>
To: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: linux-samsung-soc@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Alim Akhtar <alim.akhtar@samsung.com>,
	thomas.ab@samsung.com, Tomasz Figa <tomasz.figa@gmail.com>,
	Kyungmin Park <kyungmin.park@samsung.com>,
	Rob Herring <robherring2@gmail.com>
Subject: Re: [PATCH v3 1/2] serial: samsung: Add support for early console
Date: Tue, 16 Dec 2014 09:55:57 +0900	[thread overview]
Message-ID: <548F831D.7080500@samsung.com> (raw)
In-Reply-To: <1413804511-32441-2-git-send-email-m.szyprowski@samsung.com>

On 10/20/2014 08:28 PM, Marek Szyprowski wrote:
> From: Tomasz Figa <t.figa@samsung.com>
> 
> This patch adds support for early console initialized from device tree
> and kernel command line to all variants of Samsung serial driver.
> 
> Signed-off-by: Tomasz Figa <t.figa@samsung.com>
> [mszyprow: added support for command line based initialization,
>            fixed comments, added documentation]
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
> Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
> Tested-by: Alim Akhtar <alim.akhtar@samsung.com>

I tested this patchset with Exynos5 SoC.

Tested-by: Chanwoo Choi <cw00.choi@samsung.com>

Thanks,
Chanwoo Choi

> ---
>  Documentation/kernel-parameters.txt |  12 +++++
>  drivers/tty/serial/Kconfig          |   1 +
>  drivers/tty/serial/samsung.c        | 103 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 116 insertions(+)
> 
> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
> index 7dbe5ec9d9cd..24f363108ab3 100644
> --- a/Documentation/kernel-parameters.txt
> +++ b/Documentation/kernel-parameters.txt
> @@ -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
> diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
> index 649b784081c7..50997be6cf6d 100644
> --- a/drivers/tty/serial/Kconfig
> +++ b/drivers/tty/serial/Kconfig
> @@ -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
> diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
> index c78f43a481ce..8ad453a5d845 100644
> --- a/drivers/tty/serial/samsung.c
> +++ b/drivers/tty/serial/samsung.c
> @@ -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 <ben@simtec.co.uk>");
> 

WARNING: multiple messages have this Message-ID (diff)
From: cw00.choi@samsung.com (Chanwoo Choi)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 1/2] serial: samsung: Add support for early console
Date: Tue, 16 Dec 2014 09:55:57 +0900	[thread overview]
Message-ID: <548F831D.7080500@samsung.com> (raw)
In-Reply-To: <1413804511-32441-2-git-send-email-m.szyprowski@samsung.com>

On 10/20/2014 08:28 PM, Marek Szyprowski wrote:
> From: Tomasz Figa <t.figa@samsung.com>
> 
> This patch adds support for early console initialized from device tree
> and kernel command line to all variants of Samsung serial driver.
> 
> Signed-off-by: Tomasz Figa <t.figa@samsung.com>
> [mszyprow: added support for command line based initialization,
>            fixed comments, added documentation]
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
> Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
> Tested-by: Alim Akhtar <alim.akhtar@samsung.com>

I tested this patchset with Exynos5 SoC.

Tested-by: Chanwoo Choi <cw00.choi@samsung.com>

Thanks,
Chanwoo Choi

> ---
>  Documentation/kernel-parameters.txt |  12 +++++
>  drivers/tty/serial/Kconfig          |   1 +
>  drivers/tty/serial/samsung.c        | 103 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 116 insertions(+)
> 
> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
> index 7dbe5ec9d9cd..24f363108ab3 100644
> --- a/Documentation/kernel-parameters.txt
> +++ b/Documentation/kernel-parameters.txt
> @@ -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
> diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
> index 649b784081c7..50997be6cf6d 100644
> --- a/drivers/tty/serial/Kconfig
> +++ b/drivers/tty/serial/Kconfig
> @@ -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
> diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
> index c78f43a481ce..8ad453a5d845 100644
> --- a/drivers/tty/serial/samsung.c
> +++ b/drivers/tty/serial/samsung.c
> @@ -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 <ben@simtec.co.uk>");
> 

  reply	other threads:[~2014-12-16  0:55 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-20 11:28 [PATCH v3 0/2] serial: samsung: add support for early console Marek Szyprowski
2014-10-20 11:28 ` Marek Szyprowski
2014-10-20 11:28 ` [PATCH v3 1/2] serial: samsung: Add " Marek Szyprowski
2014-10-20 11:28   ` Marek Szyprowski
2014-12-16  0:55   ` Chanwoo Choi [this message]
2014-12-16  0:55     ` Chanwoo Choi
2014-10-20 11:28 ` [PATCH v3 2/2] ARM: dts: exynos4: Add stdout-path properties Marek Szyprowski
2014-10-20 11:28   ` Marek Szyprowski
2014-12-15  6:47 ` [PATCH v3 0/2] serial: samsung: add support for early console Chanho Park
2014-12-15  6:47   ` Chanho Park

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=548F831D.7080500@samsung.com \
    --to=cw00.choi@samsung.com \
    --cc=alim.akhtar@samsung.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=robherring2@gmail.com \
    --cc=thomas.ab@samsung.com \
    --cc=tomasz.figa@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.