Lines Matching +full:hte +full:- +full:gpio

1 // SPDX-License-Identifier: GPL-2.0
14 #include <linux/gpio.h>
15 #include <linux/gpio/driver.h>
16 #include <linux/hte.h>
34 #include <uapi/linux/gpio.h>
37 #include "gpiolib-cdev.h"
40 * Array sizes must ensure 64-bit alignment and not create holes in the
47 * Check that uAPI structs are 64-bit aligned for 32/64-bit compatibility
58 /* Character device interface to GPIO.
60 * The GPIO character device, /dev/gpiochipN, provides userspace an
70 * GPIO line handle management
75 * struct linehandle_state - contains the state of a userspace handle
76 * @gdev: the GPIO device the handle pertains to
78 * @descs: the GPIO descriptors held by this handle
102 return -EINVAL; in linehandle_validate_flags()
110 return -EINVAL; in linehandle_validate_flags()
119 return -EINVAL; in linehandle_validate_flags()
125 return -EINVAL; in linehandle_validate_flags()
133 return -EINVAL; in linehandle_validate_flags()
141 return -EINVAL; in linehandle_validate_flags()
171 return -EFAULT; in linehandle_set_config()
178 for (i = 0; i < lh->num_descs; i++) { in linehandle_set_config()
179 desc = lh->descs[i]; in linehandle_set_config()
180 linehandle_flags_to_desc_flags(gcnf.flags, &desc->flags); in linehandle_set_config()
206 struct linehandle_state *lh = file->private_data; in linehandle_ioctl()
213 guard(rwsem_read)(&lh->gdev->sem); in linehandle_ioctl()
215 if (!lh->gdev->chip) in linehandle_ioctl()
216 return -ENODEV; in linehandle_ioctl()
222 lh->num_descs, lh->descs, in linehandle_ioctl()
228 for (i = 0; i < lh->num_descs; i++) in linehandle_ioctl()
232 return -EFAULT; in linehandle_ioctl()
240 if (!test_bit(FLAG_IS_OUT, &lh->descs[0]->flags)) in linehandle_ioctl()
241 return -EPERM; in linehandle_ioctl()
244 return -EFAULT; in linehandle_ioctl()
247 for (i = 0; i < lh->num_descs; i++) in linehandle_ioctl()
253 lh->num_descs, in linehandle_ioctl()
254 lh->descs, in linehandle_ioctl()
260 return -EINVAL; in linehandle_ioctl()
276 for (i = 0; i < lh->num_descs; i++) in linehandle_free()
277 if (lh->descs[i]) in linehandle_free()
278 gpiod_free(lh->descs[i]); in linehandle_free()
279 kfree(lh->label); in linehandle_free()
280 gpio_device_put(lh->gdev); in linehandle_free()
286 linehandle_free(file->private_data); in linehandle_release()
309 return -EFAULT; in linehandle_create()
311 return -EINVAL; in linehandle_create()
321 return -ENOMEM; in linehandle_create()
322 lh->gdev = gpio_device_get(gdev); in linehandle_create()
326 lh->label = kstrndup(handlereq.consumer_label, in linehandle_create()
327 sizeof(handlereq.consumer_label) - 1, in linehandle_create()
329 if (!lh->label) { in linehandle_create()
330 ret = -ENOMEM; in linehandle_create()
335 lh->num_descs = handlereq.lines; in linehandle_create()
337 /* Request each GPIO */ in linehandle_create()
340 struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset); in linehandle_create()
347 ret = gpiod_request_user(desc, lh->label); in linehandle_create()
350 lh->descs[i] = desc; in linehandle_create()
351 linehandle_flags_to_desc_flags(handlereq.flags, &desc->flags); in linehandle_create()
375 dev_dbg(&gdev->dev, "registered chardev handle for line %d\n", in linehandle_create()
385 file = anon_inode_getfile("gpio-linehandle", in linehandle_create()
402 return -EFAULT; in linehandle_create()
407 dev_dbg(&gdev->dev, "registered chardev handle for %d lines\n", in linehandle_create()
408 lh->num_descs); in linehandle_create()
421 * struct line - contains the state of a requested line
423 * @desc: the GPIO descriptor for this line.
425 * @irq: the interrupt triggered in response to events on this GPIO
438 * @hdesc: the Hardware Timestamp Engine (HTE) descriptor
447 * -- edge detector specific fields --
475 * -- debouncer specific fields --
502 * HTE provider sets line level at the time of event. The valid
507 * when sw_debounce is set on HTE enabled line, this is running
512 * when sw_debounce is set on HTE enabled line, this variable records
531 * struct linereq - contains the state of a userspace line request
532 * @gdev: the GPIO device the line request pertains to
533 * @label: consumer label used to tag GPIO descriptors
538 * @events: KFIFO for the GPIO events
543 * of configuration, particularly multi-step accesses to desc flags and
571 if (line->desc < entry->desc) { in supinfo_insert()
572 new = &((*new)->rb_left); in supinfo_insert()
573 } else if (line->desc > entry->desc) { in supinfo_insert()
574 new = &((*new)->rb_right); in supinfo_insert()
582 rb_link_node(&line->node, parent, new); in supinfo_insert()
583 rb_insert_color(&line->node, &supinfo_tree); in supinfo_insert()
590 rb_erase(&line->node, &supinfo_tree); in supinfo_erase()
600 if (desc < line->desc) in supinfo_find()
601 node = node->rb_left; in supinfo_find()
602 else if (desc > line->desc) in supinfo_find()
603 node = node->rb_right; in supinfo_find()
622 attr = &info->attrs[info->num_attrs]; in supinfo_to_lineinfo()
623 attr->id = GPIO_V2_LINE_ATTR_ID_DEBOUNCE; in supinfo_to_lineinfo()
624 attr->debounce_period_us = READ_ONCE(line->debounce_period_us); in supinfo_to_lineinfo()
625 info->num_attrs++; in supinfo_to_lineinfo()
630 return READ_ONCE(line->debounce_period_us); in line_has_supinfo()
644 WRITE_ONCE(line->debounce_period_us, debounce_period_us); in line_set_debounce_period()
697 wake_up_poll(&lr->wait, EPOLLIN | EPOLLERR); in linereq_unregistered_notify()
707 scoped_guard(spinlock, &lr->wait.lock) { in linereq_put_event()
708 if (kfifo_is_full(&lr->events)) { in linereq_put_event()
710 kfifo_skip(&lr->events); in linereq_put_event()
712 kfifo_in(&lr->events, le, 1); in linereq_put_event()
715 wake_up_poll(&lr->wait, EPOLLIN); in linereq_put_event()
717 pr_debug_ratelimited("event FIFO is full - event dropped\n"); in linereq_put_event()
722 if (test_bit(FLAG_EVENT_CLOCK_REALTIME, &line->desc->flags)) in line_event_timestamp()
725 test_bit(FLAG_EVENT_CLOCK_HTE, &line->desc->flags)) in line_event_timestamp()
726 return line->timestamp_ns; in line_event_timestamp()
751 lr = line->req; in process_hw_ts_thread()
755 le.timestamp_ns = line->timestamp_ns; in process_hw_ts_thread()
756 edflags = READ_ONCE(line->edflags); in process_hw_ts_thread()
760 level = (line->raw_level >= 0) ? in process_hw_ts_thread()
761 line->raw_level : in process_hw_ts_thread()
762 gpiod_get_raw_value_cansleep(line->desc); in process_hw_ts_thread()
778 le.line_seqno = line->line_seqno; in process_hw_ts_thread()
779 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno; in process_hw_ts_thread()
780 le.offset = gpio_chip_hwgpio(line->desc); in process_hw_ts_thread()
797 line->timestamp_ns = ts->tsc; in process_hw_ts()
798 line->raw_level = ts->raw_level; in process_hw_ts()
799 lr = line->req; in process_hw_ts()
801 if (READ_ONCE(line->sw_debounced)) { in process_hw_ts()
802 line->total_discard_seq++; in process_hw_ts()
803 line->last_seqno = ts->seq; in process_hw_ts()
804 mod_delayed_work(system_wq, &line->work, in process_hw_ts()
805 usecs_to_jiffies(READ_ONCE(line->debounce_period_us))); in process_hw_ts()
807 if (unlikely(ts->seq < line->line_seqno)) in process_hw_ts()
810 diff_seqno = ts->seq - line->line_seqno; in process_hw_ts()
811 line->line_seqno = ts->seq; in process_hw_ts()
812 if (lr->num_lines != 1) in process_hw_ts()
813 line->req_seqno = atomic_add_return(diff_seqno, in process_hw_ts()
814 &lr->seqno); in process_hw_ts()
826 struct hte_ts_desc *hdesc = &line->hdesc; in hte_edge_setup()
829 flags |= test_bit(FLAG_ACTIVE_LOW, &line->desc->flags) ? in hte_edge_setup()
833 flags |= test_bit(FLAG_ACTIVE_LOW, &line->desc->flags) ? in hte_edge_setup()
837 line->total_discard_seq = 0; in hte_edge_setup()
839 hte_init_line_attr(hdesc, desc_to_gpio(line->desc), flags, NULL, in hte_edge_setup()
840 line->desc); in hte_edge_setup()
861 struct linereq *lr = line->req; in edge_irq_thread()
867 if (line->timestamp_ns) { in edge_irq_thread()
868 le.timestamp_ns = line->timestamp_ns; in edge_irq_thread()
876 if (lr->num_lines != 1) in edge_irq_thread()
877 line->req_seqno = atomic_inc_return(&lr->seqno); in edge_irq_thread()
879 line->timestamp_ns = 0; in edge_irq_thread()
881 switch (READ_ONCE(line->edflags) & GPIO_V2_LINE_EDGE_FLAGS) { in edge_irq_thread()
883 le.id = line_event_id(gpiod_get_value_cansleep(line->desc)); in edge_irq_thread()
894 line->line_seqno++; in edge_irq_thread()
895 le.line_seqno = line->line_seqno; in edge_irq_thread()
896 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno; in edge_irq_thread()
897 le.offset = gpio_chip_hwgpio(line->desc); in edge_irq_thread()
907 struct linereq *lr = line->req; in edge_irq_handler()
913 line->timestamp_ns = line_event_timestamp(line); in edge_irq_handler()
915 if (lr->num_lines != 1) in edge_irq_handler()
916 line->req_seqno = atomic_inc_return(&lr->seqno); in edge_irq_handler()
929 * minor race - debouncer may be stopped here, so edge_detector_stop() in debounced_value()
933 value = READ_ONCE(line->level); in debounced_value()
935 if (test_bit(FLAG_ACTIVE_LOW, &line->desc->flags)) in debounced_value()
945 mod_delayed_work(system_wq, &line->work, in debounce_irq_handler()
946 usecs_to_jiffies(READ_ONCE(line->debounce_period_us))); in debounce_irq_handler()
956 u64 eflags, edflags = READ_ONCE(line->edflags); in debounce_work_func()
957 int level = -1; in debounce_work_func()
962 level = line->raw_level; in debounce_work_func()
965 level = gpiod_get_raw_value_cansleep(line->desc); in debounce_work_func()
971 if (READ_ONCE(line->level) == level) in debounce_work_func()
974 WRITE_ONCE(line->level, level); in debounce_work_func()
976 /* -- edge detection -- */ in debounce_work_func()
981 /* switch from physical level to logical - if they differ */ in debounce_work_func()
993 lr = line->req; in debounce_work_func()
995 le.offset = gpio_chip_hwgpio(line->desc); in debounce_work_func()
999 line->total_discard_seq -= 1; in debounce_work_func()
1000 diff_seqno = line->last_seqno - line->total_discard_seq - in debounce_work_func()
1001 line->line_seqno; in debounce_work_func()
1002 line->line_seqno = line->last_seqno - line->total_discard_seq; in debounce_work_func()
1003 le.line_seqno = line->line_seqno; in debounce_work_func()
1004 le.seqno = (lr->num_lines == 1) ? in debounce_work_func()
1005 le.line_seqno : atomic_add_return(diff_seqno, &lr->seqno); in debounce_work_func()
1009 line->line_seqno++; in debounce_work_func()
1010 le.line_seqno = line->line_seqno; in debounce_work_func()
1011 le.seqno = (lr->num_lines == 1) ? in debounce_work_func()
1012 le.line_seqno : atomic_inc_return(&lr->seqno); in debounce_work_func()
1026 ret = gpiod_set_debounce(line->desc, debounce_period_us); in debounce_setup()
1031 if (ret != -ENOTSUPP) in debounce_setup()
1036 level = gpiod_get_raw_value_cansleep(line->desc); in debounce_setup()
1041 test_bit(FLAG_EVENT_CLOCK_HTE, &line->desc->flags))) { in debounce_setup()
1042 irq = gpiod_to_irq(line->desc); in debounce_setup()
1044 return -ENXIO; in debounce_setup()
1048 line->req->label, line); in debounce_setup()
1051 line->irq = irq; in debounce_setup()
1058 WRITE_ONCE(line->level, level); in debounce_setup()
1059 WRITE_ONCE(line->sw_debounced, 1); in debounce_setup()
1070 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_debounced()
1071 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_DEBOUNCE) && in gpio_v2_line_config_debounced()
1072 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_debounced()
1084 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_debounce_period()
1085 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_DEBOUNCE) && in gpio_v2_line_config_debounce_period()
1086 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_debounce_period()
1087 return lc->attrs[i].attr.debounce_period_us; in gpio_v2_line_config_debounce_period()
1094 if (line->irq) { in edge_detector_stop()
1095 free_irq(line->irq, line); in edge_detector_stop()
1096 line->irq = 0; in edge_detector_stop()
1100 if (READ_ONCE(line->edflags) & GPIO_V2_LINE_FLAG_EVENT_CLOCK_HTE) in edge_detector_stop()
1101 hte_ts_put(&line->hdesc); in edge_detector_stop()
1104 cancel_delayed_work_sync(&line->work); in edge_detector_stop()
1105 WRITE_ONCE(line->sw_debounced, 0); in edge_detector_stop()
1106 WRITE_ONCE(line->edflags, 0); in edge_detector_stop()
1108 /* do not change line->level - see comment in debounced_value() */ in edge_detector_stop()
1121 if (eflags && !kfifo_initialized(&line->req->events)) { in edge_detector_setup()
1122 ret = kfifo_alloc(&line->req->events, in edge_detector_setup()
1123 line->req->event_buffer_size, GFP_KERNEL); in edge_detector_setup()
1136 if (!eflags || READ_ONCE(line->sw_debounced)) in edge_detector_setup()
1143 irq = gpiod_to_irq(line->desc); in edge_detector_setup()
1145 return -ENXIO; in edge_detector_setup()
1148 irqflags |= test_bit(FLAG_ACTIVE_LOW, &line->desc->flags) ? in edge_detector_setup()
1151 irqflags |= test_bit(FLAG_ACTIVE_LOW, &line->desc->flags) ? in edge_detector_setup()
1157 irqflags, line->req->label, line); in edge_detector_setup()
1161 line->irq = irq; in edge_detector_setup()
1169 u64 active_edflags = READ_ONCE(line->edflags); in edge_detector_update()
1174 (READ_ONCE(line->debounce_period_us) == debounce_period_us)) in edge_detector_update()
1178 if (debounce_period_us && READ_ONCE(line->sw_debounced)) { in edge_detector_update()
1184 if ((line->irq && !READ_ONCE(line->sw_debounced)) || in edge_detector_update()
1186 (!debounce_period_us && READ_ONCE(line->sw_debounced))) in edge_detector_update()
1198 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_flags()
1199 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_FLAGS) && in gpio_v2_line_config_flags()
1200 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_flags()
1201 return lc->attrs[i].attr.flags; in gpio_v2_line_config_flags()
1203 return lc->flags; in gpio_v2_line_config_flags()
1212 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_output_value()
1213 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES) && in gpio_v2_line_config_output_value()
1214 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_output_value()
1215 return !!(lc->attrs[i].attr.values & mask); in gpio_v2_line_config_output_value()
1224 return -EINVAL; in gpio_v2_line_flags_validate()
1228 return -EOPNOTSUPP; in gpio_v2_line_flags_validate()
1236 return -EINVAL; in gpio_v2_line_flags_validate()
1242 return -EINVAL; in gpio_v2_line_flags_validate()
1247 return -EINVAL; in gpio_v2_line_flags_validate()
1256 return -EINVAL; in gpio_v2_line_flags_validate()
1261 return -EINVAL; in gpio_v2_line_flags_validate()
1266 return -EINVAL; in gpio_v2_line_flags_validate()
1274 return -EINVAL; in gpio_v2_line_flags_validate()
1286 if (lc->num_attrs > GPIO_V2_LINE_NUM_ATTRS_MAX) in gpio_v2_line_config_validate()
1287 return -EINVAL; in gpio_v2_line_config_validate()
1289 if (memchr_inv(lc->padding, 0, sizeof(lc->padding))) in gpio_v2_line_config_validate()
1290 return -EINVAL; in gpio_v2_line_config_validate()
1301 return -EINVAL; in gpio_v2_line_config_validate()
1351 return -EFAULT; in linereq_get_values()
1361 for (num_get = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1365 descs = &lr->lines[i].desc; in linereq_get_values()
1370 return -EINVAL; in linereq_get_values()
1376 return -ENOMEM; in linereq_get_values()
1377 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1379 descs[didx] = lr->lines[i].desc; in linereq_get_values()
1393 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1396 if (lr->lines[i].sw_debounced) in linereq_get_values()
1397 val = debounced_value(&lr->lines[i]); in linereq_get_values()
1407 return -EFAULT; in linereq_get_values()
1421 return -EFAULT; in linereq_set_values()
1423 guard(mutex)(&lr->config_mutex); in linereq_set_values()
1429 * is optimized to minimize scanning the lv->mask, and to avoid in linereq_set_values()
1434 for (num_set = 0, i = 0; i < lr->num_lines; i++) { in linereq_set_values()
1437 if (!test_bit(FLAG_IS_OUT, &lr->lines[i].desc->flags)) in linereq_set_values()
1438 return -EPERM; in linereq_set_values()
1444 descs = &lr->lines[i].desc; in linereq_set_values()
1448 return -EINVAL; in linereq_set_values()
1454 return -ENOMEM; in linereq_set_values()
1455 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_set_values()
1457 descs[didx] = lr->lines[i].desc; in linereq_set_values()
1480 return -EFAULT; in linereq_set_config()
1482 ret = gpio_v2_line_config_validate(&lc, lr->num_lines); in linereq_set_config()
1486 guard(mutex)(&lr->config_mutex); in linereq_set_config()
1488 for (i = 0; i < lr->num_lines; i++) { in linereq_set_config()
1489 line = &lr->lines[i]; in linereq_set_config()
1490 desc = lr->lines[i].desc; in linereq_set_config()
1492 gpio_v2_line_config_flags_to_desc_flags(flags, &desc->flags); in linereq_set_config()
1515 WRITE_ONCE(line->edflags, edflags); in linereq_set_config()
1525 struct linereq *lr = file->private_data; in linereq_ioctl()
1528 guard(rwsem_read)(&lr->gdev->sem); in linereq_ioctl()
1530 if (!lr->gdev->chip) in linereq_ioctl()
1531 return -ENODEV; in linereq_ioctl()
1541 return -EINVAL; in linereq_ioctl()
1556 struct linereq *lr = file->private_data; in linereq_poll()
1559 guard(rwsem_read)(&lr->gdev->sem); in linereq_poll()
1561 if (!lr->gdev->chip) in linereq_poll()
1564 poll_wait(file, &lr->wait, wait); in linereq_poll()
1566 if (!kfifo_is_empty_spinlocked_noirqsave(&lr->events, in linereq_poll()
1567 &lr->wait.lock)) in linereq_poll()
1576 struct linereq *lr = file->private_data; in linereq_read()
1581 guard(rwsem_read)(&lr->gdev->sem); in linereq_read()
1583 if (!lr->gdev->chip) in linereq_read()
1584 return -ENODEV; in linereq_read()
1587 return -EINVAL; in linereq_read()
1590 scoped_guard(spinlock, &lr->wait.lock) { in linereq_read()
1591 if (kfifo_is_empty(&lr->events)) { in linereq_read()
1595 if (file->f_flags & O_NONBLOCK) in linereq_read()
1596 return -EAGAIN; in linereq_read()
1598 ret = wait_event_interruptible_locked(lr->wait, in linereq_read()
1599 !kfifo_is_empty(&lr->events)); in linereq_read()
1604 ret = kfifo_out(&lr->events, &le, 1); in linereq_read()
1608 * This should never happen - we were holding the in linereq_read()
1612 ret = -EIO; in linereq_read()
1617 return -EFAULT; in linereq_read()
1629 if (lr->device_unregistered_nb.notifier_call) in linereq_free()
1630 blocking_notifier_chain_unregister(&lr->gdev->device_notifier, in linereq_free()
1631 &lr->device_unregistered_nb); in linereq_free()
1633 for (i = 0; i < lr->num_lines; i++) { in linereq_free()
1634 line = &lr->lines[i]; in linereq_free()
1635 if (!line->desc) in linereq_free()
1641 gpiod_free(line->desc); in linereq_free()
1643 kfifo_free(&lr->events); in linereq_free()
1644 kfree(lr->label); in linereq_free()
1645 gpio_device_put(lr->gdev); in linereq_free()
1651 struct linereq *lr = file->private_data; in linereq_release()
1660 struct linereq *lr = file->private_data; in linereq_show_fdinfo()
1661 struct device *dev = &lr->gdev->dev; in linereq_show_fdinfo()
1664 seq_printf(out, "gpio-chip:\t%s\n", dev_name(dev)); in linereq_show_fdinfo()
1666 for (i = 0; i < lr->num_lines; i++) in linereq_show_fdinfo()
1667 seq_printf(out, "gpio-line:\t%d\n", in linereq_show_fdinfo()
1668 gpio_chip_hwgpio(lr->lines[i].desc)); in linereq_show_fdinfo()
1698 return -EFAULT; in linereq_create()
1701 return -EINVAL; in linereq_create()
1704 return -EINVAL; in linereq_create()
1713 return -ENOMEM; in linereq_create()
1714 lr->num_lines = ulr.num_lines; in linereq_create()
1716 lr->gdev = gpio_device_get(gdev); in linereq_create()
1719 lr->lines[i].req = lr; in linereq_create()
1720 WRITE_ONCE(lr->lines[i].sw_debounced, 0); in linereq_create()
1721 INIT_DELAYED_WORK(&lr->lines[i].work, debounce_work_func); in linereq_create()
1726 lr->label = kstrndup(ulr.consumer, sizeof(ulr.consumer) - 1, in linereq_create()
1728 if (!lr->label) { in linereq_create()
1729 ret = -ENOMEM; in linereq_create()
1734 mutex_init(&lr->config_mutex); in linereq_create()
1735 init_waitqueue_head(&lr->wait); in linereq_create()
1736 lr->event_buffer_size = ulr.event_buffer_size; in linereq_create()
1737 if (lr->event_buffer_size == 0) in linereq_create()
1738 lr->event_buffer_size = ulr.num_lines * 16; in linereq_create()
1739 else if (lr->event_buffer_size > GPIO_V2_LINES_MAX * 16) in linereq_create()
1740 lr->event_buffer_size = GPIO_V2_LINES_MAX * 16; in linereq_create()
1742 atomic_set(&lr->seqno, 0); in linereq_create()
1744 /* Request each GPIO */ in linereq_create()
1747 struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset); in linereq_create()
1754 ret = gpiod_request_user(desc, lr->label); in linereq_create()
1758 lr->lines[i].desc = desc; in linereq_create()
1760 gpio_v2_line_config_flags_to_desc_flags(flags, &desc->flags); in linereq_create()
1782 ret = edge_detector_setup(&lr->lines[i], lc, i, in linereq_create()
1788 lr->lines[i].edflags = edflags; in linereq_create()
1792 dev_dbg(&gdev->dev, "registered chardev handle for line %d\n", in linereq_create()
1796 lr->device_unregistered_nb.notifier_call = linereq_unregistered_notify; in linereq_create()
1797 ret = blocking_notifier_chain_register(&gdev->device_notifier, in linereq_create()
1798 &lr->device_unregistered_nb); in linereq_create()
1808 file = anon_inode_getfile("gpio-line", &line_fileops, lr, in linereq_create()
1823 return -EFAULT; in linereq_create()
1828 dev_dbg(&gdev->dev, "registered chardev handle for %d lines\n", in linereq_create()
1829 lr->num_lines); in linereq_create()
1843 * GPIO line event management
1847 * struct lineevent_state - contains the state of a userspace event
1848 * @gdev: the GPIO device the event pertains to
1850 * @desc: the GPIO descriptor held by this event
1852 * @irq: the interrupt that trigger in response to events on this GPIO
1855 * @events: KFIFO for the GPIO events
1879 struct lineevent_state *le = file->private_data; in lineevent_poll()
1882 guard(rwsem_read)(&le->gdev->sem); in lineevent_poll()
1884 if (!le->gdev->chip) in lineevent_poll()
1887 poll_wait(file, &le->wait, wait); in lineevent_poll()
1889 if (!kfifo_is_empty_spinlocked_noirqsave(&le->events, &le->wait.lock)) in lineevent_poll()
1901 wake_up_poll(&le->wait, EPOLLIN | EPOLLERR); in lineevent_unregistered_notify()
1914 struct lineevent_state *le = file->private_data; in lineevent_read()
1920 guard(rwsem_read)(&le->gdev->sem); in lineevent_read()
1922 if (!le->gdev->chip) in lineevent_read()
1923 return -ENODEV; in lineevent_read()
1939 return -EINVAL; in lineevent_read()
1942 scoped_guard(spinlock, &le->wait.lock) { in lineevent_read()
1943 if (kfifo_is_empty(&le->events)) { in lineevent_read()
1947 if (file->f_flags & O_NONBLOCK) in lineevent_read()
1948 return -EAGAIN; in lineevent_read()
1950 ret = wait_event_interruptible_locked(le->wait, in lineevent_read()
1951 !kfifo_is_empty(&le->events)); in lineevent_read()
1956 ret = kfifo_out(&le->events, &ge, 1); in lineevent_read()
1960 * This should never happen - we were holding the lock in lineevent_read()
1964 ret = -EIO; in lineevent_read()
1969 return -EFAULT; in lineevent_read()
1978 if (le->device_unregistered_nb.notifier_call) in lineevent_free()
1979 blocking_notifier_chain_unregister(&le->gdev->device_notifier, in lineevent_free()
1980 &le->device_unregistered_nb); in lineevent_free()
1981 if (le->irq) in lineevent_free()
1982 free_irq(le->irq, le); in lineevent_free()
1983 if (le->desc) in lineevent_free()
1984 gpiod_free(le->desc); in lineevent_free()
1985 kfree(le->label); in lineevent_free()
1986 gpio_device_put(le->gdev); in lineevent_free()
1992 lineevent_free(file->private_data); in lineevent_release()
1999 struct lineevent_state *le = file->private_data; in lineevent_ioctl()
2003 guard(rwsem_read)(&le->gdev->sem); in lineevent_ioctl()
2005 if (!le->gdev->chip) in lineevent_ioctl()
2006 return -ENODEV; in lineevent_ioctl()
2017 val = gpiod_get_value_cansleep(le->desc); in lineevent_ioctl()
2023 return -EFAULT; in lineevent_ioctl()
2027 return -EINVAL; in lineevent_ioctl()
2063 if (!le->timestamp) in lineevent_irq_thread()
2066 ge.timestamp = le->timestamp; in lineevent_irq_thread()
2068 if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE in lineevent_irq_thread()
2069 && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { in lineevent_irq_thread()
2070 int level = gpiod_get_value_cansleep(le->desc); in lineevent_irq_thread()
2073 /* Emit low-to-high event */ in lineevent_irq_thread()
2076 /* Emit high-to-low event */ in lineevent_irq_thread()
2078 } else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE) { in lineevent_irq_thread()
2079 /* Emit low-to-high event */ in lineevent_irq_thread()
2081 } else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { in lineevent_irq_thread()
2082 /* Emit high-to-low event */ in lineevent_irq_thread()
2088 ret = kfifo_in_spinlocked_noirqsave(&le->events, &ge, in lineevent_irq_thread()
2089 1, &le->wait.lock); in lineevent_irq_thread()
2091 wake_up_poll(&le->wait, EPOLLIN); in lineevent_irq_thread()
2093 pr_debug_ratelimited("event FIFO is full - event dropped\n"); in lineevent_irq_thread()
2106 le->timestamp = ktime_get_ns(); in lineevent_irq_handler()
2125 return -EFAULT; in lineevent_create()
2131 desc = gpiochip_get_desc(gdev->chip, offset); in lineevent_create()
2138 return -EINVAL; in lineevent_create()
2144 return -EINVAL; in lineevent_create()
2152 return -EINVAL; in lineevent_create()
2156 return -ENOMEM; in lineevent_create()
2157 le->gdev = gpio_device_get(gdev); in lineevent_create()
2161 le->label = kstrndup(eventreq.consumer_label, in lineevent_create()
2162 sizeof(eventreq.consumer_label) - 1, in lineevent_create()
2164 if (!le->label) { in lineevent_create()
2165 ret = -ENOMEM; in lineevent_create()
2170 ret = gpiod_request_user(desc, le->label); in lineevent_create()
2173 le->desc = desc; in lineevent_create()
2174 le->eflags = eflags; in lineevent_create()
2176 linehandle_flags_to_desc_flags(lflags, &desc->flags); in lineevent_create()
2186 ret = -ENODEV; in lineevent_create()
2191 irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? in lineevent_create()
2194 irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? in lineevent_create()
2198 INIT_KFIFO(le->events); in lineevent_create()
2199 init_waitqueue_head(&le->wait); in lineevent_create()
2201 le->device_unregistered_nb.notifier_call = lineevent_unregistered_notify; in lineevent_create()
2202 ret = blocking_notifier_chain_register(&gdev->device_notifier, in lineevent_create()
2203 &le->device_unregistered_nb); in lineevent_create()
2212 le->label, in lineevent_create()
2217 le->irq = irq; in lineevent_create()
2225 file = anon_inode_getfile("gpio-event", in lineevent_create()
2242 return -EFAULT; in lineevent_create()
2259 u64 flagsv2 = info_v2->flags; in gpio_v2_line_info_to_v1()
2261 memcpy(info_v1->name, info_v2->name, sizeof(info_v1->name)); in gpio_v2_line_info_to_v1()
2262 memcpy(info_v1->consumer, info_v2->consumer, sizeof(info_v1->consumer)); in gpio_v2_line_info_to_v1()
2263 info_v1->line_offset = info_v2->offset; in gpio_v2_line_info_to_v1()
2264 info_v1->flags = 0; in gpio_v2_line_info_to_v1()
2267 info_v1->flags |= GPIOLINE_FLAG_KERNEL; in gpio_v2_line_info_to_v1()
2270 info_v1->flags |= GPIOLINE_FLAG_IS_OUT; in gpio_v2_line_info_to_v1()
2273 info_v1->flags |= GPIOLINE_FLAG_ACTIVE_LOW; in gpio_v2_line_info_to_v1()
2276 info_v1->flags |= GPIOLINE_FLAG_OPEN_DRAIN; in gpio_v2_line_info_to_v1()
2278 info_v1->flags |= GPIOLINE_FLAG_OPEN_SOURCE; in gpio_v2_line_info_to_v1()
2281 info_v1->flags |= GPIOLINE_FLAG_BIAS_PULL_UP; in gpio_v2_line_info_to_v1()
2283 info_v1->flags |= GPIOLINE_FLAG_BIAS_PULL_DOWN; in gpio_v2_line_info_to_v1()
2285 info_v1->flags |= GPIOLINE_FLAG_BIAS_DISABLE; in gpio_v2_line_info_to_v1()
2293 gpio_v2_line_info_to_v1(&lic_v2->info, &lic_v1->info); in gpio_v2_line_info_changed_to_v1()
2294 lic_v1->timestamp = lic_v2->timestamp_ns; in gpio_v2_line_info_changed_to_v1()
2295 lic_v1->event_type = lic_v2->event_type; in gpio_v2_line_info_changed_to_v1()
2303 struct gpio_chip *gc = desc->gdev->chip; in gpio_desc_to_lineinfo()
2307 info->offset = gpio_chip_hwgpio(desc); in gpio_desc_to_lineinfo()
2310 if (desc->name) in gpio_desc_to_lineinfo()
2311 strscpy(info->name, desc->name, sizeof(info->name)); in gpio_desc_to_lineinfo()
2313 if (desc->label) in gpio_desc_to_lineinfo()
2314 strscpy(info->consumer, desc->label, in gpio_desc_to_lineinfo()
2315 sizeof(info->consumer)); in gpio_desc_to_lineinfo()
2317 dflags = READ_ONCE(desc->flags); in gpio_desc_to_lineinfo()
2321 * Userspace only need know that the kernel is using this GPIO so it in gpio_desc_to_lineinfo()
2327 * read on the other side of the transition - but that can always in gpio_desc_to_lineinfo()
2337 !gpiochip_line_is_valid(gc, info->offset) || in gpio_desc_to_lineinfo()
2338 !pinctrl_gpio_can_use_line(gc, info->offset)) in gpio_desc_to_lineinfo()
2339 info->flags |= GPIO_V2_LINE_FLAG_USED; in gpio_desc_to_lineinfo()
2342 info->flags |= GPIO_V2_LINE_FLAG_OUTPUT; in gpio_desc_to_lineinfo()
2344 info->flags |= GPIO_V2_LINE_FLAG_INPUT; in gpio_desc_to_lineinfo()
2347 info->flags |= GPIO_V2_LINE_FLAG_ACTIVE_LOW; in gpio_desc_to_lineinfo()
2350 info->flags |= GPIO_V2_LINE_FLAG_OPEN_DRAIN; in gpio_desc_to_lineinfo()
2352 info->flags |= GPIO_V2_LINE_FLAG_OPEN_SOURCE; in gpio_desc_to_lineinfo()
2355 info->flags |= GPIO_V2_LINE_FLAG_BIAS_DISABLED; in gpio_desc_to_lineinfo()
2357 info->flags |= GPIO_V2_LINE_FLAG_BIAS_PULL_DOWN; in gpio_desc_to_lineinfo()
2359 info->flags |= GPIO_V2_LINE_FLAG_BIAS_PULL_UP; in gpio_desc_to_lineinfo()
2362 info->flags |= GPIO_V2_LINE_FLAG_EDGE_RISING; in gpio_desc_to_lineinfo()
2364 info->flags |= GPIO_V2_LINE_FLAG_EDGE_FALLING; in gpio_desc_to_lineinfo()
2367 info->flags |= GPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME; in gpio_desc_to_lineinfo()
2369 info->flags |= GPIO_V2_LINE_FLAG_EVENT_CLOCK_HTE; in gpio_desc_to_lineinfo()
2386 struct gpio_device *gdev = cdev->gdev; in chipinfo_get()
2391 strscpy(chipinfo.name, dev_name(&gdev->dev), sizeof(chipinfo.name)); in chipinfo_get()
2392 strscpy(chipinfo.label, gdev->label, sizeof(chipinfo.label)); in chipinfo_get()
2393 chipinfo.lines = gdev->ngpio; in chipinfo_get()
2395 return -EFAULT; in chipinfo_get()
2406 int abiv = atomic_cmpxchg(&cdata->watch_abi_version, 0, version); in lineinfo_ensure_abi_version()
2422 return -EFAULT; in lineinfo_get_v1()
2425 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.line_offset); in lineinfo_get_v1()
2431 return -EPERM; in lineinfo_get_v1()
2433 if (test_and_set_bit(lineinfo.line_offset, cdev->watched_lines)) in lineinfo_get_v1()
2434 return -EBUSY; in lineinfo_get_v1()
2442 clear_bit(lineinfo.line_offset, cdev->watched_lines); in lineinfo_get_v1()
2443 return -EFAULT; in lineinfo_get_v1()
2457 return -EFAULT; in lineinfo_get()
2460 return -EINVAL; in lineinfo_get()
2462 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.offset); in lineinfo_get()
2469 return -EPERM; in lineinfo_get()
2471 if (test_and_set_bit(lineinfo.offset, cdev->watched_lines)) in lineinfo_get()
2472 return -EBUSY; in lineinfo_get()
2479 clear_bit(lineinfo.offset, cdev->watched_lines); in lineinfo_get()
2480 return -EFAULT; in lineinfo_get()
2491 return -EFAULT; in lineinfo_unwatch()
2493 if (offset >= cdev->gdev->ngpio) in lineinfo_unwatch()
2494 return -EINVAL; in lineinfo_unwatch()
2496 if (!test_and_clear_bit(offset, cdev->watched_lines)) in lineinfo_unwatch()
2497 return -EBUSY; in lineinfo_unwatch()
2503 * gpio_ioctl() - ioctl handler for the GPIO chardev
2507 struct gpio_chardev_data *cdev = file->private_data; in gpio_ioctl()
2508 struct gpio_device *gdev = cdev->gdev; in gpio_ioctl()
2511 guard(rwsem_read)(&gdev->sem); in gpio_ioctl()
2514 if (!gdev->chip) in gpio_ioctl()
2515 return -ENODEV; in gpio_ioctl()
2540 return -EINVAL; in gpio_ioctl()
2561 if (!test_bit(gpio_chip_hwgpio(desc), cdev->watched_lines)) in lineinfo_changed_notify()
2570 ret = kfifo_in_spinlocked(&cdev->events, &chg, 1, &cdev->wait.lock); in lineinfo_changed_notify()
2572 wake_up_poll(&cdev->wait, EPOLLIN); in lineinfo_changed_notify()
2574 pr_debug_ratelimited("lineinfo event FIFO is full - event dropped\n"); in lineinfo_changed_notify()
2586 wake_up_poll(&cdev->wait, EPOLLIN | EPOLLERR); in gpio_device_unregistered_notify()
2594 struct gpio_chardev_data *cdev = file->private_data; in lineinfo_watch_poll()
2597 guard(rwsem_read)(&cdev->gdev->sem); in lineinfo_watch_poll()
2599 if (!cdev->gdev->chip) in lineinfo_watch_poll()
2602 poll_wait(file, &cdev->wait, pollt); in lineinfo_watch_poll()
2604 if (!kfifo_is_empty_spinlocked_noirqsave(&cdev->events, in lineinfo_watch_poll()
2605 &cdev->wait.lock)) in lineinfo_watch_poll()
2614 struct gpio_chardev_data *cdev = file->private_data; in lineinfo_watch_read()
2620 guard(rwsem_read)(&cdev->gdev->sem); in lineinfo_watch_read()
2622 if (!cdev->gdev->chip) in lineinfo_watch_read()
2623 return -ENODEV; in lineinfo_watch_read()
2628 return -EINVAL; in lineinfo_watch_read()
2632 scoped_guard(spinlock, &cdev->wait.lock) { in lineinfo_watch_read()
2633 if (kfifo_is_empty(&cdev->events)) { in lineinfo_watch_read()
2637 if (file->f_flags & O_NONBLOCK) in lineinfo_watch_read()
2638 return -EAGAIN; in lineinfo_watch_read()
2640 ret = wait_event_interruptible_locked(cdev->wait, in lineinfo_watch_read()
2641 !kfifo_is_empty(&cdev->events)); in lineinfo_watch_read()
2647 if (atomic_read(&cdev->watch_abi_version) == 2) in lineinfo_watch_read()
2652 return -EINVAL; in lineinfo_watch_read()
2654 ret = kfifo_out(&cdev->events, &event, 1); in lineinfo_watch_read()
2657 ret = -EIO; in lineinfo_watch_read()
2665 return -EFAULT; in lineinfo_watch_read()
2672 return -EFAULT; in lineinfo_watch_read()
2676 return -EFAULT; in lineinfo_watch_read()
2685 * gpio_chrdev_open() - open the chardev for ioctl operations
2692 struct gpio_device *gdev = container_of(inode->i_cdev, in gpio_chrdev_open()
2695 int ret = -ENOMEM; in gpio_chrdev_open()
2697 guard(rwsem_read)(&gdev->sem); in gpio_chrdev_open()
2700 if (!gdev->chip) in gpio_chrdev_open()
2701 return -ENODEV; in gpio_chrdev_open()
2705 return -ENODEV; in gpio_chrdev_open()
2707 cdev->watched_lines = bitmap_zalloc(gdev->chip->ngpio, GFP_KERNEL); in gpio_chrdev_open()
2708 if (!cdev->watched_lines) in gpio_chrdev_open()
2711 init_waitqueue_head(&cdev->wait); in gpio_chrdev_open()
2712 INIT_KFIFO(cdev->events); in gpio_chrdev_open()
2713 cdev->gdev = gpio_device_get(gdev); in gpio_chrdev_open()
2715 cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; in gpio_chrdev_open()
2716 ret = blocking_notifier_chain_register(&gdev->line_state_notifier, in gpio_chrdev_open()
2717 &cdev->lineinfo_changed_nb); in gpio_chrdev_open()
2721 cdev->device_unregistered_nb.notifier_call = in gpio_chrdev_open()
2723 ret = blocking_notifier_chain_register(&gdev->device_notifier, in gpio_chrdev_open()
2724 &cdev->device_unregistered_nb); in gpio_chrdev_open()
2728 file->private_data = cdev; in gpio_chrdev_open()
2737 blocking_notifier_chain_unregister(&gdev->device_notifier, in gpio_chrdev_open()
2738 &cdev->device_unregistered_nb); in gpio_chrdev_open()
2740 blocking_notifier_chain_unregister(&gdev->line_state_notifier, in gpio_chrdev_open()
2741 &cdev->lineinfo_changed_nb); in gpio_chrdev_open()
2744 bitmap_free(cdev->watched_lines); in gpio_chrdev_open()
2751 * gpio_chrdev_release() - close chardev after ioctl operations
2758 struct gpio_chardev_data *cdev = file->private_data; in gpio_chrdev_release()
2759 struct gpio_device *gdev = cdev->gdev; in gpio_chrdev_release()
2761 bitmap_free(cdev->watched_lines); in gpio_chrdev_release()
2762 blocking_notifier_chain_unregister(&gdev->device_notifier, in gpio_chrdev_release()
2763 &cdev->device_unregistered_nb); in gpio_chrdev_release()
2764 blocking_notifier_chain_unregister(&gdev->line_state_notifier, in gpio_chrdev_release()
2765 &cdev->lineinfo_changed_nb); in gpio_chrdev_release()
2789 cdev_init(&gdev->chrdev, &gpio_fileops); in gpiolib_cdev_register()
2790 gdev->chrdev.owner = THIS_MODULE; in gpiolib_cdev_register()
2791 gdev->dev.devt = MKDEV(MAJOR(devt), gdev->id); in gpiolib_cdev_register()
2793 ret = cdev_device_add(&gdev->chrdev, &gdev->dev); in gpiolib_cdev_register()
2797 chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n", in gpiolib_cdev_register()
2798 MAJOR(devt), gdev->id); in gpiolib_cdev_register()
2805 cdev_device_del(&gdev->chrdev, &gdev->dev); in gpiolib_cdev_unregister()
2806 blocking_notifier_call_chain(&gdev->device_notifier, 0, NULL); in gpiolib_cdev_unregister()