Lines Matching refs:sc

173 	struct cuda_softc *sc = device_private(self);  in cuda_attach()  local
183 sc->sc_dev = self; in cuda_attach()
190 sc->sc_node = ca->ca_node; in cuda_attach()
191 sc->sc_memt = ca->ca_tag; in cuda_attach()
193 sc->sc_sent = 0; in cuda_attach()
194 sc->sc_received = 0; in cuda_attach()
195 sc->sc_waiting = 0; in cuda_attach()
196 sc->sc_polling = 0; in cuda_attach()
197 sc->sc_state = CUDA_NOTREADY; in cuda_attach()
198 sc->sc_error = 0; in cuda_attach()
199 sc->sc_i2c_read_len = 0; in cuda_attach()
201 cv_init(&sc->sc_todev, "cuda_event"); in cuda_attach()
202 mutex_init(&sc->sc_todevmtx, MUTEX_DEFAULT, IPL_NONE); in cuda_attach()
204 if (bus_space_map(sc->sc_memt, ca->ca_reg[0] + ca->ca_baseaddr, in cuda_attach()
205 ca->ca_reg[1], 0, &sc->sc_memh) != 0) { in cuda_attach()
210 sc->sc_ih = intr_establish_xname(irq, IST_EDGE, IPL_TTY, cuda_intr, sc, in cuda_attach()
215 sc->sc_handlers[i].handler = NULL; in cuda_attach()
216 sc->sc_handlers[i].cookie = NULL; in cuda_attach()
219 cuda_init(sc); in cuda_attach()
223 cuda_set_handler(sc, CUDA_ERROR, cuda_error_handler, sc); in cuda_attach()
224 cuda_set_handler(sc, CUDA_PSEUDO, cuda_todr_handler, sc); in cuda_attach()
233 cuda_set_handler(sc, CUDA_ADB, cuda_adb_handler, sc); in cuda_attach()
234 sc->sc_adbops.cookie = sc; in cuda_attach()
235 sc->sc_adbops.send = cuda_adb_send; in cuda_attach()
236 sc->sc_adbops.poll = cuda_adb_poll; in cuda_attach()
237 sc->sc_adbops.autopoll = cuda_autopoll; in cuda_attach()
238 sc->sc_adbops.set_handler = cuda_adb_set_handler; in cuda_attach()
239 config_found(self, &sc->sc_adbops, nadb_print, in cuda_attach()
243 sc->sc_todr.todr_gettime = cuda_todr_get; in cuda_attach()
244 sc->sc_todr.todr_settime = cuda_todr_set; in cuda_attach()
245 sc->sc_todr.cookie = sc; in cuda_attach()
246 todr_attach(&sc->sc_todr); in cuda_attach()
251 caa.cookie = sc; in cuda_attach()
283 iba.iba_tag = &sc->sc_i2c; in cuda_attach()
284 iic_tag_init(&sc->sc_i2c); in cuda_attach()
285 sc->sc_i2c.ic_cookie = sc; in cuda_attach()
286 sc->sc_i2c.ic_exec = cuda_i2c_exec; in cuda_attach()
295 cuda_init(struct cuda_softc *sc) in cuda_init() argument
299 reg = cuda_read_reg(sc, vDirB); in cuda_init()
301 cuda_write_reg(sc, vDirB, reg); in cuda_init()
303 reg = cuda_read_reg(sc, vDirB); in cuda_init()
305 cuda_write_reg(sc, vDirB, reg); in cuda_init()
307 reg = cuda_read_reg(sc, vACR); in cuda_init()
309 cuda_write_reg(sc, vACR, reg); in cuda_init()
311 cuda_write_reg(sc, vACR, (cuda_read_reg(sc, vACR) | 0x0c) & ~0x10); in cuda_init()
313 sc->sc_state = CUDA_IDLE; /* used by all types of hardware */ in cuda_init()
315 cuda_write_reg(sc, vIER, 0x84); /* make sure VIA interrupts are on */ in cuda_init()
316 cuda_idle(sc); /* set ADB bus state to idle */ in cuda_init()
319 (void)cuda_read_reg(sc, vSR); /* clear interrupt */ in cuda_init()
320 cuda_write_reg(sc, vIER, 0x04); /* no interrupts while clearing */ in cuda_init()
321 cuda_idle(sc); /* reset state to idle */ in cuda_init()
323 cuda_tip(sc); /* signal start of frame */ in cuda_init()
325 cuda_toggle_ack(sc); in cuda_init()
327 cuda_clear_tip(sc); in cuda_init()
329 cuda_idle(sc); /* back to idle state */ in cuda_init()
330 (void)cuda_read_reg(sc, vSR); /* clear interrupt */ in cuda_init()
331 cuda_write_reg(sc, vIER, 0x84); /* ints ok now */ in cuda_init()
337 struct cuda_softc *sc = device_private(dev); in cuda_final() local
339 sc->sc_polling = 0; in cuda_final()
343 cuda_write_reg(struct cuda_softc *sc, int offset, uint8_t value) in cuda_write_reg() argument
346 bus_space_write_1(sc->sc_memt, sc->sc_memh, offset, value); in cuda_write_reg()
350 cuda_read_reg(struct cuda_softc *sc, int offset) in cuda_read_reg() argument
353 return bus_space_read_1(sc->sc_memt, sc->sc_memh, offset); in cuda_read_reg()
360 struct cuda_softc *sc = cookie; in cuda_set_handler() local
364 me = &sc->sc_handlers[type]; in cuda_set_handler()
375 struct cuda_softc *sc = cookie; in cuda_send() local
379 if (sc->sc_state == CUDA_NOTREADY) in cuda_send()
384 if (sc->sc_state == CUDA_IDLE /*&& in cuda_send()
389 DPRINTF("cuda state is %d\n", sc->sc_state); in cuda_send()
390 if (sc->sc_waiting == 0) { in cuda_send()
391 sc->sc_waiting = 1; in cuda_send()
398 sc->sc_error = 0; in cuda_send()
399 memcpy(sc->sc_out, msg, length); in cuda_send()
400 sc->sc_out_length = length; in cuda_send()
401 sc->sc_sent = 0; in cuda_send()
403 if (sc->sc_waiting != 1) { in cuda_send()
406 sc->sc_state = CUDA_OUT; in cuda_send()
407 cuda_out(sc); in cuda_send()
408 cuda_write_reg(sc, vSR, sc->sc_out[0]); in cuda_send()
409 cuda_ack_off(sc); in cuda_send()
410 cuda_tip(sc); in cuda_send()
412 sc->sc_waiting = 1; in cuda_send()
414 if (sc->sc_polling || poll || cold) { in cuda_send()
415 cuda_poll(sc); in cuda_send()
426 struct cuda_softc *sc = cookie; in cuda_poll() local
430 while ((sc->sc_state != CUDA_IDLE) || in cuda_poll()
431 (cuda_intr_state(sc)) || in cuda_poll()
432 (sc->sc_waiting == 1)) { in cuda_poll()
433 if ((cuda_read_reg(sc, vIFR) & vSR_INT) == vSR_INT) { in cuda_poll()
435 cuda_intr(sc); in cuda_poll()
444 struct cuda_softc *sc = cookie; in cuda_adb_poll() local
448 cuda_intr(sc); in cuda_adb_poll()
453 cuda_idle(struct cuda_softc *sc) in cuda_idle() argument
457 reg = cuda_read_reg(sc, vBufB); in cuda_idle()
459 cuda_write_reg(sc, vBufB, reg); in cuda_idle()
463 cuda_tip(struct cuda_softc *sc) in cuda_tip() argument
467 reg = cuda_read_reg(sc, vBufB); in cuda_tip()
469 cuda_write_reg(sc, vBufB, reg); in cuda_tip()
473 cuda_clear_tip(struct cuda_softc *sc) in cuda_clear_tip() argument
477 reg = cuda_read_reg(sc, vBufB); in cuda_clear_tip()
479 cuda_write_reg(sc, vBufB, reg); in cuda_clear_tip()
483 cuda_in(struct cuda_softc *sc) in cuda_in() argument
487 reg = cuda_read_reg(sc, vACR); in cuda_in()
489 cuda_write_reg(sc, vACR, reg); in cuda_in()
493 cuda_out(struct cuda_softc *sc) in cuda_out() argument
497 reg = cuda_read_reg(sc, vACR); in cuda_out()
499 cuda_write_reg(sc, vACR, reg); in cuda_out()
503 cuda_toggle_ack(struct cuda_softc *sc) in cuda_toggle_ack() argument
507 reg = cuda_read_reg(sc, vBufB); in cuda_toggle_ack()
509 cuda_write_reg(sc, vBufB, reg); in cuda_toggle_ack()
513 cuda_ack_off(struct cuda_softc *sc) in cuda_ack_off() argument
517 reg = cuda_read_reg(sc, vBufB); in cuda_ack_off()
519 cuda_write_reg(sc, vBufB, reg); in cuda_ack_off()
523 cuda_intr_state(struct cuda_softc *sc) in cuda_intr_state() argument
525 return ((cuda_read_reg(sc, vBufB) & vPB3) == 0); in cuda_intr_state()
531 struct cuda_softc *sc = arg; in cuda_intr() local
535 reg = cuda_read_reg(sc, vIFR); /* Read the interrupts */ in cuda_intr()
543 cuda_write_reg(sc, vIFR, 0x7f); /* Clear 'em */ in cuda_intr()
546 switch (sc->sc_state) { in cuda_intr()
553 sc->sc_in[1] = cuda_read_reg(sc, vSR); in cuda_intr()
554 DPRINTF("start: %02x", sc->sc_in[1]); in cuda_intr()
555 if (cuda_intr_state(sc) == 0) { in cuda_intr()
558 if (sc->sc_waiting) { in cuda_intr()
561 sc->sc_state = CUDA_OUT; in cuda_intr()
562 sc->sc_sent = 0; in cuda_intr()
563 cuda_out(sc); in cuda_intr()
564 cuda_write_reg(sc, vSR, sc->sc_out[1]); in cuda_intr()
565 cuda_ack_off(sc); in cuda_intr()
566 cuda_tip(sc); in cuda_intr()
571 cuda_in(sc); in cuda_intr()
572 cuda_tip(sc); in cuda_intr()
574 sc->sc_received = 1; in cuda_intr()
575 sc->sc_state = CUDA_IN; in cuda_intr()
580 sc->sc_in[sc->sc_received] = cuda_read_reg(sc, vSR); in cuda_intr()
581 DPRINTF(" %02x", sc->sc_in[sc->sc_received]); in cuda_intr()
583 if (sc->sc_received > 255) { in cuda_intr()
585 if (sc->sc_received == 256) { in cuda_intr()
586 aprint_error_dev(sc->sc_dev, in cuda_intr()
591 sc->sc_received++; in cuda_intr()
592 if (sc->sc_received > 3) { in cuda_intr()
593 if ((sc->sc_in[3] == CMD_IIC) && in cuda_intr()
594 (sc->sc_received > (sc->sc_i2c_read_len + 4))) { in cuda_intr()
600 if (cuda_intr_state(sc) == 0) { in cuda_intr()
604 cuda_toggle_ack(sc); in cuda_intr()
609 sc->sc_in[0] = sc->sc_received - 1; in cuda_intr()
612 cuda_idle(sc); in cuda_intr()
615 type = sc->sc_in[1]; in cuda_intr()
617 CudaHandler *me = &sc->sc_handlers[type]; in cuda_intr()
621 sc->sc_received - 1, &sc->sc_in[1]); in cuda_intr()
623 aprint_error_dev(sc->sc_dev, in cuda_intr()
630 sc->sc_state = CUDA_IDLE; in cuda_intr()
632 sc->sc_received = 0; in cuda_intr()
638 if (sc->sc_waiting == 1) { in cuda_intr()
642 sc->sc_sent = 0; in cuda_intr()
643 sc->sc_state = CUDA_OUT; in cuda_intr()
651 if (cuda_intr_state(sc)) { in cuda_intr()
652 cuda_in(sc); in cuda_intr()
653 cuda_idle(sc); in cuda_intr()
654 sc->sc_sent = 0; in cuda_intr()
655 sc->sc_state = CUDA_IDLE; in cuda_intr()
656 sc->sc_received = 0; in cuda_intr()
668 cuda_out(sc); in cuda_intr()
669 cuda_write_reg(sc, vSR, in cuda_intr()
670 sc->sc_out[sc->sc_sent]); in cuda_intr()
671 cuda_ack_off(sc); in cuda_intr()
672 cuda_tip(sc); in cuda_intr()
678 (void)cuda_read_reg(sc, vSR); /* reset SR-intr in IFR */ in cuda_intr()
680 sc->sc_sent++; in cuda_intr()
681 if (cuda_intr_state(sc)) { /* ADB intr low during write */ in cuda_intr()
684 cuda_in(sc); /* make sure SR is set to IN */ in cuda_intr()
685 cuda_idle(sc); in cuda_intr()
686 sc->sc_sent = 0; /* must start all over */ in cuda_intr()
687 sc->sc_state = CUDA_IDLE; /* new state */ in cuda_intr()
688 sc->sc_received = 0; in cuda_intr()
689 sc->sc_waiting = 1; /* must retry when done with in cuda_intr()
696 if (sc->sc_out_length == sc->sc_sent) { /* check for done */ in cuda_intr()
698 sc->sc_waiting = 0; /* done writing */ in cuda_intr()
699 sc->sc_state = CUDA_IDLE; /* signal bus is idle */ in cuda_intr()
700 cuda_in(sc); in cuda_intr()
701 cuda_idle(sc); in cuda_intr()
705 cuda_write_reg(sc, vSR, sc->sc_out[sc->sc_sent]); in cuda_intr()
706 DPRINTF("%02x", sc->sc_out[sc->sc_sent]); in cuda_intr()
707 cuda_toggle_ack(sc); /* signal byte ready to in cuda_intr()
728 struct cuda_softc *sc = cookie; in cuda_error_handler() local
734 sc->sc_error = 1; in cuda_error_handler()
736 cv_signal(&sc->sc_todev); in cuda_error_handler()
746 struct cuda_softc *sc = cookie; in cuda_todr_handler() local
759 memcpy(&sc->sc_tod, &data[3], 4); in cuda_todr_handler()
762 sc->sc_tod = 0xffffffff; in cuda_todr_handler()
765 sc->sc_autopoll = 1; in cuda_todr_handler()
768 sc->sc_iic_done = len; in cuda_todr_handler()
771 cv_signal(&sc->sc_todev); in cuda_todr_handler()
780 struct cuda_softc *sc = tch->cookie; in cuda_todr_get() local
784 sc->sc_tod = 0; in cuda_todr_get()
785 while (sc->sc_tod == 0) { in cuda_todr_get()
786 cuda_send(sc, 0, 2, cmd); in cuda_todr_get()
788 while ((sc->sc_tod == 0) && (cnt < 10)) { in cuda_todr_get()
789 mutex_enter(&sc->sc_todevmtx); in cuda_todr_get()
790 cv_timedwait(&sc->sc_todev, &sc->sc_todevmtx, hz); in cuda_todr_get()
791 mutex_exit(&sc->sc_todevmtx); in cuda_todr_get()
796 if (sc->sc_tod == 0) { in cuda_todr_get()
797 aprint_error_dev(sc->sc_dev, in cuda_todr_get()
801 if ((sc->sc_tod > 0xf0000000UL) || in cuda_todr_get()
802 (sc->sc_tod < DIFF19041970)) { in cuda_todr_get()
804 sc->sc_tod = 0; in cuda_todr_get()
805 aprint_verbose_dev(sc->sc_dev, in cuda_todr_get()
810 tvp->tv_sec = sc->sc_tod - DIFF19041970; in cuda_todr_get()
819 struct cuda_softc *sc = tch->cookie; in cuda_todr_set() local
825 sc->sc_tod = 0; in cuda_todr_set()
826 if (cuda_send(sc, 0, 6, cmd) == 0) { in cuda_todr_set()
827 while (sc->sc_tod == 0) { in cuda_todr_set()
828 mutex_enter(&sc->sc_todevmtx); in cuda_todr_set()
829 cv_timedwait(&sc->sc_todev, &sc->sc_todevmtx, hz); in cuda_todr_set()
830 mutex_exit(&sc->sc_todevmtx); in cuda_todr_set()
834 aprint_error_dev(sc->sc_dev, "%s failed\n", __func__); in cuda_todr_set()
844 struct cuda_softc *sc; in cuda_poweroff() local
849 sc = cuda0->cookie; in cuda_poweroff()
850 sc->sc_polling = 1; in cuda_poweroff()
851 cuda0->poll(sc); in cuda_poweroff()
852 if (cuda0->send(sc, 1, 2, cmd) == 0) in cuda_poweroff()
859 struct cuda_softc *sc; in cuda_restart() local
864 sc = cuda0->cookie; in cuda_restart()
865 sc->sc_polling = 1; in cuda_restart()
866 cuda0->poll(sc); in cuda_restart()
867 if (cuda0->send(sc, 1, 2, cmd) == 0) in cuda_restart()
876 struct cuda_softc *sc = cookie; in cuda_autopoll() local
879 if (cmd[2] == sc->sc_autopoll) in cuda_autopoll()
882 sc->sc_autopoll = -1; in cuda_autopoll()
883 cuda_send(sc, 0, 3, cmd); in cuda_autopoll()
884 while(sc->sc_autopoll == -1) { in cuda_autopoll()
885 if (sc->sc_polling || cold) { in cuda_autopoll()
886 cuda_poll(sc); in cuda_autopoll()
888 mutex_enter(&sc->sc_todevmtx); in cuda_autopoll()
889 cv_timedwait(&sc->sc_todev, &sc->sc_todevmtx, hz); in cuda_autopoll()
890 mutex_exit(&sc->sc_todevmtx); in cuda_autopoll()
898 struct cuda_softc *sc = cookie; in cuda_adb_handler() local
900 if (sc->sc_adb_handler != NULL) { in cuda_adb_handler()
901 sc->sc_adb_handler(sc->sc_adb_cookie, len - 1, in cuda_adb_handler()
911 struct cuda_softc *sc = cookie; in cuda_adb_send() local
922 cuda_poll(sc); in cuda_adb_send()
924 cuda_send(sc, poll, len + 2, packet); in cuda_adb_send()
926 cuda_poll(sc); in cuda_adb_send()
936 struct cuda_softc *sc = cookie; in cuda_adb_set_handler() local
939 sc->sc_adb_handler = handler; in cuda_adb_set_handler()
940 sc->sc_adb_cookie = hcookie; in cuda_adb_set_handler()
950 struct cuda_softc *sc = cookie; in cuda_i2c_exec() local
968 sc->sc_error = 0; in cuda_i2c_exec()
972 sc->sc_iic_done = 0; in cuda_i2c_exec()
973 cuda_send(sc, sc->sc_polling, send_len + 3, command); in cuda_i2c_exec()
975 while ((sc->sc_iic_done == 0) && (sc->sc_error == 0)) { in cuda_i2c_exec()
976 if (sc->sc_polling || cold) { in cuda_i2c_exec()
977 cuda_poll(sc); in cuda_i2c_exec()
979 mutex_enter(&sc->sc_todevmtx); in cuda_i2c_exec()
980 cv_timedwait(&sc->sc_todev, &sc->sc_todevmtx, hz); in cuda_i2c_exec()
981 mutex_exit(&sc->sc_todevmtx); in cuda_i2c_exec()
985 if (sc->sc_error) { in cuda_i2c_exec()
986 sc->sc_error = 0; in cuda_i2c_exec()
987 aprint_error_dev(sc->sc_dev, "error doing I2C\n"); in cuda_i2c_exec()
993 sc->sc_iic_done = 0; in cuda_i2c_exec()
1001 sc->sc_i2c_read_len = recv_len; in cuda_i2c_exec()
1003 cuda_send(sc, sc->sc_polling, 3, command); in cuda_i2c_exec()
1004 while ((sc->sc_iic_done == 0) && (sc->sc_error == 0)) { in cuda_i2c_exec()
1005 if (sc->sc_polling || cold) { in cuda_i2c_exec()
1006 cuda_poll(sc); in cuda_i2c_exec()
1008 mutex_enter(&sc->sc_todevmtx); in cuda_i2c_exec()
1009 cv_timedwait(&sc->sc_todev, &sc->sc_todevmtx, hz); in cuda_i2c_exec()
1010 mutex_exit(&sc->sc_todevmtx); in cuda_i2c_exec()
1014 if (sc->sc_error) { in cuda_i2c_exec()
1015 aprint_error_dev(sc->sc_dev, in cuda_i2c_exec()
1017 sc->sc_error = 0; in cuda_i2c_exec()
1022 DPRINTF("received: %d\n", sc->sc_iic_done); in cuda_i2c_exec()
1023 if ((sc->sc_iic_done > 3) && (recv_len > 0)) { in cuda_i2c_exec()
1027 rlen = uimin(sc->sc_iic_done - 3, recv_len); in cuda_i2c_exec()
1028 memcpy(recv, &sc->sc_in[4], rlen); in cuda_i2c_exec()