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