]> Pileus Git - ~andy/linux/commitdiff
serial: samsung: remove all uses of get_clksrc and set_clksrc
authorThomas Abraham <thomas.abraham@linaro.org>
Mon, 24 Oct 2011 09:47:57 +0000 (11:47 +0200)
committerKukjin Kim <kgene.kim@samsung.com>
Fri, 23 Dec 2011 01:06:58 +0000 (10:06 +0900)
With clkdev based clock lookup support, the clock set and get operation
using clock names communicated between the samsung uart driver and the
SoC specific extension can be removed.

In addition to that, for each platform specific extension, add the
default clock selection, number of clock options for uart baud generator,
clock selection bit mask and shift values which is required by the
clkdev support in samsung uart driver.

The default clock selection value 'def_clk_sel' specifies the default clock
to be used as the source clock for baud rate generator in case the platform
code does not specify the same.

Cc: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Thomas Abraham <thomas.abraham@linaro.org>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
arch/arm/mach-exynos/init.c
arch/arm/plat-samsung/include/plat/regs-serial.h
drivers/tty/serial/s3c2410.c
drivers/tty/serial/s3c2412.c
drivers/tty/serial/s3c2440.c
drivers/tty/serial/s3c6400.c
drivers/tty/serial/s5pv210.c
drivers/tty/serial/samsung.h

index e836c9cdc200ff3a60528bf1f371dbe08bcec872..3c9590b1703f35ee3ffdc656e4c7b0b944c7be2b 100644 (file)
@@ -20,10 +20,8 @@ void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
        struct s3c2410_uartcfg *tcfg = cfg;
        u32 ucnt;
 
-       for (ucnt = 0; ucnt < no; ucnt++, tcfg++) {
+       for (ucnt = 0; ucnt < no; ucnt++, tcfg++)
                tcfg->has_fracval = 1;
-               tcfg->flags |= NO_NEED_CHECK_CLKSRC;
-       }
 
        s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no);
 }
index 25f0c364f61ad6764474289076fe91fc051bb074..133fa97fbc82b2ef6d8240c35e489ba29c225de0 100644 (file)
@@ -71,6 +71,7 @@
 #define S3C2410_LCON_IRM          (1<<6)
 
 #define S3C2440_UCON_CLKMASK     (3<<10)
+#define S3C2440_UCON_CLKSHIFT    (10)
 #define S3C2440_UCON_PCLK        (0<<10)
 #define S3C2440_UCON_UCLK        (1<<10)
 #define S3C2440_UCON_PCLK2       (2<<10)
@@ -78,6 +79,7 @@
 #define S3C2443_UCON_EPLL        (3<<10)
 
 #define S3C6400_UCON_CLKMASK   (3<<10)
+#define S3C6400_UCON_CLKSHIFT  (10)
 #define S3C6400_UCON_PCLK      (0<<10)
 #define S3C6400_UCON_PCLK2     (2<<10)
 #define S3C6400_UCON_UCLK0     (1<<10)
 #define S3C2440_UCON_DIVSHIFT    (12)
 
 #define S3C2412_UCON_CLKMASK   (3<<10)
+#define S3C2412_UCON_CLKSHIFT  (10)
 #define S3C2412_UCON_UCLK      (1<<10)
 #define S3C2412_UCON_USYSCLK   (3<<10)
 #define S3C2412_UCON_PCLK      (0<<10)
 #define S3C2412_UCON_PCLK2     (2<<10)
 
+#define S3C2410_UCON_CLKMASK   (1 << 10)
+#define S3C2410_UCON_CLKSHIFT  (10)
 #define S3C2410_UCON_UCLK        (1<<10)
 #define S3C2410_UCON_SBREAK      (1<<4)
 
 
 /* Following are specific to S5PV210 */
 #define S5PV210_UCON_CLKMASK   (1<<10)
+#define S5PV210_UCON_CLKSHIFT  (10)
 #define S5PV210_UCON_PCLK      (0<<10)
 #define S5PV210_UCON_UCLK      (1<<10)
 
 #define S5PV210_UFSTAT_RXMASK  (255<<0)
 #define S5PV210_UFSTAT_RXSHIFT (0)
 
-#define NO_NEED_CHECK_CLKSRC   1
 #define S3C2410_UCON_CLKSEL0   (1 << 0)
 #define S3C2410_UCON_CLKSEL1   (1 << 1)
 #define S3C2410_UCON_CLKSEL2   (1 << 2)
index b1d7e7c1849d22192c21c03e9bdc5073df5be8f2..e668a9d2bbc9661c313f0fcba264a520e4d89229 100644 (file)
 
 #include "samsung.h"
 
-static int s3c2410_serial_setsource(struct uart_port *port,
-                                   struct s3c24xx_uart_clksrc *clk)
-{
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       if (strcmp(clk->name, "uclk") == 0)
-               ucon |= S3C2410_UCON_UCLK;
-       else
-               ucon &= ~S3C2410_UCON_UCLK;
-
-       wr_regl(port, S3C2410_UCON, ucon);
-       return 0;
-}
-
-static int s3c2410_serial_getsource(struct uart_port *port,
-                                   struct s3c24xx_uart_clksrc *clk)
-{
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       clk->divisor = 1;
-       clk->name = (ucon & S3C2410_UCON_UCLK) ? "uclk" : "pclk";
-
-       return 0;
-}
-
 static int s3c2410_serial_resetport(struct uart_port *port,
                                    struct s3c2410_uartcfg *cfg)
 {
@@ -77,8 +52,10 @@ static struct s3c24xx_uart_info s3c2410_uart_inf = {
        .tx_fifofull    = S3C2410_UFSTAT_TXFULL,
        .tx_fifomask    = S3C2410_UFSTAT_TXMASK,
        .tx_fifoshift   = S3C2410_UFSTAT_TXSHIFT,
-       .get_clksrc     = s3c2410_serial_getsource,
-       .set_clksrc     = s3c2410_serial_setsource,
+       .def_clk_sel    = S3C2410_UCON_CLKSEL0,
+       .num_clks       = 2,
+       .clksel_mask    = S3C2410_UCON_CLKMASK,
+       .clksel_shift   = S3C2410_UCON_CLKSHIFT,
        .reset_port     = s3c2410_serial_resetport,
 };
 
index 2234bf9ced45bc4fde8bcfba3d170ce69d229f34..5b85c1953c51bd607857ad2707bccb14e73b1c12 100644 (file)
 
 #include "samsung.h"
 
-static int s3c2412_serial_setsource(struct uart_port *port,
-                                    struct s3c24xx_uart_clksrc *clk)
-{
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       ucon &= ~S3C2412_UCON_CLKMASK;
-
-       if (strcmp(clk->name, "uclk") == 0)
-               ucon |= S3C2440_UCON_UCLK;
-       else if (strcmp(clk->name, "pclk") == 0)
-               ucon |= S3C2440_UCON_PCLK;
-       else if (strcmp(clk->name, "usysclk") == 0)
-               ucon |= S3C2412_UCON_USYSCLK;
-       else {
-               printk(KERN_ERR "unknown clock source %s\n", clk->name);
-               return -EINVAL;
-       }
-
-       wr_regl(port, S3C2410_UCON, ucon);
-       return 0;
-}
-
-
-static int s3c2412_serial_getsource(struct uart_port *port,
-                                   struct s3c24xx_uart_clksrc *clk)
-{
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       switch (ucon & S3C2412_UCON_CLKMASK) {
-       case S3C2412_UCON_UCLK:
-               clk->divisor = 1;
-               clk->name = "uclk";
-               break;
-
-       case S3C2412_UCON_PCLK:
-       case S3C2412_UCON_PCLK2:
-               clk->divisor = 1;
-               clk->name = "pclk";
-               break;
-
-       case S3C2412_UCON_USYSCLK:
-               clk->divisor = 1;
-               clk->name = "usysclk";
-               break;
-       }
-
-       return 0;
-}
-
 static int s3c2412_serial_resetport(struct uart_port *port,
                                    struct s3c2410_uartcfg *cfg)
 {
@@ -108,8 +59,10 @@ static struct s3c24xx_uart_info s3c2412_uart_inf = {
        .tx_fifofull    = S3C2440_UFSTAT_TXFULL,
        .tx_fifomask    = S3C2440_UFSTAT_TXMASK,
        .tx_fifoshift   = S3C2440_UFSTAT_TXSHIFT,
-       .get_clksrc     = s3c2412_serial_getsource,
-       .set_clksrc     = s3c2412_serial_setsource,
+       .def_clk_sel    = S3C2410_UCON_CLKSEL2,
+       .num_clks       = 4,
+       .clksel_mask    = S3C2412_UCON_CLKMASK,
+       .clksel_shift   = S3C2412_UCON_CLKSHIFT,
        .reset_port     = s3c2412_serial_resetport,
 };
 
index 4498828630f1d62391f72e8a360a35e925309912..39930f819fa27e0df2d65f3f90692fc2577faf52 100644 (file)
 
 #include "samsung.h"
 
-
-static int s3c2440_serial_setsource(struct uart_port *port,
-                                    struct s3c24xx_uart_clksrc *clk)
-{
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       /* todo - proper fclk<>nonfclk switch. */
-
-       ucon &= ~S3C2440_UCON_CLKMASK;
-
-       if (strcmp(clk->name, "uclk") == 0)
-               ucon |= S3C2440_UCON_UCLK;
-       else if (strcmp(clk->name, "pclk") == 0)
-               ucon |= S3C2440_UCON_PCLK;
-       else if (strcmp(clk->name, "fclk_n") == 0)
-               ucon |= S3C2440_UCON_FCLK;
-       else {
-               printk(KERN_ERR "unknown clock source %s\n", clk->name);
-               return -EINVAL;
-       }
-
-       wr_regl(port, S3C2410_UCON, ucon);
-       return 0;
-}
-
-
-static int s3c2440_serial_getsource(struct uart_port *port,
-                                   struct s3c24xx_uart_clksrc *clk)
-{
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       switch (ucon & S3C2440_UCON_CLKMASK) {
-       case S3C2440_UCON_UCLK:
-               clk->divisor = 1;
-               clk->name = "uclk";
-               break;
-
-       case S3C2440_UCON_PCLK:
-       case S3C2440_UCON_PCLK2:
-               clk->divisor = 1;
-               clk->name = "pclk";
-               break;
-
-       case S3C2440_UCON_FCLK:
-               clk->divisor = 1;
-               clk->name = "fclk_n";
-               break;
-       }
-
-       return 0;
-}
-
 static int s3c2440_serial_resetport(struct uart_port *port,
                                    struct s3c2410_uartcfg *cfg)
 {
@@ -110,8 +58,10 @@ static struct s3c24xx_uart_info s3c2440_uart_inf = {
        .tx_fifofull    = S3C2440_UFSTAT_TXFULL,
        .tx_fifomask    = S3C2440_UFSTAT_TXMASK,
        .tx_fifoshift   = S3C2440_UFSTAT_TXSHIFT,
-       .get_clksrc     = s3c2440_serial_getsource,
-       .set_clksrc     = s3c2440_serial_setsource,
+       .def_clk_sel    = S3C2410_UCON_CLKSEL2,
+       .num_clks       = 4,
+       .clksel_mask    = S3C2440_UCON_CLKMASK,
+       .clksel_shift   = S3C2440_UCON_CLKSHIFT,
        .reset_port     = s3c2440_serial_resetport,
 };
 
index e2f6913d84d58d5de95d580f45fcffba20be3d27..c5a6d46450894c8ccee0c8ee9df8c0140fc39a37 100644 (file)
 
 #include "samsung.h"
 
-static int s3c6400_serial_setsource(struct uart_port *port,
-                                   struct s3c24xx_uart_clksrc *clk)
-{
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       if (strcmp(clk->name, "uclk0") == 0) {
-               ucon &= ~S3C6400_UCON_CLKMASK;
-               ucon |= S3C6400_UCON_UCLK0;
-       } else if (strcmp(clk->name, "uclk1") == 0)
-               ucon |= S3C6400_UCON_UCLK1;
-       else if (strcmp(clk->name, "pclk") == 0) {
-               /* See notes about transitioning from UCLK to PCLK */
-               ucon &= ~S3C6400_UCON_UCLK0;
-       } else {
-               printk(KERN_ERR "unknown clock source %s\n", clk->name);
-               return -EINVAL;
-       }
-
-       wr_regl(port, S3C2410_UCON, ucon);
-       return 0;
-}
-
-
-static int s3c6400_serial_getsource(struct uart_port *port,
-                                   struct s3c24xx_uart_clksrc *clk)
-{
-       u32 ucon = rd_regl(port, S3C2410_UCON);
-
-       clk->divisor = 1;
-
-       switch (ucon & S3C6400_UCON_CLKMASK) {
-       case S3C6400_UCON_UCLK0:
-               clk->name = "uclk0";
-               break;
-
-       case S3C6400_UCON_UCLK1:
-               clk->name = "uclk1";
-               break;
-
-       case S3C6400_UCON_PCLK:
-       case S3C6400_UCON_PCLK2:
-               clk->name = "pclk";
-               break;
-       }
-
-       return 0;
-}
-
 static int s3c6400_serial_resetport(struct uart_port *port,
                                    struct s3c2410_uartcfg *cfg)
 {
@@ -108,8 +60,10 @@ static struct s3c24xx_uart_info s3c6400_uart_inf = {
        .tx_fifofull    = S3C2440_UFSTAT_TXFULL,
        .tx_fifomask    = S3C2440_UFSTAT_TXMASK,
        .tx_fifoshift   = S3C2440_UFSTAT_TXSHIFT,
-       .get_clksrc     = s3c6400_serial_getsource,
-       .set_clksrc     = s3c6400_serial_setsource,
+       .def_clk_sel    = S3C2410_UCON_CLKSEL2,
+       .num_clks       = 4,
+       .clksel_mask    = S3C6400_UCON_CLKMASK,
+       .clksel_shift   = S3C6400_UCON_CLKSHIFT,
        .reset_port     = s3c6400_serial_resetport,
 };
 
index 03b249e35bf1a5d49e950202742cfd50f22597eb..173df5afb0fa3933e3571d08f4f00ae82f0aadbf 100644 (file)
 #include <plat/regs-serial.h>
 #include "samsung.h"
 
-static int s5pv210_serial_setsource(struct uart_port *port,
-                                       struct s3c24xx_uart_clksrc *clk)
-{
-       struct s3c24xx_uart_port *ourport;
-       struct s3c2410_uartcfg *cfg;
-       unsigned long ucon = rd_regl(port, S3C2410_UCON);
-
-       ourport = container_of(port, struct s3c24xx_uart_port, port);
-       cfg = ourport->cfg;
-
-       if (cfg->flags & NO_NEED_CHECK_CLKSRC)
-               return 0;
-
-       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)
-{
-       struct s3c24xx_uart_port *ourport;
-       struct s3c2410_uartcfg *cfg;
-       u32 ucon = rd_regl(port, S3C2410_UCON);
-
-       ourport = container_of(port, struct s3c24xx_uart_port, port);
-       cfg = ourport->cfg;
-
-       clk->divisor = 1;
-
-       if (cfg->flags & NO_NEED_CHECK_CLKSRC)
-               return 0;
-
-       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)
 {
@@ -109,8 +55,10 @@ static int s5pv210_serial_resetport(struct uart_port *port,
                .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,     \
+               .def_clk_sel    = S3C2410_UCON_CLKSEL0,         \
+               .num_clks       = 2,                            \
+               .clksel_mask    = S5PV210_UCON_CLKMASK,         \
+               .clksel_shift   = S5PV210_UCON_CLKSHIFT,        \
                .reset_port     = s5pv210_serial_resetport
 
 static struct s3c24xx_uart_info s5p_port_fifo256 = {
index 40e9ef19bd12737e541260bc6d6137aa0119197d..c9cab2c5ae0d059aaeee63e79fb61c2377b87e93 100644 (file)
@@ -28,11 +28,6 @@ struct s3c24xx_uart_info {
 
        unsigned int            has_divslot:1;
 
-       /* clock source control */
-
-       int (*get_clksrc)(struct uart_port *, struct s3c24xx_uart_clksrc *clk);
-       int (*set_clksrc)(struct uart_port *, struct s3c24xx_uart_clksrc *clk);
-
        /* uart controls */
        int (*reset_port)(struct uart_port *, struct s3c2410_uartcfg *);
 };