diff options
-rw-r--r-- | sys/dev/pcic/i82365_isa.c | 83 | ||||
-rw-r--r-- | sys/dev/pcic/i82365reg.h | 11 |
2 files changed, 43 insertions, 51 deletions
diff --git a/sys/dev/pcic/i82365_isa.c b/sys/dev/pcic/i82365_isa.c index 4012a76..756cdff 100644 --- a/sys/dev/pcic/i82365_isa.c +++ b/sys/dev/pcic/i82365_isa.c @@ -43,15 +43,7 @@ #include <sys/rman.h> #include <machine/resource.h> -#ifdef __FreeBSD__ -#include <i386/isa/isa_device.h> -typedef int isa_chipset_tag_t; -#define ia_msize ia_memsize -#define delay(x) DELAY(x) -#else -#include <dev/isa/isareg.h> -#include <dev/isa/isavar.h> -#endif +#include <isa/isavar.h> #include <dev/pccard/pccardreg.h> #include <dev/pccard/pccardvar.h> @@ -68,6 +60,14 @@ int pcicisa_debug = 0 /* XXX */ ; #define DPRINTF(arg) #endif +static struct isa_pnp_id pcic_ids[] = { + {PCIC_PNP_82365, NULL}, /* PNP0E00 */ + {PCIC_PNP_CL_PD6720, NULL}, /* PNP0E01 */ + {PCIC_PNP_VLSI_82C146, NULL}, /* PNP0E02 */ + {PCIC_PNP_82365_CARDBUS, NULL}, /* PNP0E03 */ + {0} +}; + int pcic_isa_probe(device_t dev); int pcic_isa_attach(device_t dev); @@ -92,81 +92,62 @@ static struct pccard_chip_functions pcic_isa_functions = { int pcic_isa_probe(device_t dev) { -#if XXX - struct isa_attach_args *ia = aux; - bus_space_tag_t iot = ia->ia_iot; - bus_space_handle_t ioh, memh; + bus_space_tag_t iot; + bus_space_handle_t ioh; int val, found; + int rid; + struct resource *res; + u_long port, portlen; - /* Disallow wildcarded i/o address. */ -#ifdef __FreeBSD__ - if (ia->ia_iobase == ISACF_IOBASE_DEFAULT) -#else - if (ia->ia_iobase == ISACF_PORT_DEFAULT) -#endif - return (0); - - if (bus_space_map(iot, ia->ia_iobase, PCIC_IOSIZE, 0, &ioh)) - return (0); - - if (ia->ia_msize == -1) - ia->ia_msize = PCIC_MEMSIZE; -#ifdef __FreeBSD__ - if (bus_space_map(ia->ia_memt, kvtop(ia->ia_membase), ia->ia_msize, 0, &memh)) -#else - if (bus_space_map(ia->ia_memt, ia->ia_maddr, ia->ia_msize, 0, &memh)) -#endif - return (0); + /* Check isapnp ids */ + if (ISA_PNP_PROBE(device_get_parent(dev), dev, pcic_ids) == ENXIO) + return (ENXIO); + if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &port, &portlen)) { + bus_set_resource(dev, SYS_RES_IOPORT, 0, PCIC_INDEX0, + PCIC_IOSIZE); + } + rid = 0; + res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, PCIC_IOSIZE, + RF_ACTIVE); + if (!res) + return(ENXIO); + iot = rman_get_bustag(res); + ioh = rman_get_bushandle(res); found = 0; /* * this could be done with a loop, but it would violate the * abstraction */ - bus_space_write_1(iot, ioh, PCIC_REG_INDEX, C0SA + PCIC_IDENT); - val = bus_space_read_1(iot, ioh, PCIC_REG_DATA); - if (pcic_ident_ok(val)) found++; - bus_space_write_1(iot, ioh, PCIC_REG_INDEX, C0SB + PCIC_IDENT); - val = bus_space_read_1(iot, ioh, PCIC_REG_DATA); - if (pcic_ident_ok(val)) found++; - bus_space_write_1(iot, ioh, PCIC_REG_INDEX, C1SA + PCIC_IDENT); - val = bus_space_read_1(iot, ioh, PCIC_REG_DATA); - if (pcic_ident_ok(val)) found++; - bus_space_write_1(iot, ioh, PCIC_REG_INDEX, C1SB + PCIC_IDENT); - val = bus_space_read_1(iot, ioh, PCIC_REG_DATA); - if (pcic_ident_ok(val)) found++; + bus_release_resource(dev, SYS_RES_IOPORT, rid, res); - bus_space_unmap(iot, ioh, PCIC_IOSIZE); - - bus_space_unmap(ia->ia_memt, memh, ia->ia_msize); + /* XXX DO I NEED TO WORRY ABOUT IRQ? XXX */ if (!found) - return (0); + return (ENXIO); - ia->ia_iosize = PCIC_IOSIZE; -#endif - return (1); + return (0); } int diff --git a/sys/dev/pcic/i82365reg.h b/sys/dev/pcic/i82365reg.h index b6fc39f..d6f0815 100644 --- a/sys/dev/pcic/i82365reg.h +++ b/sys/dev/pcic/i82365reg.h @@ -42,6 +42,11 @@ #define PCIC_REG_DATA 1 /* + * I/o ports + */ +#define PCIC_INDEX0 0x3e0 + +/* * The PCIC allows two chips to share the same address. In order not to run * afoul of the netbsd device model, this driver will treat those chips as * the same device. @@ -336,3 +341,9 @@ #define PCIC_CIRRUS_EXTENDED_DATA 0x2F #define PCIC_CIRRUS_EXT_CONTROL_1 0x03 #define PCIC_CIRRUS_EXT_CONTROL_1_PCI_INTR_MASK 0x18 + +/* Plug and play */ +#define PCIC_PNP_82365 0x000ED040 /* PNP0E00 */ +#define PCIC_PNP_CL_PD6720 0x010ED040 /* PNP0E01 */ +#define PCIC_PNP_VLSI_82C146 0x020ED040 /* PNP0E02 */ +#define PCIC_PNP_82365_CARDBUS 0x030ED040 /* PNP0E03 */ |