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 +#include +#include +#include +#include +#include +#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