Lines Matching refs:priv

97 	struct gpioc_cdevpriv		*priv;  member
164 next_head_event(struct gpioc_cdevpriv *priv) in next_head_event() argument
168 rv = &priv->events[priv->evidx_head++]; in next_head_event()
169 if (priv->evidx_head == priv->numevents) in next_head_event()
170 priv->evidx_head = 0; in next_head_event()
175 next_tail_event(struct gpioc_cdevpriv *priv) in next_tail_event() argument
179 rv = &priv->events[priv->evidx_tail++]; in next_tail_event()
180 if (priv->evidx_tail == priv->numevents) in next_tail_event()
181 priv->evidx_tail = 0; in next_tail_event()
186 number_of_events(struct gpioc_cdevpriv *priv) in number_of_events() argument
188 if (priv->evidx_head >= priv->evidx_tail) in number_of_events()
189 return (priv->evidx_head - priv->evidx_tail); in number_of_events()
191 return (priv->numevents + priv->evidx_head - priv->evidx_tail); in number_of_events()
265 gpioc_attach_priv_pin(struct gpioc_cdevpriv *priv, in gpioc_attach_priv_pin() argument
276 mtx_lock(&priv->mtx); in gpioc_attach_priv_pin()
278 if (priv_link->priv == priv) in gpioc_attach_priv_pin()
283 SLIST_FOREACH(pin_link, &priv->pins, next) { in gpioc_attach_priv_pin()
290 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
297 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
303 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
306 priv_link->priv = priv; in gpioc_attach_priv_pin()
309 SLIST_INSERT_HEAD(&priv->pins, pin_link, next); in gpioc_attach_priv_pin()
310 mtx_unlock(&priv->mtx); in gpioc_attach_priv_pin()
316 gpioc_detach_priv_pin(struct gpioc_cdevpriv *priv, in gpioc_detach_priv_pin() argument
327 mtx_lock(&priv->mtx); in gpioc_detach_priv_pin()
329 if (priv_link->priv == priv) { in gpioc_detach_priv_pin()
338 SLIST_FOREACH_SAFE(pin_link, &priv->pins, next, pin_link_temp) { in gpioc_detach_priv_pin()
348 priv->evidx_head = priv->evidx_tail = 0; in gpioc_detach_priv_pin()
350 SLIST_REMOVE(&priv->pins, pin_link, gpioc_pins, next); in gpioc_detach_priv_pin()
357 mtx_unlock(&priv->mtx); in gpioc_detach_priv_pin()
363 gpioc_intr_reconfig_allowed(struct gpioc_cdevpriv *priv, in gpioc_intr_reconfig_allowed() argument
374 if (priv_link->priv != priv) in gpioc_intr_reconfig_allowed()
383 gpioc_get_intr_config(struct gpioc_softc *sc, struct gpioc_cdevpriv *priv, in gpioc_get_intr_config() argument
397 if (priv_link->priv == priv) { in gpioc_get_intr_config()
408 gpioc_set_intr_config(struct gpioc_softc *sc, struct gpioc_cdevpriv *priv, in gpioc_set_intr_config() argument
430 res = gpioc_attach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
438 res = gpioc_attach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
447 if (gpioc_intr_reconfig_allowed(priv, intr_conf)) { in gpioc_set_intr_config()
451 res = gpioc_detach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
457 if (!gpioc_intr_reconfig_allowed(priv, intr_conf)) in gpioc_set_intr_config()
464 res = gpioc_attach_priv_pin(priv, intr_conf); in gpioc_set_intr_config()
513 struct gpioc_cdevpriv *priv = privs->priv; in gpioc_interrupt_handler() local
516 mtx_lock(&priv->mtx); in gpioc_interrupt_handler()
517 SLIST_FOREACH(privpin, &priv->pins, next) { in gpioc_interrupt_handler()
524 mtx_unlock(&priv->mtx); in gpioc_interrupt_handler()
528 if (priv->report_option == GPIO_EVENT_REPORT_DETAIL) { in gpioc_interrupt_handler()
529 event = next_head_event(priv); in gpioc_interrupt_handler()
531 if (priv->evidx_head == priv->evidx_tail) in gpioc_interrupt_handler()
532 next_tail_event(priv); in gpioc_interrupt_handler()
535 event = &priv->events[privpin->firstevent + 1]; in gpioc_interrupt_handler()
537 privpin->firstevent = priv->evidx_head; in gpioc_interrupt_handler()
538 event = next_head_event(priv); in gpioc_interrupt_handler()
542 event = next_head_event(priv); in gpioc_interrupt_handler()
549 wakeup(priv); in gpioc_interrupt_handler()
550 selwakeup(&priv->selinfo); in gpioc_interrupt_handler()
551 KNOTE_LOCKED(&priv->selinfo.si_note, 0); in gpioc_interrupt_handler()
552 if (priv->async == true && priv->sigio != NULL) in gpioc_interrupt_handler()
553 pgsigio(&priv->sigio, SIGIO, 0); in gpioc_interrupt_handler()
554 mtx_unlock(&priv->mtx); in gpioc_interrupt_handler()
634 struct gpioc_cdevpriv *priv; in gpioc_cdevpriv_dtor() local
639 priv = data; in gpioc_cdevpriv_dtor()
641 SLIST_FOREACH_SAFE(pin_link, &priv->pins, next, pin_link_temp) { in gpioc_cdevpriv_dtor()
649 if (priv_link->priv == priv) { in gpioc_cdevpriv_dtor()
658 if (gpioc_intr_reconfig_allowed(priv, pin_link->pin)) { in gpioc_cdevpriv_dtor()
662 SLIST_REMOVE(&priv->pins, pin_link, gpioc_pins, next); in gpioc_cdevpriv_dtor()
666 wakeup(&priv); in gpioc_cdevpriv_dtor()
667 knlist_clear(&priv->selinfo.si_note, 0); in gpioc_cdevpriv_dtor()
668 seldrain(&priv->selinfo); in gpioc_cdevpriv_dtor()
669 knlist_destroy(&priv->selinfo.si_note); in gpioc_cdevpriv_dtor()
670 funsetown(&priv->sigio); in gpioc_cdevpriv_dtor()
672 mtx_destroy(&priv->mtx); in gpioc_cdevpriv_dtor()
673 free(priv->events, M_GPIOC); in gpioc_cdevpriv_dtor()
680 struct gpioc_cdevpriv *priv; in gpioc_open() local
683 priv = malloc(sizeof(*priv), M_GPIOC, M_WAITOK | M_ZERO); in gpioc_open()
684 priv->sc = dev->si_drv1; in gpioc_open()
685 priv->report_option = GPIO_EVENT_REPORT_DETAIL; in gpioc_open()
686 err = devfs_set_cdevpriv(priv, gpioc_cdevpriv_dtor); in gpioc_open()
688 gpioc_cdevpriv_dtor(priv); in gpioc_open()
691 mtx_init(&priv->mtx, "gpioc priv", NULL, MTX_DEF); in gpioc_open()
692 knlist_init_mtx(&priv->selinfo.si_note, &priv->mtx); in gpioc_open()
701 priv->numevents = priv->sc->sc_npins * 2; in gpioc_open()
702 priv->events = malloc(priv->numevents * sizeof(struct gpio_event_detail), in gpioc_open()
711 struct gpioc_cdevpriv *priv; in gpioc_read() local
721 if ((err = devfs_get_cdevpriv((void **)&priv)) != 0) in gpioc_read()
724 if (priv->report_option == GPIO_EVENT_REPORT_SUMMARY) in gpioc_read()
732 mtx_lock(&priv->mtx); in gpioc_read()
733 while (priv->evidx_head == priv->evidx_tail) { in gpioc_read()
734 if (SLIST_EMPTY(&priv->pins)) { in gpioc_read()
741 err = mtx_sleep(priv, &priv->mtx, PCATCH, "gpintr", 0); in gpioc_read()
748 priv->evidx_tail != priv->evidx_head) { in gpioc_read()
749 event = next_tail_event(priv); in gpioc_read()
750 if (priv->report_option == GPIO_EVENT_REPORT_SUMMARY) { in gpioc_read()
755 event = next_tail_event(priv); in gpioc_read()
765 mtx_unlock(&priv->mtx); in gpioc_read()
767 mtx_lock(&priv->mtx); in gpioc_read()
769 mtx_unlock(&priv->mtx); in gpioc_read()
780 struct gpioc_cdevpriv *priv; in gpioc_ioctl() local
805 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
808 pin.gp_flags |= gpioc_get_intr_config(sc, priv, in gpioc_ioctl()
817 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
850 res = gpioc_set_intr_config(sc, priv, pin.gp_pin, in gpioc_ioctl()
892 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
896 if (!SLIST_EMPTY(&priv->pins)) { in gpioc_ioctl()
905 priv->report_option = evcfg->gp_report_type; in gpioc_ioctl()
907 if (priv->report_option == GPIO_EVENT_REPORT_DETAIL && in gpioc_ioctl()
908 priv->numevents < evcfg->gp_fifo_size) { in gpioc_ioctl()
909 free(priv->events, M_GPIOC); in gpioc_ioctl()
910 priv->numevents = evcfg->gp_fifo_size; in gpioc_ioctl()
911 priv->events = malloc(priv->numevents * in gpioc_ioctl()
914 priv->evidx_head = priv->evidx_tail = 0; in gpioc_ioctl()
927 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
930 priv->async = true; in gpioc_ioctl()
932 priv->async = false; in gpioc_ioctl()
936 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
938 *(int *)arg = fgetown(&priv->sigio); in gpioc_ioctl()
941 res = devfs_get_cdevpriv((void **)&priv); in gpioc_ioctl()
943 res = fsetown(*(int *)arg, &priv->sigio); in gpioc_ioctl()
956 struct gpioc_cdevpriv *priv; in gpioc_poll() local
962 err = devfs_get_cdevpriv((void **)&priv); in gpioc_poll()
968 if (SLIST_EMPTY(&priv->pins)) { in gpioc_poll()
974 if (priv->evidx_head != priv->evidx_tail) in gpioc_poll()
977 selrecord(td, &priv->selinfo); in gpioc_poll()
986 struct gpioc_cdevpriv *priv; in gpioc_kqfilter() local
990 err = devfs_get_cdevpriv((void **)&priv); in gpioc_kqfilter()
994 if (SLIST_EMPTY(&priv->pins)) in gpioc_kqfilter()
1000 kn->kn_hook = (void *)priv; in gpioc_kqfilter()
1006 knlist = &priv->selinfo.si_note; in gpioc_kqfilter()
1015 struct gpioc_cdevpriv *priv = kn->kn_hook; in gpioc_kqread() local
1019 if (SLIST_EMPTY(&priv->pins)) { in gpioc_kqread()
1023 if (priv->evidx_head != priv->evidx_tail) { in gpioc_kqread()
1024 if (priv->report_option == GPIO_EVENT_REPORT_SUMMARY) in gpioc_kqread()
1028 kn->kn_data = recsize * number_of_events(priv); in gpioc_kqread()
1038 struct gpioc_cdevpriv *priv = kn->kn_hook; in gpioc_kqdetach() local
1039 struct knlist *knlist = &priv->selinfo.si_note; in gpioc_kqdetach()