diff options
-rw-r--r-- | arch/arm/mach-ixp2000/ixdp2x01.c | 78 | ||||
-rw-r--r-- | drivers/serial/8250_acpi.c | 183 | ||||
-rw-r--r-- | drivers/serial/Kconfig | 9 | ||||
-rw-r--r-- | drivers/serial/Makefile | 1 | ||||
-rw-r--r-- | drivers/serial/amba-pl010.c | 110 | ||||
-rw-r--r-- | include/linux/serial_8250.h | 1 |
6 files changed, 110 insertions, 272 deletions
diff --git a/arch/arm/mach-ixp2000/ixdp2x01.c b/arch/arm/mach-ixp2000/ixdp2x01.c index f9d4968c1d66..66915282a463 100644 --- a/arch/arm/mach-ixp2000/ixdp2x01.c +++ b/arch/arm/mach-ixp2000/ixdp2x01.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/tty.h> | 30 | #include <linux/tty.h> |
31 | #include <linux/serial_core.h> | 31 | #include <linux/serial_core.h> |
32 | #include <linux/platform_device.h> | 32 | #include <linux/platform_device.h> |
33 | #include <linux/serial_8250.h> | ||
33 | 34 | ||
34 | #include <asm/io.h> | 35 | #include <asm/io.h> |
35 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
@@ -132,7 +133,7 @@ void __init ixdp2x01_init_irq(void) | |||
132 | 133 | ||
133 | 134 | ||
134 | /************************************************************************* | 135 | /************************************************************************* |
135 | * IXDP2x01 memory map and serial ports | 136 | * IXDP2x01 memory map |
136 | *************************************************************************/ | 137 | *************************************************************************/ |
137 | static struct map_desc ixdp2x01_io_desc __initdata = { | 138 | static struct map_desc ixdp2x01_io_desc __initdata = { |
138 | .virtual = IXDP2X01_VIRT_CPLD_BASE, | 139 | .virtual = IXDP2X01_VIRT_CPLD_BASE, |
@@ -141,40 +142,78 @@ static struct map_desc ixdp2x01_io_desc __initdata = { | |||
141 | .type = MT_DEVICE | 142 | .type = MT_DEVICE |
142 | }; | 143 | }; |
143 | 144 | ||
144 | static struct uart_port ixdp2x01_serial_ports[2] = { | 145 | static void __init ixdp2x01_map_io(void) |
146 | { | ||
147 | ixp2000_map_io(); | ||
148 | iotable_init(&ixdp2x01_io_desc, 1); | ||
149 | } | ||
150 | |||
151 | |||
152 | /************************************************************************* | ||
153 | * IXDP2x01 serial ports | ||
154 | *************************************************************************/ | ||
155 | static struct plat_serial8250_port ixdp2x01_serial_port1[] = { | ||
145 | { | 156 | { |
146 | .membase = (char *)(IXDP2X01_UART1_VIRT_BASE), | ||
147 | .mapbase = (unsigned long)IXDP2X01_UART1_PHYS_BASE, | 157 | .mapbase = (unsigned long)IXDP2X01_UART1_PHYS_BASE, |
158 | .membase = (char *)IXDP2X01_UART1_VIRT_BASE, | ||
148 | .irq = IRQ_IXDP2X01_UART1, | 159 | .irq = IRQ_IXDP2X01_UART1, |
149 | .flags = UPF_SKIP_TEST, | 160 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, |
150 | .iotype = UPIO_MEM32, | 161 | .iotype = UPIO_MEM32, |
151 | .regshift = 2, | 162 | .regshift = 2, |
152 | .uartclk = IXDP2X01_UART_CLK, | 163 | .uartclk = IXDP2X01_UART_CLK, |
153 | .line = 1, | 164 | }, |
154 | .type = PORT_16550A, | 165 | { } |
155 | .fifosize = 16 | 166 | }; |
156 | }, { | 167 | |
157 | .membase = (char *)(IXDP2X01_UART2_VIRT_BASE), | 168 | static struct resource ixdp2x01_uart_resource1 = { |
169 | .start = IXDP2X01_UART1_PHYS_BASE, | ||
170 | .end = IXDP2X01_UART1_PHYS_BASE + 0xffff, | ||
171 | .flags = IORESOURCE_MEM, | ||
172 | }; | ||
173 | |||
174 | static struct platform_device ixdp2x01_serial_device1 = { | ||
175 | .name = "serial8250", | ||
176 | .id = PLAT8250_DEV_PLATFORM1, | ||
177 | .dev = { | ||
178 | .platform_data = ixdp2x01_serial_port1, | ||
179 | }, | ||
180 | .num_resources = 1, | ||
181 | .resource = &ixdp2x01_uart_resource1, | ||
182 | }; | ||
183 | |||
184 | static struct plat_serial8250_port ixdp2x01_serial_port2[] = { | ||
185 | { | ||
158 | .mapbase = (unsigned long)IXDP2X01_UART2_PHYS_BASE, | 186 | .mapbase = (unsigned long)IXDP2X01_UART2_PHYS_BASE, |
187 | .membase = (char *)IXDP2X01_UART2_VIRT_BASE, | ||
159 | .irq = IRQ_IXDP2X01_UART2, | 188 | .irq = IRQ_IXDP2X01_UART2, |
160 | .flags = UPF_SKIP_TEST, | 189 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, |
161 | .iotype = UPIO_MEM32, | 190 | .iotype = UPIO_MEM32, |
162 | .regshift = 2, | 191 | .regshift = 2, |
163 | .uartclk = IXDP2X01_UART_CLK, | 192 | .uartclk = IXDP2X01_UART_CLK, |
164 | .line = 2, | ||
165 | .type = PORT_16550A, | ||
166 | .fifosize = 16 | ||
167 | }, | 193 | }, |
194 | { } | ||
168 | }; | 195 | }; |
169 | 196 | ||
170 | static void __init ixdp2x01_map_io(void) | 197 | static struct resource ixdp2x01_uart_resource2 = { |
171 | { | 198 | .start = IXDP2X01_UART2_PHYS_BASE, |
172 | ixp2000_map_io(); | 199 | .end = IXDP2X01_UART2_PHYS_BASE + 0xffff, |
200 | .flags = IORESOURCE_MEM, | ||
201 | }; | ||
173 | 202 | ||
174 | iotable_init(&ixdp2x01_io_desc, 1); | 203 | static struct platform_device ixdp2x01_serial_device2 = { |
204 | .name = "serial8250", | ||
205 | .id = PLAT8250_DEV_PLATFORM2, | ||
206 | .dev = { | ||
207 | .platform_data = ixdp2x01_serial_port2, | ||
208 | }, | ||
209 | .num_resources = 1, | ||
210 | .resource = &ixdp2x01_uart_resource2, | ||
211 | }; | ||
175 | 212 | ||
176 | early_serial_setup(&ixdp2x01_serial_ports[0]); | 213 | static void ixdp2x01_uart_init(void) |
177 | early_serial_setup(&ixdp2x01_serial_ports[1]); | 214 | { |
215 | platform_device_register(&ixdp2x01_serial_device1); | ||
216 | platform_device_register(&ixdp2x01_serial_device2); | ||
178 | } | 217 | } |
179 | 218 | ||
180 | 219 | ||
@@ -374,6 +413,7 @@ static void __init ixdp2x01_init_machine(void) | |||
374 | 413 | ||
375 | platform_add_devices(ixdp2x01_devices, ARRAY_SIZE(ixdp2x01_devices)); | 414 | platform_add_devices(ixdp2x01_devices, ARRAY_SIZE(ixdp2x01_devices)); |
376 | ixp2000_uart_init(); | 415 | ixp2000_uart_init(); |
416 | ixdp2x01_uart_init(); | ||
377 | } | 417 | } |
378 | 418 | ||
379 | 419 | ||
diff --git a/drivers/serial/8250_acpi.c b/drivers/serial/8250_acpi.c deleted file mode 100644 index 809f89ab965c..000000000000 --- a/drivers/serial/8250_acpi.c +++ /dev/null | |||
@@ -1,183 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2002-2003 Matthew Wilcox for Hewlett-Packard | ||
3 | * Copyright (C) 2004 Hewlett-Packard Co | ||
4 | * Bjorn Helgaas <bjorn.helgaas@hp.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/acpi.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/serial_core.h> | ||
16 | |||
17 | #include <acpi/acpi_bus.h> | ||
18 | |||
19 | #include <asm/io.h> | ||
20 | |||
21 | #include "8250.h" | ||
22 | |||
23 | struct serial_private { | ||
24 | int line; | ||
25 | }; | ||
26 | |||
27 | static acpi_status acpi_serial_mmio(struct uart_port *port, | ||
28 | struct acpi_resource_address64 *addr) | ||
29 | { | ||
30 | port->mapbase = addr->minimum; | ||
31 | port->iotype = UPIO_MEM; | ||
32 | port->flags |= UPF_IOREMAP; | ||
33 | return AE_OK; | ||
34 | } | ||
35 | |||
36 | static acpi_status acpi_serial_port(struct uart_port *port, | ||
37 | struct acpi_resource_io *io) | ||
38 | { | ||
39 | if (io->address_length) { | ||
40 | port->iobase = io->minimum; | ||
41 | port->iotype = UPIO_PORT; | ||
42 | } else | ||
43 | printk(KERN_ERR "%s: zero-length IO port range?\n", __FUNCTION__); | ||
44 | return AE_OK; | ||
45 | } | ||
46 | |||
47 | static acpi_status acpi_serial_ext_irq(struct uart_port *port, | ||
48 | struct acpi_resource_extended_irq *ext_irq) | ||
49 | { | ||
50 | int rc; | ||
51 | |||
52 | if (ext_irq->interrupt_count > 0) { | ||
53 | rc = acpi_register_gsi(ext_irq->interrupts[0], | ||
54 | ext_irq->triggering, ext_irq->polarity); | ||
55 | if (rc < 0) | ||
56 | return AE_ERROR; | ||
57 | port->irq = rc; | ||
58 | } | ||
59 | return AE_OK; | ||
60 | } | ||
61 | |||
62 | static acpi_status acpi_serial_irq(struct uart_port *port, | ||
63 | struct acpi_resource_irq *irq) | ||
64 | { | ||
65 | int rc; | ||
66 | |||
67 | if (irq->interrupt_count > 0) { | ||
68 | rc = acpi_register_gsi(irq->interrupts[0], | ||
69 | irq->triggering, irq->polarity); | ||
70 | if (rc < 0) | ||
71 | return AE_ERROR; | ||
72 | port->irq = rc; | ||
73 | } | ||
74 | return AE_OK; | ||
75 | } | ||
76 | |||
77 | static acpi_status acpi_serial_resource(struct acpi_resource *res, void *data) | ||
78 | { | ||
79 | struct uart_port *port = (struct uart_port *) data; | ||
80 | struct acpi_resource_address64 addr; | ||
81 | acpi_status status; | ||
82 | |||
83 | status = acpi_resource_to_address64(res, &addr); | ||
84 | if (ACPI_SUCCESS(status)) | ||
85 | return acpi_serial_mmio(port, &addr); | ||
86 | else if (res->type == ACPI_RESOURCE_TYPE_IO) | ||
87 | return acpi_serial_port(port, &res->data.io); | ||
88 | else if (res->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ) | ||
89 | return acpi_serial_ext_irq(port, &res->data.extended_irq); | ||
90 | else if (res->type == ACPI_RESOURCE_TYPE_IRQ) | ||
91 | return acpi_serial_irq(port, &res->data.irq); | ||
92 | return AE_OK; | ||
93 | } | ||
94 | |||
95 | static int acpi_serial_add(struct acpi_device *device) | ||
96 | { | ||
97 | struct serial_private *priv; | ||
98 | acpi_status status; | ||
99 | struct uart_port port; | ||
100 | int result; | ||
101 | |||
102 | memset(&port, 0, sizeof(struct uart_port)); | ||
103 | |||
104 | port.uartclk = 1843200; | ||
105 | port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; | ||
106 | |||
107 | priv = kmalloc(sizeof(struct serial_private), GFP_KERNEL); | ||
108 | if (!priv) { | ||
109 | result = -ENOMEM; | ||
110 | goto fail; | ||
111 | } | ||
112 | memset(priv, 0, sizeof(*priv)); | ||
113 | |||
114 | status = acpi_walk_resources(device->handle, METHOD_NAME__CRS, | ||
115 | acpi_serial_resource, &port); | ||
116 | if (ACPI_FAILURE(status)) { | ||
117 | result = -ENODEV; | ||
118 | goto fail; | ||
119 | } | ||
120 | |||
121 | if (!port.mapbase && !port.iobase) { | ||
122 | printk(KERN_ERR "%s: no iomem or port address in %s _CRS\n", | ||
123 | __FUNCTION__, device->pnp.bus_id); | ||
124 | result = -ENODEV; | ||
125 | goto fail; | ||
126 | } | ||
127 | |||
128 | priv->line = serial8250_register_port(&port); | ||
129 | if (priv->line < 0) { | ||
130 | printk(KERN_WARNING "Couldn't register serial port %s: %d\n", | ||
131 | device->pnp.bus_id, priv->line); | ||
132 | result = -ENODEV; | ||
133 | goto fail; | ||
134 | } | ||
135 | |||
136 | acpi_driver_data(device) = priv; | ||
137 | return 0; | ||
138 | |||
139 | fail: | ||
140 | kfree(priv); | ||
141 | |||
142 | return result; | ||
143 | } | ||
144 | |||
145 | static int acpi_serial_remove(struct acpi_device *device, int type) | ||
146 | { | ||
147 | struct serial_private *priv; | ||
148 | |||
149 | if (!device || !acpi_driver_data(device)) | ||
150 | return -EINVAL; | ||
151 | |||
152 | priv = acpi_driver_data(device); | ||
153 | serial8250_unregister_port(priv->line); | ||
154 | kfree(priv); | ||
155 | |||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static struct acpi_driver acpi_serial_driver = { | ||
160 | .name = "serial", | ||
161 | .class = "", | ||
162 | .ids = "PNP0501", | ||
163 | .ops = { | ||
164 | .add = acpi_serial_add, | ||
165 | .remove = acpi_serial_remove, | ||
166 | }, | ||
167 | }; | ||
168 | |||
169 | static int __init acpi_serial_init(void) | ||
170 | { | ||
171 | return acpi_bus_register_driver(&acpi_serial_driver); | ||
172 | } | ||
173 | |||
174 | static void __exit acpi_serial_exit(void) | ||
175 | { | ||
176 | acpi_bus_unregister_driver(&acpi_serial_driver); | ||
177 | } | ||
178 | |||
179 | module_init(acpi_serial_init); | ||
180 | module_exit(acpi_serial_exit); | ||
181 | |||
182 | MODULE_LICENSE("GPL"); | ||
183 | MODULE_DESCRIPTION("Generic 8250/16x50 ACPI serial driver"); | ||
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index c66ef96c71b4..ceb3697bf84d 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -77,14 +77,6 @@ config SERIAL_8250_CS | |||
77 | 77 | ||
78 | If unsure, say N. | 78 | If unsure, say N. |
79 | 79 | ||
80 | config SERIAL_8250_ACPI | ||
81 | bool "8250/16550 device discovery via ACPI namespace" | ||
82 | default y if IA64 | ||
83 | depends on ACPI && SERIAL_8250 | ||
84 | ---help--- | ||
85 | If you wish to enable serial port discovery via the ACPI | ||
86 | namespace, say Y here. If unsure, say N. | ||
87 | |||
88 | config SERIAL_8250_NR_UARTS | 80 | config SERIAL_8250_NR_UARTS |
89 | int "Maximum number of 8250/16550 serial ports" | 81 | int "Maximum number of 8250/16550 serial ports" |
90 | depends on SERIAL_8250 | 82 | depends on SERIAL_8250 |
@@ -827,6 +819,7 @@ config SERIAL_ICOM | |||
827 | tristate "IBM Multiport Serial Adapter" | 819 | tristate "IBM Multiport Serial Adapter" |
828 | depends on PCI && (PPC_ISERIES || PPC_PSERIES) | 820 | depends on PCI && (PPC_ISERIES || PPC_PSERIES) |
829 | select SERIAL_CORE | 821 | select SERIAL_CORE |
822 | select FW_LOADER | ||
830 | help | 823 | help |
831 | This driver is for a family of multiport serial adapters | 824 | This driver is for a family of multiport serial adapters |
832 | including 2 port RVX, 2 port internal modem, 4 port internal | 825 | including 2 port RVX, 2 port internal modem, 4 port internal |
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 50c221af9e6d..a3a4323d9c86 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile | |||
@@ -5,7 +5,6 @@ | |||
5 | # | 5 | # |
6 | 6 | ||
7 | serial-8250-y := | 7 | serial-8250-y := |
8 | serial-8250-$(CONFIG_SERIAL_8250_ACPI) += 8250_acpi.o | ||
9 | serial-8250-$(CONFIG_PNP) += 8250_pnp.o | 8 | serial-8250-$(CONFIG_PNP) += 8250_pnp.o |
10 | serial-8250-$(CONFIG_GSC) += 8250_gsc.o | 9 | serial-8250-$(CONFIG_GSC) += 8250_gsc.o |
11 | serial-8250-$(CONFIG_PCI) += 8250_pci.o | 10 | serial-8250-$(CONFIG_PCI) += 8250_pci.o |
diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c index e04d5e82d9ae..127d6cd5de7f 100644 --- a/drivers/serial/amba-pl010.c +++ b/drivers/serial/amba-pl010.c | |||
@@ -62,26 +62,8 @@ | |||
62 | 62 | ||
63 | #define AMBA_ISR_PASS_LIMIT 256 | 63 | #define AMBA_ISR_PASS_LIMIT 256 |
64 | 64 | ||
65 | /* | ||
66 | * Access macros for the AMBA UARTs | ||
67 | */ | ||
68 | #define UART_GET_INT_STATUS(p) readb((p)->membase + UART010_IIR) | ||
69 | #define UART_PUT_ICR(p, c) writel((c), (p)->membase + UART010_ICR) | ||
70 | #define UART_GET_FR(p) readb((p)->membase + UART01x_FR) | ||
71 | #define UART_GET_CHAR(p) readb((p)->membase + UART01x_DR) | ||
72 | #define UART_PUT_CHAR(p, c) writel((c), (p)->membase + UART01x_DR) | ||
73 | #define UART_GET_RSR(p) readb((p)->membase + UART01x_RSR) | ||
74 | #define UART_GET_CR(p) readb((p)->membase + UART010_CR) | ||
75 | #define UART_PUT_CR(p,c) writel((c), (p)->membase + UART010_CR) | ||
76 | #define UART_GET_LCRL(p) readb((p)->membase + UART010_LCRL) | ||
77 | #define UART_PUT_LCRL(p,c) writel((c), (p)->membase + UART010_LCRL) | ||
78 | #define UART_GET_LCRM(p) readb((p)->membase + UART010_LCRM) | ||
79 | #define UART_PUT_LCRM(p,c) writel((c), (p)->membase + UART010_LCRM) | ||
80 | #define UART_GET_LCRH(p) readb((p)->membase + UART010_LCRH) | ||
81 | #define UART_PUT_LCRH(p,c) writel((c), (p)->membase + UART010_LCRH) | ||
82 | #define UART_RX_DATA(s) (((s) & UART01x_FR_RXFE) == 0) | 65 | #define UART_RX_DATA(s) (((s) & UART01x_FR_RXFE) == 0) |
83 | #define UART_TX_READY(s) (((s) & UART01x_FR_TXFF) == 0) | 66 | #define UART_TX_READY(s) (((s) & UART01x_FR_TXFF) == 0) |
84 | #define UART_TX_EMPTY(p) ((UART_GET_FR(p) & UART01x_FR_TMSK) == 0) | ||
85 | 67 | ||
86 | #define UART_DUMMY_RSR_RX /*256*/0 | 68 | #define UART_DUMMY_RSR_RX /*256*/0 |
87 | #define UART_PORT_SIZE 64 | 69 | #define UART_PORT_SIZE 64 |
@@ -110,36 +92,36 @@ static void pl010_stop_tx(struct uart_port *port) | |||
110 | { | 92 | { |
111 | unsigned int cr; | 93 | unsigned int cr; |
112 | 94 | ||
113 | cr = UART_GET_CR(port); | 95 | cr = readb(port->membase + UART010_CR); |
114 | cr &= ~UART010_CR_TIE; | 96 | cr &= ~UART010_CR_TIE; |
115 | UART_PUT_CR(port, cr); | 97 | writel(cr, port->membase + UART010_CR); |
116 | } | 98 | } |
117 | 99 | ||
118 | static void pl010_start_tx(struct uart_port *port) | 100 | static void pl010_start_tx(struct uart_port *port) |
119 | { | 101 | { |
120 | unsigned int cr; | 102 | unsigned int cr; |
121 | 103 | ||
122 | cr = UART_GET_CR(port); | 104 | cr = readb(port->membase + UART010_CR); |
123 | cr |= UART010_CR_TIE; | 105 | cr |= UART010_CR_TIE; |
124 | UART_PUT_CR(port, cr); | 106 | writel(cr, port->membase + UART010_CR); |
125 | } | 107 | } |
126 | 108 | ||
127 | static void pl010_stop_rx(struct uart_port *port) | 109 | static void pl010_stop_rx(struct uart_port *port) |
128 | { | 110 | { |
129 | unsigned int cr; | 111 | unsigned int cr; |
130 | 112 | ||
131 | cr = UART_GET_CR(port); | 113 | cr = readb(port->membase + UART010_CR); |
132 | cr &= ~(UART010_CR_RIE | UART010_CR_RTIE); | 114 | cr &= ~(UART010_CR_RIE | UART010_CR_RTIE); |
133 | UART_PUT_CR(port, cr); | 115 | writel(cr, port->membase + UART010_CR); |
134 | } | 116 | } |
135 | 117 | ||
136 | static void pl010_enable_ms(struct uart_port *port) | 118 | static void pl010_enable_ms(struct uart_port *port) |
137 | { | 119 | { |
138 | unsigned int cr; | 120 | unsigned int cr; |
139 | 121 | ||
140 | cr = UART_GET_CR(port); | 122 | cr = readb(port->membase + UART010_CR); |
141 | cr |= UART010_CR_MSIE; | 123 | cr |= UART010_CR_MSIE; |
142 | UART_PUT_CR(port, cr); | 124 | writel(cr, port->membase + UART010_CR); |
143 | } | 125 | } |
144 | 126 | ||
145 | static void | 127 | static void |
@@ -152,9 +134,9 @@ pl010_rx_chars(struct uart_port *port) | |||
152 | struct tty_struct *tty = port->info->tty; | 134 | struct tty_struct *tty = port->info->tty; |
153 | unsigned int status, ch, flag, rsr, max_count = 256; | 135 | unsigned int status, ch, flag, rsr, max_count = 256; |
154 | 136 | ||
155 | status = UART_GET_FR(port); | 137 | status = readb(port->membase + UART01x_FR); |
156 | while (UART_RX_DATA(status) && max_count--) { | 138 | while (UART_RX_DATA(status) && max_count--) { |
157 | ch = UART_GET_CHAR(port); | 139 | ch = readb(port->membase + UART01x_DR); |
158 | flag = TTY_NORMAL; | 140 | flag = TTY_NORMAL; |
159 | 141 | ||
160 | port->icount.rx++; | 142 | port->icount.rx++; |
@@ -163,7 +145,7 @@ pl010_rx_chars(struct uart_port *port) | |||
163 | * Note that the error handling code is | 145 | * Note that the error handling code is |
164 | * out of the main execution path | 146 | * out of the main execution path |
165 | */ | 147 | */ |
166 | rsr = UART_GET_RSR(port) | UART_DUMMY_RSR_RX; | 148 | rsr = readb(port->membase + UART01x_RSR) | UART_DUMMY_RSR_RX; |
167 | if (unlikely(rsr & UART01x_RSR_ANY)) { | 149 | if (unlikely(rsr & UART01x_RSR_ANY)) { |
168 | if (rsr & UART01x_RSR_BE) { | 150 | if (rsr & UART01x_RSR_BE) { |
169 | rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE); | 151 | rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE); |
@@ -193,7 +175,7 @@ pl010_rx_chars(struct uart_port *port) | |||
193 | uart_insert_char(port, rsr, UART01x_RSR_OE, ch, flag); | 175 | uart_insert_char(port, rsr, UART01x_RSR_OE, ch, flag); |
194 | 176 | ||
195 | ignore_char: | 177 | ignore_char: |
196 | status = UART_GET_FR(port); | 178 | status = readb(port->membase + UART01x_FR); |
197 | } | 179 | } |
198 | tty_flip_buffer_push(tty); | 180 | tty_flip_buffer_push(tty); |
199 | return; | 181 | return; |
@@ -205,7 +187,7 @@ static void pl010_tx_chars(struct uart_port *port) | |||
205 | int count; | 187 | int count; |
206 | 188 | ||
207 | if (port->x_char) { | 189 | if (port->x_char) { |
208 | UART_PUT_CHAR(port, port->x_char); | 190 | writel(port->x_char, port->membase + UART01x_DR); |
209 | port->icount.tx++; | 191 | port->icount.tx++; |
210 | port->x_char = 0; | 192 | port->x_char = 0; |
211 | return; | 193 | return; |
@@ -217,7 +199,7 @@ static void pl010_tx_chars(struct uart_port *port) | |||
217 | 199 | ||
218 | count = port->fifosize >> 1; | 200 | count = port->fifosize >> 1; |
219 | do { | 201 | do { |
220 | UART_PUT_CHAR(port, xmit->buf[xmit->tail]); | 202 | writel(xmit->buf[xmit->tail], port->membase + UART01x_DR); |
221 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 203 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
222 | port->icount.tx++; | 204 | port->icount.tx++; |
223 | if (uart_circ_empty(xmit)) | 205 | if (uart_circ_empty(xmit)) |
@@ -236,9 +218,9 @@ static void pl010_modem_status(struct uart_port *port) | |||
236 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 218 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
237 | unsigned int status, delta; | 219 | unsigned int status, delta; |
238 | 220 | ||
239 | UART_PUT_ICR(&uap->port, 0); | 221 | writel(0, uap->port.membase + UART010_ICR); |
240 | 222 | ||
241 | status = UART_GET_FR(&uap->port) & UART01x_FR_MODEM_ANY; | 223 | status = readb(uap->port.membase + UART01x_FR) & UART01x_FR_MODEM_ANY; |
242 | 224 | ||
243 | delta = status ^ uap->old_status; | 225 | delta = status ^ uap->old_status; |
244 | uap->old_status = status; | 226 | uap->old_status = status; |
@@ -266,7 +248,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id, struct pt_regs *regs) | |||
266 | 248 | ||
267 | spin_lock(&port->lock); | 249 | spin_lock(&port->lock); |
268 | 250 | ||
269 | status = UART_GET_INT_STATUS(port); | 251 | status = readb(port->membase + UART010_IIR); |
270 | if (status) { | 252 | if (status) { |
271 | do { | 253 | do { |
272 | if (status & (UART010_IIR_RTIS | UART010_IIR_RIS)) | 254 | if (status & (UART010_IIR_RTIS | UART010_IIR_RIS)) |
@@ -283,7 +265,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id, struct pt_regs *regs) | |||
283 | if (pass_counter-- == 0) | 265 | if (pass_counter-- == 0) |
284 | break; | 266 | break; |
285 | 267 | ||
286 | status = UART_GET_INT_STATUS(port); | 268 | status = readb(port->membase + UART010_IIR); |
287 | } while (status & (UART010_IIR_RTIS | UART010_IIR_RIS | | 269 | } while (status & (UART010_IIR_RTIS | UART010_IIR_RIS | |
288 | UART010_IIR_TIS)); | 270 | UART010_IIR_TIS)); |
289 | handled = 1; | 271 | handled = 1; |
@@ -296,7 +278,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id, struct pt_regs *regs) | |||
296 | 278 | ||
297 | static unsigned int pl010_tx_empty(struct uart_port *port) | 279 | static unsigned int pl010_tx_empty(struct uart_port *port) |
298 | { | 280 | { |
299 | return UART_GET_FR(port) & UART01x_FR_BUSY ? 0 : TIOCSER_TEMT; | 281 | return readb(port->membase + UART01x_FR) & UART01x_FR_BUSY ? 0 : TIOCSER_TEMT; |
300 | } | 282 | } |
301 | 283 | ||
302 | static unsigned int pl010_get_mctrl(struct uart_port *port) | 284 | static unsigned int pl010_get_mctrl(struct uart_port *port) |
@@ -304,7 +286,7 @@ static unsigned int pl010_get_mctrl(struct uart_port *port) | |||
304 | unsigned int result = 0; | 286 | unsigned int result = 0; |
305 | unsigned int status; | 287 | unsigned int status; |
306 | 288 | ||
307 | status = UART_GET_FR(port); | 289 | status = readb(port->membase + UART01x_FR); |
308 | if (status & UART01x_FR_DCD) | 290 | if (status & UART01x_FR_DCD) |
309 | result |= TIOCM_CAR; | 291 | result |= TIOCM_CAR; |
310 | if (status & UART01x_FR_DSR) | 292 | if (status & UART01x_FR_DSR) |
@@ -340,12 +322,12 @@ static void pl010_break_ctl(struct uart_port *port, int break_state) | |||
340 | unsigned int lcr_h; | 322 | unsigned int lcr_h; |
341 | 323 | ||
342 | spin_lock_irqsave(&port->lock, flags); | 324 | spin_lock_irqsave(&port->lock, flags); |
343 | lcr_h = UART_GET_LCRH(port); | 325 | lcr_h = readb(port->membase + UART010_LCRH); |
344 | if (break_state == -1) | 326 | if (break_state == -1) |
345 | lcr_h |= UART01x_LCRH_BRK; | 327 | lcr_h |= UART01x_LCRH_BRK; |
346 | else | 328 | else |
347 | lcr_h &= ~UART01x_LCRH_BRK; | 329 | lcr_h &= ~UART01x_LCRH_BRK; |
348 | UART_PUT_LCRH(port, lcr_h); | 330 | writel(lcr_h, port->membase + UART010_LCRH); |
349 | spin_unlock_irqrestore(&port->lock, flags); | 331 | spin_unlock_irqrestore(&port->lock, flags); |
350 | } | 332 | } |
351 | 333 | ||
@@ -364,13 +346,13 @@ static int pl010_startup(struct uart_port *port) | |||
364 | /* | 346 | /* |
365 | * initialise the old status of the modem signals | 347 | * initialise the old status of the modem signals |
366 | */ | 348 | */ |
367 | uap->old_status = UART_GET_FR(port) & UART01x_FR_MODEM_ANY; | 349 | uap->old_status = readb(port->membase + UART01x_FR) & UART01x_FR_MODEM_ANY; |
368 | 350 | ||
369 | /* | 351 | /* |
370 | * Finally, enable interrupts | 352 | * Finally, enable interrupts |
371 | */ | 353 | */ |
372 | UART_PUT_CR(port, UART01x_CR_UARTEN | UART010_CR_RIE | | 354 | writel(UART01x_CR_UARTEN | UART010_CR_RIE | UART010_CR_RTIE, |
373 | UART010_CR_RTIE); | 355 | port->membase + UART010_CR); |
374 | 356 | ||
375 | return 0; | 357 | return 0; |
376 | } | 358 | } |
@@ -385,11 +367,12 @@ static void pl010_shutdown(struct uart_port *port) | |||
385 | /* | 367 | /* |
386 | * disable all interrupts, disable the port | 368 | * disable all interrupts, disable the port |
387 | */ | 369 | */ |
388 | UART_PUT_CR(port, 0); | 370 | writel(0, port->membase + UART010_CR); |
389 | 371 | ||
390 | /* disable break condition and fifos */ | 372 | /* disable break condition and fifos */ |
391 | UART_PUT_LCRH(port, UART_GET_LCRH(port) & | 373 | writel(readb(port->membase + UART010_LCRH) & |
392 | ~(UART01x_LCRH_BRK | UART01x_LCRH_FEN)); | 374 | ~(UART01x_LCRH_BRK | UART01x_LCRH_FEN), |
375 | port->membase + UART010_LCRH); | ||
393 | } | 376 | } |
394 | 377 | ||
395 | static void | 378 | static void |
@@ -466,25 +449,25 @@ pl010_set_termios(struct uart_port *port, struct termios *termios, | |||
466 | port->ignore_status_mask |= UART_DUMMY_RSR_RX; | 449 | port->ignore_status_mask |= UART_DUMMY_RSR_RX; |
467 | 450 | ||
468 | /* first, disable everything */ | 451 | /* first, disable everything */ |
469 | old_cr = UART_GET_CR(port) & ~UART010_CR_MSIE; | 452 | old_cr = readb(port->membase + UART010_CR) & ~UART010_CR_MSIE; |
470 | 453 | ||
471 | if (UART_ENABLE_MS(port, termios->c_cflag)) | 454 | if (UART_ENABLE_MS(port, termios->c_cflag)) |
472 | old_cr |= UART010_CR_MSIE; | 455 | old_cr |= UART010_CR_MSIE; |
473 | 456 | ||
474 | UART_PUT_CR(port, 0); | 457 | writel(0, port->membase + UART010_CR); |
475 | 458 | ||
476 | /* Set baud rate */ | 459 | /* Set baud rate */ |
477 | quot -= 1; | 460 | quot -= 1; |
478 | UART_PUT_LCRM(port, ((quot & 0xf00) >> 8)); | 461 | writel((quot & 0xf00) >> 8, port->membase + UART010_LCRM); |
479 | UART_PUT_LCRL(port, (quot & 0xff)); | 462 | writel(quot & 0xff, port->membase + UART010_LCRL); |
480 | 463 | ||
481 | /* | 464 | /* |
482 | * ----------v----------v----------v----------v----- | 465 | * ----------v----------v----------v----------v----- |
483 | * NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L | 466 | * NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L |
484 | * ----------^----------^----------^----------^----- | 467 | * ----------^----------^----------^----------^----- |
485 | */ | 468 | */ |
486 | UART_PUT_LCRH(port, lcr_h); | 469 | writel(lcr_h, port->membase + UART010_LCRH); |
487 | UART_PUT_CR(port, old_cr); | 470 | writel(old_cr, port->membase + UART010_CR); |
488 | 471 | ||
489 | spin_unlock_irqrestore(&port->lock, flags); | 472 | spin_unlock_irqrestore(&port->lock, flags); |
490 | } | 473 | } |
@@ -593,9 +576,13 @@ static struct uart_amba_port amba_ports[UART_NR] = { | |||
593 | 576 | ||
594 | static void pl010_console_putchar(struct uart_port *port, int ch) | 577 | static void pl010_console_putchar(struct uart_port *port, int ch) |
595 | { | 578 | { |
596 | while (!UART_TX_READY(UART_GET_FR(port))) | 579 | unsigned int status; |
580 | |||
581 | do { | ||
582 | status = readb(port->membase + UART01x_FR); | ||
597 | barrier(); | 583 | barrier(); |
598 | UART_PUT_CHAR(port, ch); | 584 | } while (!UART_TX_READY(status)); |
585 | writel(ch, port->membase + UART01x_DR); | ||
599 | } | 586 | } |
600 | 587 | ||
601 | static void | 588 | static void |
@@ -607,8 +594,8 @@ pl010_console_write(struct console *co, const char *s, unsigned int count) | |||
607 | /* | 594 | /* |
608 | * First save the CR then disable the interrupts | 595 | * First save the CR then disable the interrupts |
609 | */ | 596 | */ |
610 | old_cr = UART_GET_CR(port); | 597 | old_cr = readb(port->membase + UART010_CR); |
611 | UART_PUT_CR(port, UART01x_CR_UARTEN); | 598 | writel(UART01x_CR_UARTEN, port->membase + UART010_CR); |
612 | 599 | ||
613 | uart_console_write(port, s, count, pl010_console_putchar); | 600 | uart_console_write(port, s, count, pl010_console_putchar); |
614 | 601 | ||
@@ -617,18 +604,19 @@ pl010_console_write(struct console *co, const char *s, unsigned int count) | |||
617 | * and restore the TCR | 604 | * and restore the TCR |
618 | */ | 605 | */ |
619 | do { | 606 | do { |
620 | status = UART_GET_FR(port); | 607 | status = readb(port->membase + UART01x_FR); |
608 | barrier(); | ||
621 | } while (status & UART01x_FR_BUSY); | 609 | } while (status & UART01x_FR_BUSY); |
622 | UART_PUT_CR(port, old_cr); | 610 | writel(old_cr, port->membase + UART010_CR); |
623 | } | 611 | } |
624 | 612 | ||
625 | static void __init | 613 | static void __init |
626 | pl010_console_get_options(struct uart_port *port, int *baud, | 614 | pl010_console_get_options(struct uart_port *port, int *baud, |
627 | int *parity, int *bits) | 615 | int *parity, int *bits) |
628 | { | 616 | { |
629 | if (UART_GET_CR(port) & UART01x_CR_UARTEN) { | 617 | if (readb(port->membase + UART010_CR) & UART01x_CR_UARTEN) { |
630 | unsigned int lcr_h, quot; | 618 | unsigned int lcr_h, quot; |
631 | lcr_h = UART_GET_LCRH(port); | 619 | lcr_h = readb(port->membase + UART010_LCRH); |
632 | 620 | ||
633 | *parity = 'n'; | 621 | *parity = 'n'; |
634 | if (lcr_h & UART01x_LCRH_PEN) { | 622 | if (lcr_h & UART01x_LCRH_PEN) { |
@@ -643,7 +631,7 @@ pl010_console_get_options(struct uart_port *port, int *baud, | |||
643 | else | 631 | else |
644 | *bits = 8; | 632 | *bits = 8; |
645 | 633 | ||
646 | quot = UART_GET_LCRL(port) | UART_GET_LCRM(port) << 8; | 634 | quot = readb(port->membase + UART010_LCRL) | readb(port->membase + UART010_LCRM) << 8; |
647 | *baud = port->uartclk / (16 * (quot + 1)); | 635 | *baud = port->uartclk / (16 * (quot + 1)); |
648 | } | 636 | } |
649 | } | 637 | } |
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 73b464f0926a..8e9681413726 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
@@ -37,6 +37,7 @@ enum { | |||
37 | PLAT8250_DEV_LEGACY = -1, | 37 | PLAT8250_DEV_LEGACY = -1, |
38 | PLAT8250_DEV_PLATFORM, | 38 | PLAT8250_DEV_PLATFORM, |
39 | PLAT8250_DEV_PLATFORM1, | 39 | PLAT8250_DEV_PLATFORM1, |
40 | PLAT8250_DEV_PLATFORM2, | ||
40 | PLAT8250_DEV_FOURPORT, | 41 | PLAT8250_DEV_FOURPORT, |
41 | PLAT8250_DEV_ACCENT, | 42 | PLAT8250_DEV_ACCENT, |
42 | PLAT8250_DEV_BOCA, | 43 | PLAT8250_DEV_BOCA, |