serial: sccnxp: Using CLK API for getting UART clock
authorAlexander Shiyan <shc_work@mail.ru>
Wed, 31 Jul 2013 10:56:30 +0000 (14:56 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Aug 2013 01:08:01 +0000 (18:08 -0700)
This patch removes "frequency" parameter from SCCNXP platform_data
and uses CLK API for getting clock. If CLK ommited, default IC
frequency will be used instead.

Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/mips/sni/a20r.c
drivers/tty/serial/sccnxp.c
include/linux/platform_data/serial-sccnxp.h

index dd0ab98..f9407e1 100644 (file)
@@ -122,7 +122,6 @@ static struct resource sc26xx_rsrc[] = {
 
 static struct sccnxp_pdata sccnxp_data = {
        .reg_shift      = 2,
-       .frequency      = 3686400,
        .mctrl_cfg[0]   = MCTRL_SIG(DTR_OP, LINE_OP7) |
                          MCTRL_SIG(RTS_OP, LINE_OP3) |
                          MCTRL_SIG(DSR_IP, LINE_IP5) |
index 12a5c26..81e7047 100644 (file)
@@ -15,6 +15,7 @@
 #define SUPPORT_SYSRQ
 #endif
 
+#include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/module.h>
 #include <linux/device.h>
@@ -783,9 +784,10 @@ static int sccnxp_probe(struct platform_device *pdev)
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        int chiptype = pdev->id_entry->driver_data;
        struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev);
-       int i, ret, fifosize, freq_min, freq_max;
+       int i, ret, fifosize, freq_min, freq_max, uartclk;
        struct sccnxp_port *s;
        void __iomem *membase;
+       struct clk *clk;
 
        membase = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(membase))
@@ -898,11 +900,25 @@ static int sccnxp_probe(struct platform_device *pdev)
        } else if (PTR_ERR(s->regulator) == -EPROBE_DEFER)
                return -EPROBE_DEFER;
 
-       if (!pdata) {
-               dev_warn(&pdev->dev,
-                        "No platform data supplied, using defaults\n");
-               s->pdata.frequency = s->freq_std;
+       clk = devm_clk_get(&pdev->dev, NULL);
+       if (IS_ERR(clk)) {
+               if (PTR_ERR(clk) == -EPROBE_DEFER) {
+                       ret = -EPROBE_DEFER;
+                       goto err_out;
+               }
+               dev_notice(&pdev->dev, "Using default clock frequency\n");
+               uartclk = s->freq_std;
        } else
+               uartclk = clk_get_rate(clk);
+
+       /* Check input frequency */
+       if ((uartclk < freq_min) || (uartclk > freq_max)) {
+               dev_err(&pdev->dev, "Frequency out of bounds\n");
+               ret = -EINVAL;
+               goto err_out;
+       }
+
+       if (pdata)
                memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata));
 
        if (s->pdata.poll_time_us) {
@@ -920,14 +936,6 @@ static int sccnxp_probe(struct platform_device *pdev)
                }
        }
 
-       /* Check input frequency */
-       if ((s->pdata.frequency < freq_min) ||
-           (s->pdata.frequency > freq_max)) {
-               dev_err(&pdev->dev, "Frequency out of bounds\n");
-               ret = -EINVAL;
-               goto err_out;
-       }
-
        s->uart.owner           = THIS_MODULE;
        s->uart.dev_name        = "ttySC";
        s->uart.major           = SCCNXP_MAJOR;
@@ -959,7 +967,7 @@ static int sccnxp_probe(struct platform_device *pdev)
                s->port[i].mapbase      = res->start;
                s->port[i].membase      = membase;
                s->port[i].regshift     = s->pdata.reg_shift;
-               s->port[i].uartclk      = s->pdata.frequency;
+               s->port[i].uartclk      = uartclk;
                s->port[i].ops          = &sccnxp_ops;
                uart_add_one_port(&s->uart, &s->port[i]);
                /* Set direction to input */
index bdc510d..af0c8c3 100644 (file)
@@ -60,7 +60,6 @@
  * };
  *
  * static struct sccnxp_pdata sc2892_info = {
- *     .frequency      = 3686400,
  *     .mctrl_cfg[0]   = MCTRL_SIG(DIR_OP, LINE_OP0),
  *     .mctrl_cfg[1]   = MCTRL_SIG(DIR_OP, LINE_OP1),
  * };
@@ -78,8 +77,6 @@
 
 /* SCCNXP platform data structure */
 struct sccnxp_pdata {
-       /* Frequency (extrenal clock or crystal) */
-       int                     frequency;
        /* Shift for A0 line */
        const u8                reg_shift;
        /* Modem control lines configuration */