serial: stm32: fix error handling in probe
authorFabrice Gasnier <fabrice.gasnier@st.com>
Thu, 13 Jul 2017 15:08:29 +0000 (15:08 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 30 Jul 2017 14:32:31 +0000 (07:32 -0700)
Disable clock properly in case of error.

Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Signed-off-by: Bich Hemon <bich.hemon@st.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/stm32-usart.c

index 2fca2d2..688afc4 100644 (file)
@@ -678,8 +678,10 @@ static int stm32_init_port(struct stm32_port *stm32port,
                return ret;
 
        stm32port->port.uartclk = clk_get_rate(stm32port->clk);
-       if (!stm32port->port.uartclk)
+       if (!stm32port->port.uartclk) {
+               clk_disable_unprepare(stm32port->clk);
                ret = -EINVAL;
+       }
 
        return ret;
 }
@@ -865,7 +867,7 @@ static int stm32_serial_probe(struct platform_device *pdev)
 
        ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port);
        if (ret)
-               return ret;
+               goto err_uninit;
 
        ret = stm32_of_dma_rx_probe(stm32port, pdev);
        if (ret)
@@ -878,6 +880,11 @@ static int stm32_serial_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, &stm32port->port);
 
        return 0;
+
+err_uninit:
+       clk_disable_unprepare(stm32port->clk);
+
+       return ret;
 }
 
 static int stm32_serial_remove(struct platform_device *pdev)