mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
Merge branch 'fixes' into for-linus
Conflicts: arch/arm/mach-versatile/core.c
This commit is contained in:
commit
2502991560
4009 changed files with 236373 additions and 124037 deletions
|
|
@ -44,6 +44,10 @@
|
|||
|
||||
#include "8250.h"
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
#include "suncore.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Configuration:
|
||||
* share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
|
||||
|
|
@ -53,6 +57,13 @@ static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
|
|||
|
||||
static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
|
||||
|
||||
static struct uart_driver serial8250_reg;
|
||||
|
||||
static int serial_index(struct uart_port *port)
|
||||
{
|
||||
return (serial8250_reg.minor - 64) + port->line;
|
||||
}
|
||||
|
||||
/*
|
||||
* Debugging.
|
||||
*/
|
||||
|
|
@ -536,7 +547,7 @@ static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
|
|||
/*
|
||||
* FIFO support.
|
||||
*/
|
||||
static inline void serial8250_clear_fifos(struct uart_8250_port *p)
|
||||
static void serial8250_clear_fifos(struct uart_8250_port *p)
|
||||
{
|
||||
if (p->capabilities & UART_CAP_FIFO) {
|
||||
serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO);
|
||||
|
|
@ -551,7 +562,7 @@ static inline void serial8250_clear_fifos(struct uart_8250_port *p)
|
|||
* capability" bit enabled. Note that on XR16C850s, we need to
|
||||
* reset LCR to write to IER.
|
||||
*/
|
||||
static inline void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
|
||||
static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
|
||||
{
|
||||
if (p->capabilities & UART_CAP_SLEEP) {
|
||||
if (p->capabilities & UART_CAP_EFR) {
|
||||
|
|
@ -993,7 +1004,7 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
|
|||
return;
|
||||
|
||||
DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04x, 0x%p): ",
|
||||
up->port.line, up->port.iobase, up->port.membase);
|
||||
serial_index(&up->port), up->port.iobase, up->port.membase);
|
||||
|
||||
/*
|
||||
* We really do need global IRQs disabled here - we're going to
|
||||
|
|
@ -1128,8 +1139,8 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
|
|||
if (up->capabilities != uart_config[up->port.type].flags) {
|
||||
printk(KERN_WARNING
|
||||
"ttyS%d: detected caps %08x should be %08x\n",
|
||||
up->port.line, up->capabilities,
|
||||
uart_config[up->port.type].flags);
|
||||
serial_index(&up->port), up->capabilities,
|
||||
uart_config[up->port.type].flags);
|
||||
}
|
||||
|
||||
up->port.fifosize = uart_config[up->port.type].fifo_size;
|
||||
|
|
@ -1424,8 +1435,7 @@ static unsigned int check_modem_status(struct uart_8250_port *up)
|
|||
/*
|
||||
* This handles the interrupt from one port.
|
||||
*/
|
||||
static inline void
|
||||
serial8250_handle_port(struct uart_8250_port *up)
|
||||
static void serial8250_handle_port(struct uart_8250_port *up)
|
||||
{
|
||||
unsigned int status;
|
||||
unsigned long flags;
|
||||
|
|
@ -1719,7 +1729,7 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state)
|
|||
/*
|
||||
* Wait for transmitter & holding register to empty
|
||||
*/
|
||||
static inline void wait_for_xmitr(struct uart_8250_port *up, int bits)
|
||||
static void wait_for_xmitr(struct uart_8250_port *up, int bits)
|
||||
{
|
||||
unsigned int status, tmout = 10000;
|
||||
|
||||
|
|
@ -1854,7 +1864,8 @@ static int serial8250_startup(struct uart_port *port)
|
|||
*/
|
||||
if (!(up->port.flags & UPF_BUGGY_UART) &&
|
||||
(serial_inp(up, UART_LSR) == 0xff)) {
|
||||
printk("ttyS%d: LSR safety check engaged!\n", up->port.line);
|
||||
printk(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
|
||||
serial_index(&up->port));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
@ -1909,7 +1920,8 @@ static int serial8250_startup(struct uart_port *port)
|
|||
*/
|
||||
if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
|
||||
up->bugs |= UART_BUG_THRE;
|
||||
pr_debug("ttyS%d - using backup timer\n", port->line);
|
||||
pr_debug("ttyS%d - using backup timer\n",
|
||||
serial_index(port));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1969,7 +1981,7 @@ static int serial8250_startup(struct uart_port *port)
|
|||
if (!(up->bugs & UART_BUG_TXEN)) {
|
||||
up->bugs |= UART_BUG_TXEN;
|
||||
pr_debug("ttyS%d - enabling bad tx status workarounds\n",
|
||||
port->line);
|
||||
serial_index(port));
|
||||
}
|
||||
} else {
|
||||
up->bugs &= ~UART_BUG_TXEN;
|
||||
|
|
@ -2637,7 +2649,6 @@ static int serial8250_console_early_setup(void)
|
|||
return serial8250_find_port_for_earlycon();
|
||||
}
|
||||
|
||||
static struct uart_driver serial8250_reg;
|
||||
static struct console serial8250_console = {
|
||||
.name = "ttyS",
|
||||
.write = serial8250_console_write,
|
||||
|
|
@ -2684,7 +2695,6 @@ static struct uart_driver serial8250_reg = {
|
|||
.dev_name = "ttyS",
|
||||
.major = TTY_MAJOR,
|
||||
.minor = 64,
|
||||
.nr = UART_NR,
|
||||
.cons = SERIAL8250_CONSOLE,
|
||||
};
|
||||
|
||||
|
|
@ -2966,10 +2976,12 @@ static int __init serial8250_init(void)
|
|||
"%d ports, IRQ sharing %sabled\n", nr_uarts,
|
||||
share_irqs ? "en" : "dis");
|
||||
|
||||
for (i = 0; i < NR_IRQS; i++)
|
||||
spin_lock_init(&irq_lists[i].lock);
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
ret = sunserial_register_minors(&serial8250_reg, UART_NR);
|
||||
#else
|
||||
serial8250_reg.nr = UART_NR;
|
||||
ret = uart_register_driver(&serial8250_reg);
|
||||
#endif
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
|
|
@ -2994,7 +3006,11 @@ static int __init serial8250_init(void)
|
|||
put_dev:
|
||||
platform_device_put(serial8250_isa_devs);
|
||||
unreg_uart_drv:
|
||||
#ifdef CONFIG_SPARC
|
||||
sunserial_unregister_minors(&serial8250_reg, UART_NR);
|
||||
#else
|
||||
uart_unregister_driver(&serial8250_reg);
|
||||
#endif
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -3013,7 +3029,11 @@ static void __exit serial8250_exit(void)
|
|||
platform_driver_unregister(&serial8250_isa_driver);
|
||||
platform_device_unregister(isa_dev);
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
sunserial_unregister_minors(&serial8250_reg, UART_NR);
|
||||
#else
|
||||
uart_unregister_driver(&serial8250_reg);
|
||||
#endif
|
||||
}
|
||||
|
||||
module_init(serial8250_init);
|
||||
|
|
|
|||
|
|
@ -2041,9 +2041,9 @@ static int pciserial_resume_one(struct pci_dev *dev)
|
|||
* The device may have been disabled. Re-enable it.
|
||||
*/
|
||||
err = pci_enable_device(dev);
|
||||
/* FIXME: We cannot simply error out here */
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
printk(KERN_ERR "pciserial: Unable to re-enable ports, trying to continue.\n");
|
||||
pciserial_resume_ports(priv);
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ menu "Serial drivers"
|
|||
# The new 8250/16550 serial drivers
|
||||
config SERIAL_8250
|
||||
tristate "8250/16550 and compatible serial support"
|
||||
depends on (BROKEN || !SPARC)
|
||||
select SERIAL_CORE
|
||||
---help---
|
||||
This selects whether you want to include the driver for the standard
|
||||
|
|
@ -994,24 +993,12 @@ config SERIAL_68328_RTS_CTS
|
|||
bool "Support RTS/CTS on 68328 serial port"
|
||||
depends on SERIAL_68328
|
||||
|
||||
config SERIAL_COLDFIRE
|
||||
bool "ColdFire serial support (DEPRECATED)"
|
||||
depends on COLDFIRE
|
||||
help
|
||||
This driver supports the built-in serial ports of the Motorola ColdFire
|
||||
family of CPUs.
|
||||
This driver is deprecated because it supports only the old interface
|
||||
for serial drivers and features like magic keys are not working.
|
||||
Please switch to the new style driver because this driver will be
|
||||
removed soon.
|
||||
|
||||
config SERIAL_MCF
|
||||
bool "Coldfire serial support (new style driver)"
|
||||
bool "Coldfire serial support"
|
||||
depends on COLDFIRE
|
||||
select SERIAL_CORE
|
||||
help
|
||||
This new serial driver supports the Freescale Coldfire serial ports
|
||||
using the new serial driver subsystem.
|
||||
This serial driver supports the Freescale Coldfire serial ports.
|
||||
|
||||
config SERIAL_MCF_BAUDRATE
|
||||
int "Default baudrate for Coldfire serial ports"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,16 @@
|
|||
|
||||
obj-$(CONFIG_SERIAL_CORE) += serial_core.o
|
||||
obj-$(CONFIG_SERIAL_21285) += 21285.o
|
||||
|
||||
# These Sparc drivers have to appear before others such as 8250
|
||||
# which share ttySx minor node space. Otherwise console device
|
||||
# names change and other unplesantries.
|
||||
obj-$(CONFIG_SERIAL_SUNCORE) += suncore.o
|
||||
obj-$(CONFIG_SERIAL_SUNHV) += sunhv.o
|
||||
obj-$(CONFIG_SERIAL_SUNZILOG) += sunzilog.o
|
||||
obj-$(CONFIG_SERIAL_SUNSU) += sunsu.o
|
||||
obj-$(CONFIG_SERIAL_SUNSAB) += sunsab.o
|
||||
|
||||
obj-$(CONFIG_SERIAL_8250) += 8250.o
|
||||
obj-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o
|
||||
obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o
|
||||
|
|
@ -31,16 +41,10 @@ obj-$(CONFIG_SERIAL_S3C2400) += s3c2400.o
|
|||
obj-$(CONFIG_SERIAL_S3C2410) += s3c2410.o
|
||||
obj-$(CONFIG_SERIAL_S3C2412) += s3c2412.o
|
||||
obj-$(CONFIG_SERIAL_S3C2440) += s3c2440.o
|
||||
obj-$(CONFIG_SERIAL_SUNCORE) += suncore.o
|
||||
obj-$(CONFIG_SERIAL_SUNHV) += sunhv.o
|
||||
obj-$(CONFIG_SERIAL_SUNZILOG) += sunzilog.o
|
||||
obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o
|
||||
obj-$(CONFIG_SERIAL_SUNSU) += sunsu.o
|
||||
obj-$(CONFIG_SERIAL_SUNSAB) += sunsab.o
|
||||
obj-$(CONFIG_SERIAL_MUX) += mux.o
|
||||
obj-$(CONFIG_SERIAL_68328) += 68328serial.o
|
||||
obj-$(CONFIG_SERIAL_68360) += 68360serial.o
|
||||
obj-$(CONFIG_SERIAL_COLDFIRE) += mcfserial.o
|
||||
obj-$(CONFIG_SERIAL_MCF) += mcf.o
|
||||
obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o
|
||||
obj-$(CONFIG_SERIAL_LH7A40X) += serial_lh7a40x.o
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Blackfin On-Chip Serial Driver
|
||||
*
|
||||
* Copyright 2006-2007 Analog Devices Inc.
|
||||
* Copyright 2006-2008 Analog Devices Inc.
|
||||
*
|
||||
* Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
|
|
@ -42,6 +42,9 @@
|
|||
#define BFIN_SERIAL_MAJOR 204
|
||||
#define BFIN_SERIAL_MINOR 64
|
||||
|
||||
static struct bfin_serial_port bfin_serial_ports[BFIN_UART_NR_PORTS];
|
||||
static int nr_active_ports = ARRAY_SIZE(bfin_serial_resource);
|
||||
|
||||
/*
|
||||
* Setup for console. Argument comes from the menuconfig
|
||||
*/
|
||||
|
|
@ -126,13 +129,13 @@ static int kgdb_entry_state;
|
|||
void kgdb_put_debug_char(int chr)
|
||||
{
|
||||
struct bfin_serial_port *uart;
|
||||
|
||||
|
||||
if (CONFIG_KGDB_UART_PORT < 0
|
||||
|| CONFIG_KGDB_UART_PORT >= BFIN_UART_NR_PORTS)
|
||||
uart = &bfin_serial_ports[0];
|
||||
else
|
||||
uart = &bfin_serial_ports[CONFIG_KGDB_UART_PORT];
|
||||
|
||||
|
||||
while (!(UART_GET_LSR(uart) & THRE)) {
|
||||
SSYNC();
|
||||
}
|
||||
|
|
@ -152,7 +155,7 @@ int kgdb_get_debug_char(void)
|
|||
uart = &bfin_serial_ports[0];
|
||||
else
|
||||
uart = &bfin_serial_ports[CONFIG_KGDB_UART_PORT];
|
||||
|
||||
|
||||
while(!(UART_GET_LSR(uart) & DR)) {
|
||||
SSYNC();
|
||||
}
|
||||
|
|
@ -298,7 +301,11 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
|
|||
bfin_serial_mctrl_check(uart);
|
||||
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) {
|
||||
bfin_serial_stop_tx(&uart->port);
|
||||
#ifdef CONFIG_BF54x
|
||||
/* Clear TFI bit */
|
||||
UART_PUT_LSR(uart, TFI);
|
||||
#endif
|
||||
UART_CLEAR_IER(uart, ETBEI);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -317,9 +324,6 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
|
|||
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(&uart->port);
|
||||
|
||||
if (uart_circ_empty(xmit))
|
||||
bfin_serial_stop_tx(&uart->port);
|
||||
}
|
||||
|
||||
static irqreturn_t bfin_serial_rx_int(int irq, void *dev_id)
|
||||
|
|
@ -645,6 +649,42 @@ static int bfin_serial_startup(struct uart_port *port)
|
|||
free_irq(uart->port.irq, uart);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
# ifdef CONFIG_BF54x
|
||||
{
|
||||
unsigned uart_dma_ch_rx, uart_dma_ch_tx;
|
||||
|
||||
switch (uart->port.irq) {
|
||||
case IRQ_UART3_RX:
|
||||
uart_dma_ch_rx = CH_UART3_RX;
|
||||
uart_dma_ch_tx = CH_UART3_TX;
|
||||
break;
|
||||
case IRQ_UART2_RX:
|
||||
uart_dma_ch_rx = CH_UART2_RX;
|
||||
uart_dma_ch_tx = CH_UART2_TX;
|
||||
break;
|
||||
default:
|
||||
uart_dma_ch_rx = uart_dma_ch_tx = 0;
|
||||
break;
|
||||
};
|
||||
|
||||
if (uart_dma_ch_rx &&
|
||||
request_dma(uart_dma_ch_rx, "BFIN_UART_RX") < 0) {
|
||||
printk(KERN_NOTICE"Fail to attach UART interrupt\n");
|
||||
free_irq(uart->port.irq, uart);
|
||||
free_irq(uart->port.irq + 1, uart);
|
||||
return -EBUSY;
|
||||
}
|
||||
if (uart_dma_ch_tx &&
|
||||
request_dma(uart_dma_ch_tx, "BFIN_UART_TX") < 0) {
|
||||
printk(KERN_NOTICE "Fail to attach UART interrupt\n");
|
||||
free_dma(uart_dma_ch_rx);
|
||||
free_irq(uart->port.irq, uart);
|
||||
free_irq(uart->port.irq + 1, uart);
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
UART_SET_IER(uart, ERBFI);
|
||||
return 0;
|
||||
|
|
@ -662,6 +702,20 @@ static void bfin_serial_shutdown(struct uart_port *port)
|
|||
del_timer(&(uart->rx_dma_timer));
|
||||
dma_free_coherent(NULL, PAGE_SIZE, uart->rx_dma_buf.buf, 0);
|
||||
#else
|
||||
#ifdef CONFIG_BF54x
|
||||
switch (uart->port.irq) {
|
||||
case IRQ_UART3_RX:
|
||||
free_dma(CH_UART3_RX);
|
||||
free_dma(CH_UART3_TX);
|
||||
break;
|
||||
case IRQ_UART2_RX:
|
||||
free_dma(CH_UART2_RX);
|
||||
free_dma(CH_UART2_TX);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
#endif
|
||||
#ifdef CONFIG_KGDB_UART
|
||||
if (uart->port.line != CONFIG_KGDB_UART_PORT)
|
||||
#endif
|
||||
|
|
@ -757,6 +811,9 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
|
|||
val |= UCEN;
|
||||
UART_PUT_GCTL(uart, val);
|
||||
|
||||
/* Port speed changed, update the per-port timeout. */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&uart->port.lock, flags);
|
||||
}
|
||||
|
||||
|
|
@ -859,8 +916,9 @@ static void __init bfin_serial_init_ports(void)
|
|||
return;
|
||||
first = 0;
|
||||
|
||||
for (i = 0; i < nr_ports; i++) {
|
||||
for (i = 0; i < nr_active_ports; i++) {
|
||||
bfin_serial_ports[i].port.uartclk = get_sclk();
|
||||
bfin_serial_ports[i].port.fifosize = BFIN_UART_TX_FIFO_SIZE;
|
||||
bfin_serial_ports[i].port.ops = &bfin_serial_pops;
|
||||
bfin_serial_ports[i].port.line = i;
|
||||
bfin_serial_ports[i].port.iotype = UPIO_MEM;
|
||||
|
|
@ -961,7 +1019,7 @@ bfin_serial_console_setup(struct console *co, char *options)
|
|||
* if so, search for the first available port that does have
|
||||
* console support.
|
||||
*/
|
||||
if (co->index == -1 || co->index >= nr_ports)
|
||||
if (co->index == -1 || co->index >= nr_active_ports)
|
||||
co->index = 0;
|
||||
uart = &bfin_serial_ports[co->index];
|
||||
|
||||
|
|
@ -1056,7 +1114,7 @@ static __init void early_serial_write(struct console *con, const char *s,
|
|||
}
|
||||
}
|
||||
|
||||
static struct __init console bfin_early_serial_console = {
|
||||
static struct __initdata console bfin_early_serial_console = {
|
||||
.name = "early_BFuart",
|
||||
.write = early_serial_write,
|
||||
.device = uart_console_device,
|
||||
|
|
@ -1072,7 +1130,7 @@ struct console __init *bfin_earlyserial_init(unsigned int port,
|
|||
struct bfin_serial_port *uart;
|
||||
struct ktermios t;
|
||||
|
||||
if (port == -1 || port >= nr_ports)
|
||||
if (port == -1 || port >= nr_active_ports)
|
||||
port = 0;
|
||||
bfin_serial_init_ports();
|
||||
bfin_early_serial_console.index = port;
|
||||
|
|
@ -1100,20 +1158,26 @@ static struct uart_driver bfin_serial_reg = {
|
|||
|
||||
static int bfin_serial_suspend(struct platform_device *dev, pm_message_t state)
|
||||
{
|
||||
struct bfin_serial_port *uart = platform_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
if (uart)
|
||||
uart_suspend_port(&bfin_serial_reg, &uart->port);
|
||||
for (i = 0; i < nr_active_ports; i++) {
|
||||
if (bfin_serial_ports[i].port.dev != &dev->dev)
|
||||
continue;
|
||||
uart_suspend_port(&bfin_serial_reg, &bfin_serial_ports[i].port);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bfin_serial_resume(struct platform_device *dev)
|
||||
{
|
||||
struct bfin_serial_port *uart = platform_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
if (uart)
|
||||
uart_resume_port(&bfin_serial_reg, &uart->port);
|
||||
for (i = 0; i < nr_active_ports; i++) {
|
||||
if (bfin_serial_ports[i].port.dev != &dev->dev)
|
||||
continue;
|
||||
uart_resume_port(&bfin_serial_reg, &bfin_serial_ports[i].port);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1128,32 +1192,31 @@ static int bfin_serial_probe(struct platform_device *dev)
|
|||
break;
|
||||
|
||||
if (i < dev->num_resources) {
|
||||
for (i = 0; i < nr_ports; i++, res++) {
|
||||
for (i = 0; i < nr_active_ports; i++, res++) {
|
||||
if (bfin_serial_ports[i].port.mapbase != res->start)
|
||||
continue;
|
||||
bfin_serial_ports[i].port.dev = &dev->dev;
|
||||
uart_add_one_port(&bfin_serial_reg, &bfin_serial_ports[i].port);
|
||||
platform_set_drvdata(dev, &bfin_serial_ports[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bfin_serial_remove(struct platform_device *pdev)
|
||||
static int bfin_serial_remove(struct platform_device *dev)
|
||||
{
|
||||
struct bfin_serial_port *uart = platform_get_drvdata(pdev);
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_active_ports; i++) {
|
||||
if (bfin_serial_ports[i].port.dev != &dev->dev)
|
||||
continue;
|
||||
uart_remove_one_port(&bfin_serial_reg, &bfin_serial_ports[i].port);
|
||||
bfin_serial_ports[i].port.dev = NULL;
|
||||
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
||||
gpio_free(uart->cts_pin);
|
||||
gpio_free(uart->rts_pin);
|
||||
gpio_free(bfin_serial_ports[i].cts_pin);
|
||||
gpio_free(bfin_serial_ports[i].rts_pin);
|
||||
#endif
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
if (uart)
|
||||
uart_remove_one_port(&bfin_serial_reg, &uart->port);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -457,7 +457,6 @@ static struct e100_serial rs_table[] = {
|
|||
#define NR_PORTS (sizeof(rs_table)/sizeof(struct e100_serial))
|
||||
|
||||
static struct ktermios *serial_termios[NR_PORTS];
|
||||
static struct ktermios *serial_termios_locked[NR_PORTS];
|
||||
#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
|
||||
static struct fast_timer fast_timers[NR_PORTS];
|
||||
#endif
|
||||
|
|
@ -4419,6 +4418,7 @@ rs_init(void)
|
|||
rs485_pa_bit)) {
|
||||
printk(KERN_CRIT "ETRAX100LX serial: Could not allocate "
|
||||
"RS485 pin\n");
|
||||
put_tty_driver(driver);
|
||||
return -EBUSY;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -4427,6 +4427,7 @@ rs_init(void)
|
|||
rs485_port_g_bit)) {
|
||||
printk(KERN_CRIT "ETRAX100LX serial: Could not allocate "
|
||||
"RS485 pin\n");
|
||||
put_tty_driver(driver);
|
||||
return -EBUSY;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -4446,8 +4447,6 @@ rs_init(void)
|
|||
driver->init_termios.c_ispeed = 115200;
|
||||
driver->init_termios.c_ospeed = 115200;
|
||||
driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
|
||||
driver->termios = serial_termios;
|
||||
driver->termios_locked = serial_termios_locked;
|
||||
|
||||
tty_set_operations(driver, &rs_ops);
|
||||
serial_driver = driver;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* mcfserial.c -- serial driver for ColdFire internal UARTS.
|
||||
*
|
||||
* Copyright (c) 1999 Greg Ungerer <gerg@snapgear.com>
|
||||
* Copyright (c) 2000-2001 Lineo, Inc. <www.lineo.com>
|
||||
* Copyright (c) 2002 SnapGear Inc., <www.snapgear.com>
|
||||
*
|
||||
* Based on code from 68332serial.c which was:
|
||||
*
|
||||
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
|
||||
* Copyright (C) 1998 TSHG
|
||||
* Copyright (c) 1999 Rt-Control Inc. <jeff@uclinux.org>
|
||||
*/
|
||||
#ifndef _MCF_SERIAL_H
|
||||
#define _MCF_SERIAL_H
|
||||
|
||||
#include <linux/serial.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/*
|
||||
* Define a local serial stats structure.
|
||||
*/
|
||||
|
||||
struct mcf_stats {
|
||||
unsigned int rx;
|
||||
unsigned int tx;
|
||||
unsigned int rxbreak;
|
||||
unsigned int rxframing;
|
||||
unsigned int rxparity;
|
||||
unsigned int rxoverrun;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* This is our internal structure for each serial port's state.
|
||||
* Each serial port has one of these structures associated with it.
|
||||
*/
|
||||
|
||||
struct mcf_serial {
|
||||
int magic;
|
||||
volatile unsigned char *addr; /* UART memory address */
|
||||
int irq;
|
||||
int flags; /* defined in tty.h */
|
||||
int type; /* UART type */
|
||||
struct tty_struct *tty;
|
||||
unsigned char imr; /* Software imr register */
|
||||
unsigned int baud;
|
||||
int sigs;
|
||||
int custom_divisor;
|
||||
int x_char; /* xon/xoff character */
|
||||
int baud_base;
|
||||
int close_delay;
|
||||
unsigned short closing_wait;
|
||||
unsigned short closing_wait2;
|
||||
unsigned long event;
|
||||
int line;
|
||||
int count; /* # of fd on device */
|
||||
int blocked_open; /* # of blocked opens */
|
||||
unsigned char *xmit_buf;
|
||||
int xmit_head;
|
||||
int xmit_tail;
|
||||
int xmit_cnt;
|
||||
struct mcf_stats stats;
|
||||
struct work_struct tqueue;
|
||||
struct work_struct tqueue_hangup;
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
|
||||
};
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _MCF_SERIAL_H */
|
||||
|
|
@ -2051,7 +2051,8 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port)
|
|||
"transmitter\n",
|
||||
port->dev ? port->dev->bus_id : "",
|
||||
port->dev ? ": " : "",
|
||||
drv->dev_name, port->line);
|
||||
drv->dev_name,
|
||||
drv->tty_driver->name_base + port->line);
|
||||
|
||||
ops->shutdown(port);
|
||||
}
|
||||
|
|
@ -2154,12 +2155,11 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)
|
|||
|
||||
switch (port->iotype) {
|
||||
case UPIO_PORT:
|
||||
snprintf(address, sizeof(address),
|
||||
"I/O 0x%x", port->iobase);
|
||||
snprintf(address, sizeof(address), "I/O 0x%lx", port->iobase);
|
||||
break;
|
||||
case UPIO_HUB6:
|
||||
snprintf(address, sizeof(address),
|
||||
"I/O 0x%x offset 0x%x", port->iobase, port->hub6);
|
||||
"I/O 0x%lx offset 0x%x", port->iobase, port->hub6);
|
||||
break;
|
||||
case UPIO_MEM:
|
||||
case UPIO_MEM32:
|
||||
|
|
@ -2177,7 +2177,9 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)
|
|||
printk(KERN_INFO "%s%s%s%d at %s (irq = %d) is a %s\n",
|
||||
port->dev ? port->dev->bus_id : "",
|
||||
port->dev ? ": " : "",
|
||||
drv->dev_name, port->line, address, port->irq, uart_type(port));
|
||||
drv->dev_name,
|
||||
drv->tty_driver->name_base + port->line,
|
||||
address, port->irq, uart_type(port));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -431,131 +431,103 @@ first_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse)
|
|||
{
|
||||
int i;
|
||||
i = pcmcia_get_first_tuple(handle, tuple);
|
||||
if (i != CS_SUCCESS)
|
||||
return CS_NO_MORE_ITEMS;
|
||||
i = pcmcia_get_tuple_data(handle, tuple);
|
||||
if (i != CS_SUCCESS)
|
||||
if (i != 0)
|
||||
return i;
|
||||
return pcmcia_parse_tuple(handle, tuple, parse);
|
||||
}
|
||||
|
||||
static int
|
||||
next_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse)
|
||||
{
|
||||
int i;
|
||||
i = pcmcia_get_next_tuple(handle, tuple);
|
||||
if (i != CS_SUCCESS)
|
||||
return CS_NO_MORE_ITEMS;
|
||||
i = pcmcia_get_tuple_data(handle, tuple);
|
||||
if (i != CS_SUCCESS)
|
||||
if (i != 0)
|
||||
return i;
|
||||
return pcmcia_parse_tuple(handle, tuple, parse);
|
||||
return pcmcia_parse_tuple(tuple, parse);
|
||||
}
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
static int simple_config(struct pcmcia_device *link)
|
||||
static int simple_config_check(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
static const int size_table[2] = { 8, 16 };
|
||||
int *try = priv_data;
|
||||
|
||||
if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
|
||||
p_dev->conf.Vpp =
|
||||
cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
|
||||
|
||||
if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[(*try >> 1)])
|
||||
&& (cf->io.win[0].base != 0)) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.IOAddrLines = ((*try & 0x1) == 0) ?
|
||||
16 : cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
|
||||
static const int size_table[2] = { 8, 16 };
|
||||
int j;
|
||||
|
||||
if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
|
||||
for (j = 0; j < 5; j++) {
|
||||
p_dev->io.BasePort1 = base[j];
|
||||
p_dev->io.IOAddrLines = base[j] ? 16 : 3;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int simple_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct serial_info *info = link->priv;
|
||||
struct serial_cfg_mem *cfg_mem;
|
||||
tuple_t *tuple;
|
||||
u_char *buf;
|
||||
cisparse_t *parse;
|
||||
cistpl_cftable_entry_t *cf;
|
||||
config_info_t config;
|
||||
int i, j, try;
|
||||
int s;
|
||||
|
||||
cfg_mem = kmalloc(sizeof(struct serial_cfg_mem), GFP_KERNEL);
|
||||
if (!cfg_mem)
|
||||
return -1;
|
||||
|
||||
tuple = &cfg_mem->tuple;
|
||||
parse = &cfg_mem->parse;
|
||||
cf = &parse->cftable_entry;
|
||||
buf = cfg_mem->buf;
|
||||
int i = -ENODEV, try;
|
||||
|
||||
/* If the card is already configured, look up the port and irq */
|
||||
i = pcmcia_get_configuration_info(link, &config);
|
||||
if ((i == CS_SUCCESS) && (config.Attributes & CONF_VALID_CLIENT)) {
|
||||
if (link->function_config) {
|
||||
unsigned int port = 0;
|
||||
if ((config.BasePort2 != 0) && (config.NumPorts2 == 8)) {
|
||||
port = config.BasePort2;
|
||||
if ((link->io.BasePort2 != 0) &&
|
||||
(link->io.NumPorts2 == 8)) {
|
||||
port = link->io.BasePort2;
|
||||
info->slave = 1;
|
||||
} else if ((info->manfid == MANFID_OSITECH) &&
|
||||
(config.NumPorts1 == 0x40)) {
|
||||
port = config.BasePort1 + 0x28;
|
||||
(link->io.NumPorts1 == 0x40)) {
|
||||
port = link->io.BasePort1 + 0x28;
|
||||
info->slave = 1;
|
||||
}
|
||||
if (info->slave) {
|
||||
kfree(cfg_mem);
|
||||
return setup_serial(link, info, port, config.AssignedIRQ);
|
||||
return setup_serial(link, info, port,
|
||||
link->irq.AssignedIRQ);
|
||||
}
|
||||
}
|
||||
|
||||
/* First pass: look for a config entry that looks normal. */
|
||||
tuple->TupleData = (cisdata_t *) buf;
|
||||
tuple->TupleOffset = 0;
|
||||
tuple->TupleDataMax = 255;
|
||||
tuple->Attributes = 0;
|
||||
tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
/* Two tries: without IO aliases, then with aliases */
|
||||
for (s = 0; s < 2; s++) {
|
||||
for (try = 0; try < 2; try++) {
|
||||
i = first_tuple(link, tuple, parse);
|
||||
while (i != CS_NO_MORE_ITEMS) {
|
||||
if (i != CS_SUCCESS)
|
||||
goto next_entry;
|
||||
if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
|
||||
link->conf.Vpp =
|
||||
cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
|
||||
if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[s]) &&
|
||||
(cf->io.win[0].base != 0)) {
|
||||
link->conf.ConfigIndex = cf->index;
|
||||
link->io.BasePort1 = cf->io.win[0].base;
|
||||
link->io.IOAddrLines = (try == 0) ?
|
||||
16 : cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
if (i == CS_SUCCESS)
|
||||
goto found_port;
|
||||
}
|
||||
next_entry:
|
||||
i = next_tuple(link, tuple, parse);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* First pass: look for a config entry that looks normal.
|
||||
* Two tries: without IO aliases, then with aliases */
|
||||
for (try = 0; try < 4; try++)
|
||||
if (!pcmcia_loop_config(link, simple_config_check, &try))
|
||||
goto found_port;
|
||||
|
||||
/* Second pass: try to find an entry that isn't picky about
|
||||
its base address, then try to grab any standard serial port
|
||||
address, and finally try to get any free port. */
|
||||
i = first_tuple(link, tuple, parse);
|
||||
while (i != CS_NO_MORE_ITEMS) {
|
||||
if ((i == CS_SUCCESS) && (cf->io.nwin > 0) &&
|
||||
((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
|
||||
link->conf.ConfigIndex = cf->index;
|
||||
for (j = 0; j < 5; j++) {
|
||||
link->io.BasePort1 = base[j];
|
||||
link->io.IOAddrLines = base[j] ? 16 : 3;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
if (i == CS_SUCCESS)
|
||||
goto found_port;
|
||||
}
|
||||
}
|
||||
i = next_tuple(link, tuple, parse);
|
||||
}
|
||||
if (!pcmcia_loop_config(link, simple_config_check_notpicky, NULL))
|
||||
goto found_port;
|
||||
|
||||
found_port:
|
||||
if (i != CS_SUCCESS) {
|
||||
printk(KERN_NOTICE
|
||||
"serial_cs: no usable port range found, giving up\n");
|
||||
cs_error(link, RequestIO, i);
|
||||
kfree(cfg_mem);
|
||||
return -1;
|
||||
}
|
||||
printk(KERN_NOTICE
|
||||
"serial_cs: no usable port range found, giving up\n");
|
||||
cs_error(link, RequestIO, i);
|
||||
return -1;
|
||||
|
||||
found_port:
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != CS_SUCCESS) {
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIRQ, i);
|
||||
link->irq.AssignedIRQ = 0;
|
||||
}
|
||||
|
|
@ -569,88 +541,76 @@ next_entry:
|
|||
info->quirk->config(link);
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != CS_SUCCESS) {
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
kfree(cfg_mem);
|
||||
return -1;
|
||||
}
|
||||
kfree(cfg_mem);
|
||||
return setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ);
|
||||
}
|
||||
|
||||
static int multi_config(struct pcmcia_device * link)
|
||||
static int multi_config_check(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
int *base2 = priv_data;
|
||||
|
||||
/* The quad port cards have bad CIS's, so just look for a
|
||||
window larger than 8 ports and assume it will be right */
|
||||
if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io)) {
|
||||
*base2 = p_dev->io.BasePort1 + 8;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cf,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
int *base2 = priv_data;
|
||||
|
||||
if (cf->io.nwin == 2) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.BasePort2 = cf->io.win[1].base;
|
||||
p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io)) {
|
||||
*base2 = p_dev->io.BasePort2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int multi_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct serial_info *info = link->priv;
|
||||
struct serial_cfg_mem *cfg_mem;
|
||||
tuple_t *tuple;
|
||||
u_char *buf;
|
||||
cisparse_t *parse;
|
||||
cistpl_cftable_entry_t *cf;
|
||||
int i, rc, base2 = 0;
|
||||
|
||||
cfg_mem = kmalloc(sizeof(struct serial_cfg_mem), GFP_KERNEL);
|
||||
if (!cfg_mem)
|
||||
return -1;
|
||||
tuple = &cfg_mem->tuple;
|
||||
parse = &cfg_mem->parse;
|
||||
cf = &parse->cftable_entry;
|
||||
buf = cfg_mem->buf;
|
||||
|
||||
tuple->TupleData = (cisdata_t *) buf;
|
||||
tuple->TupleOffset = 0;
|
||||
tuple->TupleDataMax = 255;
|
||||
tuple->Attributes = 0;
|
||||
tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
int i, base2 = 0;
|
||||
|
||||
/* First, look for a generic full-sized window */
|
||||
link->io.NumPorts1 = info->multi * 8;
|
||||
i = first_tuple(link, tuple, parse);
|
||||
while (i != CS_NO_MORE_ITEMS) {
|
||||
/* The quad port cards have bad CIS's, so just look for a
|
||||
window larger than 8 ports and assume it will be right */
|
||||
if ((i == CS_SUCCESS) && (cf->io.nwin == 1) &&
|
||||
(cf->io.win[0].len > 8)) {
|
||||
link->conf.ConfigIndex = cf->index;
|
||||
link->io.BasePort1 = cf->io.win[0].base;
|
||||
link->io.IOAddrLines =
|
||||
cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
base2 = link->io.BasePort1 + 8;
|
||||
if (i == CS_SUCCESS)
|
||||
break;
|
||||
}
|
||||
i = next_tuple(link, tuple, parse);
|
||||
}
|
||||
|
||||
/* If that didn't work, look for two windows */
|
||||
if (i != CS_SUCCESS) {
|
||||
if (pcmcia_loop_config(link, multi_config_check, &base2)) {
|
||||
/* If that didn't work, look for two windows */
|
||||
link->io.NumPorts1 = link->io.NumPorts2 = 8;
|
||||
info->multi = 2;
|
||||
i = first_tuple(link, tuple, parse);
|
||||
while (i != CS_NO_MORE_ITEMS) {
|
||||
if ((i == CS_SUCCESS) && (cf->io.nwin == 2)) {
|
||||
link->conf.ConfigIndex = cf->index;
|
||||
link->io.BasePort1 = cf->io.win[0].base;
|
||||
link->io.BasePort2 = cf->io.win[1].base;
|
||||
link->io.IOAddrLines =
|
||||
cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
base2 = link->io.BasePort2;
|
||||
if (i == CS_SUCCESS)
|
||||
break;
|
||||
}
|
||||
i = next_tuple(link, tuple, parse);
|
||||
if (pcmcia_loop_config(link, multi_config_check_notpicky,
|
||||
&base2)) {
|
||||
printk(KERN_NOTICE "serial_cs: no usable port range"
|
||||
"found, giving up\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
if (i != CS_SUCCESS) {
|
||||
cs_error(link, RequestIO, i);
|
||||
rc = -1;
|
||||
goto free_cfg_mem;
|
||||
}
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != CS_SUCCESS) {
|
||||
if (i != 0) {
|
||||
/* FIXME: comment does not fit, error handling does not fit */
|
||||
printk(KERN_NOTICE
|
||||
"serial_cs: no usable port range found, giving up\n");
|
||||
cs_error(link, RequestIRQ, i);
|
||||
|
|
@ -664,10 +624,9 @@ static int multi_config(struct pcmcia_device * link)
|
|||
info->quirk->config(link);
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != CS_SUCCESS) {
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
rc = -1;
|
||||
goto free_cfg_mem;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* The Oxford Semiconductor OXCF950 cards are in fact single-port:
|
||||
|
|
@ -678,7 +637,8 @@ static int multi_config(struct pcmcia_device * link)
|
|||
info->prodid == PRODID_POSSIO_GCC)) {
|
||||
int err;
|
||||
|
||||
if (cf->index == 1 || cf->index == 3) {
|
||||
if (link->conf.ConfigIndex == 1 ||
|
||||
link->conf.ConfigIndex == 3) {
|
||||
err = setup_serial(link, info, base2,
|
||||
link->irq.AssignedIRQ);
|
||||
base2 = link->io.BasePort1;
|
||||
|
|
@ -695,18 +655,14 @@ static int multi_config(struct pcmcia_device * link)
|
|||
if (info->quirk && info->quirk->wakeup)
|
||||
info->quirk->wakeup(link);
|
||||
|
||||
rc = 0;
|
||||
goto free_cfg_mem;
|
||||
return 0;
|
||||
}
|
||||
|
||||
setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ);
|
||||
for (i = 0; i < info->multi - 1; i++)
|
||||
setup_serial(link, info, base2 + (8 * i),
|
||||
link->irq.AssignedIRQ);
|
||||
rc = 0;
|
||||
free_cfg_mem:
|
||||
kfree(cfg_mem);
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*======================================================================
|
||||
|
|
@ -746,7 +702,7 @@ static int serial_config(struct pcmcia_device * link)
|
|||
/* Is this a compliant multifunction card? */
|
||||
tuple->DesiredTuple = CISTPL_LONGLINK_MFC;
|
||||
tuple->Attributes = TUPLE_RETURN_COMMON | TUPLE_RETURN_LINK;
|
||||
info->multi = (first_tuple(link, tuple, parse) == CS_SUCCESS);
|
||||
info->multi = (first_tuple(link, tuple, parse) == 0);
|
||||
|
||||
/* Is this a multiport card? */
|
||||
tuple->DesiredTuple = CISTPL_MANFID;
|
||||
|
|
@ -770,7 +726,7 @@ static int serial_config(struct pcmcia_device * link)
|
|||
((link->func_id == CISTPL_FUNCID_MULTI) ||
|
||||
(link->func_id == CISTPL_FUNCID_SERIAL))) {
|
||||
tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
if (first_tuple(link, tuple, parse) == CS_SUCCESS) {
|
||||
if (first_tuple(link, tuple, parse) == 0) {
|
||||
if ((cf->io.nwin == 1) && (cf->io.win[0].len % 8 == 0))
|
||||
info->multi = cf->io.win[0].len >> 3;
|
||||
if ((cf->io.nwin == 2) && (cf->io.win[0].len == 8) &&
|
||||
|
|
|
|||
|
|
@ -616,7 +616,7 @@ static int __devexit hv_remove(struct of_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct of_device_id hv_match[] = {
|
||||
static const struct of_device_id hv_match[] = {
|
||||
{
|
||||
.name = "console",
|
||||
.compatible = "qcn",
|
||||
|
|
|
|||
|
|
@ -1078,7 +1078,7 @@ static int __devexit sab_remove(struct of_device *op)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct of_device_id sab_match[] = {
|
||||
static const struct of_device_id sab_match[] = {
|
||||
{
|
||||
.name = "se",
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1506,7 +1506,7 @@ static int __devexit su_remove(struct of_device *op)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct of_device_id su_match[] = {
|
||||
static const struct of_device_id su_match[] = {
|
||||
{
|
||||
.name = "su",
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1480,7 +1480,7 @@ static int __devexit zs_remove(struct of_device *op)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct of_device_id zs_match[] = {
|
||||
static const struct of_device_id zs_match[] = {
|
||||
{
|
||||
.name = "zs",
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in a new issue