Commit 1c2f0493 authored by Vikram Pandita's avatar Vikram Pandita Committed by Live-CD User

serial: 8250: add IRQ trigger support

There is currently no provision for passing IRQ trigger flags for
serial IRQs with triggering requirements (such as GPIO IRQs)

This patch adds irqflags to plat_serial8250_port that can be passed
from board file to reqest_irq() of 8250 driver

Changes are backward compatible with boards passing UPF_SHARE_IRQ flag

Tested on Zoom2 board that has IRQF_TRIGGER_RISING requirement for 8250 irq

[Moved new flag to end to fix bugs in the original with the old_serial array
	-- Alan]
Signed-off-by: default avatarVikram Pandita <vikram.pandita@ti.com>
Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 1e066d80
...@@ -1677,7 +1677,7 @@ static int serial_link_irq_chain(struct uart_8250_port *up) ...@@ -1677,7 +1677,7 @@ static int serial_link_irq_chain(struct uart_8250_port *up)
INIT_LIST_HEAD(&up->list); INIT_LIST_HEAD(&up->list);
i->head = &up->list; i->head = &up->list;
spin_unlock_irq(&i->lock); spin_unlock_irq(&i->lock);
irq_flags |= up->port.irqflags;
ret = request_irq(up->port.irq, serial8250_interrupt, ret = request_irq(up->port.irq, serial8250_interrupt,
irq_flags, "serial", i); irq_flags, "serial", i);
if (ret < 0) if (ret < 0)
...@@ -2026,7 +2026,7 @@ static int serial8250_startup(struct uart_port *port) ...@@ -2026,7 +2026,7 @@ static int serial8250_startup(struct uart_port *port)
* allow register changes to become visible. * allow register changes to become visible.
*/ */
spin_lock_irqsave(&up->port.lock, flags); spin_lock_irqsave(&up->port.lock, flags);
if (up->port.flags & UPF_SHARE_IRQ) if (up->port.irqflags & IRQF_SHARED)
disable_irq_nosync(up->port.irq); disable_irq_nosync(up->port.irq);
wait_for_xmitr(up, UART_LSR_THRE); wait_for_xmitr(up, UART_LSR_THRE);
...@@ -2039,7 +2039,7 @@ static int serial8250_startup(struct uart_port *port) ...@@ -2039,7 +2039,7 @@ static int serial8250_startup(struct uart_port *port)
iir = serial_in(up, UART_IIR); iir = serial_in(up, UART_IIR);
serial_out(up, UART_IER, 0); serial_out(up, UART_IER, 0);
if (up->port.flags & UPF_SHARE_IRQ) if (up->port.irqflags & IRQF_SHARED)
enable_irq(up->port.irq); enable_irq(up->port.irq);
spin_unlock_irqrestore(&up->port.lock, flags); spin_unlock_irqrestore(&up->port.lock, flags);
...@@ -2671,6 +2671,7 @@ static void __init serial8250_isa_init_ports(void) ...@@ -2671,6 +2671,7 @@ static void __init serial8250_isa_init_ports(void)
i++, up++) { i++, up++) {
up->port.iobase = old_serial_port[i].port; up->port.iobase = old_serial_port[i].port;
up->port.irq = irq_canonicalize(old_serial_port[i].irq); up->port.irq = irq_canonicalize(old_serial_port[i].irq);
up->port.irqflags = old_serial_port[i].irqflags;
up->port.uartclk = old_serial_port[i].baud_base * 16; up->port.uartclk = old_serial_port[i].baud_base * 16;
up->port.flags = old_serial_port[i].flags; up->port.flags = old_serial_port[i].flags;
up->port.hub6 = old_serial_port[i].hub6; up->port.hub6 = old_serial_port[i].hub6;
...@@ -2679,7 +2680,7 @@ static void __init serial8250_isa_init_ports(void) ...@@ -2679,7 +2680,7 @@ static void __init serial8250_isa_init_ports(void)
up->port.regshift = old_serial_port[i].iomem_reg_shift; up->port.regshift = old_serial_port[i].iomem_reg_shift;
set_io_from_upio(&up->port); set_io_from_upio(&up->port);
if (share_irqs) if (share_irqs)
up->port.flags |= UPF_SHARE_IRQ; up->port.irqflags |= IRQF_SHARED;
} }
} }
...@@ -2869,6 +2870,7 @@ int __init early_serial_setup(struct uart_port *port) ...@@ -2869,6 +2870,7 @@ int __init early_serial_setup(struct uart_port *port)
p->iobase = port->iobase; p->iobase = port->iobase;
p->membase = port->membase; p->membase = port->membase;
p->irq = port->irq; p->irq = port->irq;
p->irqflags = port->irqflags;
p->uartclk = port->uartclk; p->uartclk = port->uartclk;
p->fifosize = port->fifosize; p->fifosize = port->fifosize;
p->regshift = port->regshift; p->regshift = port->regshift;
...@@ -2942,6 +2944,7 @@ static int __devinit serial8250_probe(struct platform_device *dev) ...@@ -2942,6 +2944,7 @@ static int __devinit serial8250_probe(struct platform_device *dev)
port.iobase = p->iobase; port.iobase = p->iobase;
port.membase = p->membase; port.membase = p->membase;
port.irq = p->irq; port.irq = p->irq;
port.irqflags = p->irqflags;
port.uartclk = p->uartclk; port.uartclk = p->uartclk;
port.regshift = p->regshift; port.regshift = p->regshift;
port.iotype = p->iotype; port.iotype = p->iotype;
...@@ -2954,7 +2957,7 @@ static int __devinit serial8250_probe(struct platform_device *dev) ...@@ -2954,7 +2957,7 @@ static int __devinit serial8250_probe(struct platform_device *dev)
port.serial_out = p->serial_out; port.serial_out = p->serial_out;
port.dev = &dev->dev; port.dev = &dev->dev;
if (share_irqs) if (share_irqs)
port.flags |= UPF_SHARE_IRQ; port.irqflags |= IRQF_SHARED;
ret = serial8250_register_port(&port); ret = serial8250_register_port(&port);
if (ret < 0) { if (ret < 0) {
dev_err(&dev->dev, "unable to register port at index %d " dev_err(&dev->dev, "unable to register port at index %d "
...@@ -3096,6 +3099,7 @@ int serial8250_register_port(struct uart_port *port) ...@@ -3096,6 +3099,7 @@ int serial8250_register_port(struct uart_port *port)
uart->port.iobase = port->iobase; uart->port.iobase = port->iobase;
uart->port.membase = port->membase; uart->port.membase = port->membase;
uart->port.irq = port->irq; uart->port.irq = port->irq;
uart->port.irqflags = port->irqflags;
uart->port.uartclk = port->uartclk; uart->port.uartclk = port->uartclk;
uart->port.fifosize = port->fifosize; uart->port.fifosize = port->fifosize;
uart->port.regshift = port->regshift; uart->port.regshift = port->regshift;
......
...@@ -25,6 +25,7 @@ struct old_serial_port { ...@@ -25,6 +25,7 @@ struct old_serial_port {
unsigned char io_type; unsigned char io_type;
unsigned char *iomem_base; unsigned char *iomem_base;
unsigned short iomem_reg_shift; unsigned short iomem_reg_shift;
unsigned long irqflags;
}; };
/* /*
......
...@@ -22,6 +22,7 @@ struct plat_serial8250_port { ...@@ -22,6 +22,7 @@ struct plat_serial8250_port {
void __iomem *membase; /* ioremap cookie or NULL */ void __iomem *membase; /* ioremap cookie or NULL */
resource_size_t mapbase; /* resource base */ resource_size_t mapbase; /* resource base */
unsigned int irq; /* interrupt number */ unsigned int irq; /* interrupt number */
unsigned long irqflags; /* request_irq flags */
unsigned int uartclk; /* UART clock rate */ unsigned int uartclk; /* UART clock rate */
void *private_data; void *private_data;
unsigned char regshift; /* register shift */ unsigned char regshift; /* register shift */
......
...@@ -265,6 +265,7 @@ struct uart_port { ...@@ -265,6 +265,7 @@ struct uart_port {
unsigned int (*serial_in)(struct uart_port *, int); unsigned int (*serial_in)(struct uart_port *, int);
void (*serial_out)(struct uart_port *, int, int); void (*serial_out)(struct uart_port *, int, int);
unsigned int irq; /* irq number */ unsigned int irq; /* irq number */
unsigned long irqflags; /* irq flags */
unsigned int uartclk; /* base uart clock */ unsigned int uartclk; /* base uart clock */
unsigned int fifosize; /* tx fifo size */ unsigned int fifosize; /* tx fifo size */
unsigned char x_char; /* xon/xoff char */ unsigned char x_char; /* xon/xoff char */
......
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