From: Dongwoo Lee Date: Mon, 13 May 2019 07:33:18 +0000 (+0900) Subject: serial: bcm283x_mu: Refactor RX buffer X-Git-Tag: submit/tizen/20190530.011954~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b7f15b8819732ab488cdd75402baaa6b198c1a23;p=platform%2Fkernel%2Fu-boot.git serial: bcm283x_mu: Refactor RX buffer This patch changes maximum count of reading rx fifo by following emprical test, and applies circular queue to buffer. Change-Id: Id498ea9c0c22014f00af2b45ad64ad4c6e69a021 Signed-off-by: Dongwoo Lee --- diff --git a/drivers/serial/serial_bcm283x_mu.c b/drivers/serial/serial_bcm283x_mu.c index d8cdb1f1d4..725aa63dd4 100644 --- a/drivers/serial/serial_bcm283x_mu.c +++ b/drivers/serial/serial_bcm283x_mu.c @@ -100,12 +100,15 @@ static int bcm283x_mu_serial_probe(struct udevice *dev) static inline int bcm283x_mu_rx_buffer_full(struct bcm283x_mu_priv *priv) { - return !!(priv->rx_buffer_in_pos == BCM283X_MU_RX_BUFFER_LEN - 1); + if (!priv->rx_buffer_out_pos) + return priv->rx_buffer_in_pos == BCM283X_MU_RX_BUFFER_LEN - 1; + + return priv->rx_buffer_out_pos == priv->rx_buffer_in_pos + 1; } static inline int bcm283x_mu_rx_buffer_empty(struct bcm283x_mu_priv *priv) { - return !!(priv->rx_buffer_out_pos == BCM283X_MU_RX_BUFFER_INIT_POS); + return priv->rx_buffer_out_pos == BCM283X_MU_RX_BUFFER_INIT_POS; } static void bcm283x_mu_rx_buffer_put(struct bcm283x_mu_priv *priv, int data) @@ -113,7 +116,10 @@ static void bcm283x_mu_rx_buffer_put(struct bcm283x_mu_priv *priv, int data) if (bcm283x_mu_rx_buffer_empty(priv)) priv->rx_buffer_out_pos++; - priv->rx_buffer[++priv->rx_buffer_in_pos] = data; + priv->rx_buffer_in_pos++; + priv->rx_buffer_in_pos %= BCM283X_MU_RX_BUFFER_LEN; + + priv->rx_buffer[priv->rx_buffer_in_pos] = data; } static int bcm283x_mu_rx_buffer_get(struct bcm283x_mu_priv *priv) @@ -125,6 +131,7 @@ static int bcm283x_mu_rx_buffer_get(struct bcm283x_mu_priv *priv) priv->rx_buffer_out_pos = BCM283X_MU_RX_BUFFER_INIT_POS; } else { priv->rx_buffer_out_pos++; + priv->rx_buffer_out_pos %= BCM283X_MU_RX_BUFFER_LEN; } return data; @@ -135,7 +142,7 @@ static int bcm283x_mu_serial_getc(struct udevice *dev) struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev); struct bcm283x_mu_priv *priv = dev_get_priv(dev); struct bcm283x_mu_regs *regs = priv->regs; - int max_count = 256; + int max_count = 32; if (plat->disabled) return -EAGAIN; @@ -144,13 +151,13 @@ static int bcm283x_mu_serial_getc(struct udevice *dev) if (bcm283x_mu_rx_buffer_full(priv) || --max_count == 0) break; - bcm283x_mu_rx_buffer_put(priv, readl(®s->io)); + bcm283x_mu_rx_buffer_put(priv, (int)readl(®s->io)); } if (bcm283x_mu_rx_buffer_empty(priv)) return -EAGAIN; - return (int)bcm283x_mu_rx_buffer_get(priv); + return bcm283x_mu_rx_buffer_get(priv); } static int bcm283x_mu_serial_putc(struct udevice *dev, const char data)