1 /* $NetBSD: it8368.c,v 1.21 2005/12/24 23:24:00 perry Exp $ */
4 * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: it8368.c,v 1.21 2005/12/24 23:24:00 perry Exp $");
35 #undef WINCE_DEFAULT_SETTING /* for debug */
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/device.h>
42 #include <machine/bus.h>
44 #include <dev/pcmcia/pcmciareg.h>
45 #include <dev/pcmcia/pcmciavar.h>
46 #include <dev/pcmcia/pcmciachip.h>
48 #include <hpcmips/tx/tx39var.h>
49 #include <hpcmips/tx/txcsbusvar.h>
50 #include <hpcmips/tx/tx39biureg.h> /* legacy mode requires BIU access */
51 #include <hpcmips/dev/it8368var.h>
52 #include <hpcmips/dev/it8368reg.h>
56 #define DPRINTF(arg) if (it8368debug) printf arg;
57 #define DPRINTFN(n, arg) if (it8368debug > (n)) printf arg;
60 #define DPRINTFN(n, arg)
63 int it8368e_match(struct device
*, struct cfdata
*, void *);
64 void it8368e_attach(struct device
*, struct device
*, void *);
65 int it8368_print(void *, const char *);
67 #define IT8368_LASTSTATE_PRESENT 0x0002
68 #define IT8368_LASTSTATE_HALF 0x0001
69 #define IT8368_LASTSTATE_EMPTY 0x0000
71 struct it8368e_softc
{
73 struct device
*sc_pcmcia
;
74 tx_chipset_tag_t sc_tc
;
77 bus_space_tag_t sc_csregt
;
78 bus_space_handle_t sc_csregh
;
79 /* I/O, attribute space */
80 bus_space_tag_t sc_csiot
;
81 bus_addr_t sc_csiobase
;
82 bus_size_t sc_csiosize
;
84 * XXX theses means attribute memory. not memory space.
85 * memory space is 0x64000000.
87 bus_space_tag_t sc_csmemt
;
88 bus_addr_t sc_csmembase
;
89 bus_size_t sc_csmemsize
;
91 /* Separate I/O and attribute space mode */
94 /* Card interrupt handler */
95 int (*sc_card_fun
)(void *);
100 /* Card status change */
106 void it8368_init_socket(struct it8368e_softc
*);
107 void it8368_attach_socket(struct it8368e_softc
*);
108 int it8368_intr(void *);
109 int it8368_chip_mem_alloc(pcmcia_chipset_handle_t
, bus_size_t
,
110 struct pcmcia_mem_handle
*);
111 void it8368_chip_mem_free(pcmcia_chipset_handle_t
, struct pcmcia_mem_handle
*);
112 int it8368_chip_mem_map(pcmcia_chipset_handle_t
, int, bus_size_t
, bus_size_t
,
113 struct pcmcia_mem_handle
*, bus_addr_t
*, int *);
114 void it8368_chip_mem_unmap(pcmcia_chipset_handle_t
, int);
115 int it8368_chip_io_alloc(pcmcia_chipset_handle_t
, bus_addr_t
, bus_size_t
,
116 bus_size_t
, struct pcmcia_io_handle
*);
117 void it8368_chip_io_free(pcmcia_chipset_handle_t
, struct pcmcia_io_handle
*);
118 int it8368_chip_io_map(pcmcia_chipset_handle_t
, int, bus_addr_t
, bus_size_t
,
119 struct pcmcia_io_handle
*, int *);
120 void it8368_chip_io_unmap(pcmcia_chipset_handle_t
, int);
121 void it8368_chip_socket_enable(pcmcia_chipset_handle_t
);
122 void it8368_chip_socket_disable(pcmcia_chipset_handle_t
);
123 void *it8368_chip_intr_establish(pcmcia_chipset_handle_t
,
124 struct pcmcia_function
*, int, int (*) (void *), void *);
125 void it8368_chip_intr_disestablish(pcmcia_chipset_handle_t
, void *);
128 void it8368_dump(struct it8368e_softc
*);
131 static struct pcmcia_chip_functions it8368_functions
= {
132 it8368_chip_mem_alloc
,
133 it8368_chip_mem_free
,
135 it8368_chip_mem_unmap
,
136 it8368_chip_io_alloc
,
139 it8368_chip_io_unmap
,
140 it8368_chip_intr_establish
,
141 it8368_chip_intr_disestablish
,
142 it8368_chip_socket_enable
,
143 it8368_chip_socket_disable
146 CFATTACH_DECL(it8368e
, sizeof(struct it8368e_softc
),
147 it8368e_match
, it8368e_attach
, NULL
, NULL
);
150 * IT8368 configuration register is big-endian.
152 static inline u_int16_t
it8368_reg_read(bus_space_tag_t
,
153 bus_space_handle_t
, int);
154 static inline void it8368_reg_write(bus_space_tag_t
, bus_space_handle_t
,
157 #ifdef IT8368E_DESTRUCTIVE_CHECK
158 int it8368e_id_check(void *);
161 * IT8368E don't have identification method. this is destructive check.
164 it8368e_id_check(void *aux
)
166 struct cs_attach_args
*ca
= aux
;
168 bus_space_tag_t csregt
;
169 bus_space_handle_t csregh
;
174 csregt
= ca
->ca_csreg
.cstag
;
176 bus_space_map(csregt
, ca
->ca_csreg
.csbase
, ca
->ca_csreg
.cssize
,
178 reg
= it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
);
182 reg
&= ~IT8368_CTRL_BYTESWAP
;
183 it8368_reg_write(csregt
, csregh
, IT8368_CTRL_REG
, reg
);
184 reg
= it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
);
185 if (reg
& IT8368_CTRL_BYTESWAP
)
188 reg
|= IT8368_CTRL_BYTESWAP
;
189 it8368_reg_write(csregt
, csregh
, IT8368_CTRL_REG
, reg
);
190 reg
= it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
);
191 if (!(reg
& IT8368_CTRL_BYTESWAP
))
196 it8368_reg_write(csregt
, csregh
, IT8368_CTRL_REG
, oreg
);
197 bus_space_unmap(csregt
, csregh
, ca
->ca_csreg
.cssize
);
201 #endif /* IT8368E_DESTRUCTIVE_CHECK */
204 it8368e_match(struct device
*parent
, struct cfdata
*cf
, void *aux
)
206 #ifdef IT8368E_DESTRUCTIVE_CHECK
207 return (it8368e_id_check(aux
));
214 it8368e_attach(struct device
*parent
, struct device
*self
, void *aux
)
216 struct cs_attach_args
*ca
= aux
;
217 struct it8368e_softc
*sc
= (void*)self
;
219 bus_space_tag_t csregt
;
220 bus_space_handle_t csregh
;
223 sc
->sc_tc
= tc
= ca
->ca_tc
;
224 sc
->sc_csregt
= csregt
= ca
->ca_csreg
.cstag
;
226 bus_space_map(csregt
, ca
->ca_csreg
.csbase
, ca
->ca_csreg
.cssize
,
228 csregh
= sc
->sc_csregh
;
229 sc
->sc_csiot
= ca
->ca_csio
.cstag
;
230 sc
->sc_csiobase
= ca
->ca_csio
.csbase
;
231 sc
->sc_csiosize
= ca
->ca_csio
.cssize
;
234 printf("\n\t[Windows CE setting]\n");
235 it8368_dump(sc
); /* print WindowsCE setting */
237 /* LHA[14:13] <= HA[14:13] */
238 reg
= it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
);
239 reg
&= ~IT8368_CTRL_ADDRSEL
;
240 it8368_reg_write(csregt
, csregh
, IT8368_CTRL_REG
, reg
);
242 /* Set all MFIO direction as LHA[23:13] output pins */
243 reg
= it8368_reg_read(csregt
, csregh
, IT8368_MFIODIR_REG
);
244 reg
|= IT8368_MFIODIR_MASK
;
245 it8368_reg_write(csregt
, csregh
, IT8368_MFIODIR_REG
, reg
);
247 /* Set all MFIO functions as LHA */
248 reg
= it8368_reg_read(csregt
, csregh
, IT8368_MFIOSEL_REG
);
249 reg
&= ~IT8368_MFIOSEL_MASK
;
250 it8368_reg_write(csregt
, csregh
, IT8368_MFIOSEL_REG
, reg
);
252 /* Disable MFIO interrupt */
253 reg
= it8368_reg_read(csregt
, csregh
, IT8368_MFIOPOSINTEN_REG
);
254 reg
&= ~IT8368_MFIOPOSINTEN_MASK
;
255 it8368_reg_write(csregt
, csregh
, IT8368_MFIOPOSINTEN_REG
, reg
);
256 reg
= it8368_reg_read(csregt
, csregh
, IT8368_MFIONEGINTEN_REG
);
257 reg
&= ~IT8368_MFIONEGINTEN_MASK
;
258 it8368_reg_write(csregt
, csregh
, IT8368_MFIONEGINTEN_REG
, reg
);
261 reg
= IT8368_PIN_CRDVCCON1
| IT8368_PIN_CRDVCCON0
|
262 IT8368_PIN_CRDVPPON1
| IT8368_PIN_CRDVPPON0
|
264 it8368_reg_write(csregt
, csregh
, IT8368_GPIODIR_REG
, reg
);
268 * Separate I/O and attribute memory region
270 reg
= it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
);
272 reg
|= IT8368_CTRL_FIXATTRIO
;
273 it8368_reg_write(csregt
, csregh
, IT8368_CTRL_REG
, reg
);
275 if (IT8368_CTRL_FIXATTRIO
&
276 it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
)) {
278 printf("%s: fix attr mode\n", sc
->sc_dev
.dv_xname
);
281 printf("%s: legacy attr mode\n", sc
->sc_dev
.dv_xname
);
284 sc
->sc_csmemt
= sc
->sc_csiot
;
285 sc
->sc_csiosize
/= 2;
286 sc
->sc_csmemsize
= sc
->sc_csiosize
;
287 sc
->sc_csmembase
= sc
->sc_csiosize
;
292 /* Enable card and interrupt driving. */
293 reg
= it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
);
294 reg
|= (IT8368_CTRL_GLOBALEN
| IT8368_CTRL_CARDEN
);
296 reg
|= IT8368_CTRL_FIXATTRIO
;
297 it8368_reg_write(csregt
, csregh
, IT8368_CTRL_REG
, reg
);
299 sc
->sc_irq
= ca
->ca_irq1
;
300 sc
->sc_card_irq
= ca
->ca_irq3
;
302 it8368_attach_socket(sc
);
306 it8368_reg_read(bus_space_tag_t t
, bus_space_handle_t h
, int ofs
)
310 val
= bus_space_read_2(t
, h
, ofs
);
311 return (0xffff & (((val
>> 8) & 0xff)|((val
<< 8) & 0xff00)));
315 it8368_reg_write(bus_space_tag_t t
, bus_space_handle_t h
, int ofs
, u_int16_t v
)
319 val
= 0xffff & (((v
>> 8) & 0xff)|((v
<< 8) & 0xff00));
320 bus_space_write_2(t
, h
, ofs
, val
);
324 it8368_intr(void *arg
)
326 struct it8368e_softc
*sc
= arg
;
327 bus_space_tag_t csregt
= sc
->sc_csregt
;
328 bus_space_handle_t csregh
= sc
->sc_csregh
;
331 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIONEGINTSTAT_REG
);
333 if (reg
& IT8368_PIN_BCRDRDY
) {
334 if (sc
->sc_card_fun
) {
335 /* clear interrupt */
336 it8368_reg_write(csregt
, csregh
,
337 IT8368_GPIONEGINTSTAT_REG
,
340 /* Dispatch card interrupt handler */
341 (*sc
->sc_card_fun
)(sc
->sc_card_arg
);
343 } else if (reg
& IT8368_PIN_CRDDET2
) {
344 it8368_reg_write(csregt
, csregh
, IT8368_GPIONEGINTSTAT_REG
,
350 it8368_chip_socket_disable(sc
);
354 reg2
= reg
& ~(IT8368_PIN_BCRDRDY
|IT8368_PIN_CRDDET2
);
355 printf("unknown it8368 interrupt: ");
357 it8368_reg_write(csregt
, csregh
, IT8368_GPIONEGINTSTAT_REG
,
366 it8368_print(void *arg
, const char *pnp
)
369 aprint_normal("pcmcia at %s", pnp
);
375 it8368_attach_socket(struct it8368e_softc
*sc
)
377 struct pcmciabus_attach_args paa
;
379 paa
.paa_busname
= "pcmcia";
380 paa
.pct
= (pcmcia_chipset_tag_t
)&it8368_functions
;
381 paa
.pch
= (pcmcia_chipset_handle_t
)sc
;
383 paa
.iosize
= sc
->sc_csiosize
;
385 if ((sc
->sc_pcmcia
= config_found_ia((void*)sc
, "pcmciabus", &paa
,
387 it8368_init_socket(sc
);
392 it8368_init_socket(struct it8368e_softc
*sc
)
394 bus_space_tag_t csregt
= sc
->sc_csregt
;
395 bus_space_handle_t csregh
= sc
->sc_csregh
;
399 * set up the card to interrupt on card detect
401 reg
= IT8368_PIN_CRDDET2
; /* CSC */
402 /* enable negative edge */
403 it8368_reg_write(csregt
, csregh
, IT8368_GPIONEGINTEN_REG
, reg
);
404 /* disable positive edge */
405 it8368_reg_write(csregt
, csregh
, IT8368_GPIOPOSINTEN_REG
, 0);
407 sc
->sc_ih
= tx_intr_establish(sc
->sc_tc
, sc
->sc_irq
,
408 IST_EDGE
, IPL_BIO
, it8368_intr
, sc
);
409 if (sc
->sc_ih
== NULL
) {
410 printf("%s: can't establish interrupt\n",
411 sc
->sc_dev
.dv_xname
);
416 * if there's a card there, then attach it.
418 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIODATAIN_REG
);
420 if (reg
& (IT8368_PIN_CRDDET2
|IT8368_PIN_CRDDET1
)) {
421 sc
->sc_laststate
= IT8368_LASTSTATE_EMPTY
;
423 pcmcia_card_attach(sc
->sc_pcmcia
);
424 sc
->sc_laststate
= IT8368_LASTSTATE_PRESENT
;
429 it8368_chip_intr_establish(pcmcia_chipset_handle_t pch
,
430 struct pcmcia_function
*pf
, int ipl
, int (*ih_fun
)(void *), void *ih_arg
)
432 struct it8368e_softc
*sc
= (struct it8368e_softc
*) pch
;
433 bus_space_tag_t csregt
= sc
->sc_csregt
;
434 bus_space_handle_t csregh
= sc
->sc_csregh
;
438 panic("it8368_chip_intr_establish: "
439 "duplicate card interrupt handler.");
441 sc
->sc_card_fun
= ih_fun
;
442 sc
->sc_card_arg
= ih_arg
;
444 sc
->sc_card_ih
= tx_intr_establish(sc
->sc_tc
, sc
->sc_card_irq
,
445 IST_EDGE
, IPL_BIO
, it8368_intr
,
448 /* enable card interrupt */
449 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIONEGINTEN_REG
);
450 reg
|= IT8368_PIN_BCRDRDY
;
451 it8368_reg_write(csregt
, csregh
, IT8368_GPIONEGINTEN_REG
, reg
);
453 return (sc
->sc_card_ih
);
457 it8368_chip_intr_disestablish(pcmcia_chipset_handle_t pch
, void *ih
)
459 struct it8368e_softc
*sc
= (struct it8368e_softc
*) pch
;
460 bus_space_tag_t csregt
= sc
->sc_csregt
;
461 bus_space_handle_t csregh
= sc
->sc_csregh
;
464 if (!sc
->sc_card_fun
)
465 panic("it8368_chip_intr_disestablish:"
466 "no handler established.");
467 assert(ih
== sc
->sc_card_ih
);
472 /* disable card interrupt */
473 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIONEGINTEN_REG
);
474 reg
&= ~IT8368_PIN_BCRDRDY
;
475 it8368_reg_write(csregt
, csregh
, IT8368_GPIONEGINTEN_REG
, reg
);
477 tx_intr_disestablish(sc
->sc_tc
, ih
);
481 it8368_chip_mem_alloc(pcmcia_chipset_handle_t pch
, bus_size_t size
,
482 struct pcmcia_mem_handle
*pcmhp
)
484 struct it8368e_softc
*sc
= (struct it8368e_softc
*) pch
;
486 if (bus_space_alloc(sc
->sc_csmemt
, sc
->sc_csmembase
,
487 sc
->sc_csmembase
+ sc
->sc_csmemsize
, size
,
488 size
, 0, 0, 0, &pcmhp
->memh
)) {
489 DPRINTF(("it8368_chip_mem_alloc: failed\n"));
493 if (!sc
->sc_fixattr
) /* XXX IT8368 brain damaged spec */
494 pcmhp
->memh
-= sc
->sc_csmembase
;
496 pcmhp
->memt
= sc
->sc_csmemt
;
497 pcmhp
->addr
= pcmhp
->memh
;
499 pcmhp
->realsize
= size
;
501 DPRINTF(("it8368_chip_mem_alloc: %#x+%#x\n",
502 (unsigned)pcmhp
->memh
, (unsigned)size
));
508 it8368_chip_mem_free(pcmcia_chipset_handle_t pch
,
509 struct pcmcia_mem_handle
*pcmhp
)
511 struct it8368e_softc
*sc
= (struct it8368e_softc
*) pch
;
513 DPRINTF(("it8368_chip_mem_free: %#x+%#x\n",
514 (unsigned)pcmhp
->memh
, (unsigned)pcmhp
->size
));
516 if (!sc
->sc_fixattr
) /* XXX IT8368 brain damaged spec */
517 pcmhp
->memh
+= sc
->sc_csmembase
;
519 bus_space_unmap(pcmhp
->memt
, pcmhp
->memh
, pcmhp
->size
);
523 it8368_chip_mem_map(pcmcia_chipset_handle_t pch
, int kind
,
524 bus_addr_t card_addr
, bus_size_t size
, struct pcmcia_mem_handle
*pcmhp
,
525 bus_size_t
*offsetp
, int *windowp
)
528 it8368_mode(pch
, IT8368_ATTR_MODE
, IT8368_WIDTH_16
);
530 *offsetp
= card_addr
;
531 DPRINTF(("it8368_chip_mem_map %#x+%#x\n",
532 (unsigned)pcmhp
->memh
, (unsigned)size
));
538 it8368_chip_mem_unmap(pcmcia_chipset_handle_t pch
, int window
)
540 /* return to I/O mode */
541 it8368_mode(pch
, IT8368_IO_MODE
, IT8368_WIDTH_16
);
545 it8368_mode(pcmcia_chipset_handle_t pch
, int io
, int width
)
547 struct it8368e_softc
*sc
= (struct it8368e_softc
*) pch
;
550 DPRINTF(("it8368_mode: change access space to "));
551 DPRINTF((io
? "I/O (%dbit)\n" : "attribute (%dbit)...\n",
552 width
== IT8368_WIDTH_8
? 8 : 16));
554 reg32
= tx_conf_read(sc
->sc_tc
, TX39_MEMCONFIG3_REG
);
557 if (width
== IT8368_WIDTH_8
)
558 reg32
|= TX39_MEMCONFIG3_PORT8SEL
;
560 reg32
&= ~TX39_MEMCONFIG3_PORT8SEL
;
563 if (!sc
->sc_fixattr
) {
565 reg32
|= TX39_MEMCONFIG3_CARD1IOEN
;
567 reg32
&= ~TX39_MEMCONFIG3_CARD1IOEN
;
569 tx_conf_write(sc
->sc_tc
, TX39_MEMCONFIG3_REG
, reg32
);
573 return; /* No need to report BIU status */
575 /* check BIU status */
576 reg32
= tx_conf_read(sc
->sc_tc
, TX39_MEMCONFIG3_REG
);
577 if (reg32
& TX39_MEMCONFIG3_CARD1IOEN
) {
578 DPRINTF(("it8368_mode: I/O space (%dbit) enabled\n",
579 reg32
& TX39_MEMCONFIG3_PORT8SEL
? 8 : 16));
581 DPRINTF(("it8368_mode: atttribute space enabled\n"));
583 #endif /* IT8368DEBUG */
587 it8368_chip_io_alloc(pcmcia_chipset_handle_t pch
, bus_addr_t start
,
588 bus_size_t size
, bus_size_t align
, struct pcmcia_io_handle
*pcihp
)
590 struct it8368e_softc
*sc
= (struct it8368e_softc
*) pch
;
593 if (bus_space_map(sc
->sc_csiot
, start
, size
, 0,
597 DPRINTF(("it8368_chip_io_alloc map port %#x+%#x\n",
598 (unsigned)start
, (unsigned)size
));
600 if (bus_space_alloc(sc
->sc_csiot
, sc
->sc_csiobase
,
601 sc
->sc_csiobase
+ sc
->sc_csiosize
,
602 size
, align
, 0, 0, &pcihp
->addr
,
607 pcihp
->flags
= PCMCIA_IO_ALLOCATED
;
608 DPRINTF(("it8368_chip_io_alloc alloc %#x from %#x\n",
609 (unsigned)size
, (unsigned)pcihp
->addr
));
612 pcihp
->iot
= sc
->sc_csiot
;
619 it8368_chip_io_map(pcmcia_chipset_handle_t pch
, int width
, bus_addr_t offset
,
620 bus_size_t size
, struct pcmcia_io_handle
*pcihp
, int *windowp
)
623 it8368_mode(pch
, IT8368_IO_MODE
, IT8368_WIDTH_16
);
625 DPRINTF(("it8368_chip_io_map %#x:%#x+%#x\n",
626 (unsigned)pcihp
->ioh
, (unsigned)offset
, (unsigned)size
));
632 it8368_chip_io_free(pcmcia_chipset_handle_t pch
,
633 struct pcmcia_io_handle
*pcihp
)
635 if (pcihp
->flags
& PCMCIA_IO_ALLOCATED
)
636 bus_space_free(pcihp
->iot
, pcihp
->ioh
, pcihp
->size
);
638 bus_space_unmap(pcihp
->iot
, pcihp
->ioh
, pcihp
->size
);
640 DPRINTF(("it8368_chip_io_free %#x+%#x\n",
641 (unsigned)pcihp
->ioh
, (unsigned)pcihp
->size
));
645 it8368_chip_io_unmap(pcmcia_chipset_handle_t pch
, int window
)
651 it8368_chip_socket_enable(pcmcia_chipset_handle_t pch
)
653 #ifndef WINCE_DEFAULT_SETTING
654 struct it8368e_softc
*sc
= (struct it8368e_softc
*)pch
;
655 bus_space_tag_t csregt
= sc
->sc_csregt
;
656 bus_space_handle_t csregh
= sc
->sc_csregh
;
657 volatile u_int16_t reg
;
660 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIODATAOUT_REG
);
661 reg
&= ~(IT8368_PIN_CRDVCCMASK
| IT8368_PIN_CRDVPPMASK
);
662 reg
|= (IT8368_PIN_CRDVCC_0V
| IT8368_PIN_CRDVPP_0V
);
663 it8368_reg_write(csregt
, csregh
, IT8368_GPIODATAOUT_REG
, reg
);
667 * wait 300ms until power fails (Tpf). Then, wait 100ms since
668 * we are changing Vcc (Toff).
670 delay((300 + 100) * 1000);
673 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIODATAOUT_REG
);
674 reg
&= ~(IT8368_PIN_CRDVCCMASK
| IT8368_PIN_CRDVPPMASK
);
675 reg
|= IT8368_PIN_CRDVCC_5V
; /* XXX */
676 it8368_reg_write(csregt
, csregh
, IT8368_GPIODATAOUT_REG
, reg
);
679 * wait 100ms until power raise (Tpr) and 20ms to become
682 * some machines require some more time to be settled
683 * (300ms is added here).
685 delay((100 + 20 + 300) * 1000);
687 /* Assert reset signal */
688 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIODATAOUT_REG
);
689 reg
|= IT8368_PIN_BCRDRST
;
690 it8368_reg_write(csregt
, csregh
, IT8368_GPIODATAOUT_REG
, reg
);
693 * hold RESET at least 10us.
697 /* deassert reset signal */
698 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIODATAOUT_REG
);
699 reg
&= ~IT8368_PIN_BCRDRST
;
700 it8368_reg_write(csregt
, csregh
, IT8368_GPIODATAOUT_REG
, reg
);
703 DPRINTF(("it8368_chip_socket_enable: socket enabled\n"));
704 #endif /* !WINCE_DEFAULT_SETTING */
708 it8368_chip_socket_disable(pcmcia_chipset_handle_t pch
)
710 #ifndef WINCE_DEFAULT_SETTING
711 struct it8368e_softc
*sc
= (struct it8368e_softc
*) pch
;
712 bus_space_tag_t csregt
= sc
->sc_csregt
;
713 bus_space_handle_t csregh
= sc
->sc_csregh
;
717 reg
= it8368_reg_read(csregt
, csregh
, IT8368_GPIODATAOUT_REG
);
718 reg
&= ~(IT8368_PIN_CRDVCCMASK
| IT8368_PIN_CRDVPPMASK
);
719 reg
|= (IT8368_PIN_CRDVCC_0V
| IT8368_PIN_CRDVPP_0V
);
720 it8368_reg_write(csregt
, csregh
, IT8368_GPIODATAOUT_REG
, reg
);
724 * wait 300ms until power fails (Tpf).
728 DPRINTF(("it8368_chip_socket_disable: socket disabled\n"));
729 #endif /* !WINCE_DEFAULT_SETTING */
733 #define PRINTGPIO(m) __dbg_bit_print(it8368_reg_read(csregt, csregh, \
734 IT8368_GPIO##m##_REG), 0, IT8368_GPIO_MAX, #m, DBG_BIT_PRINT_COUNT)
735 #define PRINTMFIO(m) __dbg_bit_print(it8368_reg_read(csregt, csregh, \
736 IT8368_MFIO##m##_REG), 0, IT8368_MFIO_MAX, #m, DBG_BIT_PRINT_COUNT)
738 it8368_dump(struct it8368e_softc
*sc
)
740 bus_space_tag_t csregt
= sc
->sc_csregt
;
741 bus_space_handle_t csregh
= sc
->sc_csregh
;
749 PRINTGPIO(POSINTSTAT
);
750 PRINTGPIO(NEGINTSTAT
);
758 PRINTMFIO(POSINTSTAT
);
759 PRINTMFIO(NEGINTSTAT
);
760 __dbg_bit_print(it8368_reg_read(csregt
, csregh
, IT8368_CTRL_REG
), 0, 15,
761 "CTRL", DBG_BIT_PRINT_COUNT
);
762 __dbg_bit_print(it8368_reg_read(csregt
, csregh
, IT8368_GPIODATAIN_REG
),
763 8, 11, "]CRDDET/SENSE[", DBG_BIT_PRINT_COUNT
);
765 #endif /* IT8368DEBUG */