* [PATCH v2 0/7] serial: liteuart: add IRQ support
@ 2022-11-10 0:44 Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 1/7] serial: liteuart: use KBUILD_MODNAME as driver name Gabriel Somlo
` (6 more replies)
0 siblings, 7 replies; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Add IRQ support to the LiteX LiteUART serial interface
Changes from v1:
- split minor cosmetic changes out into individual patches
(1/3 became 1..5/7)
- patches 6/7 and 7/7 unchanged (used to be 2/3 and 3/3)
Gabriel Somlo (7):
serial: liteuart: use KBUILD_MODNAME as driver name
serial: liteuart: use bit number macros
serial: liteuart: remove unused uart_ops stubs
serial: liteuart: don't set unused port fields
serial: liteuart: minor style fix in liteuart_init()
serial: liteuart: separate RX loop from poll timer
serial: liteuart: add IRQ support
drivers/tty/serial/liteuart.c | 123 ++++++++++++++++++++++------------
1 file changed, 80 insertions(+), 43 deletions(-)
--
2.37.3
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/7] serial: liteuart: use KBUILD_MODNAME as driver name
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
@ 2022-11-10 0:44 ` Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 2/7] serial: liteuart: use bit number macros Gabriel Somlo
` (5 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Replace hard-coded instances of "liteuart" with KBUILD_MODNAME.
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
---
drivers/tty/serial/liteuart.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
index 4c0604325ee9..32b81bd03d0c 100644
--- a/drivers/tty/serial/liteuart.c
+++ b/drivers/tty/serial/liteuart.c
@@ -57,7 +57,7 @@ static struct console liteuart_console;
static struct uart_driver liteuart_driver = {
.owner = THIS_MODULE,
- .driver_name = "liteuart",
+ .driver_name = KBUILD_MODNAME,
.dev_name = "ttyLXU",
.major = 0,
.minor = 0,
@@ -322,7 +322,7 @@ static struct platform_driver liteuart_platform_driver = {
.probe = liteuart_probe,
.remove = liteuart_remove,
.driver = {
- .name = "liteuart",
+ .name = KBUILD_MODNAME,
.of_match_table = liteuart_of_match,
},
};
@@ -368,7 +368,7 @@ static int liteuart_console_setup(struct console *co, char *options)
}
static struct console liteuart_console = {
- .name = "liteuart",
+ .name = KBUILD_MODNAME,
.write = liteuart_console_write,
.device = uart_console_device,
.setup = liteuart_console_setup,
--
2.37.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 2/7] serial: liteuart: use bit number macros
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 1/7] serial: liteuart: use KBUILD_MODNAME as driver name Gabriel Somlo
@ 2022-11-10 0:44 ` Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 3/7] serial: liteuart: remove unused uart_ops stubs Gabriel Somlo
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Replace magic bit constants (e.g., 1, 2, 4) with BIT(x) expressions.
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
---
drivers/tty/serial/liteuart.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
index 32b81bd03d0c..1497d4cdc221 100644
--- a/drivers/tty/serial/liteuart.c
+++ b/drivers/tty/serial/liteuart.c
@@ -38,8 +38,8 @@
#define OFF_EV_ENABLE 0x14
/* events */
-#define EV_TX 0x1
-#define EV_RX 0x2
+#define EV_TX BIT(0)
+#define EV_RX BIT(1)
struct liteuart_port {
struct uart_port port;
--
2.37.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 3/7] serial: liteuart: remove unused uart_ops stubs
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 1/7] serial: liteuart: use KBUILD_MODNAME as driver name Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 2/7] serial: liteuart: use bit number macros Gabriel Somlo
@ 2022-11-10 0:44 ` Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 4/7] serial: liteuart: don't set unused port fields Gabriel Somlo
` (3 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Remove stub uart_ops methods that are not called unconditionally
from serial_core. Document stubs that are expected to be present.
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
---
drivers/tty/serial/liteuart.c | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
index 1497d4cdc221..90f6280c5452 100644
--- a/drivers/tty/serial/liteuart.c
+++ b/drivers/tty/serial/liteuart.c
@@ -122,6 +122,7 @@ static unsigned int liteuart_get_mctrl(struct uart_port *port)
static void liteuart_stop_tx(struct uart_port *port)
{
+ /* not used in LiteUART, but called unconditionally from serial_core */
}
static void liteuart_start_tx(struct uart_port *port)
@@ -154,11 +155,6 @@ static void liteuart_stop_rx(struct uart_port *port)
del_timer(&uart->timer);
}
-static void liteuart_break_ctl(struct uart_port *port, int break_state)
-{
- /* LiteUART doesn't support sending break signal */
-}
-
static int liteuart_startup(struct uart_port *port)
{
struct liteuart_port *uart = to_liteuart_port(port);
@@ -197,15 +193,6 @@ static const char *liteuart_type(struct uart_port *port)
return "liteuart";
}
-static void liteuart_release_port(struct uart_port *port)
-{
-}
-
-static int liteuart_request_port(struct uart_port *port)
-{
- return 0;
-}
-
static void liteuart_config_port(struct uart_port *port, int flags)
{
/*
@@ -232,13 +219,10 @@ static const struct uart_ops liteuart_ops = {
.stop_tx = liteuart_stop_tx,
.start_tx = liteuart_start_tx,
.stop_rx = liteuart_stop_rx,
- .break_ctl = liteuart_break_ctl,
.startup = liteuart_startup,
.shutdown = liteuart_shutdown,
.set_termios = liteuart_set_termios,
.type = liteuart_type,
- .release_port = liteuart_release_port,
- .request_port = liteuart_request_port,
.config_port = liteuart_config_port,
.verify_port = liteuart_verify_port,
};
--
2.37.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 4/7] serial: liteuart: don't set unused port fields
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
` (2 preceding siblings ...)
2022-11-10 0:44 ` [PATCH v2 3/7] serial: liteuart: remove unused uart_ops stubs Gabriel Somlo
@ 2022-11-10 0:44 ` Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 5/7] serial: liteuart: minor style fix in liteuart_init() Gabriel Somlo
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Remove regshift and iobase port fields, since they are unused
by the driver.
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
---
drivers/tty/serial/liteuart.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
index 90f6280c5452..5b684fd198b7 100644
--- a/drivers/tty/serial/liteuart.c
+++ b/drivers/tty/serial/liteuart.c
@@ -264,9 +264,7 @@ static int liteuart_probe(struct platform_device *pdev)
port->iotype = UPIO_MEM;
port->flags = UPF_BOOT_AUTOCONF;
port->ops = &liteuart_ops;
- port->regshift = 2;
port->fifosize = 16;
- port->iobase = 1;
port->type = PORT_UNKNOWN;
port->line = dev_id;
spin_lock_init(&port->lock);
--
2.37.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 5/7] serial: liteuart: minor style fix in liteuart_init()
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
` (3 preceding siblings ...)
2022-11-10 0:44 ` [PATCH v2 4/7] serial: liteuart: don't set unused port fields Gabriel Somlo
@ 2022-11-10 0:44 ` Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 6/7] serial: liteuart: separate RX loop from poll timer Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 7/7] serial: liteuart: add IRQ support Gabriel Somlo
6 siblings, 0 replies; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
---
drivers/tty/serial/liteuart.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
index 5b684fd198b7..047d5ad32e13 100644
--- a/drivers/tty/serial/liteuart.c
+++ b/drivers/tty/serial/liteuart.c
@@ -398,12 +398,10 @@ static int __init liteuart_init(void)
return res;
res = platform_driver_register(&liteuart_platform_driver);
- if (res) {
+ if (res)
uart_unregister_driver(&liteuart_driver);
- return res;
- }
- return 0;
+ return res;
}
static void __exit liteuart_exit(void)
--
2.37.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 6/7] serial: liteuart: separate RX loop from poll timer
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
` (4 preceding siblings ...)
2022-11-10 0:44 ` [PATCH v2 5/7] serial: liteuart: minor style fix in liteuart_init() Gabriel Somlo
@ 2022-11-10 0:44 ` Gabriel Somlo
2022-11-10 11:01 ` Ilpo Järvinen
2022-11-10 0:44 ` [PATCH v2 7/7] serial: liteuart: add IRQ support Gabriel Somlo
6 siblings, 1 reply; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Move the character-receive (RX) loop to its own dedicated function,
and (for now) call that from the poll timer, liteuart_timer().
This is in preparation for adding IRQ support to the receive path.
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
---
drivers/tty/serial/liteuart.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
index 047d5ad32e13..aa7052280197 100644
--- a/drivers/tty/serial/liteuart.c
+++ b/drivers/tty/serial/liteuart.c
@@ -67,29 +67,34 @@ static struct uart_driver liteuart_driver = {
#endif
};
-static void liteuart_timer(struct timer_list *t)
+static void liteuart_rx_chars(struct uart_port *port)
{
- struct liteuart_port *uart = from_timer(uart, t, timer);
- struct uart_port *port = &uart->port;
unsigned char __iomem *membase = port->membase;
- unsigned int flg = TTY_NORMAL;
- int ch;
- unsigned long status;
+ unsigned int status;
+ unsigned char ch;
while ((status = !litex_read8(membase + OFF_RXEMPTY)) == 1) {
ch = litex_read8(membase + OFF_RXTX);
port->icount.rx++;
/* necessary for RXEMPTY to refresh its value */
- litex_write8(membase + OFF_EV_PENDING, EV_TX | EV_RX);
+ litex_write8(membase + OFF_EV_PENDING, EV_RX);
/* no overflow bits in status */
if (!(uart_handle_sysrq_char(port, ch)))
- uart_insert_char(port, status, 0, ch, flg);
-
- tty_flip_buffer_push(&port->state->port);
+ uart_insert_char(port, status, 0, ch, TTY_NORMAL);
}
+ tty_flip_buffer_push(&port->state->port);
+}
+
+static void liteuart_timer(struct timer_list *t)
+{
+ struct liteuart_port *uart = from_timer(uart, t, timer);
+ struct uart_port *port = &uart->port;
+
+ liteuart_rx_chars(port);
+
mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
}
--
2.37.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 7/7] serial: liteuart: add IRQ support
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
` (5 preceding siblings ...)
2022-11-10 0:44 ` [PATCH v2 6/7] serial: liteuart: separate RX loop from poll timer Gabriel Somlo
@ 2022-11-10 0:44 ` Gabriel Somlo
6 siblings, 0 replies; 10+ messages in thread
From: Gabriel Somlo @ 2022-11-10 0:44 UTC (permalink / raw)
To: linux-kernel
Cc: linux-serial, gregkh, jirislaby, kgugala, mholenko, joel,
david.abdurachmanov, florent, geert
Add support for IRQ-driven RX. The TX path remains "polling" based,
which is fine since TX is synchronous.
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
---
drivers/tty/serial/liteuart.c | 66 +++++++++++++++++++++++++++++++----
1 file changed, 59 insertions(+), 7 deletions(-)
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
index aa7052280197..45da944d1fea 100644
--- a/drivers/tty/serial/liteuart.c
+++ b/drivers/tty/serial/liteuart.c
@@ -6,6 +6,7 @@
*/
#include <linux/console.h>
+#include <linux/interrupt.h>
#include <linux/litex.h>
#include <linux/module.h>
#include <linux/of.h>
@@ -88,13 +89,27 @@ static void liteuart_rx_chars(struct uart_port *port)
tty_flip_buffer_push(&port->state->port);
}
+static irqreturn_t liteuart_interrupt(int irq, void *data)
+{
+ struct uart_port *port = data;
+ unsigned int isr;
+
+ isr = litex_read32(port->membase + OFF_EV_PENDING);
+
+ spin_lock(&port->lock);
+ if (isr & EV_RX)
+ liteuart_rx_chars(port);
+ spin_unlock(&port->lock);
+
+ return IRQ_RETVAL(isr);
+}
+
static void liteuart_timer(struct timer_list *t)
{
struct liteuart_port *uart = from_timer(uart, t, timer);
struct uart_port *port = &uart->port;
- liteuart_rx_chars(port);
-
+ liteuart_interrupt(0, port);
mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
}
@@ -163,19 +178,49 @@ static void liteuart_stop_rx(struct uart_port *port)
static int liteuart_startup(struct uart_port *port)
{
struct liteuart_port *uart = to_liteuart_port(port);
+ unsigned long flags;
+ int ret;
+ u8 irq_mask = 0;
- /* disable events */
- litex_write8(port->membase + OFF_EV_ENABLE, 0);
+ if (port->irq) {
+ ret = request_irq(port->irq, liteuart_interrupt, 0,
+ KBUILD_MODNAME, port);
+ if (ret == 0) {
+ /* we only need interrupts on the rx path! */
+ irq_mask = EV_RX;
+ } else {
+ pr_err(KBUILD_MODNAME ": can't attach LiteUART %d "
+ "irq %d; switching to polling\n",
+ port->line, port->irq);
+ port->irq = 0;
+ }
+ }
- /* prepare timer for polling */
- timer_setup(&uart->timer, liteuart_timer, 0);
- mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
+ if (!port->irq) {
+ timer_setup(&uart->timer, liteuart_timer, 0);
+ mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
+ }
+
+ spin_lock_irqsave(&port->lock, flags);
+ litex_write8(port->membase + OFF_EV_ENABLE, irq_mask);
+ spin_unlock_irqrestore(&port->lock, flags);
return 0;
}
static void liteuart_shutdown(struct uart_port *port)
{
+ struct liteuart_port *uart = to_liteuart_port(port);
+ unsigned long flags;
+
+ spin_lock_irqsave(&port->lock, flags);
+ litex_write8(port->membase + OFF_EV_ENABLE, 0);
+ spin_unlock_irqrestore(&port->lock, flags);
+
+ if (port->irq)
+ free_irq(port->irq, port);
+ else
+ del_timer_sync(&uart->timer);
}
static void liteuart_set_termios(struct uart_port *port, struct ktermios *new,
@@ -264,6 +309,13 @@ static int liteuart_probe(struct platform_device *pdev)
goto err_erase_id;
}
+ /* get irq */
+ ret = platform_get_irq_optional(pdev, 0);
+ if (ret < 0 && ret != -ENXIO)
+ return ret;
+ if (ret > 0)
+ port->irq = ret;
+
/* values not from device tree */
port->dev = &pdev->dev;
port->iotype = UPIO_MEM;
--
2.37.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 6/7] serial: liteuart: separate RX loop from poll timer
2022-11-10 0:44 ` [PATCH v2 6/7] serial: liteuart: separate RX loop from poll timer Gabriel Somlo
@ 2022-11-10 11:01 ` Ilpo Järvinen
2022-11-10 20:29 ` Gabriel L. Somlo
0 siblings, 1 reply; 10+ messages in thread
From: Ilpo Järvinen @ 2022-11-10 11:01 UTC (permalink / raw)
To: Gabriel Somlo
Cc: LKML, linux-serial, Greg Kroah-Hartman, Jiri Slaby, kgugala,
mholenko, joel, david.abdurachmanov, florent, geert
On Wed, 9 Nov 2022, Gabriel Somlo wrote:
> Move the character-receive (RX) loop to its own dedicated function,
> and (for now) call that from the poll timer, liteuart_timer().
>
> This is in preparation for adding IRQ support to the receive path.
>
> Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
> ---
> drivers/tty/serial/liteuart.c | 25 +++++++++++++++----------
> 1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
> index 047d5ad32e13..aa7052280197 100644
> --- a/drivers/tty/serial/liteuart.c
> +++ b/drivers/tty/serial/liteuart.c
> @@ -67,29 +67,34 @@ static struct uart_driver liteuart_driver = {
> #endif
> };
>
> -static void liteuart_timer(struct timer_list *t)
> +static void liteuart_rx_chars(struct uart_port *port)
> {
> - struct liteuart_port *uart = from_timer(uart, t, timer);
> - struct uart_port *port = &uart->port;
> unsigned char __iomem *membase = port->membase;
> - unsigned int flg = TTY_NORMAL;
> - int ch;
> - unsigned long status;
> + unsigned int status;
> + unsigned char ch;
>
> while ((status = !litex_read8(membase + OFF_RXEMPTY)) == 1) {
> ch = litex_read8(membase + OFF_RXTX);
> port->icount.rx++;
>
> /* necessary for RXEMPTY to refresh its value */
> - litex_write8(membase + OFF_EV_PENDING, EV_TX | EV_RX);
> + litex_write8(membase + OFF_EV_PENDING, EV_RX);
>
> /* no overflow bits in status */
> if (!(uart_handle_sysrq_char(port, ch)))
> - uart_insert_char(port, status, 0, ch, flg);
> -
> - tty_flip_buffer_push(&port->state->port);
> + uart_insert_char(port, status, 0, ch, TTY_NORMAL);
> }
>
> + tty_flip_buffer_push(&port->state->port);
This change is doing extra stuff besides moving rx to a dedicated
function.
I see no reason why those other changes couldn't be put into an entirely
separate patch. Also, please described those changes properly in the
commit message (answer the why? question).
--
i.
> +}
> +
> +static void liteuart_timer(struct timer_list *t)
> +{
> + struct liteuart_port *uart = from_timer(uart, t, timer);
> + struct uart_port *port = &uart->port;
> +
> + liteuart_rx_chars(port);
> +
> mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
> }
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 6/7] serial: liteuart: separate RX loop from poll timer
2022-11-10 11:01 ` Ilpo Järvinen
@ 2022-11-10 20:29 ` Gabriel L. Somlo
0 siblings, 0 replies; 10+ messages in thread
From: Gabriel L. Somlo @ 2022-11-10 20:29 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: LKML, linux-serial, Greg Kroah-Hartman, Jiri Slaby, kgugala,
mholenko, joel, david.abdurachmanov, florent, geert
On Thu, Nov 10, 2022 at 01:01:47PM +0200, Ilpo Järvinen wrote:
> On Wed, 9 Nov 2022, Gabriel Somlo wrote:
>
> > Move the character-receive (RX) loop to its own dedicated function,
> > and (for now) call that from the poll timer, liteuart_timer().
> >
> > This is in preparation for adding IRQ support to the receive path.
> >
> > Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
> > ---
> > drivers/tty/serial/liteuart.c | 25 +++++++++++++++----------
> > 1 file changed, 15 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
> > index 047d5ad32e13..aa7052280197 100644
> > --- a/drivers/tty/serial/liteuart.c
> > +++ b/drivers/tty/serial/liteuart.c
> > @@ -67,29 +67,34 @@ static struct uart_driver liteuart_driver = {
> > #endif
> > };
> >
> > -static void liteuart_timer(struct timer_list *t)
> > +static void liteuart_rx_chars(struct uart_port *port)
> > {
> > - struct liteuart_port *uart = from_timer(uart, t, timer);
> > - struct uart_port *port = &uart->port;
> > unsigned char __iomem *membase = port->membase;
> > - unsigned int flg = TTY_NORMAL;
> > - int ch;
> > - unsigned long status;
> > + unsigned int status;
> > + unsigned char ch;
> >
> > while ((status = !litex_read8(membase + OFF_RXEMPTY)) == 1) {
> > ch = litex_read8(membase + OFF_RXTX);
> > port->icount.rx++;
> >
> > /* necessary for RXEMPTY to refresh its value */
> > - litex_write8(membase + OFF_EV_PENDING, EV_TX | EV_RX);
> > + litex_write8(membase + OFF_EV_PENDING, EV_RX);
> >
> > /* no overflow bits in status */
> > if (!(uart_handle_sysrq_char(port, ch)))
> > - uart_insert_char(port, status, 0, ch, flg);
> > -
> > - tty_flip_buffer_push(&port->state->port);
> > + uart_insert_char(port, status, 0, ch, TTY_NORMAL);
> > }
> >
> > + tty_flip_buffer_push(&port->state->port);
>
> This change is doing extra stuff besides moving rx to a dedicated
> function.
>
> I see no reason why those other changes couldn't be put into an entirely
> separate patch. Also, please described those changes properly in the
> commit message (answer the why? question).
You're right, calling `tty_flip_buffer_push()` as each character is
received is overkill, we only need to call it once per interrupt once
all available characters have been received.
I forgot I noticed (and fixed) that as part of the move -- I'll split
it out into its own separate patch (probably *before* moving all of rx
to a dedicated function).
Should show up in v3, once I also address all the other feedback I
received.
Thanks again for catching it!
Cheers,
-Gabriel
> --
> i.
>
> > +}
> > +
> > +static void liteuart_timer(struct timer_list *t)
> > +{
> > + struct liteuart_port *uart = from_timer(uart, t, timer);
> > + struct uart_port *port = &uart->port;
> > +
> > + liteuart_rx_chars(port);
> > +
> > mod_timer(&uart->timer, jiffies + uart_poll_timeout(port));
> > }
> >
> >
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-11-10 20:29 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-10 0:44 [PATCH v2 0/7] serial: liteuart: add IRQ support Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 1/7] serial: liteuart: use KBUILD_MODNAME as driver name Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 2/7] serial: liteuart: use bit number macros Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 3/7] serial: liteuart: remove unused uart_ops stubs Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 4/7] serial: liteuart: don't set unused port fields Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 5/7] serial: liteuart: minor style fix in liteuart_init() Gabriel Somlo
2022-11-10 0:44 ` [PATCH v2 6/7] serial: liteuart: separate RX loop from poll timer Gabriel Somlo
2022-11-10 11:01 ` Ilpo Järvinen
2022-11-10 20:29 ` Gabriel L. Somlo
2022-11-10 0:44 ` [PATCH v2 7/7] serial: liteuart: add IRQ support Gabriel Somlo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).