Lines Matching refs:lr
574 struct linereq *lr = container_of(nb, struct linereq, in linereq_unregistered_notify() local
577 wake_up_poll(&lr->wait, EPOLLIN | EPOLLERR); in linereq_unregistered_notify()
582 static void linereq_put_event(struct linereq *lr, in linereq_put_event() argument
587 scoped_guard(spinlock, &lr->wait.lock) { in linereq_put_event()
588 if (kfifo_is_full(&lr->events)) { in linereq_put_event()
590 kfifo_skip(&lr->events); in linereq_put_event()
592 kfifo_in(&lr->events, le, 1); in linereq_put_event()
595 wake_up_poll(&lr->wait, EPOLLIN); in linereq_put_event()
641 struct linereq *lr; in process_hw_ts_thread() local
650 lr = line->req; in process_hw_ts_thread()
678 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno; in process_hw_ts_thread()
681 linereq_put_event(lr, &le); in process_hw_ts_thread()
689 struct linereq *lr; in process_hw_ts() local
698 lr = line->req; in process_hw_ts()
711 if (lr->num_lines != 1) in process_hw_ts()
713 &lr->seqno); in process_hw_ts()
760 struct linereq *lr = line->req; in edge_irq_thread() local
775 if (lr->num_lines != 1) in edge_irq_thread()
776 line->req_seqno = atomic_inc_return(&lr->seqno); in edge_irq_thread()
795 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno; in edge_irq_thread()
798 linereq_put_event(lr, &le); in edge_irq_thread()
806 struct linereq *lr = line->req; in edge_irq_handler() local
814 if (lr->num_lines != 1) in edge_irq_handler()
815 line->req_seqno = atomic_inc_return(&lr->seqno); in edge_irq_handler()
854 struct linereq *lr; in debounce_work_func() local
892 lr = line->req; in debounce_work_func()
903 le.seqno = (lr->num_lines == 1) ? in debounce_work_func()
904 le.line_seqno : atomic_add_return(diff_seqno, &lr->seqno); in debounce_work_func()
910 le.seqno = (lr->num_lines == 1) ? in debounce_work_func()
911 le.line_seqno : atomic_inc_return(&lr->seqno); in debounce_work_func()
916 linereq_put_event(lr, &le); in debounce_work_func()
1273 static long linereq_get_values(struct linereq *lr, void __user *ip) in linereq_get_values() argument
1294 for (num_get = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1298 descs = &lr->lines[i].desc; in linereq_get_values()
1310 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1312 descs[didx] = lr->lines[i].desc; in linereq_get_values()
1326 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1329 if (lr->lines[i].sw_debounced) in linereq_get_values()
1330 val = debounced_value(&lr->lines[i]); in linereq_get_values()
1345 static long linereq_set_values(struct linereq *lr, void __user *ip) in linereq_set_values() argument
1356 guard(mutex)(&lr->config_mutex); in linereq_set_values()
1367 for (num_set = 0, i = 0; i < lr->num_lines; i++) { in linereq_set_values()
1374 descs = &lr->lines[i].desc; in linereq_set_values()
1385 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_set_values()
1387 descs[didx] = lr->lines[i].desc; in linereq_set_values()
1400 static long linereq_set_config(struct linereq *lr, void __user *ip) in linereq_set_config() argument
1412 ret = gpio_v2_line_config_validate(&lc, lr->num_lines); in linereq_set_config()
1416 guard(mutex)(&lr->config_mutex); in linereq_set_config()
1418 for (i = 0; i < lr->num_lines; i++) { in linereq_set_config()
1419 line = &lr->lines[i]; in linereq_set_config()
1420 desc = lr->lines[i].desc; in linereq_set_config()
1457 struct linereq *lr = file->private_data; in linereq_ioctl() local
1460 guard(srcu)(&lr->gdev->srcu); in linereq_ioctl()
1462 if (!rcu_access_pointer(lr->gdev->chip)) in linereq_ioctl()
1467 return linereq_get_values(lr, ip); in linereq_ioctl()
1469 return linereq_set_values(lr, ip); in linereq_ioctl()
1471 return linereq_set_config(lr, ip); in linereq_ioctl()
1488 struct linereq *lr = file->private_data; in linereq_poll() local
1491 guard(srcu)(&lr->gdev->srcu); in linereq_poll()
1493 if (!rcu_access_pointer(lr->gdev->chip)) in linereq_poll()
1496 poll_wait(file, &lr->wait, wait); in linereq_poll()
1498 if (!kfifo_is_empty_spinlocked_noirqsave(&lr->events, in linereq_poll()
1499 &lr->wait.lock)) in linereq_poll()
1508 struct linereq *lr = file->private_data; in linereq_read() local
1513 guard(srcu)(&lr->gdev->srcu); in linereq_read()
1515 if (!rcu_access_pointer(lr->gdev->chip)) in linereq_read()
1522 scoped_guard(spinlock, &lr->wait.lock) { in linereq_read()
1523 if (kfifo_is_empty(&lr->events)) { in linereq_read()
1530 ret = wait_event_interruptible_locked(lr->wait, in linereq_read()
1531 !kfifo_is_empty(&lr->events)); in linereq_read()
1536 if (kfifo_out(&lr->events, &le, 1) != 1) { in linereq_read()
1555 static void linereq_free(struct linereq *lr) in linereq_free() argument
1559 if (lr->device_unregistered_nb.notifier_call) in linereq_free()
1560 blocking_notifier_chain_unregister(&lr->gdev->device_notifier, in linereq_free()
1561 &lr->device_unregistered_nb); in linereq_free()
1563 for (i = 0; i < lr->num_lines; i++) { in linereq_free()
1564 if (lr->lines[i].desc) { in linereq_free()
1565 edge_detector_stop(&lr->lines[i]); in linereq_free()
1566 gpiod_free(lr->lines[i].desc); in linereq_free()
1569 kfifo_free(&lr->events); in linereq_free()
1570 kfree(lr->label); in linereq_free()
1571 gpio_device_put(lr->gdev); in linereq_free()
1572 kvfree(lr); in linereq_free()
1577 struct linereq *lr = file->private_data; in linereq_release() local
1579 linereq_free(lr); in linereq_release()
1586 struct linereq *lr = file->private_data; in linereq_show_fdinfo() local
1587 struct device *dev = &lr->gdev->dev; in linereq_show_fdinfo()
1592 for (i = 0; i < lr->num_lines; i++) in linereq_show_fdinfo()
1594 gpio_chip_hwgpio(lr->lines[i].desc)); in linereq_show_fdinfo()
1617 struct linereq *lr; in linereq_create() local
1637 lr = kvzalloc(struct_size(lr, lines, ulr.num_lines), GFP_KERNEL); in linereq_create()
1638 if (!lr) in linereq_create()
1640 lr->num_lines = ulr.num_lines; in linereq_create()
1642 lr->gdev = gpio_device_get(gdev); in linereq_create()
1645 lr->lines[i].req = lr; in linereq_create()
1646 WRITE_ONCE(lr->lines[i].sw_debounced, 0); in linereq_create()
1647 INIT_DELAYED_WORK(&lr->lines[i].work, debounce_work_func); in linereq_create()
1652 lr->label = kstrndup(ulr.consumer, sizeof(ulr.consumer) - 1, in linereq_create()
1654 if (!lr->label) { in linereq_create()
1660 mutex_init(&lr->config_mutex); in linereq_create()
1661 init_waitqueue_head(&lr->wait); in linereq_create()
1662 INIT_KFIFO(lr->events); in linereq_create()
1663 lr->event_buffer_size = ulr.event_buffer_size; in linereq_create()
1664 if (lr->event_buffer_size == 0) in linereq_create()
1665 lr->event_buffer_size = ulr.num_lines * 16; in linereq_create()
1666 else if (lr->event_buffer_size > GPIO_V2_LINES_MAX * 16) in linereq_create()
1667 lr->event_buffer_size = GPIO_V2_LINES_MAX * 16; in linereq_create()
1669 atomic_set(&lr->seqno, 0); in linereq_create()
1681 ret = gpiod_request_user(desc, lr->label); in linereq_create()
1685 lr->lines[i].desc = desc; in linereq_create()
1709 ret = edge_detector_setup(&lr->lines[i], lc, i, in linereq_create()
1715 lr->lines[i].edflags = edflags; in linereq_create()
1723 lr->device_unregistered_nb.notifier_call = linereq_unregistered_notify; in linereq_create()
1725 &lr->device_unregistered_nb); in linereq_create()
1735 file = anon_inode_getfile("gpio-line", &line_fileops, lr, in linereq_create()
1756 lr->num_lines); in linereq_create()
1763 linereq_free(lr); in linereq_create()