Commit 457cd4f5 authored by Dick Hollenbeck's avatar Dick Hollenbeck Committed by Russell King

[ARM] 5250/1: unbalanced enable_irq() for serial_ks8695.c fix

The function ks8695uart_set_termios() would cause an unbalanced
enable_irq() generated message to be printk()ed. This is because
there was no book keeping support to remember if the calls to
enable_irq() and disable_irq() were balanced for the modem
control irq.
Signed-off-by: default avatarDick Hollenbeck <dick@softplc.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent b8e6c91c
...@@ -63,8 +63,44 @@ ...@@ -63,8 +63,44 @@
#define UART_DUMMY_LSR_RX 0x100 #define UART_DUMMY_LSR_RX 0x100
#define UART_PORT_SIZE (KS8695_USR - KS8695_URRB + 4) #define UART_PORT_SIZE (KS8695_USR - KS8695_URRB + 4)
#define tx_enabled(port) ((port)->unused[0]) static inline int tx_enabled(struct uart_port *port)
#define rx_enabled(port) ((port)->unused[1]) {
return port->unused[0] & 1;
}
static inline int rx_enabled(struct uart_port *port)
{
return port->unused[0] & 2;
}
static inline int ms_enabled(struct uart_port *port)
{
return port->unused[0] & 4;
}
static inline void ms_enable(struct uart_port *port, int enabled)
{
if(enabled)
port->unused[0] |= 4;
else
port->unused[0] &= ~4;
}
static inline void rx_enable(struct uart_port *port, int enabled)
{
if(enabled)
port->unused[0] |= 2;
else
port->unused[0] &= ~2;
}
static inline void tx_enable(struct uart_port *port, int enabled)
{
if(enabled)
port->unused[0] |= 1;
else
port->unused[0] &= ~1;
}
#ifdef SUPPORT_SYSRQ #ifdef SUPPORT_SYSRQ
...@@ -75,7 +111,7 @@ static void ks8695uart_stop_tx(struct uart_port *port) ...@@ -75,7 +111,7 @@ static void ks8695uart_stop_tx(struct uart_port *port)
{ {
if (tx_enabled(port)) { if (tx_enabled(port)) {
disable_irq(KS8695_IRQ_UART_TX); disable_irq(KS8695_IRQ_UART_TX);
tx_enabled(port) = 0; tx_enable(port, 0);
} }
} }
...@@ -83,7 +119,7 @@ static void ks8695uart_start_tx(struct uart_port *port) ...@@ -83,7 +119,7 @@ static void ks8695uart_start_tx(struct uart_port *port)
{ {
if (!tx_enabled(port)) { if (!tx_enabled(port)) {
enable_irq(KS8695_IRQ_UART_TX); enable_irq(KS8695_IRQ_UART_TX);
tx_enabled(port) = 1; tx_enable(port, 1);
} }
} }
...@@ -91,18 +127,24 @@ static void ks8695uart_stop_rx(struct uart_port *port) ...@@ -91,18 +127,24 @@ static void ks8695uart_stop_rx(struct uart_port *port)
{ {
if (rx_enabled(port)) { if (rx_enabled(port)) {
disable_irq(KS8695_IRQ_UART_RX); disable_irq(KS8695_IRQ_UART_RX);
rx_enabled(port) = 0; rx_enable(port, 0);
} }
} }
static void ks8695uart_enable_ms(struct uart_port *port) static void ks8695uart_enable_ms(struct uart_port *port)
{ {
enable_irq(KS8695_IRQ_UART_MODEM_STATUS); if (!ms_enabled(port)) {
enable_irq(KS8695_IRQ_UART_MODEM_STATUS);
ms_enable(port,1);
}
} }
static void ks8695uart_disable_ms(struct uart_port *port) static void ks8695uart_disable_ms(struct uart_port *port)
{ {
disable_irq(KS8695_IRQ_UART_MODEM_STATUS); if (ms_enabled(port)) {
disable_irq(KS8695_IRQ_UART_MODEM_STATUS);
ms_enable(port,0);
}
} }
static irqreturn_t ks8695uart_rx_chars(int irq, void *dev_id) static irqreturn_t ks8695uart_rx_chars(int irq, void *dev_id)
...@@ -285,8 +327,9 @@ static int ks8695uart_startup(struct uart_port *port) ...@@ -285,8 +327,9 @@ static int ks8695uart_startup(struct uart_port *port)
int retval; int retval;
set_irq_flags(KS8695_IRQ_UART_TX, IRQF_VALID | IRQF_NOAUTOEN); set_irq_flags(KS8695_IRQ_UART_TX, IRQF_VALID | IRQF_NOAUTOEN);
tx_enabled(port) = 0; tx_enable(port, 0);
rx_enabled(port) = 1; rx_enable(port, 1);
ms_enable(port, 1);
/* /*
* Allocate the IRQ * Allocate the IRQ
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment