1 /* $NetBSD: i82365_isapnp.c,v 1.29 2009/09/17 18:09:51 tsutsui Exp $ */
4 * Copyright (c) 1998 Bill Sommerfeld. All rights reserved.
5 * Copyright (c) 1997 Marc Horowitz. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Marc Horowitz.
18 * 4. The name of the author may not be used to endorse or promote products
19 * derived from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include <sys/cdefs.h>
34 __KERNEL_RCSID(0, "$NetBSD: i82365_isapnp.c,v 1.29 2009/09/17 18:09:51 tsutsui Exp $");
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/device.h>
39 #include <sys/extent.h>
40 #include <sys/malloc.h>
45 #include <dev/isa/isareg.h>
46 #include <dev/isa/isavar.h>
48 #include <dev/isapnp/isapnpreg.h>
49 #include <dev/isapnp/isapnpvar.h>
50 #include <dev/isapnp/isapnpdevs.h>
52 #include <dev/pcmcia/pcmciareg.h>
53 #include <dev/pcmcia/pcmciavar.h>
54 #include <dev/pcmcia/pcmciachip.h>
56 #include <dev/ic/i82365reg.h>
57 #include <dev/ic/i82365var.h>
58 #include <dev/isa/i82365_isavar.h>
62 int pcicisapnp_debug
= 0 /* XXX */ ;
63 #define DPRINTF(arg) if (pcicisapnp_debug) printf arg;
68 int pcic_isapnp_match(device_t
, cfdata_t
, void *);
69 void pcic_isapnp_attach(device_t
, device_t
, void *);
71 CFATTACH_DECL(pcic_isapnp
, sizeof(struct pcic_isa_softc
),
72 pcic_isapnp_match
, pcic_isapnp_attach
, NULL
, NULL
);
74 static const struct pcmcia_chip_functions pcic_isa_functions
= {
85 pcic_isa_chip_intr_establish
,
86 pcic_isa_chip_intr_disestablish
,
88 pcic_chip_socket_enable
,
89 pcic_chip_socket_disable
,
90 pcic_chip_socket_settype
,
95 pcic_isapnp_match(device_t parent
, cfdata_t match
, void *aux
)
99 pri
= isapnp_devmatch(aux
, &isapnp_pcic_devinfo
, &variant
);
100 if (pri
&& variant
> 0)
106 pcic_isapnp_attach(device_t parent
, device_t self
, void *aux
)
108 struct pcic_isa_softc
*isc
= device_private(self
);
109 struct pcic_softc
*sc
= &isc
->sc_pcic
;
110 struct isapnp_attach_args
*ipa
= aux
;
111 isa_chipset_tag_t ic
= ipa
->ipa_ic
;
112 bus_space_tag_t iot
= ipa
->ipa_iot
;
113 bus_space_tag_t memt
= ipa
->ipa_memt
;
114 bus_space_handle_t ioh
;
115 bus_space_handle_t memh
;
122 if (isapnp_config(iot
, memt
, ipa
)) {
123 aprint_error_dev(self
, "error in region allocation\n");
127 printf("%s: %s %s", device_xname(self
), ipa
->ipa_devident
,
130 /* sanity check that we get at least one hunk of IO space.. */
131 if (ipa
->ipa_nio
< 1) {
132 aprint_error_dev(self
,
133 "failed to get one chunk of i/o space\n");
137 /* Find i/o space. */
138 ioh
= ipa
->ipa_io
[0].h
;
140 /* sanity check to make sure we have a real PCIC there.. */
141 bus_space_write_1(iot
, ioh
, PCIC_REG_INDEX
, C0SA
+ PCIC_IDENT
);
142 tmp1
= bus_space_read_1(iot
, ioh
, PCIC_REG_DATA
);
143 printf("(ident 0x%x", tmp1
);
144 if (pcic_ident_ok(tmp1
)) {
147 printf(" Not OK)\n");
152 if (isa_mem_alloc(memt
, msize
, msize
, 0, 0, &maddr
, &memh
)) {
153 printf(": can't alloc mem space\n");
156 printf(": using iomem 0x%lx iosiz 0x%x", maddr
, msize
);
158 sc
->subregionmask
= (1 << (msize
/ PCIC_MEM_PAGESIZE
)) - 1;
161 sc
->pct
= &pcic_isa_functions
;
169 * allocate an irq. it will be used by both controllers. I could
170 * use two different interrupts, but interrupts are relatively
171 * scarce, shareable, and for PCIC controllers, very infrequent.
174 if (ipa
->ipa_nirq
> 0)
175 sc
->irq
= ipa
->ipa_irq
[0].num
;
182 pcic_isa_bus_width_probe(sc
, iot
, ioh
, ipa
->ipa_io
[0].base
,
183 ipa
->ipa_io
[0].length
);
184 pcic_attach_sockets(sc
);
185 config_interrupts(self
, pcic_isa_config_interrupts
);