1098ca2bdSWarner Losh /*- 227d5dc18SMarcel Moolenaar * Copyright (c) 2001 M. Warner Losh. All rights reserved. 327d5dc18SMarcel Moolenaar * 427d5dc18SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 527d5dc18SMarcel Moolenaar * modification, are permitted provided that the following conditions 627d5dc18SMarcel Moolenaar * are met: 727d5dc18SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 827d5dc18SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 927d5dc18SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 1027d5dc18SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 1127d5dc18SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 1227d5dc18SMarcel Moolenaar * 1327d5dc18SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1427d5dc18SMarcel Moolenaar * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1527d5dc18SMarcel Moolenaar * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1627d5dc18SMarcel Moolenaar * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1727d5dc18SMarcel Moolenaar * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1827d5dc18SMarcel Moolenaar * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1927d5dc18SMarcel Moolenaar * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2027d5dc18SMarcel Moolenaar * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2127d5dc18SMarcel Moolenaar * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2227d5dc18SMarcel Moolenaar * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2327d5dc18SMarcel Moolenaar */ 2427d5dc18SMarcel Moolenaar 2527d5dc18SMarcel Moolenaar #include <sys/cdefs.h> 2627d5dc18SMarcel Moolenaar __FBSDID("$FreeBSD$"); 2727d5dc18SMarcel Moolenaar 2827d5dc18SMarcel Moolenaar #include <sys/param.h> 2927d5dc18SMarcel Moolenaar #include <sys/systm.h> 3027d5dc18SMarcel Moolenaar #include <sys/bus.h> 3127d5dc18SMarcel Moolenaar #include <sys/conf.h> 3227d5dc18SMarcel Moolenaar #include <sys/kernel.h> 3327d5dc18SMarcel Moolenaar #include <sys/module.h> 3427d5dc18SMarcel Moolenaar #include <machine/bus.h> 3527d5dc18SMarcel Moolenaar #include <sys/rman.h> 3627d5dc18SMarcel Moolenaar #include <machine/resource.h> 3727d5dc18SMarcel Moolenaar 3827d5dc18SMarcel Moolenaar #include <isa/isavar.h> 3927d5dc18SMarcel Moolenaar 4027d5dc18SMarcel Moolenaar #include <dev/uart/uart.h> 4127d5dc18SMarcel Moolenaar #include <dev/uart/uart_bus.h> 4227d5dc18SMarcel Moolenaar 4327d5dc18SMarcel Moolenaar static int uart_acpi_probe(device_t dev); 4427d5dc18SMarcel Moolenaar 4527d5dc18SMarcel Moolenaar static device_method_t uart_acpi_methods[] = { 4627d5dc18SMarcel Moolenaar /* Device interface */ 4727d5dc18SMarcel Moolenaar DEVMETHOD(device_probe, uart_acpi_probe), 4827d5dc18SMarcel Moolenaar DEVMETHOD(device_attach, uart_bus_attach), 4927d5dc18SMarcel Moolenaar DEVMETHOD(device_detach, uart_bus_detach), 5027d5dc18SMarcel Moolenaar { 0, 0 } 5127d5dc18SMarcel Moolenaar }; 5227d5dc18SMarcel Moolenaar 5327d5dc18SMarcel Moolenaar static driver_t uart_acpi_driver = { 5427d5dc18SMarcel Moolenaar uart_driver_name, 5527d5dc18SMarcel Moolenaar uart_acpi_methods, 5627d5dc18SMarcel Moolenaar sizeof(struct uart_softc), 5727d5dc18SMarcel Moolenaar }; 5827d5dc18SMarcel Moolenaar 5927d5dc18SMarcel Moolenaar static struct isa_pnp_id acpi_ns8250_ids[] = { 6027d5dc18SMarcel Moolenaar {0x0005d041, "Standard PC COM port"}, /* PNP0500 */ 6127d5dc18SMarcel Moolenaar {0x0105d041, "16550A-compatible COM port"}, /* PNP0501 */ 6227d5dc18SMarcel Moolenaar {0} 6327d5dc18SMarcel Moolenaar }; 6427d5dc18SMarcel Moolenaar 6527d5dc18SMarcel Moolenaar static int 6627d5dc18SMarcel Moolenaar uart_acpi_probe(device_t dev) 6727d5dc18SMarcel Moolenaar { 6827d5dc18SMarcel Moolenaar struct uart_softc *sc; 6927d5dc18SMarcel Moolenaar device_t parent; 7027d5dc18SMarcel Moolenaar 7127d5dc18SMarcel Moolenaar parent = device_get_parent(dev); 7227d5dc18SMarcel Moolenaar sc = device_get_softc(dev); 7327d5dc18SMarcel Moolenaar 7427d5dc18SMarcel Moolenaar if (!ISA_PNP_PROBE(parent, dev, acpi_ns8250_ids)) { 7527d5dc18SMarcel Moolenaar sc->sc_class = &uart_ns8250_class; 76875f70dbSMarcel Moolenaar return (uart_bus_probe(dev, 0, 0, 0, 0)); 7727d5dc18SMarcel Moolenaar } 7827d5dc18SMarcel Moolenaar 7927d5dc18SMarcel Moolenaar /* Add checks for non-ns8250 IDs here. */ 8027d5dc18SMarcel Moolenaar return (ENXIO); 8127d5dc18SMarcel Moolenaar } 8227d5dc18SMarcel Moolenaar 8327d5dc18SMarcel Moolenaar DRIVER_MODULE(uart, acpi, uart_acpi_driver, uart_devclass, 0, 0); 84