serial: sc16is7xx: Respect clock-frequency property
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 18 Mar 2019 10:29:15 +0000 (12:29 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 27 Mar 2019 15:30:50 +0000 (00:30 +0900)
If the property is provided and there are no other possibilities to detect
UART clock frequency, use it as a fallback.

Tested-By: Georgii Staroselskii <georgii.staroselskii@emlid.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sc16is7xx.c

index 635178c..7240c86 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/property.h>
 #include <linux/regmap.h>
 #include <linux/serial_core.h>
 #include <linux/serial.h>
@@ -1179,7 +1180,8 @@ static int sc16is7xx_probe(struct device *dev,
                           struct regmap *regmap, int irq, unsigned long flags)
 {
        struct sched_param sched_param = { .sched_priority = MAX_RT_PRIO / 2 };
-       unsigned long freq, *pfreq = dev_get_platdata(dev);
+       unsigned long freq = 0, *pfreq = dev_get_platdata(dev);
+       u32 uartclk = 0;
        int i, ret;
        struct sc16is7xx_port *s;
 
@@ -1193,10 +1195,17 @@ static int sc16is7xx_probe(struct device *dev,
                return -ENOMEM;
        }
 
+       /* Always ask for fixed clock rate from a property. */
+       device_property_read_u32(dev, "clock-frequency", &uartclk);
+
        s->clk = devm_clk_get(dev, NULL);
        if (IS_ERR(s->clk)) {
+               if (uartclk)
+                       freq = uartclk;
                if (pfreq)
                        freq = *pfreq;
+               if (freq)
+                       dev_dbg(dev, "Clock frequency: %luHz\n", freq);
                else
                        return PTR_ERR(s->clk);
        } else {