summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTimple Raj M <[email protected]>2026-04-21 10:15:55 +0530
committerCasey Connolly <[email protected]>2026-05-18 11:04:14 +0200
commit8fce24a418bdd498ae478fa381023db2f8565f44 (patch)
treed61ab82291f22df8f405bf46da97cc92cbea41d3 /drivers
parentc9eb2d64e2c6c1e1f1ebd3ea734afe2b0bac963b (diff)
serial: msm-geni: configure RX watermark register
The SE_GENI_RX_WATERMARK_REG was not being programmed in the RX setup paths. Set it to DEF_RX_WM (2) in qcom_geni_serial_start_rx(), msm_geni_serial_setup_rx() and _debug_uart_init() to align with the Linux kernel driver behaviour. Without this, the RX FIFO watermark interrupt threshold is left at its hardware reset value, which may differ from the expected value and can cause RX data loss or missed watermark interrupts. Link: https://lore.kernel.org/all/[email protected]/ Signed-off-by: Timple Raj M <[email protected]> Signed-off-by: Gurumoorthy Santhakumar <[email protected]> Reviewed-by: Simon Glass <[email protected]> Reviewed-by: Sumit Garg <[email protected]> Reviewed-by: Csey Connolly <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Casey Connolly <[email protected]>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/serial/serial_msm_geni.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/serial/serial_msm_geni.c b/drivers/serial/serial_msm_geni.c
index 3dca581f68f..ae4015e0fdc 100644
--- a/drivers/serial/serial_msm_geni.c
+++ b/drivers/serial/serial_msm_geni.c
@@ -55,6 +55,7 @@
#define SE_UART_RX_PARITY_CFG 0x2a8
#define DEF_TX_WM 2
+#define DEF_RX_WM 2
/* GENI_FORCE_DEFAULT_REG fields */
#define UART_START_READ 0x1
@@ -345,6 +346,7 @@ static void qcom_geni_serial_start_rx(struct udevice *dev)
geni_se_setup_s_cmd(priv->base, UART_START_READ, 0);
+ writel(DEF_RX_WM, priv->base + SE_GENI_RX_WATERMARK_REG);
setbits_le32(priv->base + SE_GENI_S_IRQ_EN, S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN);
setbits_le32(priv->base + SE_GENI_M_IRQ_EN, M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN);
}
@@ -373,6 +375,7 @@ static void msm_geni_serial_setup_rx(struct udevice *dev)
geni_se_setup_s_cmd(priv->base, UART_START_READ, 0);
+ writel(DEF_RX_WM, priv->base + SE_GENI_RX_WATERMARK_REG);
setbits_le32(priv->base + SE_GENI_S_IRQ_EN, S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN);
setbits_le32(priv->base + SE_GENI_M_IRQ_EN, M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN);
}
@@ -616,6 +619,7 @@ static inline void _debug_uart_init(void)
phys_addr_t base = CONFIG_VAL(DEBUG_UART_BASE);
geni_serial_init(&init_dev);
+ writel(DEF_RX_WM, base + SE_GENI_RX_WATERMARK_REG);
geni_serial_baud(base, CLK_DIV, CONFIG_BAUDRATE);
qcom_geni_serial_start_tx(base);
}