[ARM] 2866/1: add i.MX set_mctrl / get_mctrl functions
Patch from Sascha Hauer This patch adds support for setting and getting RTS / CTS via set_mtctrl / get_mctrl functions. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
committed by
Russell King
parent
b129a8ccd5
commit
0f302dc354
@@ -2289,143 +2289,11 @@ int uart_match_port(struct uart_port *port1, struct uart_port *port2)
|
||||
}
|
||||
EXPORT_SYMBOL(uart_match_port);
|
||||
|
||||
/*
|
||||
* Try to find an unused uart_state slot for a port.
|
||||
*/
|
||||
static struct uart_state *
|
||||
uart_find_match_or_unused(struct uart_driver *drv, struct uart_port *port)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* First, find a port entry which matches. Note: if we do
|
||||
* find a matching entry, and it has a non-zero use count,
|
||||
* then we can't register the port.
|
||||
*/
|
||||
for (i = 0; i < drv->nr; i++)
|
||||
if (uart_match_port(drv->state[i].port, port))
|
||||
return &drv->state[i];
|
||||
|
||||
/*
|
||||
* We didn't find a matching entry, so look for the first
|
||||
* free entry. We look for one which hasn't been previously
|
||||
* used (indicated by zero iobase).
|
||||
*/
|
||||
for (i = 0; i < drv->nr; i++)
|
||||
if (drv->state[i].port->type == PORT_UNKNOWN &&
|
||||
drv->state[i].port->iobase == 0 &&
|
||||
drv->state[i].count == 0)
|
||||
return &drv->state[i];
|
||||
|
||||
/*
|
||||
* That also failed. Last resort is to find any currently
|
||||
* entry which doesn't have a real port associated with it.
|
||||
*/
|
||||
for (i = 0; i < drv->nr; i++)
|
||||
if (drv->state[i].port->type == PORT_UNKNOWN &&
|
||||
drv->state[i].count == 0)
|
||||
return &drv->state[i];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_register_port: register uart settings with a port
|
||||
* @drv: pointer to the uart low level driver structure for this port
|
||||
* @port: uart port structure describing the port
|
||||
*
|
||||
* Register UART settings with the specified low level driver. Detect
|
||||
* the type of the port if UPF_BOOT_AUTOCONF is set, and detect the
|
||||
* IRQ if UPF_AUTO_IRQ is set.
|
||||
*
|
||||
* We try to pick the same port for the same IO base address, so that
|
||||
* when a modem is plugged in, unplugged and plugged back in, it gets
|
||||
* allocated the same port.
|
||||
*
|
||||
* Returns negative error, or positive line number.
|
||||
*/
|
||||
int uart_register_port(struct uart_driver *drv, struct uart_port *port)
|
||||
{
|
||||
struct uart_state *state;
|
||||
int ret;
|
||||
|
||||
down(&port_sem);
|
||||
|
||||
state = uart_find_match_or_unused(drv, port);
|
||||
|
||||
if (state) {
|
||||
/*
|
||||
* Ok, we've found a line that we can use.
|
||||
*
|
||||
* If we find a port that matches this one, and it appears
|
||||
* to be in-use (even if it doesn't have a type) we shouldn't
|
||||
* alter it underneath itself - the port may be open and
|
||||
* trying to do useful work.
|
||||
*/
|
||||
if (uart_users(state) != 0) {
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the port is already initialised, don't touch it.
|
||||
*/
|
||||
if (state->port->type == PORT_UNKNOWN) {
|
||||
state->port->iobase = port->iobase;
|
||||
state->port->membase = port->membase;
|
||||
state->port->irq = port->irq;
|
||||
state->port->uartclk = port->uartclk;
|
||||
state->port->fifosize = port->fifosize;
|
||||
state->port->regshift = port->regshift;
|
||||
state->port->iotype = port->iotype;
|
||||
state->port->flags = port->flags;
|
||||
state->port->line = state - drv->state;
|
||||
state->port->mapbase = port->mapbase;
|
||||
|
||||
uart_configure_port(drv, state, state->port);
|
||||
}
|
||||
|
||||
ret = state->port->line;
|
||||
} else
|
||||
ret = -ENOSPC;
|
||||
out:
|
||||
up(&port_sem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_unregister_port - de-allocate a port
|
||||
* @drv: pointer to the uart low level driver structure for this port
|
||||
* @line: line index previously returned from uart_register_port()
|
||||
*
|
||||
* Hang up the specified line associated with the low level driver,
|
||||
* and mark the port as unused.
|
||||
*/
|
||||
void uart_unregister_port(struct uart_driver *drv, int line)
|
||||
{
|
||||
struct uart_state *state;
|
||||
|
||||
if (line < 0 || line >= drv->nr) {
|
||||
printk(KERN_ERR "Attempt to unregister ");
|
||||
printk("%s%d", drv->dev_name, line);
|
||||
printk("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
state = drv->state + line;
|
||||
|
||||
down(&port_sem);
|
||||
uart_unconfigure_port(drv, state);
|
||||
up(&port_sem);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(uart_write_wakeup);
|
||||
EXPORT_SYMBOL(uart_register_driver);
|
||||
EXPORT_SYMBOL(uart_unregister_driver);
|
||||
EXPORT_SYMBOL(uart_suspend_port);
|
||||
EXPORT_SYMBOL(uart_resume_port);
|
||||
EXPORT_SYMBOL(uart_register_port);
|
||||
EXPORT_SYMBOL(uart_unregister_port);
|
||||
EXPORT_SYMBOL(uart_add_one_port);
|
||||
EXPORT_SYMBOL(uart_remove_one_port);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user