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