serial: 8250_omap: Use clk_get_rate() to obtain fclk frequency
authorVignesh R <vigneshr@ti.com>
Wed, 9 Jan 2019 09:12:06 +0000 (14:42 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 18 Jan 2019 10:23:00 +0000 (11:23 +0100)
8250_omap driver uses clock-frequency DT property to obtain functional
clk frequency. This is not ideal as users need to calculate functional
clk frequency offline and populate it in DT.
Therefore add support to obtain functional clock frequency using clk
APIs when clock-frequency DT property is not defined.

Suggested-by: Lokesh Vutla <lokeshvutla@ti.com>
Signed-off-by: Vignesh R <vigneshr@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_omap.c

index a74126569785c84d1c11a4ebdd5093935730cbbc..0a8316632d751563ef12fe6b74c69a0570286f97 100644 (file)
@@ -12,6 +12,7 @@
 #define SUPPORT_SYSRQ
 #endif
 
+#include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/io.h>
 #include <linux/module.h>
@@ -1203,7 +1204,18 @@ static int omap8250_probe(struct platform_device *pdev)
        }
        up.port.line = ret;
 
-       of_property_read_u32(np, "clock-frequency", &up.port.uartclk);
+       if (of_property_read_u32(np, "clock-frequency", &up.port.uartclk)) {
+               struct clk *clk;
+
+               clk = devm_clk_get(&pdev->dev, NULL);
+               if (IS_ERR(clk)) {
+                       if (PTR_ERR(clk) == -EPROBE_DEFER)
+                               return -EPROBE_DEFER;
+               } else {
+                       up.port.uartclk = clk_get_rate(clk);
+               }
+       }
+
        priv->wakeirq = irq_of_parse_and_map(np, 1);
 
        id = of_match_device(of_match_ptr(omap8250_dt_ids), &pdev->dev);