xref: /netbsd/sys/arch/newsmips/dev/hb.c (revision c4a72b64)
1 /*	$NetBSD: hb.c,v 1.9 2002/10/02 04:27:52 thorpej Exp $	*/
2 
3 #include <sys/param.h>
4 #include <sys/systm.h>
5 #include <sys/device.h>
6 
7 #include <machine/autoconf.h>
8 
9 static int	hb_match __P((struct device *, struct cfdata *, void *));
10 static void	hb_attach __P((struct device *, struct device *, void *));
11 static int	hb_search __P((struct device *, struct cfdata *, void *));
12 static int	hb_print __P((void *, const char *));
13 void		hb_intr_dispatch __P((int));	/* XXX */
14 
15 CFATTACH_DECL(hb, sizeof(struct device),
16     hb_match, hb_attach, NULL, NULL);
17 
18 extern struct cfdriver hb_cd;
19 
20 struct intrhand {
21 	int (*func) __P((void *));
22 	void *arg;
23 };
24 
25 #define NHBINTR	4
26 struct intrhand hb_intrhand[6][NHBINTR];
27 
28 static int
29 hb_match(parent, cf, aux)
30 	struct device *parent;
31 	struct cfdata *cf;
32 	void *aux;
33 {
34 	struct confargs *ca = aux;
35 
36 	if (strcmp(ca->ca_name, hb_cd.cd_name) != 0)
37 		return 0;
38 
39 	return 1;
40 }
41 
42 static void
43 hb_attach(parent, self, aux)
44 	struct device *parent;
45 	struct device *self;
46 	void *aux;
47 {
48 	struct confargs *ca = aux;
49 
50 	printf("\n");
51 	config_search(hb_search, self, ca);
52 }
53 
54 static int
55 hb_search(parent, cf, aux)
56 	struct device *parent;
57 	struct cfdata *cf;
58 	void *aux;
59 {
60 	struct confargs *ca = aux;
61 
62 	ca->ca_addr = cf->cf_addr;
63 	ca->ca_name = cf->cf_name;
64 
65 	if (config_match(parent, cf, ca) > 0)
66 		config_attach(parent, cf, ca, hb_print);
67 
68 	return 0;
69 }
70 
71 /*
72  * Print out the confargs.  The (parent) name is non-NULL
73  * when there was no match found by config_found().
74  */
75 static int
76 hb_print(args, name)
77 	void *args;
78 	const char *name;
79 {
80 	struct confargs *ca = args;
81 
82 	/* Be quiet about empty HB locations. */
83 	if (name)
84 		return QUIET;
85 
86 	if (ca->ca_addr != -1)
87 		printf(" addr 0x%x", ca->ca_addr);
88 
89 	return UNCONF;
90 }
91 
92 void *
93 hb_intr_establish(irq, level, func, arg)
94 	int irq, level;
95 	int (*func) __P((void *));
96 	void *arg;
97 {
98 	struct intrhand *ih = hb_intrhand[irq];
99 	int i;
100 
101 	for (i = NHBINTR; i > 0; i--) {
102 		if (ih->func == NULL)
103 			goto found;
104 		ih++;
105 	}
106 	panic("hb_intr_establish: no room");
107 
108 found:
109 	ih->func = func;
110 	ih->arg = arg;
111 
112 #ifdef HB_DEBUG
113 	for (irq = 0; irq <= 2; irq++) {
114 		for (i = 0; i < NHBINTR; i++) {
115 			printf("%p(%p) ",
116 			       hb_intrhand[irq][i].func,
117 			       hb_intrhand[irq][i].arg);
118 		}
119 		printf("\n");
120 	}
121 #endif
122 
123 	return ih;
124 }
125 
126 void
127 hb_intr_dispatch(irq)
128 	int irq;
129 {
130 	struct intrhand *ih;
131 	int i;
132 
133 	ih = hb_intrhand[irq];
134 	for (i = NHBINTR; i > 0; i--) {
135 		if (ih->func)
136 			(*ih->func)(ih->arg);
137 		ih++;
138 	}
139 }
140