Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+52 −9
Original line number Original line Diff line number Diff line
@@ -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)
{
{
	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)
{
{
	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)
{
{
	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)
{
{
	if (!ms_enabled(port)) {
		enable_irq(KS8695_IRQ_UART_MODEM_STATUS);
		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)
{
{
	if (ms_enabled(port)) {
		disable_irq(KS8695_IRQ_UART_MODEM_STATUS);
		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)
	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