void led_attach(struct device *parent, struct device *self, void *aux) { struct led_softc *sc = (void *)self; struct ebus_attach_args *ea = aux; int rev; if (ebus_bus_map(ea->ea_iotag, 0, EBUS_PADDR_FROM_REG(&ea->ea_regs[0]), ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) { sc->sc_iot = ea->ea_iotag; } else if (ebus_bus_map(ea->ea_memtag, 0, EBUS_PADDR_FROM_REG(&ea->ea_regs[0]), ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) { sc->sc_iot = ea->ea_memtag; } else { printf("%s: can't map register space\n", self->dv_xname); return; } bus_space_write_1(sc->sc_iot, sc->sc_ioh, EPIC_ADDR, EPIC_FW_VERSION); delay(10000); rev = bus_space_read_1(sc->sc_iot, sc->sc_ioh, EPIC_DATA); printf(": rev 0x%02x\n", rev); /* Turn off the alert LED. */ bus_space_write_1(sc->sc_iot, sc->sc_ioh, EPIC_WRITE_MASK, EPIC_ALERT_LED_MASK); bus_space_write_1(sc->sc_iot, sc->sc_ioh, EPIC_ADDR, EPIC_LED_STATE0); delay(10000); bus_space_write_1(sc->sc_iot, sc->sc_ioh, EPIC_DATA, EPIC_ALERT_LED_OFF); timeout_set(&sc->sc_to, led_blink_finish, sc); sc->sc_blink.bl_func = led_blink; sc->sc_blink.bl_arg = sc; blink_led_register(&sc->sc_blink); }
void lcd_attach(struct device *parent, struct device *self, void *aux) { struct lcd_softc *sc = (struct lcd_softc *)self; struct confargs *ca = aux; struct pdc_chassis_lcd *pdc_lcd = (void *)ca->ca_pdc_iodc_read; int i; sc->sc_iot = ca->ca_iot; if (bus_space_map(sc->sc_iot, pdc_lcd->cmd_addr, 1, 0, &sc->sc_cmdh)) { printf(": cannot map cmd register\n"); return; } if (bus_space_map(sc->sc_iot, pdc_lcd->data_addr, 1, 0, &sc->sc_datah)) { printf(": cannot map data register\n"); bus_space_unmap(sc->sc_iot, sc->sc_cmdh, 1); return; } printf(": model %d\n", pdc_lcd->model); sc->sc_delay = pdc_lcd->delay; for (i = 0; i < 3; i++) sc->sc_heartbeat[i] = pdc_lcd->heartbeat[i]; timeout_set(&sc->sc_to, lcd_blink_finish, sc); sc->sc_blink.bl_func = lcd_blink; sc->sc_blink.bl_arg = sc; blink_led_register(&sc->sc_blink); mountroothook_establish(lcd_mountroot, sc); }
void fhc_attach(struct fhc_softc *sc) { int node0, node; u_int32_t ctrl; printf(" board %d: %s\n", sc->sc_board, getpropstring(sc->sc_node, "board-model")); sc->sc_cbt = fhc_alloc_bus_tag(sc); sc->sc_ign = sc->sc_board << 1; bus_space_write_4(sc->sc_bt, sc->sc_ireg, FHC_I_IGN, sc->sc_ign); sc->sc_ign = bus_space_read_4(sc->sc_bt, sc->sc_ireg, FHC_I_IGN); ctrl = bus_space_read_4(sc->sc_bt, sc->sc_preg, FHC_P_CTRL); if (!sc->sc_is_central) ctrl |= FHC_P_CTRL_IXIST; ctrl &= ~(FHC_P_CTRL_AOFF | FHC_P_CTRL_BOFF | FHC_P_CTRL_SLINE); bus_space_write_4(sc->sc_bt, sc->sc_preg, FHC_P_CTRL, ctrl); bus_space_read_4(sc->sc_bt, sc->sc_preg, FHC_P_CTRL); /* clear interrupts */ bus_space_write_4(sc->sc_bt, sc->sc_freg, FHC_F_ICLR, 0); bus_space_read_4(sc->sc_bt, sc->sc_freg, FHC_F_ICLR); bus_space_write_4(sc->sc_bt, sc->sc_sreg, FHC_S_ICLR, 0); bus_space_read_4(sc->sc_bt, sc->sc_sreg, FHC_S_ICLR); bus_space_write_4(sc->sc_bt, sc->sc_ureg, FHC_U_ICLR, 0); bus_space_read_4(sc->sc_bt, sc->sc_ureg, FHC_U_ICLR); bus_space_write_4(sc->sc_bt, sc->sc_treg, FHC_T_ICLR, 0); bus_space_read_4(sc->sc_bt, sc->sc_treg, FHC_T_ICLR); getprop(sc->sc_node, "ranges", sizeof(struct fhc_range), &sc->sc_nrange, (void **)&sc->sc_range); node0 = firstchild(sc->sc_node); for (node = node0; node; node = nextsibling(node)) { struct fhc_attach_args fa; bzero(&fa, sizeof(fa)); fa.fa_node = node; fa.fa_bustag = sc->sc_cbt; if (fhc_get_string(fa.fa_node, "name", &fa.fa_name)) { printf("can't fetch name for node 0x%x\n", node); continue; } getprop(node, "reg", sizeof(struct fhc_reg), &fa.fa_nreg, (void **)&fa.fa_reg); getprop(node, "interrupts", sizeof(int), &fa.fa_nintr, (void **)&fa.fa_intr); getprop(node, "address", sizeof(*fa.fa_promvaddrs), &fa.fa_npromvaddrs, (void **)&fa.fa_promvaddrs); (void)config_found(&sc->sc_dv, (void *)&fa, fhc_print); if (fa.fa_name != NULL) free(fa.fa_name, M_DEVBUF); if (fa.fa_reg != NULL) free(fa.fa_reg, M_DEVBUF); if (fa.fa_nintr != NULL) free(fa.fa_intr, M_DEVBUF); if (fa.fa_promvaddrs != NULL) free(fa.fa_promvaddrs, M_DEVBUF); } sc->sc_blink.bl_func = fhc_led_blink; sc->sc_blink.bl_arg = sc; blink_led_register(&sc->sc_blink); }