uart_bus_pccard.c revision 120083
1216995Slstewart/* 2216995Slstewart * Copyright (c) 2001 M. Warner Losh. All rights reserved. 3216995Slstewart * Copyright (c) 2003 Norikatsu Shigemura, Takenori Watanabe All rights reserved. 4216995Slstewart * 5216995Slstewart * Redistribution and use in source and binary forms, with or without 6216995Slstewart * modification, are permitted provided that the following conditions 7216995Slstewart * are met: 8216995Slstewart * 1. Redistributions of source code must retain the above copyright 9216995Slstewart * notice, this list of conditions and the following disclaimer. 10216995Slstewart * 2. Redistributions in binary form must reproduce the above copyright 11216995Slstewart * notice, this list of conditions and the following disclaimer in the 12216995Slstewart * documentation and/or other materials provided with the distribution. 13216995Slstewart * 14216995Slstewart * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15216995Slstewart * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16216995Slstewart * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17216995Slstewart * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18216995Slstewart * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19216995Slstewart * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20216995Slstewart * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21216995Slstewart * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22216995Slstewart * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23216995Slstewart * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24216995Slstewart */ 25216995Slstewart 26216995Slstewart#include <sys/cdefs.h> 27216995Slstewart__FBSDID("$FreeBSD: head/sys/dev/uart/uart_bus_pccard.c 120083 2003-09-15 04:49:22Z marcel $"); 28298661Scem 29216995Slstewart#include <sys/param.h> 30216995Slstewart#include <sys/systm.h> 31216995Slstewart#include <sys/bus.h> 32216995Slstewart#include <sys/conf.h> 33216995Slstewart#include <sys/kernel.h> 34216995Slstewart#include <sys/lock.h> 35216995Slstewart#include <sys/malloc.h> 36297422Sjamie#include <sys/mutex.h> 37297422Sjamie#include <sys/module.h> 38297422Sjamie#include <sys/tty.h> 39216995Slstewart#include <machine/bus_pio.h> 40217043Slstewart#include <machine/bus.h> 41216995Slstewart#include <machine/resource.h> 42216995Slstewart 43216995Slstewart#include <dev/pccard/pccardreg.h> 44216995Slstewart#include <dev/pccard/pccardvar.h> 45216995Slstewart#include <dev/pccard/pccarddevs.h> 46216995Slstewart 47216995Slstewart#include <dev/uart/uart.h> 48216995Slstewart#include <dev/uart/uart_bus.h> 49216995Slstewart 50216995Slstewartstatic int uart_pccard_match(device_t self); 51216995Slstewartstatic int uart_pccard_probe(device_t dev); 52216995Slstewart 53216995Slstewartstatic device_method_t uart_pccard_methods[] = { 54216995Slstewart /* Device interface */ 55216995Slstewart DEVMETHOD(device_probe, pccard_compat_probe), 56216995Slstewart DEVMETHOD(device_attach, pccard_compat_attach), 57216995Slstewart DEVMETHOD(device_detach, uart_bus_detach), 58216995Slstewart 59216995Slstewart /* Card interface */ 60216995Slstewart DEVMETHOD(card_compat_match, uart_pccard_match), 61216995Slstewart DEVMETHOD(card_compat_probe, uart_pccard_probe), 62216995Slstewart DEVMETHOD(card_compat_attach, uart_bus_attach), 63216995Slstewart 64216995Slstewart { 0, 0 } 65216995Slstewart}; 66216995Slstewart 67216995Slstewartstatic driver_t uart_pccard_driver = { 68298661Scem uart_driver_name, 69297422Sjamie uart_pccard_methods, 70297422Sjamie sizeof(struct uart_softc), 71297422Sjamie}; 72297422Sjamie 73297422Sjamiestatic int 74297422Sjamieuart_pccard_match(device_t dev) 75297422Sjamie{ 76297422Sjamie int error = 0; 77298661Scem u_int32_t fcn = PCCARD_FUNCTION_UNSPEC; 78297422Sjamie 79297422Sjamie error = pccard_get_function(dev, &fcn); 80297422Sjamie if (error != 0) 81297422Sjamie return (error); 82298661Scem /* 83297422Sjamie * If a serial card, we are likely the right driver. However, 84297422Sjamie * some serial cards are better servered by other drivers, so 85216995Slstewart * allow other drivers to claim it, if they want. 86216995Slstewart */ 87216995Slstewart if (fcn == PCCARD_FUNCTION_SERIAL) 88216995Slstewart return (-100); 89216995Slstewart 90216995Slstewart return(ENXIO); 91216995Slstewart} 92216995Slstewart 93216995Slstewartstatic int 94216995Slstewartuart_pccard_probe(dev) 95216995Slstewart device_t dev; 96216995Slstewart{ 97216995Slstewart struct uart_softc *sc; 98216995Slstewart sc = device_get_softc(dev); 99216995Slstewart sc->sc_class = &uart_ns8250_class; 100216995Slstewart 101216995Slstewart /* Do not probe IRQ - pccard doesn't turn on the interrupt line */ 102216995Slstewart /* until bus_setup_intr but how can I do so?*/ 103216995Slstewart return (uart_bus_probe(dev, 0, 0, 0)); 104216995Slstewart} 105216995Slstewart 106216995SlstewartDRIVER_MODULE(uart, pccard, uart_pccard_driver, uart_devclass, 0, 0); 107216995Slstewart