From: Suhrid Subramaniam <[email protected]>

Use ulong for return value of clk_get_rate() in the MediaTek serial
driver.

IS_ERR_VALUE() does a signed 64-bit comparison against the range of
possible error codes. If clk_get_rate() returns an error, assigning this
to a u32 truncates the top 32 bits making the value smaller, defeating
IS_ERR_VALUE() and producing a garbage divisor that hangs the UART.

Fixes: 3b17f2e2c2a9 ("serial: mtk: add support for using dynamic baud clock 
souce")
Signed-off-by: Suhrid Subramaniam <[email protected]>
Reviewed-by: Julien Stephan <[email protected]>
Signed-off-by: David Lechner <[email protected]>
---
 drivers/serial/serial_mtk.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/serial/serial_mtk.c b/drivers/serial/serial_mtk.c
index 01cc415efdd..28e87f485a2 100644
--- a/drivers/serial/serial_mtk.c
+++ b/drivers/serial/serial_mtk.c
@@ -213,7 +213,7 @@ static int _mtk_serial_pending(struct mtk_serial_priv 
*priv, bool input)
 static int mtk_serial_setbrg(struct udevice *dev, int baudrate)
 {
        struct mtk_serial_priv *priv = dev_get_priv(dev);
-       u32 clk_rate;
+       ulong clk_rate;
 
        clk_rate = clk_get_rate(&priv->clk);
        if (IS_ERR_VALUE(clk_rate) || clk_rate == 0)
@@ -266,6 +266,7 @@ static int mtk_serial_of_to_plat(struct udevice *dev)
 {
        struct mtk_serial_priv *priv = dev_get_priv(dev);
        fdt_addr_t addr;
+       ulong clk_rate;
        int err;
 
        addr = dev_read_addr(dev);
@@ -282,8 +283,8 @@ static int mtk_serial_of_to_plat(struct udevice *dev)
                        return -EINVAL;
                }
        } else {
-               err = clk_get_rate(&priv->clk);
-               if (IS_ERR_VALUE(err)) {
+               clk_rate = clk_get_rate(&priv->clk);
+               if (IS_ERR_VALUE(clk_rate)) {
                        dev_err(dev, "invalid baud clock\n");
                        return -EINVAL;
                }

-- 
2.43.0

Reply via email to