diff -urpNX dontdiff linux-2.5.29/drivers/serial/acpi.c linux-2.5.29-scsi/drivers/serial/acpi.c
--- linux-2.5.29/drivers/serial/acpi.c	1969-12-31 17:00:00.000000000 -0700
+++ linux-2.5.29-scsi/drivers/serial/acpi.c	2002-07-27 17:44:32.000000000 -0600
@@ -0,0 +1,109 @@
+/*
+ * serial/acpi.c
+ * Copyright (c) 2002 Matthew Wilcox for Hewlett-Packard
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/acpi.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/serial.h>
+#include <asm/io.h>
+#include <asm/serial.h>
+#include "../acpi/acpi_bus.h"
+
+static int acpi_serial_add(struct acpi_device *device)
+{
+	acpi_status result;
+	acpi_buffer buffer;
+	struct serial_struct serial_req;
+	int line, offset = 0;
+
+	memset(&serial_req, 0, sizeof(serial_req));
+	buffer.length = 0;
+	buffer.pointer = NULL;
+	result = acpi_get_current_resources(device->handle, &buffer);
+	if (result != AE_BUFFER_OVERFLOW)
+		return -ENODEV;
+	buffer.pointer = kmalloc(buffer.length, GFP_KERNEL);
+	if (!buffer.pointer)
+		return -ENOMEM;
+	result = acpi_get_current_resources(device->handle, &buffer);
+	if (result != AE_OK) {
+		result = -ENODEV;
+		goto out;
+	}
+
+	while (offset <= buffer.length) {
+		acpi_resource *res = buffer.pointer + offset;
+		if (res->length == 0)
+			break;
+		offset += res->length;
+		if (res->id == ACPI_RSTYPE_ADDRESS32) {
+			acpi_resource_address32 *addr32 = &res->data.address32;
+			serial_req.iomem_base = ioremap(addr32->min_address_range, addr32->max_address_range - addr32->min_address_range + 1);
+			serial_req.io_type = SERIAL_IO_MEM;
+			serial_req.port = 0;
+			serial_req.port_high = 0;
+		} else if (res->id == ACPI_RSTYPE_EXT_IRQ) {
+			acpi_resource_ext_irq *ext_irq = &res->data.extended_irq;
+			if (ext_irq->number_of_interrupts > 0) {
+#ifdef CONFIG_IA64
+				serial_req.irq = acpi_register_irq(ext_irq->interrupts[0],
+				                  ext_irq->active_high_low == ACPI_ACTIVE_HIGH,
+				                  ext_irq->edge_level == ACPI_EDGE_SENSITIVE);
+#else
+				serial_req.irq = ext_irq->interrupts[0];
+#endif
+			}
+		}
+	}
+
+	serial_req.baud_base = BASE_BAUD;
+	serial_req.flags = ASYNC_SKIP_TEST|ASYNC_BOOT_AUTOCONF|ASYNC_AUTO_IRQ;
+	serial_req.xmit_fifo_size = serial_req.custom_divisor = 0;
+	serial_req.close_delay = serial_req.hub6 = serial_req.closing_wait = 0;
+	serial_req.iomem_reg_shift = 0;
+
+	result = 0;
+	line = register_serial(&serial_req);
+	if (line < 0)
+		result = -ENODEV;
+
+ out:
+	kfree(buffer.pointer);
+	return result;
+}
+
+static int acpi_serial_remove(struct acpi_device *device, int type)
+{
+	return 0;
+}
+
+static struct acpi_driver acpi_serial_driver = {
+	name:	"serial",
+	class:	"",
+	ids:	"PNP0501",
+	ops:	{
+			add:	acpi_serial_add,
+			remove:	acpi_serial_remove,
+		},
+};
+
+static int __init acpi_serial_init(void)
+{
+	acpi_bus_register_driver(&acpi_serial_driver);
+	return 0;
+}
+
+static void __exit acpi_serial_exit(void)
+{
+	acpi_bus_unregister_driver(&acpi_serial_driver);
+}
+
+module_init(acpi_serial_init);
+module_exit(acpi_serial_exit);
diff -urpNX dontdiff linux-2.5.29/drivers/serial/Config.help linux-2.5.29-scsi/drivers/serial/Config.help
--- linux-2.5.29/drivers/serial/Config.help	2002-07-27 12:09:16.000000000 -0600
+++ linux-2.5.29-scsi/drivers/serial/Config.help	2002-07-27 17:14:20.000000000 -0600
@@ -48,6 +48,13 @@ CONFIG_SERIAL_8250_CONSOLE
 
   If unsure, say N.
 
+CONFIG_SERIAL_8250_ACPI
+  Say Y here to enable support for serial devices which can be found
+  in the ACPI namespace, but not by any other means.  You don't need
+  to enable this if the serial device can be found by a PCI bus walk.
+  This option does NOT enable support for the SPCR and DBGP tables found
+  in the ACPI specification.
+
 CONFIG_SERIAL_8250_CS
   Say Y here to enable support for 16-bit PCMCIA serial devices,
   including serial port cards, modems, and the modem functions of
diff -urpNX dontdiff linux-2.5.29/drivers/serial/Config.in linux-2.5.29-scsi/drivers/serial/Config.in
--- linux-2.5.29/drivers/serial/Config.in	2002-07-27 12:09:16.000000000 -0600
+++ linux-2.5.29-scsi/drivers/serial/Config.in	2002-07-27 17:06:37.000000000 -0600
@@ -11,6 +11,7 @@ comment 'Serial drivers'
 dep_tristate '8250/16550 and compatible serial support (EXPERIMENTAL)' CONFIG_SERIAL_8250 $CONFIG_EXPERIMENTAL
 dep_bool '  Console on 8250/16550 and compatible serial port (EXPERIMENTAL)' CONFIG_SERIAL_8250_CONSOLE $CONFIG_SERIAL_8250 $CONFIG_EXPERIMENTAL
 dep_tristate '  8250/16550 PCMCIA device support' CONFIG_SERIAL_8250_CS $CONFIG_PCMCIA $CONFIG_SERIAL_8250
+dep_tristate '  8250/16550 ACPI namespace support' CONFIG_SERIAL_8250_ACPI $CONFIG_ACPI $CONFIG_SERIAL_8250
 
 dep_mbool 'Extended 8250/16550 serial driver options' CONFIG_SERIAL_8250_EXTENDED $CONFIG_SERIAL_8250
 dep_bool '  Support more than 4 serial ports' CONFIG_SERIAL_8250_MANY_PORTS $CONFIG_SERIAL_8250_EXTENDED
diff -urpNX dontdiff linux-2.5.29/drivers/serial/Makefile linux-2.5.29-scsi/drivers/serial/Makefile
--- linux-2.5.29/drivers/serial/Makefile	2002-07-27 12:09:16.000000000 -0600
+++ linux-2.5.29-scsi/drivers/serial/Makefile	2002-07-27 17:07:00.000000000 -0600
@@ -12,6 +12,7 @@ serial-8250-$(CONFIG_ISAPNP) += 8250_pnp
 obj-$(CONFIG_SERIAL_CORE) += core.o
 obj-$(CONFIG_SERIAL_21285) += 21285.o
 obj-$(CONFIG_SERIAL_8250) += 8250.o $(serial-8250-y)
+obj-$(CONFIG_SERIAL_8250_ACPI) += acpi.o
 obj-$(CONFIG_SERIAL_8250_CS) += 8250_cs.o
 obj-$(CONFIG_SERIAL_ANAKIN) += anakin.o
 obj-$(CONFIG_SERIAL_AMBA) += amba.o
