pccbb_isa.c revision 140035
1208926Smjacob/*- 2208926Smjacob * Copyright (c) 2002-2004 M. Warner Losh. 3208926Smjacob * All rights reserved. 4208926Smjacob * 5208926Smjacob * Redistribution and use in source and binary forms, with or without 6208926Smjacob * modification, are permitted provided that the following conditions 7208926Smjacob * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27/* 28 * Driver for ISA to PCMCIA bridges compliant with the Intel ExCA 29 * specification. 30 */ 31 32#include <sys/cdefs.h> 33__FBSDID("$FreeBSD: head/sys/dev/pccbb/pccbb_isa.c 140035 2005-01-11 05:33:18Z imp $"); 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/proc.h> 38#include <sys/condvar.h> 39#include <sys/errno.h> 40#include <sys/kernel.h> 41#include <sys/lock.h> 42#include <sys/malloc.h> 43#include <sys/module.h> 44#include <sys/mutex.h> 45#include <sys/sysctl.h> 46#include <sys/kthread.h> 47#include <sys/bus.h> 48#include <machine/bus.h> 49#include <sys/rman.h> 50#include <machine/resource.h> 51 52#include <isa/isavar.h> 53 54#include <dev/pccard/pccardreg.h> 55#include <dev/pccard/pccardvar.h> 56 57#include <dev/exca/excareg.h> 58#include <dev/exca/excavar.h> 59 60#include <dev/pccbb/pccbbreg.h> 61#include <dev/pccbb/pccbbvar.h> 62 63#include "power_if.h" 64#include "card_if.h" 65 66/***************************************************************************** 67 * Configurable parameters. 68 *****************************************************************************/ 69 70/* sysctl vars */ 71SYSCTL_NODE(_hw, OID_AUTO, pcic, CTLFLAG_RD, 0, "PCIC parameters"); 72 73static int isa_intr_mask = EXCA_INT_MASK_ALLOWED; 74TUNABLE_INT("hw.cbb.intr_mask", &isa_intr_mask); 75SYSCTL_INT(_hw_pcic, OID_AUTO, intr_mask, CTLFLAG_RD, &isa_intr_mask, 0, 76 "Mask of allowable interrupts for this laptop. The default is generally\n\ 77correct, but some laptops do not route all the IRQ pins to the bridge to\n\ 78save wires. Sometimes you need a more restrictive mask because some of the\n\ 79hardware in your laptop may not have a driver so its IRQ might not be\n\ 80allocated."); 81 82/***************************************************************************** 83 * End of configurable parameters. 84 *****************************************************************************/ 85 86#define DPRINTF(x) do { if (cbb_debug) printf x; } while (0) 87#define DEVPRINTF(x) do { if (cbb_debug) device_printf x; } while (0) 88 89static struct isa_pnp_id pcic_ids[] = { 90 {EXCA_PNP_ACTIONTEC, NULL}, /* AEI0218 */ 91 {EXCA_PNP_IBM3765, NULL}, /* IBM3765 */ 92 {EXCA_PNP_82365, NULL}, /* PNP0E00 */ 93 {EXCA_PNP_CL_PD6720, NULL}, /* PNP0E01 */ 94 {EXCA_PNP_VLSI_82C146, NULL}, /* PNP0E02 */ 95 {EXCA_PNP_82365_CARDBUS, NULL}, /* PNP0E03 */ 96 {EXCA_PNP_SCM_SWAPBOX, NULL}, /* SCM0469 */ 97 {0} 98}; 99 100/************************************************************************/ 101/* Probe/Attach */ 102/************************************************************************/ 103 104#if 0 105 struct resource *res; 106 int rid; 107 int i; 108 109 /* A little bogus, but go ahead and get the irq for CSC events */ 110 rid = 0; 111 res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); 112 if (res == NULL) { 113 /* 114 * No IRQ specified, find one. This can be due to the PnP 115 * data not specifying any IRQ, or the default kernel not 116 * assinging an IRQ. 117 */ 118 for (i = 0; i < 16; i++) { 119 if (((1 << i) & isa_intr_mask) == 0) 120 continue; 121 res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, i, i, 122 1, RF_ACTIVE); 123 if (res != NULL) 124 break; 125 } 126 if (res == NULL) 127 return (ENXIO); 128 bus_release_resource(dev, SYS_RES_IRQ, rid, res); 129 bus_set_resource(dev, SYS_RES_IRQ, 0, i, 1); 130 } else { 131 bus_release_resource(dev, SYS_RES_IRQ, rid, res); 132 } 133 if (res == NULL) { 134 device_printf(dev, "Cannot allocate mem\n"); 135 return (ENOMEM); 136 } 137#endif 138 139static int 140cbb_isa_activate(device_t dev) 141{ 142 return (ENOMEM); 143} 144 145static void 146cbb_isa_deactivate(device_t dev) 147{ 148} 149 150static int 151cbb_isa_probe(device_t dev) 152{ 153 int error; 154 struct cbb_softc *sc = device_get_softc(dev); 155 156 /* Check isapnp ids */ 157 error = ISA_PNP_PROBE(device_get_parent(dev), dev, pcic_ids); 158 if (error != 0 && error != ENOENT) 159 return (error); 160 161 error = cbb_isa_activate(dev); 162 if (error != 0) 163 return (error); 164 165 /* Check to make sure that we have actual hardware */ 166 error = exca_probe_slots(dev, &sc->exca[0], sc->bst, sc->bsh); 167 cbb_isa_deactivate(dev); 168 return (error); 169} 170 171static int 172cbb_isa_attach(device_t dev) 173{ 174 return (ENOMEM); 175} 176 177static device_method_t cbb_methods[] = { 178 /* Device interface */ 179 DEVMETHOD(device_probe, cbb_isa_probe), 180 DEVMETHOD(device_attach, cbb_isa_attach), 181 DEVMETHOD(device_detach, cbb_detach), 182 DEVMETHOD(device_shutdown, cbb_shutdown), 183 DEVMETHOD(device_suspend, cbb_suspend), 184 DEVMETHOD(device_resume, cbb_resume), 185 186 /* bus methods */ 187 DEVMETHOD(bus_print_child, bus_generic_print_child), 188 DEVMETHOD(bus_read_ivar, cbb_read_ivar), 189 DEVMETHOD(bus_write_ivar, cbb_write_ivar), 190 DEVMETHOD(bus_alloc_resource, cbb_alloc_resource), 191 DEVMETHOD(bus_release_resource, cbb_release_resource), 192 DEVMETHOD(bus_activate_resource, cbb_activate_resource), 193 DEVMETHOD(bus_deactivate_resource, cbb_deactivate_resource), 194 DEVMETHOD(bus_driver_added, cbb_driver_added), 195 DEVMETHOD(bus_child_detached, cbb_child_detached), 196 DEVMETHOD(bus_setup_intr, cbb_setup_intr), 197 DEVMETHOD(bus_teardown_intr, cbb_teardown_intr), 198 DEVMETHOD(bus_child_present, cbb_child_present), 199 200 /* 16-bit card interface */ 201 DEVMETHOD(card_set_res_flags, cbb_pcic_set_res_flags), 202 DEVMETHOD(card_set_memory_offset, cbb_pcic_set_memory_offset), 203 204 /* power interface */ 205 DEVMETHOD(power_enable_socket, cbb_power_enable_socket), 206 DEVMETHOD(power_disable_socket, cbb_power_disable_socket), 207 208 {0,0} 209}; 210 211static driver_t cbb_isa_driver = { 212 "cbb", 213 cbb_methods, 214 sizeof(struct cbb_softc) 215}; 216 217DRIVER_MODULE(cbb, isa, cbb_isa_driver, cbb_devclass, 0, 0); 218MODULE_DEPEND(cbb, exca, 1, 1, 1); 219