SE HMIBSC board debug console requires RS232 flow control, so enable
corresponding support if RS232 gpios are present.

Signed-off-by: Sumit Garg <sumit.g...@linaro.org>
---
 drivers/serial/serial_msm.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/serial/serial_msm.c b/drivers/serial/serial_msm.c
index 43e58595dc2..a38bf229f06 100644
--- a/drivers/serial/serial_msm.c
+++ b/drivers/serial/serial_msm.c
@@ -35,6 +35,8 @@
 #define UARTDM_MR2                              0x04
 #define UARTDM_CSR                              0xA0
 
+#define MSM_UART_MR1_RX_RDY_CTL                BIT(7)
+
 #define UARTDM_SR                0xA4 /* Status register */
 #define UARTDM_SR_RX_READY       (1 << 0) /* Word is the receiver FIFO */
 #define UARTDM_SR_TX_EMPTY       (1 << 3) /* Transmitter underrun */
@@ -193,13 +195,18 @@ static int msm_uart_clk_init(struct udevice *dev)
        return 0;
 }
 
-static void uart_dm_init(struct msm_serial_data *priv)
+static void uart_dm_init(struct msm_serial_data *priv, bool is_rs232)
 {
        /* Delay initialization for a bit to let pins stabilize if necessary */
        mdelay(5);
 
        writel(priv->clk_bit_rate, priv->base + UARTDM_CSR);
-       writel(0x0, priv->base + UARTDM_MR1);
+
+       if (is_rs232)
+               writel(MSM_UART_MR1_RX_RDY_CTL, priv->base + UARTDM_MR1);
+       else
+               writel(0x0, priv->base + UARTDM_MR1);
+
        writel(MSM_BOOT_UART_DM_8_N_1_MODE, priv->base + UARTDM_MR2);
        writel(MSM_BOOT_UART_DM_CMD_RESET_RX, priv->base + UARTDM_CR);
        writel(MSM_BOOT_UART_DM_CMD_RESET_TX, priv->base + UARTDM_CR);
@@ -212,6 +219,7 @@ static int msm_serial_probe(struct udevice *dev)
        int ret;
        struct msm_serial_data *priv = dev_get_priv(dev);
        struct gpio_desc rs232_0, rs232_1;
+       bool is_rs232 = false;
 
        /* No need to reinitialize the UART after relocation */
        if (gd->flags & GD_FLG_RELOC)
@@ -221,13 +229,15 @@ static int msm_serial_probe(struct udevice *dev)
        if (ret)
                return ret;
 
-       if (!gpio_request_by_name(dev, "gpios", 0, &rs232_0, GPIOD_IS_OUT))
+       if (!gpio_request_by_name(dev, "gpios", 0, &rs232_0, GPIOD_IS_OUT)) {
                dm_gpio_set_value(&rs232_0, 1);
+               is_rs232 = true;
+       }
        if (!gpio_request_by_name(dev, "gpios", 1, &rs232_1, GPIOD_IS_OUT))
                dm_gpio_set_value(&rs232_1, 0);
 
        pinctrl_select_state(dev, "uart");
-       uart_dm_init(priv);
+       uart_dm_init(priv, is_rs232);
 
        return 0;
 }
-- 
2.34.1

Reply via email to