ucbio.c revision 1.1 1 /* $NetBSD: ucbio.c,v 1.1 2000/02/27 16:34:13 uch Exp $ */
2
3 /*
4 * Copyright (c) 2000, by UCHIYAMA Yasushi
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. The name of the developer may NOT be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 */
28
29 /*
30 * Device driver for PHILIPS UCB1200 Advanced modem/audio analog front-end
31 * General Purpose I/O part.
32 */
33 #include "opt_tx39_debug.h"
34
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/device.h>
38
39 #include <machine/bus.h>
40 #include <machine/intr.h>
41 #include <machine/platid.h>
42 #include <machine/platid_mask.h>
43
44 #include <hpcmips/tx/tx39var.h>
45 #include <hpcmips/tx/tx39sibvar.h>
46 #include <hpcmips/tx/tx39sibreg.h>
47
48 #include <hpcmips/dev/ucb1200var.h>
49 #include <hpcmips/dev/ucb1200reg.h>
50
51 #include "locators.h"
52
53 extern char* btnmgr_name __P((long));
54
55 int ucbio_match __P((struct device*, struct cfdata*, void*));
56 void ucbio_attach __P((struct device*, struct device*, void*));
57
58 struct ucbio_softc {
59 struct device sc_dev;
60 };
61
62 struct cfattach ucbio_ca = {
63 sizeof(struct ucbio_softc), ucbio_match, ucbio_attach
64 };
65
66 int ucbio_print __P((void*, const char*));
67 int ucbio_submatch __P((struct device*, struct cfdata*, void*));
68
69 int
70 ucbio_match(parent, cf, aux)
71 struct device *parent;
72 struct cfdata *cf;
73 void *aux;
74 {
75 return (1);
76 }
77
78 void
79 ucbio_attach(parent, self, aux)
80 struct device *parent;
81 struct device *self;
82 void *aux;
83 {
84 struct ucb1200_attach_args *ucba = aux;
85 struct ucbio_attach_args uia;
86 int port;
87
88 printf("\n");
89
90 uia.uia_tc = ucba->ucba_tc;
91 for (port = 0; port < UCB1200_IOPORT_MAX; port++) {
92 uia.uia_port = port;
93 config_found_sm(self, &uia, ucbio_print, ucbio_submatch);
94 }
95 }
96
97 int
98 ucbio_submatch(parent, cf, aux)
99 struct device *parent;
100 struct cfdata *cf;
101 void *aux;
102 {
103 struct ucbio_attach_args *uia = aux;
104 platid_mask_t mask;
105
106 if (cf->cf_loc[NEWGPBUSIFCF_PORT] != uia->uia_port)
107 return (0);
108
109 mask = PLATID_DEREF(cf->cf_loc[NEWGPBUSIFCF_PLATFORM]);
110 if (!platid_match(&platid, &mask))
111 return (0);
112
113 uia->uia_id = cf->cf_loc[NEWGPBUSIFCF_ID];
114 return ((*cf->cf_attach->ca_match)(parent, cf, aux));
115 }
116
117 int
118 ucbio_print(aux, pnp)
119 void *aux;
120 const char *pnp;
121 {
122 struct ucbio_attach_args *uia = aux;
123
124 if (!pnp)
125 printf(" port %d \"%s\"", uia->uia_port,
126 btnmgr_name(uia->uia_id));
127
128 return (QUIET);
129 }
130