Lines Matching refs:lr

615 	struct linereq *lr = container_of(nb, struct linereq,
618 wake_up_poll(&lr->wait, EPOLLIN | EPOLLERR);
623 static void linereq_put_event(struct linereq *lr,
628 spin_lock(&lr->wait.lock);
629 if (kfifo_is_full(&lr->events)) {
631 kfifo_skip(&lr->events);
633 kfifo_in(&lr->events, le, 1);
634 spin_unlock(&lr->wait.lock);
636 wake_up_poll(&lr->wait, EPOLLIN);
663 struct linereq *lr;
672 lr = line->req;
700 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno;
703 linereq_put_event(lr, &le);
711 struct linereq *lr;
720 lr = line->req;
733 if (lr->num_lines != 1)
735 &lr->seqno);
782 struct linereq *lr = line->req;
797 if (lr->num_lines != 1)
798 line->req_seqno = atomic_inc_return(&lr->seqno);
817 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno;
820 linereq_put_event(lr, &le);
828 struct linereq *lr = line->req;
836 if (lr->num_lines != 1)
837 line->req_seqno = atomic_inc_return(&lr->seqno);
876 struct linereq *lr;
914 lr = line->req;
925 le.seqno = (lr->num_lines == 1) ?
926 le.line_seqno : atomic_add_return(diff_seqno, &lr->seqno);
932 le.seqno = (lr->num_lines == 1) ?
933 le.line_seqno : atomic_inc_return(&lr->seqno);
938 linereq_put_event(lr, &le);
1262 static long linereq_get_values(struct linereq *lr, void __user *ip)
1275 for (num_get = 0, i = 0; i < lr->num_lines; i++) {
1278 descs = &lr->lines[i].desc;
1289 for (didx = 0, i = 0; i < lr->num_lines; i++) {
1291 descs[didx] = lr->lines[i].desc;
1305 for (didx = 0, i = 0; i < lr->num_lines; i++) {
1307 if (lr->lines[i].sw_debounced)
1308 val = debounced_value(&lr->lines[i]);
1323 static long linereq_set_values_unlocked(struct linereq *lr,
1332 for (num_set = 0, i = 0; i < lr->num_lines; i++) {
1334 if (!test_bit(FLAG_IS_OUT, &lr->lines[i].desc->flags))
1339 descs = &lr->lines[i].desc;
1350 for (didx = 0, i = 0; i < lr->num_lines; i++) {
1352 descs[didx] = lr->lines[i].desc;
1365 static long linereq_set_values(struct linereq *lr, void __user *ip)
1373 mutex_lock(&lr->config_mutex);
1375 ret = linereq_set_values_unlocked(lr, &lv);
1377 mutex_unlock(&lr->config_mutex);
1382 static long linereq_set_config_unlocked(struct linereq *lr,
1391 for (i = 0; i < lr->num_lines; i++) {
1392 line = &lr->lines[i];
1393 desc = lr->lines[i].desc;
1425 static long linereq_set_config(struct linereq *lr, void __user *ip)
1433 ret = gpio_v2_line_config_validate(&lc, lr->num_lines);
1437 mutex_lock(&lr->config_mutex);
1439 ret = linereq_set_config_unlocked(lr, &lc);
1441 mutex_unlock(&lr->config_mutex);
1449 struct linereq *lr = file->private_data;
1452 if (!lr->gdev->chip)
1457 return linereq_get_values(lr, ip);
1459 return linereq_set_values(lr, ip);
1461 return linereq_set_config(lr, ip);
1470 struct linereq *lr = file->private_data;
1472 return call_ioctl_locked(file, cmd, arg, lr->gdev,
1487 struct linereq *lr = file->private_data;
1490 if (!lr->gdev->chip)
1493 poll_wait(file, &lr->wait, wait);
1495 if (!kfifo_is_empty_spinlocked_noirqsave(&lr->events,
1496 &lr->wait.lock))
1505 struct linereq *lr = file->private_data;
1507 return call_poll_locked(file, wait, lr->gdev, linereq_poll_unlocked);
1513 struct linereq *lr = file->private_data;
1518 if (!lr->gdev->chip)
1525 spin_lock(&lr->wait.lock);
1526 if (kfifo_is_empty(&lr->events)) {
1528 spin_unlock(&lr->wait.lock);
1533 spin_unlock(&lr->wait.lock);
1537 ret = wait_event_interruptible_locked(lr->wait,
1538 !kfifo_is_empty(&lr->events));
1540 spin_unlock(&lr->wait.lock);
1545 ret = kfifo_out(&lr->events, &le, 1);
1546 spin_unlock(&lr->wait.lock);
1568 struct linereq *lr = file->private_data;
1570 return call_read_locked(file, buf, count, f_ps, lr->gdev,
1574 static void linereq_free(struct linereq *lr)
1578 if (lr->device_unregistered_nb.notifier_call)
1579 blocking_notifier_chain_unregister(&lr->gdev->device_notifier,
1580 &lr->device_unregistered_nb);
1582 for (i = 0; i < lr->num_lines; i++) {
1583 if (lr->lines[i].desc) {
1584 edge_detector_stop(&lr->lines[i]);
1585 gpiod_free(lr->lines[i].desc);
1588 kfifo_free(&lr->events);
1589 kfree(lr->label);
1590 gpio_device_put(lr->gdev);
1591 kfree(lr);
1596 struct linereq *lr = file->private_data;
1598 linereq_free(lr);
1605 struct linereq *lr = file->private_data;
1606 struct device *dev = &lr->gdev->dev;
1611 for (i = 0; i < lr->num_lines; i++)
1613 gpio_chip_hwgpio(lr->lines[i].desc));
1636 struct linereq *lr;
1656 lr = kzalloc(struct_size(lr, lines, ulr.num_lines), GFP_KERNEL);
1657 if (!lr)
1660 lr->gdev = gpio_device_get(gdev);
1663 lr->lines[i].req = lr;
1664 WRITE_ONCE(lr->lines[i].sw_debounced, 0);
1665 INIT_DELAYED_WORK(&lr->lines[i].work, debounce_work_func);
1670 lr->label = kstrndup(ulr.consumer, sizeof(ulr.consumer) - 1,
1672 if (!lr->label) {
1678 mutex_init(&lr->config_mutex);
1679 init_waitqueue_head(&lr->wait);
1680 lr->event_buffer_size = ulr.event_buffer_size;
1681 if (lr->event_buffer_size == 0)
1682 lr->event_buffer_size = ulr.num_lines * 16;
1683 else if (lr->event_buffer_size > GPIO_V2_LINES_MAX * 16)
1684 lr->event_buffer_size = GPIO_V2_LINES_MAX * 16;
1686 atomic_set(&lr->seqno, 0);
1687 lr->num_lines = ulr.num_lines;
1699 ret = gpiod_request_user(desc, lr->label);
1703 lr->lines[i].desc = desc;
1727 ret = edge_detector_setup(&lr->lines[i], lc, i,
1733 lr->lines[i].edflags = edflags;
1741 lr->device_unregistered_nb.notifier_call = linereq_unregistered_notify;
1743 &lr->device_unregistered_nb);
1753 file = anon_inode_getfile("gpio-line", &line_fileops, lr,
1774 lr->num_lines);
1781 linereq_free(lr);