Lines Matching refs:priv

96 	struct gpioc_cdevpriv		*priv;  member
163 next_head_event(struct gpioc_cdevpriv *priv) in next_head_event() argument
167 rv = &priv->events[priv->evidx_head++]; in next_head_event()
168 if (priv->evidx_head == priv->numevents) in next_head_event()
169 priv->evidx_head = 0; in next_head_event()
174 next_tail_event(struct gpioc_cdevpriv *priv) in next_tail_event() argument
178 rv = &priv->events[priv->evidx_tail++]; in next_tail_event()
179 if (priv->evidx_tail == priv->numevents) in next_tail_event()
180 priv->evidx_tail = 0; in next_tail_event()
185 number_of_events(struct gpioc_cdevpriv *priv) in number_of_events() argument
187 if (priv->evidx_head >= priv->evidx_tail) in number_of_events()
188 return (priv->evidx_head - priv->evidx_tail); in number_of_events()
190 return (priv->numevents + priv->evidx_head - priv->evidx_tail); in number_of_events()
264 gpioc_attach_priv_pin(struct gpioc_cdevpriv *priv, in gpioc_attach_priv_pin() argument
275 mtx_lock(&priv->mtx); in gpioc_attach_priv_pin()
277 if (priv_link->priv == priv) in gpioc_attach_priv_pin()
282 SLIST_FOREACH(pin_link, &priv->pins, next) { in gpioc_attach_priv_pin()
289 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
296 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
302 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
305 priv_link->priv = priv; in gpioc_attach_priv_pin()
308 SLIST_INSERT_HEAD(&priv->pins, pin_link, next); in gpioc_attach_priv_pin()
309 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
315 gpioc_detach_priv_pin(struct gpioc_cdevpriv *priv, in gpioc_detach_priv_pin() argument
326 mtx_lock(&priv->mtx); in gpioc_detach_priv_pin()
328 if (priv_link->priv == priv) { in gpioc_detach_priv_pin()
337 SLIST_FOREACH_SAFE(pin_link, &priv->pins, next, pin_link_temp) { in gpioc_detach_priv_pin()
347 priv->evidx_head = priv->evidx_tail = 0; in gpioc_detach_priv_pin()
349 SLIST_REMOVE(&priv->pins, pin_link, gpioc_pins, next); in gpioc_detach_priv_pin()
356 mtx_unlock(&priv->mtx); in gpioc_detach_priv_pin()
362 gpioc_intr_reconfig_allowed(struct gpioc_cdevpriv *priv, in gpioc_intr_reconfig_allowed() argument
373 if (priv_link->priv != priv) in gpioc_intr_reconfig_allowed()
382 gpioc_get_intr_config(struct gpioc_softc *sc, struct gpioc_cdevpriv *priv, in gpioc_get_intr_config() argument
396 if (priv_link->priv == priv) { in gpioc_get_intr_config()
407 gpioc_set_intr_config(struct gpioc_softc *sc, struct gpioc_cdevpriv *priv, in gpioc_set_intr_config() argument
429 res = gpioc_attach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
437 res = gpioc_attach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
446 if (gpioc_intr_reconfig_allowed(priv, intr_conf)) { in gpioc_set_intr_config()
450 res = gpioc_detach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
456 if (!gpioc_intr_reconfig_allowed(priv, intr_conf)) in gpioc_set_intr_config()
463 res = gpioc_attach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
512 struct gpioc_cdevpriv *priv = privs->priv; in gpioc_interrupt_handler() local
515 mtx_lock(&priv->mtx); in gpioc_interrupt_handler()
516 SLIST_FOREACH(privpin, &priv->pins, next) { in gpioc_interrupt_handler()
523 mtx_unlock(&priv->mtx); in gpioc_interrupt_handler()
527 if (priv->report_option == GPIO_EVENT_REPORT_DETAIL) { in gpioc_interrupt_handler()
528 event = next_head_event(priv); in gpioc_interrupt_handler()
530 if (priv->evidx_head == priv->evidx_tail) in gpioc_interrupt_handler()
531 next_tail_event(priv); in gpioc_interrupt_handler()
534 event = &priv->events[privpin->firstevent + 1]; in gpioc_interrupt_handler()
536 privpin->firstevent = priv->evidx_head; in gpioc_interrupt_handler()
537 event = next_head_event(priv); in gpioc_interrupt_handler()
541 event = next_head_event(priv); in gpioc_interrupt_handler()
548 wakeup(priv); in gpioc_interrupt_handler()
549 selwakeup(&priv->selinfo); in gpioc_interrupt_handler()
550 KNOTE_LOCKED(&priv->selinfo.si_note, 0); in gpioc_interrupt_handler()
551 if (priv->async == true && priv->sigio != NULL) in gpioc_interrupt_handler()
552 pgsigio(&priv->sigio, SIGIO, 0); in gpioc_interrupt_handler()
553 mtx_unlock(&priv->mtx); in gpioc_interrupt_handler()
633 struct gpioc_cdevpriv *priv; in gpioc_cdevpriv_dtor() local
638 priv = data; in gpioc_cdevpriv_dtor()
640 SLIST_FOREACH_SAFE(pin_link, &priv->pins, next, pin_link_temp) { in gpioc_cdevpriv_dtor()
648 if (priv_link->priv == priv) { in gpioc_cdevpriv_dtor()
657 if (gpioc_intr_reconfig_allowed(priv, pin_link->pin)) { in gpioc_cdevpriv_dtor()
661 SLIST_REMOVE(&priv->pins, pin_link, gpioc_pins, next); in gpioc_cdevpriv_dtor()
665 wakeup(&priv); in gpioc_cdevpriv_dtor()
666 knlist_clear(&priv->selinfo.si_note, 0); in gpioc_cdevpriv_dtor()
667 seldrain(&priv->selinfo); in gpioc_cdevpriv_dtor()
668 knlist_destroy(&priv->selinfo.si_note); in gpioc_cdevpriv_dtor()
669 funsetown(&priv->sigio); in gpioc_cdevpriv_dtor()
671 mtx_destroy(&priv->mtx); in gpioc_cdevpriv_dtor()
672 free(priv->events, M_GPIOC); in gpioc_cdevpriv_dtor()
679 struct gpioc_cdevpriv *priv; in gpioc_open() local
682 priv = malloc(sizeof(*priv), M_GPIOC, M_WAITOK | M_ZERO); in gpioc_open()
683 priv->sc = dev->si_drv1; in gpioc_open()
685 mtx_init(&priv->mtx, "gpioc priv", NULL, MTX_DEF); in gpioc_open()
686 knlist_init_mtx(&priv->selinfo.si_note, &priv->mtx); in gpioc_open()
688 priv->async = false; in gpioc_open()
689 priv->report_option = GPIO_EVENT_REPORT_DETAIL; in gpioc_open()
690 priv->sigio = NULL; in gpioc_open()
699 priv->numevents = priv->sc->sc_npins * 2; in gpioc_open()
700 priv->events = malloc(priv->numevents * sizeof(struct gpio_event_detail), in gpioc_open()
703 priv->evidx_head = priv->evidx_tail = 0; in gpioc_open()
704 SLIST_INIT(&priv->pins); in gpioc_open()
706 err = devfs_set_cdevpriv(priv, gpioc_cdevpriv_dtor); in gpioc_open()
708 gpioc_cdevpriv_dtor(priv); in gpioc_open()
715 struct gpioc_cdevpriv *priv; in gpioc_read() local
725 if ((err = devfs_get_cdevpriv((void **)&priv)) != 0) in gpioc_read()
728 if (priv->report_option == GPIO_EVENT_REPORT_SUMMARY) in gpioc_read()
736 mtx_lock(&priv->mtx); in gpioc_read()
737 while (priv->evidx_head == priv->evidx_tail) { in gpioc_read()
738 if (SLIST_EMPTY(&priv->pins)) { in gpioc_read()
745 err = mtx_sleep(priv, &priv->mtx, PCATCH, "gpintr", 0); in gpioc_read()
752 priv->evidx_tail != priv->evidx_head) { in gpioc_read()
753 event = next_tail_event(priv); in gpioc_read()
754 if (priv->report_option == GPIO_EVENT_REPORT_SUMMARY) { in gpioc_read()
759 event = next_tail_event(priv); in gpioc_read()
769 mtx_unlock(&priv->mtx); in gpioc_read()
771 mtx_lock(&priv->mtx); in gpioc_read()
773 mtx_unlock(&priv->mtx); in gpioc_read()
784 struct gpioc_cdevpriv *priv; in gpioc_ioctl() local
809 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
812 pin.gp_flags |= gpioc_get_intr_config(sc, priv, in gpioc_ioctl()
821 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
854 res = gpioc_set_intr_config(sc, priv, pin.gp_pin, in gpioc_ioctl()
896 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
900 if (!SLIST_EMPTY(&priv->pins)) { in gpioc_ioctl()
909 priv->report_option = evcfg->gp_report_type; in gpioc_ioctl()
911 if (priv->report_option == GPIO_EVENT_REPORT_DETAIL && in gpioc_ioctl()
912 priv->numevents < evcfg->gp_fifo_size) { in gpioc_ioctl()
913 free(priv->events, M_GPIOC); in gpioc_ioctl()
914 priv->numevents = evcfg->gp_fifo_size; in gpioc_ioctl()
915 priv->events = malloc(priv->numevents * in gpioc_ioctl()
918 priv->evidx_head = priv->evidx_tail = 0; in gpioc_ioctl()
931 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
934 priv->async = true; in gpioc_ioctl()
936 priv->async = false; in gpioc_ioctl()
940 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
942 *(int *)arg = fgetown(&priv->sigio); in gpioc_ioctl()
945 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
947 res = fsetown(*(int *)arg, &priv->sigio); in gpioc_ioctl()
960 struct gpioc_cdevpriv *priv; in gpioc_poll() local
966 err = devfs_get_cdevpriv((void **)&priv); in gpioc_poll()
972 if (SLIST_EMPTY(&priv->pins)) { in gpioc_poll()
978 if (priv->evidx_head != priv->evidx_tail) in gpioc_poll()
981 selrecord(td, &priv->selinfo); in gpioc_poll()
990 struct gpioc_cdevpriv *priv; in gpioc_kqfilter() local
994 err = devfs_get_cdevpriv((void **)&priv); in gpioc_kqfilter()
998 if (SLIST_EMPTY(&priv->pins)) in gpioc_kqfilter()
1004 kn->kn_hook = (void *)priv; in gpioc_kqfilter()
1010 knlist = &priv->selinfo.si_note; in gpioc_kqfilter()
1019 struct gpioc_cdevpriv *priv = kn->kn_hook; in gpioc_kqread() local
1023 if (SLIST_EMPTY(&priv->pins)) { in gpioc_kqread()
1027 if (priv->evidx_head != priv->evidx_tail) { in gpioc_kqread()
1028 if (priv->report_option == GPIO_EVENT_REPORT_SUMMARY) in gpioc_kqread()
1032 kn->kn_data = recsize * number_of_events(priv); in gpioc_kqread()
1042 struct gpioc_cdevpriv *priv = kn->kn_hook; in gpioc_kqdetach() local
1043 struct knlist *knlist = &priv->selinfo.si_note; in gpioc_kqdetach()