From: Ben Dooks <ben-linux@fluff.org>
To: Kukjin Kim <kgene.kim@samsung.com>
Cc: linux-samsung-soc@vger.kernel.org, ben-linux@fluff.org,
Thomas Abraham <thomas.ab@samsung.com>
Subject: Re: [PATCH 10/10] ARM: S5PV210: Add serial port support
Date: Tue, 19 Jan 2010 04:03:00 +0000 [thread overview]
Message-ID: <20100119040300.GH3971@trinity.fluff.org> (raw)
In-Reply-To: <1263868118-32086-1-git-send-email-kgene.kim@samsung.com>
On Tue, Jan 19, 2010 at 11:28:38AM +0900, Kukjin Kim wrote:
> This patch adds UART serial port support for S5PV210.
>
> Signed-off-by: Thomas Abraham <thomas.ab@samsung.com>
> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
> ---
> arch/arm/plat-s3c/include/plat/regs-serial.h | 30 ++++
> drivers/serial/Kconfig | 9 +-
> drivers/serial/Makefile | 1 +
> drivers/serial/s5pv210.c | 185 ++++++++++++++++++++++++++
> 4 files changed, 224 insertions(+), 1 deletions(-)
> create mode 100644 drivers/serial/s5pv210.c
>
> diff --git a/arch/arm/plat-s3c/include/plat/regs-serial.h b/arch/arm/plat-s3c/include/plat/regs-serial.h
> index 85d8904..60d6604 100644
> --- a/arch/arm/plat-s3c/include/plat/regs-serial.h
> +++ b/arch/arm/plat-s3c/include/plat/regs-serial.h
> @@ -194,6 +194,36 @@
> #define S3C64XX_UINTSP 0x34
> #define S3C64XX_UINTM 0x38
>
> +/* Following are specific to S5PV210 and S5P6442 */
> +#define S5PV210_UCON_CLKMASK (1<<10)
> +#define S5PV210_UCON_PCLK (0<<10)
> +#define S5PV210_UCON_UCLK (1<<10)
> +
> +#define S5PV210_UFCON_TXTRIG0 (0<<8)
> +#define S5PV210_UFCON_TXTRIG4 (1<<8)
> +#define S5PV210_UFCON_TXTRIG8 (2<<8)
> +#define S5PV210_UFCON_TXTRIG16 (3<<8)
> +#define S5PV210_UFCON_TXTRIG32 (4<<8)
> +#define S5PV210_UFCON_TXTRIG64 (5<<8)
> +#define S5PV210_UFCON_TXTRIG128 (6<<8)
> +#define S5PV210_UFCON_TXTRIG256 (7<<8)
> +
> +#define S5PV210_UFCON_RXTRIG1 (0<<4)
> +#define S5PV210_UFCON_RXTRIG4 (1<<4)
> +#define S5PV210_UFCON_RXTRIG8 (2<<4)
> +#define S5PV210_UFCON_RXTRIG16 (3<<4)
> +#define S5PV210_UFCON_RXTRIG32 (4<<4)
> +#define S5PV210_UFCON_RXTRIG64 (5<<4)
> +#define S5PV210_UFCON_RXTRIG128 (6<<4)
> +#define S5PV210_UFCON_RXTRIG256 (7<<4)
> +
> +#define S5PV210_UFSTAT_TXFULL (1<<24)
> +#define S5PV210_UFSTAT_RXFULL (1<<8)
> +#define S5PV210_UFSTAT_TXMASK (255<<16)
> +#define S5PV210_UFSTAT_TXSHIFT (16)
> +#define S5PV210_UFSTAT_RXMASK (255<<0)
> +#define S5PV210_UFSTAT_RXSHIFT (0)
> +
> #ifndef __ASSEMBLY__
>
> /* struct s3c24xx_uart_clksrc
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index d7d687f..ebdd2b9 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -459,7 +459,7 @@ config SERIAL_SAMSUNG_UARTS
> int
> depends on ARM && PLAT_S3C
> default 2 if ARCH_S3C2400
> - default 4 if ARCH_S5P6440 || ARCH_S5PC1XX || ARCH_S3C64XX || CPU_S3C2443
> + default 4 if ARCH_S5P6440 || ARCH_S5PC1XX || ARCH_S5PV210 || ARCH_S3C64XX || CPU_S3C2443
> default 3
> help
> Select the number of available UART ports for the Samsung S3C
> @@ -540,6 +540,13 @@ config SERIAL_S5PC100
> help
> Serial port support for the Samsung S5PC100 SoCs
>
> +config SERIAL_S5PV210
> + tristate "Samsung S5PV210 Serial port support"
> + depends on SERIAL_SAMSUNG && CPU_S5PV210
> + default y
> + help
> + Serial port support for Samsung's S5P Family of SoC's
> +
> config SERIAL_MAX3100
> tristate "MAX3100 support"
> depends on SPI
> diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
> index 5548fe7..6aa4723 100644
> --- a/drivers/serial/Makefile
> +++ b/drivers/serial/Makefile
> @@ -45,6 +45,7 @@ obj-$(CONFIG_SERIAL_S3C2440) += s3c2440.o
> obj-$(CONFIG_SERIAL_S3C24A0) += s3c24a0.o
> obj-$(CONFIG_SERIAL_S3C6400) += s3c6400.o
> obj-$(CONFIG_SERIAL_S5PC100) += s3c6400.o
> +obj-$(CONFIG_SERIAL_S5PV210) += s5pv210.o
> obj-$(CONFIG_SERIAL_MAX3100) += max3100.o
> obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o
> obj-$(CONFIG_SERIAL_MUX) += mux.o
> diff --git a/drivers/serial/s5pv210.c b/drivers/serial/s5pv210.c
> new file mode 100644
> index 0000000..4dc3c39
> --- /dev/null
> +++ b/drivers/serial/s5pv210.c
> @@ -0,0 +1,185 @@
> +/* linux/drivers/serial/s5pv210.c
> + *
> + * Copyright (c) 2010 Samsung Electronics Co., Ltd.
> + * http://www.samsung.com/
> + *
> + * Based on drivers/serial/s3c6400.c
> + *
> + * Driver for Samsung S5PV210 SoC UARTs.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> +*/
> +
> +#include <linux/module.h>
> +#include <linux/ioport.h>
> +#include <linux/io.h>
> +#include <linux/platform_device.h>
> +#include <linux/init.h>
> +#include <linux/serial_core.h>
> +#include <linux/serial.h>
> +
> +#include <asm/irq.h>
> +#include <mach/hardware.h>
> +#include <plat/regs-serial.h>
> +#include "samsung.h"
> +
> +static int s5pv210_serial_setsource(struct uart_port *port,
> + struct s3c24xx_uart_clksrc *clk)
> +{
> + unsigned long ucon = rd_regl(port, S3C2410_UCON);
> +
> + if (strcmp(clk->name, "pclk") == 0)
> + ucon &= ~S5PV210_UCON_CLKMASK;
> + else if (strcmp(clk->name, "uclk1") == 0)
> + ucon |= S5PV210_UCON_CLKMASK;
> + else {
> + printk(KERN_ERR "unknown clock source %s\n", clk->name);
> + return -EINVAL;
> + }
> +
> + wr_regl(port, S3C2410_UCON, ucon);
> + return 0;
> +}
> +
> +
> +static int s5pv210_serial_getsource(struct uart_port *port,
> + struct s3c24xx_uart_clksrc *clk)
> +{
> + u32 ucon = rd_regl(port, S3C2410_UCON);
> +
> + clk->divisor = 1;
> +
> + switch (ucon & S5PV210_UCON_CLKMASK) {
> + case S5PV210_UCON_PCLK:
> + clk->name = "pclk";
> + break;
> + case S5PV210_UCON_UCLK:
> + clk->name = "uclk1";
> + break;
> + }
> +
> + return 0;
> +}
> +
> +static int s5pv210_serial_resetport(struct uart_port *port,
> + struct s3c2410_uartcfg *cfg)
> +{
> + unsigned long ucon = rd_regl(port, S3C2410_UCON);
> +
> + ucon &= S5PV210_UCON_CLKMASK;
> + wr_regl(port, S3C2410_UCON, ucon | cfg->ucon);
> + wr_regl(port, S3C2410_ULCON, cfg->ulcon);
> +
> + /* reset both fifos */
> + wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH);
> + wr_regl(port, S3C2410_UFCON, cfg->ufcon);
> +
> + return 0;
> +}
> +
> +static struct s3c24xx_uart_info s5p_uart_inf[] = {
> + [0] = {
> + .name = "Samsung S5PV210 UART0",
> + .type = PORT_S3C6400,
> + .fifosize = 256,
> + .has_divslot = 1,
> + .rx_fifomask = S5PV210_UFSTAT_RXMASK,
> + .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT,
> + .rx_fifofull = S5PV210_UFSTAT_RXFULL,
> + .tx_fifofull = S5PV210_UFSTAT_TXFULL,
> + .tx_fifomask = S5PV210_UFSTAT_TXMASK,
> + .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT,
> + .get_clksrc = s5pv210_serial_getsource,
> + .set_clksrc = s5pv210_serial_setsource,
> + .reset_port = s5pv210_serial_resetport,
> + },
> + [1] = {
> + .name = "Samsung S5PV210 UART1",
> + .type = PORT_S3C6400,
> + .fifosize = 64,
> + .has_divslot = 1,
> + .rx_fifomask = S5PV210_UFSTAT_RXMASK,
> + .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT,
> + .rx_fifofull = S5PV210_UFSTAT_RXFULL,
> + .tx_fifofull = S5PV210_UFSTAT_TXFULL,
> + .tx_fifomask = S5PV210_UFSTAT_TXMASK,
> + .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT,
> + .get_clksrc = s5pv210_serial_getsource,
> + .set_clksrc = s5pv210_serial_setsource,
> + .reset_port = s5pv210_serial_resetport,
> + },
> + [2] = {
> + .name = "Samsung S5PV210 UART2",
> + .type = PORT_S3C6400,
> + .fifosize = 16,
> + .has_divslot = 1,
> + .rx_fifomask = S5PV210_UFSTAT_RXMASK,
> + .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT,
> + .rx_fifofull = S5PV210_UFSTAT_RXFULL,
> + .tx_fifofull = S5PV210_UFSTAT_TXFULL,
> + .tx_fifomask = S5PV210_UFSTAT_TXMASK,
> + .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT,
> + .get_clksrc = s5pv210_serial_getsource,
> + .set_clksrc = s5pv210_serial_setsource,
> + .reset_port = s5pv210_serial_resetport,
> + },
> + [3] = {
> + .name = "Samsung S5PV210 UART3",
> + .type = PORT_S3C6400,
> + .fifosize = 16,
> + .has_divslot = 1,
> + .rx_fifomask = S5PV210_UFSTAT_RXMASK,
> + .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT,
> + .rx_fifofull = S5PV210_UFSTAT_RXFULL,
> + .tx_fifofull = S5PV210_UFSTAT_TXFULL,
> + .tx_fifomask = S5PV210_UFSTAT_TXMASK,
> + .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT,
> + .get_clksrc = s5pv210_serial_getsource,
> + .set_clksrc = s5pv210_serial_setsource,
> + .reset_port = s5pv210_serial_resetport,
> + },
> +};
It might be worth having a standard definition and then placing
in the per-port definitions for what changes for each port to avoid
having to replicate it for each.
Just a suggestion.
> +/* device management */
> +static int s5p_serial_probe(struct platform_device *pdev)
> +{
> + return s3c24xx_serial_probe(pdev, &s5p_uart_inf[pdev->id]);
> +}
> +
> +static struct platform_driver s5p_serial_drv = {
> + .probe = s5p_serial_probe,
> + .remove = s3c24xx_serial_remove,
> + .driver = {
> + .name = "s5pv210-uart",
> + .owner = THIS_MODULE,
> + },
> +};
> +
> +static int __init s5pv210_serial_console_init(void)
> +{
> + struct s3c24xx_uart_info *uinfo[CONFIG_SERIAL_SAMSUNG_UARTS];
> + int i;
> +
> + for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++)
> + uinfo[i] = &s5p_uart_inf[i];
> +
> + return s3c24xx_serial_initconsole(&s5p_serial_drv, uinfo);
> +}
> +
> +console_initcall(s5pv210_serial_console_init);
> +
> +static int __init s5p_serial_init(void)
> +{
> + return s3c24xx_serial_init(&s5p_serial_drv, s5p_uart_inf);
> +}
> +
> +static void __exit s5p_serial_exit(void)
> +{
> + platform_driver_unregister(&s5p_serial_drv);
> +}
> +
> +module_init(s5p_serial_init);
> +module_exit(s5p_serial_exit);
> +
> --
> 1.6.2.5
No MODULE_ALIAS() entry for autoloading platfom device.
Worse, no MODULE_AUTHOUR() and MODULE_LICENSE() directives.
I know these are nlikely to be built as a module, but they can and so
it is good to have the correct information here.
--
Ben
Q: What's a light-year?
A: One-third less calories than a regular year.
prev parent reply other threads:[~2010-01-19 4:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-19 2:28 [PATCH 10/10] ARM: S5PV210: Add serial port support Kukjin Kim
2010-01-19 4:03 ` Ben Dooks [this message]
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=20100119040300.GH3971@trinity.fluff.org \
--to=ben-linux@fluff.org \
--cc=kgene.kim@samsung.com \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=thomas.ab@samsung.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.