From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: Peter Hurley <peter@hurleysoftware.com>
Cc: balbi@ti.com, linux-omap@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
Tony Lindgren <tony@atomide.com>,
linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
mika.westerberg@linux.intel.com
Subject: Re: [PATCH 4/5] tty: serial: 8250 core: add runtime pm
Date: Thu, 17 Jul 2014 17:43:00 +0200 [thread overview]
Message-ID: <20140717154300.GA16623@linutronix.de> (raw)
In-Reply-To: <53C7EC6F.6060902@hurleysoftware.com>
* Peter Hurley | 2014-07-17 11:31:59 [-0400]:
>On 07/16/2014 12:06 PM, Felipe Balbi wrote:
>>On Wed, Jul 16, 2014 at 05:54:56PM +0200, Sebastian Andrzej Siewior wrote:
>>>On 07/16/2014 05:16 PM, Felipe Balbi wrote:
>
>>>>I wonder if you should get_sync() on start_tx() and only
>>>>put_autosuspend() at stop_tx(). I guess the outcome would be
>>>>largely the same, no ?
>>>
>>>I just opened minicom on ttyS0 and gave a try. start_tx() was invoked
>>>each time I pressed a key (sent a character). I haven't seen stop_tx()
>>>even after after I closed minicom. I guess stop_tx() is invoked if you
>>>switch half-duplex communication.
>>
>>that's bad, I expected stop to be called also after each character.
>
>The 8250 core auto-stops tx when the tx ring buffer is empty (except
>in the case of dma, where stopping tx isn't necessary).
This is correct. So this is what I have now for the non-dma case:
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
index 2e4a93b..480a1c0 100644
--- a/drivers/tty/serial/8250/8250_core.c
+++ b/drivers/tty/serial/8250/8250_core.c
@@ -1283,6 +1283,9 @@ static inline void __stop_tx(struct uart_8250_port *p)
if (p->ier & UART_IER_THRI) {
p->ier &= ~UART_IER_THRI;
serial_out(p, UART_IER, p->ier);
+
+ pm_runtime_mark_last_busy(p->port.dev);
+ pm_runtime_put_autosuspend(p->port.dev);
}
}
@@ -1310,12 +1313,12 @@ static void serial8250_start_tx(struct uart_port *port)
struct uart_8250_port *up =
container_of(port, struct uart_8250_port, port);
- pm_runtime_get_sync(port->dev);
if (up->dma && !serial8250_tx_dma(up)) {
goto out;
} else if (!(up->ier & UART_IER_THRI)) {
up->ier |= UART_IER_THRI;
+ pm_runtime_get_sync(port->dev);
serial_port_out(port, UART_IER, up->ier);
if (up->bugs & UART_BUG_TXEN) {
unsigned char lsr;
@@ -1500,9 +1503,10 @@ void serial8250_tx_chars(struct uart_8250_port *up)
uart_write_wakeup(port);
DEBUG_INTR("THRE...");
-
+#if 0
if (uart_circ_empty(xmit))
__stop_tx(up);
+#endif
}
EXPORT_SYMBOL_GPL(serial8250_tx_chars);
and now I need to come up with something that is not if (port != omap)
for that #if 0 block. The code disables the TX FIFO empty interrupt once
the transfer is complete. I want to call __stop_tx() once the tx fifo is
empty.
Felipe, Would a check for dev->power.use_autosuspend be the right thing
to do?
>Regards,
>Peter Hurley
Sebastian
WARNING: multiple messages have this Message-ID (diff)
From: bigeasy@linutronix.de (Sebastian Andrzej Siewior)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 4/5] tty: serial: 8250 core: add runtime pm
Date: Thu, 17 Jul 2014 17:43:00 +0200 [thread overview]
Message-ID: <20140717154300.GA16623@linutronix.de> (raw)
In-Reply-To: <53C7EC6F.6060902@hurleysoftware.com>
* Peter Hurley | 2014-07-17 11:31:59 [-0400]:
>On 07/16/2014 12:06 PM, Felipe Balbi wrote:
>>On Wed, Jul 16, 2014 at 05:54:56PM +0200, Sebastian Andrzej Siewior wrote:
>>>On 07/16/2014 05:16 PM, Felipe Balbi wrote:
>
>>>>I wonder if you should get_sync() on start_tx() and only
>>>>put_autosuspend() at stop_tx(). I guess the outcome would be
>>>>largely the same, no ?
>>>
>>>I just opened minicom on ttyS0 and gave a try. start_tx() was invoked
>>>each time I pressed a key (sent a character). I haven't seen stop_tx()
>>>even after after I closed minicom. I guess stop_tx() is invoked if you
>>>switch half-duplex communication.
>>
>>that's bad, I expected stop to be called also after each character.
>
>The 8250 core auto-stops tx when the tx ring buffer is empty (except
>in the case of dma, where stopping tx isn't necessary).
This is correct. So this is what I have now for the non-dma case:
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
index 2e4a93b..480a1c0 100644
--- a/drivers/tty/serial/8250/8250_core.c
+++ b/drivers/tty/serial/8250/8250_core.c
@@ -1283,6 +1283,9 @@ static inline void __stop_tx(struct uart_8250_port *p)
if (p->ier & UART_IER_THRI) {
p->ier &= ~UART_IER_THRI;
serial_out(p, UART_IER, p->ier);
+
+ pm_runtime_mark_last_busy(p->port.dev);
+ pm_runtime_put_autosuspend(p->port.dev);
}
}
@@ -1310,12 +1313,12 @@ static void serial8250_start_tx(struct uart_port *port)
struct uart_8250_port *up =
container_of(port, struct uart_8250_port, port);
- pm_runtime_get_sync(port->dev);
if (up->dma && !serial8250_tx_dma(up)) {
goto out;
} else if (!(up->ier & UART_IER_THRI)) {
up->ier |= UART_IER_THRI;
+ pm_runtime_get_sync(port->dev);
serial_port_out(port, UART_IER, up->ier);
if (up->bugs & UART_BUG_TXEN) {
unsigned char lsr;
@@ -1500,9 +1503,10 @@ void serial8250_tx_chars(struct uart_8250_port *up)
uart_write_wakeup(port);
DEBUG_INTR("THRE...");
-
+#if 0
if (uart_circ_empty(xmit))
__stop_tx(up);
+#endif
}
EXPORT_SYMBOL_GPL(serial8250_tx_chars);
and now I need to come up with something that is not if (port != omap)
for that #if 0 block. The code disables the TX FIFO empty interrupt once
the transfer is complete. I want to call __stop_tx() once the tx fifo is
empty.
Felipe, Would a check for dev->power.use_autosuspend be the right thing
to do?
>Regards,
>Peter Hurley
Sebastian
next prev parent reply other threads:[~2014-07-17 15:43 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-16 14:44 [PATCH v4] 8250-core based serial driver for OMAP Sebastian Andrzej Siewior
2014-07-16 14:44 ` Sebastian Andrzej Siewior
2014-07-16 14:44 ` Sebastian Andrzej Siewior
2014-07-16 14:44 ` [PATCH 1/5] tty: serial: 8250 core: provide a function to export uart_8250_port Sebastian Andrzej Siewior
2014-07-16 14:44 ` Sebastian Andrzej Siewior
2014-07-16 14:45 ` [PATCH 2/5] tty: serial: 8250 core: allow to overwrite & export serial8250_startup() Sebastian Andrzej Siewior
2014-07-16 14:45 ` Sebastian Andrzej Siewior
2014-07-16 14:45 ` Sebastian Andrzej Siewior
2014-07-16 14:45 ` [PATCH 3/5] tty: serial: 8250 core: allow to set ->throttle / ->unthrottle callbacks Sebastian Andrzej Siewior
2014-07-16 14:45 ` Sebastian Andrzej Siewior
2014-07-16 14:45 ` [PATCH 4/5] tty: serial: 8250 core: add runtime pm Sebastian Andrzej Siewior
2014-07-16 14:45 ` Sebastian Andrzej Siewior
2014-07-16 15:16 ` Felipe Balbi
2014-07-16 15:16 ` Felipe Balbi
2014-07-16 15:16 ` Felipe Balbi
2014-07-16 15:54 ` Sebastian Andrzej Siewior
2014-07-16 15:54 ` Sebastian Andrzej Siewior
2014-07-16 16:06 ` Felipe Balbi
2014-07-16 16:06 ` Felipe Balbi
2014-07-16 16:06 ` Felipe Balbi
2014-07-16 16:40 ` Sebastian Andrzej Siewior
2014-07-16 16:40 ` Sebastian Andrzej Siewior
2014-07-16 16:40 ` Sebastian Andrzej Siewior
2014-07-16 16:46 ` Felipe Balbi
2014-07-16 16:46 ` Felipe Balbi
2014-07-16 16:46 ` Felipe Balbi
2014-07-17 15:31 ` Peter Hurley
2014-07-17 15:31 ` Peter Hurley
2014-07-17 15:43 ` Sebastian Andrzej Siewior [this message]
2014-07-17 15:43 ` Sebastian Andrzej Siewior
2014-07-17 16:02 ` Felipe Balbi
2014-07-17 16:02 ` Felipe Balbi
2014-07-17 16:02 ` Felipe Balbi
2014-07-17 16:06 ` Sebastian Andrzej Siewior
2014-07-17 16:06 ` Sebastian Andrzej Siewior
2014-07-17 16:18 ` Felipe Balbi
2014-07-17 16:18 ` Felipe Balbi
2014-07-17 16:18 ` Felipe Balbi
2014-07-18 8:35 ` Sebastian Andrzej Siewior
2014-07-18 8:35 ` Sebastian Andrzej Siewior
2014-07-18 8:35 ` Sebastian Andrzej Siewior
2014-07-18 15:31 ` Felipe Balbi
2014-07-18 15:31 ` Felipe Balbi
2014-07-18 15:31 ` Felipe Balbi
2014-07-18 15:53 ` Peter Hurley
2014-07-18 15:53 ` Peter Hurley
2014-07-18 16:02 ` Felipe Balbi
2014-07-18 16:02 ` Felipe Balbi
2014-07-18 16:02 ` Felipe Balbi
2014-07-16 14:45 ` [PATCH 5/5] tty: serial: Add 8250-core based omap driver Sebastian Andrzej Siewior
2014-07-16 14:45 ` Sebastian Andrzej Siewior
2014-07-17 7:09 ` Tony Lindgren
2014-07-17 7:09 ` Tony Lindgren
2014-07-17 7:09 ` Tony Lindgren
2014-07-17 7:42 ` Sebastian Andrzej Siewior
2014-07-17 7:42 ` Sebastian Andrzej Siewior
2014-07-17 8:12 ` Tony Lindgren
2014-07-17 8:12 ` Tony Lindgren
2014-07-17 10:06 ` Sebastian Andrzej Siewior
2014-07-17 10:06 ` Sebastian Andrzej Siewior
2014-07-18 6:24 ` Tony Lindgren
2014-07-18 6:24 ` Tony Lindgren
2014-07-18 6:24 ` Tony Lindgren
2014-07-21 9:35 ` Tony Lindgren
2014-07-21 9:35 ` Tony Lindgren
2014-07-21 9:35 ` Tony Lindgren
2014-08-13 16:20 ` Sebastian Andrzej Siewior
2014-08-13 16:20 ` Sebastian Andrzej Siewior
2014-08-13 16:37 ` Tony Lindgren
2014-08-13 16:37 ` Tony Lindgren
2014-07-17 14:54 ` Felipe Balbi
2014-07-17 14:54 ` Felipe Balbi
2014-07-17 14:54 ` Felipe Balbi
2014-07-17 15:11 ` Sebastian Andrzej Siewior
2014-07-17 15:11 ` Sebastian Andrzej Siewior
2014-07-17 16:04 ` Felipe Balbi
2014-07-17 16:04 ` Felipe Balbi
2014-07-17 16:04 ` Felipe Balbi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140717154300.GA16623@linutronix.de \
--to=bigeasy@linutronix.de \
--cc=balbi@ti.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=peter@hurleysoftware.com \
--cc=tony@atomide.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.