int hil_intr(void *v) { struct hil_softc *sc = v; u_int8_t c, stat; if (cold) return (0); stat = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT); /* * This should never happen if the interrupt comes from the * loop. */ if ((stat & HIL_DATA_RDY) == 0) return (0); /* not for us */ c = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA); /* clears interrupt */ DELAY(1); hil_process_int(sc, stat, c); if (sc->sc_status != HIL_STATUS_BUSY) hil_process_pending(sc); return (1); }
void hil_set_poll(struct hil_softc *sc, int on) { if (on) { pollon(sc); } else { hil_process_pending(sc); send_hil_cmd(sc, HIL_INTON, NULL, 0, NULL); } }
int hil_intr(void *v) { struct hil_softc *sc = v; u_int8_t c, stat; if (cold) return (0); stat = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT); c = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA); /* clears interrupt */ DELAY(1); hil_process_int(sc, stat, c); if (sc->sc_status != HIL_STATUS_BUSY) hil_process_pending(sc); return (1); }
void hil_attach_deferred(void *v) { struct hil_softc *sc = v; int tries; u_int8_t db; sc->sc_status = HIL_STATUS_BUSY; /* * Initialize the loop: reconfigure, don't report errors, * put keyboard in cooked mode, and enable autopolling. */ db = LPC_RECONF | LPC_KBDCOOK | LPC_NOERROR | LPC_AUTOPOLL; send_hil_cmd(sc, HIL_WRITELPCTRL, &db, 1, NULL); /* * Delay one second for reconfiguration and then read the * data to clear the interrupt (if the loop reconfigured). */ DELAY(1000000); if (bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT) & HIL_DATA_RDY) { db = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA); DELAY(1); } /* * The HIL loop may have reconfigured. If so we proceed on, * if not we loop a few times until a successful reconfiguration * is reported back to us. If the HIL loop is still lost after a * few seconds, give up. */ for (tries = 10; tries != 0; tries--) { if (send_hil_cmd(sc, HIL_READLPSTAT, NULL, 0, &db) == 0) { if (db & (LPS_CONFFAIL | LPS_CONFGOOD)) break; } #ifdef HILDEBUG printf("%s: loop not ready, retrying...\n", sc->sc_dev.dv_xname); #endif DELAY(1000000); } if (tries == 0 || (db & LPS_CONFFAIL)) { printf("%s: no devices\n", sc->sc_dev.dv_xname); sc->sc_pending = 0; if (tries == 0) return; } /* * Create asynchronous loop event handler thread. */ if (kthread_create(hil_thread, sc, &sc->sc_thread, "%s", sc->sc_dev.dv_xname) != 0) { printf("%s: unable to create event thread\n", sc->sc_dev.dv_xname); return; } /* * Enable loop interrupts. */ send_hil_cmd(sc, HIL_INTON, NULL, 0, NULL); /* * Reconfigure if necessary */ sc->sc_status = HIL_STATUS_READY; hil_process_pending(sc); }