• Home
  • Raw
  • Download

Lines Matching +full:chg +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0
30 #include "gpiolib-cdev.h"
33 * Array sizes must ensure 64-bit alignment and not create holes in the
40 * Check that uAPI structs are 64-bit aligned for 32/64-bit compatibility
54 * interface to gpiolib GPIOs via ioctl()s.
63 * struct linehandle_state - contains the state of a userspace handle
90 return -EINVAL; in linehandle_validate_flags()
98 return -EINVAL; in linehandle_validate_flags()
107 return -EINVAL; in linehandle_validate_flags()
113 return -EINVAL; in linehandle_validate_flags()
121 return -EINVAL; in linehandle_validate_flags()
129 return -EINVAL; in linehandle_validate_flags()
159 return -EFAULT; in linehandle_set_config()
166 for (i = 0; i < lh->num_descs; i++) { in linehandle_set_config()
167 desc = lh->descs[i]; in linehandle_set_config()
168 linehandle_flags_to_desc_flags(gcnf.flags, &desc->flags); in linehandle_set_config()
186 blocking_notifier_call_chain(&desc->gdev->notifier, in linehandle_set_config()
196 struct linehandle_state *lh = file->private_data; in linehandle_ioctl()
203 if (!lh->gdev->chip) in linehandle_ioctl()
204 return -ENODEV; in linehandle_ioctl()
210 lh->num_descs, lh->descs, in linehandle_ioctl()
216 for (i = 0; i < lh->num_descs; i++) in linehandle_ioctl()
220 return -EFAULT; in linehandle_ioctl()
228 if (!test_bit(FLAG_IS_OUT, &lh->descs[0]->flags)) in linehandle_ioctl()
229 return -EPERM; in linehandle_ioctl()
232 return -EFAULT; in linehandle_ioctl()
235 for (i = 0; i < lh->num_descs; i++) in linehandle_ioctl()
241 lh->num_descs, in linehandle_ioctl()
242 lh->descs, in linehandle_ioctl()
248 return -EINVAL; in linehandle_ioctl()
264 for (i = 0; i < lh->num_descs; i++) in linehandle_free()
265 if (lh->descs[i]) in linehandle_free()
266 gpiod_free(lh->descs[i]); in linehandle_free()
267 kfree(lh->label); in linehandle_free()
268 put_device(&lh->gdev->dev); in linehandle_free()
274 linehandle_free(file->private_data); in linehandle_release()
297 return -EFAULT; in linehandle_create()
299 return -EINVAL; in linehandle_create()
309 return -ENOMEM; in linehandle_create()
310 lh->gdev = gdev; in linehandle_create()
311 get_device(&gdev->dev); in linehandle_create()
315 lh->label = kstrndup(handlereq.consumer_label, in linehandle_create()
316 sizeof(handlereq.consumer_label) - 1, in linehandle_create()
318 if (!lh->label) { in linehandle_create()
319 ret = -ENOMEM; in linehandle_create()
324 lh->num_descs = handlereq.lines; in linehandle_create()
329 struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset); in linehandle_create()
336 ret = gpiod_request(desc, lh->label); in linehandle_create()
339 lh->descs[i] = desc; in linehandle_create()
340 linehandle_flags_to_desc_flags(handlereq.flags, &desc->flags); in linehandle_create()
362 blocking_notifier_call_chain(&desc->gdev->notifier, in linehandle_create()
365 dev_dbg(&gdev->dev, "registered chardev handle for line %d\n", in linehandle_create()
375 file = anon_inode_getfile("gpio-linehandle", in linehandle_create()
392 return -EFAULT; in linehandle_create()
397 dev_dbg(&gdev->dev, "registered chardev handle for %d lines\n", in linehandle_create()
398 lh->num_descs); in linehandle_create()
411 * struct line - contains the state of a requested line
430 * -- edge detector specific fields --
449 * -- debouncer specific fields --
467 * struct linereq - contains the state of a userspace line request
478 * of configuration, particularly multi-step accesses to desc flags.
522 spin_lock(&lr->wait.lock); in linereq_put_event()
523 if (kfifo_is_full(&lr->events)) { in linereq_put_event()
525 kfifo_skip(&lr->events); in linereq_put_event()
527 kfifo_in(&lr->events, le, 1); in linereq_put_event()
528 spin_unlock(&lr->wait.lock); in linereq_put_event()
530 wake_up_poll(&lr->wait, EPOLLIN); in linereq_put_event()
532 pr_debug_ratelimited("event FIFO is full - event dropped\n"); in linereq_put_event()
538 struct linereq *lr = line->req; in edge_irq_thread()
544 if (line->timestamp_ns) { in edge_irq_thread()
545 le.timestamp_ns = line->timestamp_ns; in edge_irq_thread()
553 if (lr->num_lines != 1) in edge_irq_thread()
554 line->req_seqno = atomic_inc_return(&lr->seqno); in edge_irq_thread()
556 line->timestamp_ns = 0; in edge_irq_thread()
558 if (line->eflags == (GPIO_V2_LINE_FLAG_EDGE_RISING | in edge_irq_thread()
560 int level = gpiod_get_value_cansleep(line->desc); in edge_irq_thread()
563 /* Emit low-to-high event */ in edge_irq_thread()
566 /* Emit high-to-low event */ in edge_irq_thread()
568 } else if (line->eflags == GPIO_V2_LINE_FLAG_EDGE_RISING) { in edge_irq_thread()
569 /* Emit low-to-high event */ in edge_irq_thread()
571 } else if (line->eflags == GPIO_V2_LINE_FLAG_EDGE_FALLING) { in edge_irq_thread()
572 /* Emit high-to-low event */ in edge_irq_thread()
577 line->line_seqno++; in edge_irq_thread()
578 le.line_seqno = line->line_seqno; in edge_irq_thread()
579 le.seqno = (lr->num_lines == 1) ? le.line_seqno : line->req_seqno; in edge_irq_thread()
580 le.offset = gpio_chip_hwgpio(line->desc); in edge_irq_thread()
590 struct linereq *lr = line->req; in edge_irq_handler()
596 line->timestamp_ns = ktime_get_ns(); in edge_irq_handler()
598 if (lr->num_lines != 1) in edge_irq_handler()
599 line->req_seqno = atomic_inc_return(&lr->seqno); in edge_irq_handler()
612 * minor race - debouncer may be stopped here, so edge_detector_stop() in debounced_value()
616 value = READ_ONCE(line->level); in debounced_value()
618 if (test_bit(FLAG_ACTIVE_LOW, &line->desc->flags)) in debounced_value()
628 mod_delayed_work(system_wq, &line->work, in debounce_irq_handler()
629 usecs_to_jiffies(READ_ONCE(line->desc->debounce_period_us))); in debounce_irq_handler()
641 level = gpiod_get_raw_value_cansleep(line->desc); in debounce_work_func()
647 if (READ_ONCE(line->level) == level) in debounce_work_func()
650 WRITE_ONCE(line->level, level); in debounce_work_func()
652 /* -- edge detection -- */ in debounce_work_func()
653 if (!line->eflags) in debounce_work_func()
656 /* switch from physical level to logical - if they differ */ in debounce_work_func()
657 if (test_bit(FLAG_ACTIVE_LOW, &line->desc->flags)) in debounce_work_func()
661 if (((line->eflags == GPIO_V2_LINE_FLAG_EDGE_RISING) && !level) || in debounce_work_func()
662 ((line->eflags == GPIO_V2_LINE_FLAG_EDGE_FALLING) && level)) in debounce_work_func()
668 lr = line->req; in debounce_work_func()
670 le.offset = gpio_chip_hwgpio(line->desc); in debounce_work_func()
671 line->line_seqno++; in debounce_work_func()
672 le.line_seqno = line->line_seqno; in debounce_work_func()
673 le.seqno = (lr->num_lines == 1) ? in debounce_work_func()
674 le.line_seqno : atomic_inc_return(&lr->seqno); in debounce_work_func()
677 /* Emit low-to-high event */ in debounce_work_func()
680 /* Emit high-to-low event */ in debounce_work_func()
693 ret = gpiod_set_debounce(line->desc, debounce_period_us); in debounce_setup()
695 WRITE_ONCE(line->desc->debounce_period_us, debounce_period_us); in debounce_setup()
698 if (ret != -ENOTSUPP) in debounce_setup()
703 level = gpiod_get_raw_value_cansleep(line->desc); in debounce_setup()
707 irq = gpiod_to_irq(line->desc); in debounce_setup()
709 return -ENXIO; in debounce_setup()
711 WRITE_ONCE(line->level, level); in debounce_setup()
714 line->req->label, line); in debounce_setup()
718 WRITE_ONCE(line->sw_debounced, 1); in debounce_setup()
719 line->irq = irq; in debounce_setup()
730 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_debounced()
731 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_DEBOUNCE) && in gpio_v2_line_config_debounced()
732 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_debounced()
744 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_debounce_period()
745 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_DEBOUNCE) && in gpio_v2_line_config_debounce_period()
746 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_debounce_period()
747 return lc->attrs[i].attr.debounce_period_us; in gpio_v2_line_config_debounce_period()
754 if (line->irq) { in edge_detector_stop()
755 free_irq(line->irq, line); in edge_detector_stop()
756 line->irq = 0; in edge_detector_stop()
759 cancel_delayed_work_sync(&line->work); in edge_detector_stop()
760 WRITE_ONCE(line->sw_debounced, 0); in edge_detector_stop()
761 line->eflags = 0; in edge_detector_stop()
762 if (line->desc) in edge_detector_stop()
763 WRITE_ONCE(line->desc->debounce_period_us, 0); in edge_detector_stop()
764 /* do not change line->level - see comment in debounced_value() */ in edge_detector_stop()
776 if (eflags && !kfifo_initialized(&line->req->events)) { in edge_detector_setup()
777 ret = kfifo_alloc(&line->req->events, in edge_detector_setup()
778 line->req->event_buffer_size, GFP_KERNEL); in edge_detector_setup()
782 line->eflags = eflags; in edge_detector_setup()
788 WRITE_ONCE(line->desc->debounce_period_us, debounce_period_us); in edge_detector_setup()
792 if (!eflags || READ_ONCE(line->sw_debounced)) in edge_detector_setup()
795 irq = gpiod_to_irq(line->desc); in edge_detector_setup()
797 return -ENXIO; in edge_detector_setup()
800 irqflags |= test_bit(FLAG_ACTIVE_LOW, &line->desc->flags) ? in edge_detector_setup()
803 irqflags |= test_bit(FLAG_ACTIVE_LOW, &line->desc->flags) ? in edge_detector_setup()
809 irqflags, line->req->label, line); in edge_detector_setup()
813 line->irq = irq; in edge_detector_setup()
825 if ((line->eflags == eflags) && !polarity_change && in edge_detector_update()
826 (READ_ONCE(line->desc->debounce_period_us) == debounce_period_us)) in edge_detector_update()
830 if (debounce_period_us && READ_ONCE(line->sw_debounced)) { in edge_detector_update()
831 line->eflags = eflags; in edge_detector_update()
832 WRITE_ONCE(line->desc->debounce_period_us, debounce_period_us); in edge_detector_update()
837 if ((line->irq && !READ_ONCE(line->sw_debounced)) || in edge_detector_update()
838 (!debounce_period_us && READ_ONCE(line->sw_debounced))) in edge_detector_update()
850 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_flags()
851 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_FLAGS) && in gpio_v2_line_config_flags()
852 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_flags()
853 return lc->attrs[i].attr.flags; in gpio_v2_line_config_flags()
855 return lc->flags; in gpio_v2_line_config_flags()
864 for (i = 0; i < lc->num_attrs; i++) { in gpio_v2_line_config_output_value()
865 if ((lc->attrs[i].attr.id == GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES) && in gpio_v2_line_config_output_value()
866 (lc->attrs[i].mask & mask)) in gpio_v2_line_config_output_value()
867 return !!(lc->attrs[i].attr.values & mask); in gpio_v2_line_config_output_value()
876 return -EINVAL; in gpio_v2_line_flags_validate()
884 return -EINVAL; in gpio_v2_line_flags_validate()
889 return -EINVAL; in gpio_v2_line_flags_validate()
898 return -EINVAL; in gpio_v2_line_flags_validate()
903 return -EINVAL; in gpio_v2_line_flags_validate()
908 return -EINVAL; in gpio_v2_line_flags_validate()
916 return -EINVAL; in gpio_v2_line_flags_validate()
928 if (lc->num_attrs > GPIO_V2_LINE_NUM_ATTRS_MAX) in gpio_v2_line_config_validate()
929 return -EINVAL; in gpio_v2_line_config_validate()
931 if (memchr_inv(lc->padding, 0, sizeof(lc->padding))) in gpio_v2_line_config_validate()
932 return -EINVAL; in gpio_v2_line_config_validate()
943 return -EINVAL; in gpio_v2_line_config_validate()
988 return -EFAULT; in linereq_get_values()
990 for (num_get = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
993 descs = &lr->lines[i].desc; in linereq_get_values()
998 return -EINVAL; in linereq_get_values()
1003 return -ENOMEM; in linereq_get_values()
1004 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1006 descs[didx] = lr->lines[i].desc; in linereq_get_values()
1020 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_get_values()
1022 if (lr->lines[i].sw_debounced) in linereq_get_values()
1023 val = debounced_value(&lr->lines[i]); in linereq_get_values()
1033 return -EFAULT; in linereq_get_values()
1047 for (num_set = 0, i = 0; i < lr->num_lines; i++) { in linereq_set_values_unlocked()
1048 if (lv->mask & BIT_ULL(i)) { in linereq_set_values_unlocked()
1049 if (!test_bit(FLAG_IS_OUT, &lr->lines[i].desc->flags)) in linereq_set_values_unlocked()
1050 return -EPERM; in linereq_set_values_unlocked()
1051 if (lv->bits & BIT_ULL(i)) in linereq_set_values_unlocked()
1054 descs = &lr->lines[i].desc; in linereq_set_values_unlocked()
1058 return -EINVAL; in linereq_set_values_unlocked()
1064 return -ENOMEM; in linereq_set_values_unlocked()
1065 for (didx = 0, i = 0; i < lr->num_lines; i++) { in linereq_set_values_unlocked()
1066 if (lv->mask & BIT_ULL(i)) { in linereq_set_values_unlocked()
1067 descs[didx] = lr->lines[i].desc; in linereq_set_values_unlocked()
1086 return -EFAULT; in linereq_set_values()
1088 mutex_lock(&lr->config_mutex); in linereq_set_values()
1092 mutex_unlock(&lr->config_mutex); in linereq_set_values()
1106 for (i = 0; i < lr->num_lines; i++) { in linereq_set_config_unlocked()
1107 desc = lr->lines[i].desc; in linereq_set_config_unlocked()
1110 (!!test_bit(FLAG_ACTIVE_LOW, &desc->flags) != in linereq_set_config_unlocked()
1113 gpio_v2_line_config_flags_to_desc_flags(flags, &desc->flags); in linereq_set_config_unlocked()
1121 edge_detector_stop(&lr->lines[i]); in linereq_set_config_unlocked()
1130 ret = edge_detector_update(&lr->lines[i], lc, i, in linereq_set_config_unlocked()
1137 blocking_notifier_call_chain(&desc->gdev->notifier, in linereq_set_config_unlocked()
1150 return -EFAULT; in linereq_set_config()
1152 ret = gpio_v2_line_config_validate(&lc, lr->num_lines); in linereq_set_config()
1156 mutex_lock(&lr->config_mutex); in linereq_set_config()
1160 mutex_unlock(&lr->config_mutex); in linereq_set_config()
1168 struct linereq *lr = file->private_data; in linereq_ioctl()
1171 if (!lr->gdev->chip) in linereq_ioctl()
1172 return -ENODEV; in linereq_ioctl()
1182 return -EINVAL; in linereq_ioctl()
1197 struct linereq *lr = file->private_data; in linereq_poll()
1200 if (!lr->gdev->chip) in linereq_poll()
1203 poll_wait(file, &lr->wait, wait); in linereq_poll()
1205 if (!kfifo_is_empty_spinlocked_noirqsave(&lr->events, in linereq_poll()
1206 &lr->wait.lock)) in linereq_poll()
1217 struct linereq *lr = file->private_data; in linereq_read()
1222 if (!lr->gdev->chip) in linereq_read()
1223 return -ENODEV; in linereq_read()
1226 return -EINVAL; in linereq_read()
1229 spin_lock(&lr->wait.lock); in linereq_read()
1230 if (kfifo_is_empty(&lr->events)) { in linereq_read()
1232 spin_unlock(&lr->wait.lock); in linereq_read()
1236 if (file->f_flags & O_NONBLOCK) { in linereq_read()
1237 spin_unlock(&lr->wait.lock); in linereq_read()
1238 return -EAGAIN; in linereq_read()
1241 ret = wait_event_interruptible_locked(lr->wait, in linereq_read()
1242 !kfifo_is_empty(&lr->events)); in linereq_read()
1244 spin_unlock(&lr->wait.lock); in linereq_read()
1249 ret = kfifo_out(&lr->events, &le, 1); in linereq_read()
1250 spin_unlock(&lr->wait.lock); in linereq_read()
1253 * This should never happen - we were holding the in linereq_read()
1257 ret = -EIO; in linereq_read()
1262 return -EFAULT; in linereq_read()
1273 for (i = 0; i < lr->num_lines; i++) { in linereq_free()
1274 edge_detector_stop(&lr->lines[i]); in linereq_free()
1275 if (lr->lines[i].desc) in linereq_free()
1276 gpiod_free(lr->lines[i].desc); in linereq_free()
1278 kfifo_free(&lr->events); in linereq_free()
1279 kfree(lr->label); in linereq_free()
1280 put_device(&lr->gdev->dev); in linereq_free()
1286 struct linereq *lr = file->private_data; in linereq_release()
1315 return -EFAULT; in linereq_create()
1318 return -EINVAL; in linereq_create()
1321 return -EINVAL; in linereq_create()
1330 return -ENOMEM; in linereq_create()
1332 lr->gdev = gdev; in linereq_create()
1333 get_device(&gdev->dev); in linereq_create()
1336 lr->lines[i].req = lr; in linereq_create()
1337 WRITE_ONCE(lr->lines[i].sw_debounced, 0); in linereq_create()
1338 INIT_DELAYED_WORK(&lr->lines[i].work, debounce_work_func); in linereq_create()
1343 lr->label = kstrndup(ulr.consumer, sizeof(ulr.consumer) - 1, in linereq_create()
1345 if (!lr->label) { in linereq_create()
1346 ret = -ENOMEM; in linereq_create()
1351 mutex_init(&lr->config_mutex); in linereq_create()
1352 init_waitqueue_head(&lr->wait); in linereq_create()
1353 lr->event_buffer_size = ulr.event_buffer_size; in linereq_create()
1354 if (lr->event_buffer_size == 0) in linereq_create()
1355 lr->event_buffer_size = ulr.num_lines * 16; in linereq_create()
1356 else if (lr->event_buffer_size > GPIO_V2_LINES_MAX * 16) in linereq_create()
1357 lr->event_buffer_size = GPIO_V2_LINES_MAX * 16; in linereq_create()
1359 atomic_set(&lr->seqno, 0); in linereq_create()
1360 lr->num_lines = ulr.num_lines; in linereq_create()
1365 struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset); in linereq_create()
1372 ret = gpiod_request(desc, lr->label); in linereq_create()
1376 lr->lines[i].desc = desc; in linereq_create()
1378 gpio_v2_line_config_flags_to_desc_flags(flags, &desc->flags); in linereq_create()
1399 ret = edge_detector_setup(&lr->lines[i], lc, i, in linereq_create()
1405 blocking_notifier_call_chain(&desc->gdev->notifier, in linereq_create()
1408 dev_dbg(&gdev->dev, "registered chardev handle for line %d\n", in linereq_create()
1418 file = anon_inode_getfile("gpio-line", &line_fileops, lr, in linereq_create()
1433 return -EFAULT; in linereq_create()
1438 dev_dbg(&gdev->dev, "registered chardev handle for %d lines\n", in linereq_create()
1439 lr->num_lines); in linereq_create()
1457 * struct lineevent_state - contains the state of a userspace event
1487 struct lineevent_state *le = file->private_data; in lineevent_poll()
1490 if (!le->gdev->chip) in lineevent_poll()
1493 poll_wait(file, &le->wait, wait); in lineevent_poll()
1495 if (!kfifo_is_empty_spinlocked_noirqsave(&le->events, &le->wait.lock)) in lineevent_poll()
1522 struct lineevent_state *le = file->private_data; in lineevent_read()
1528 if (!le->gdev->chip) in lineevent_read()
1529 return -ENODEV; in lineevent_read()
1542 return -EINVAL; in lineevent_read()
1545 spin_lock(&le->wait.lock); in lineevent_read()
1546 if (kfifo_is_empty(&le->events)) { in lineevent_read()
1548 spin_unlock(&le->wait.lock); in lineevent_read()
1552 if (file->f_flags & O_NONBLOCK) { in lineevent_read()
1553 spin_unlock(&le->wait.lock); in lineevent_read()
1554 return -EAGAIN; in lineevent_read()
1557 ret = wait_event_interruptible_locked(le->wait, in lineevent_read()
1558 !kfifo_is_empty(&le->events)); in lineevent_read()
1560 spin_unlock(&le->wait.lock); in lineevent_read()
1565 ret = kfifo_out(&le->events, &ge, 1); in lineevent_read()
1566 spin_unlock(&le->wait.lock); in lineevent_read()
1569 * This should never happen - we were holding the lock in lineevent_read()
1573 ret = -EIO; in lineevent_read()
1578 return -EFAULT; in lineevent_read()
1587 if (le->irq) in lineevent_free()
1588 free_irq(le->irq, le); in lineevent_free()
1589 if (le->desc) in lineevent_free()
1590 gpiod_free(le->desc); in lineevent_free()
1591 kfree(le->label); in lineevent_free()
1592 put_device(&le->gdev->dev); in lineevent_free()
1598 lineevent_free(file->private_data); in lineevent_release()
1605 struct lineevent_state *le = file->private_data; in lineevent_ioctl()
1609 if (!le->gdev->chip) in lineevent_ioctl()
1610 return -ENODEV; in lineevent_ioctl()
1621 val = gpiod_get_value_cansleep(le->desc); in lineevent_ioctl()
1627 return -EFAULT; in lineevent_ioctl()
1631 return -EINVAL; in lineevent_ioctl()
1667 if (!le->timestamp) in lineevent_irq_thread()
1670 ge.timestamp = le->timestamp; in lineevent_irq_thread()
1672 if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE in lineevent_irq_thread()
1673 && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { in lineevent_irq_thread()
1674 int level = gpiod_get_value_cansleep(le->desc); in lineevent_irq_thread()
1677 /* Emit low-to-high event */ in lineevent_irq_thread()
1680 /* Emit high-to-low event */ in lineevent_irq_thread()
1682 } else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE) { in lineevent_irq_thread()
1683 /* Emit low-to-high event */ in lineevent_irq_thread()
1685 } else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { in lineevent_irq_thread()
1686 /* Emit high-to-low event */ in lineevent_irq_thread()
1692 ret = kfifo_in_spinlocked_noirqsave(&le->events, &ge, in lineevent_irq_thread()
1693 1, &le->wait.lock); in lineevent_irq_thread()
1695 wake_up_poll(&le->wait, EPOLLIN); in lineevent_irq_thread()
1697 pr_debug_ratelimited("event FIFO is full - event dropped\n"); in lineevent_irq_thread()
1710 le->timestamp = ktime_get_ns(); in lineevent_irq_handler()
1729 return -EFAULT; in lineevent_create()
1735 desc = gpiochip_get_desc(gdev->chip, offset); in lineevent_create()
1742 return -EINVAL; in lineevent_create()
1748 return -EINVAL; in lineevent_create()
1756 return -EINVAL; in lineevent_create()
1760 return -ENOMEM; in lineevent_create()
1761 le->gdev = gdev; in lineevent_create()
1762 get_device(&gdev->dev); in lineevent_create()
1766 le->label = kstrndup(eventreq.consumer_label, in lineevent_create()
1767 sizeof(eventreq.consumer_label) - 1, in lineevent_create()
1769 if (!le->label) { in lineevent_create()
1770 ret = -ENOMEM; in lineevent_create()
1775 ret = gpiod_request(desc, le->label); in lineevent_create()
1778 le->desc = desc; in lineevent_create()
1779 le->eflags = eflags; in lineevent_create()
1781 linehandle_flags_to_desc_flags(lflags, &desc->flags); in lineevent_create()
1787 blocking_notifier_call_chain(&desc->gdev->notifier, in lineevent_create()
1792 ret = -ENODEV; in lineevent_create()
1797 irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? in lineevent_create()
1800 irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? in lineevent_create()
1804 INIT_KFIFO(le->events); in lineevent_create()
1805 init_waitqueue_head(&le->wait); in lineevent_create()
1812 le->label, in lineevent_create()
1817 le->irq = irq; in lineevent_create()
1825 file = anon_inode_getfile("gpio-event", in lineevent_create()
1842 return -EFAULT; in lineevent_create()
1859 u64 flagsv2 = info_v2->flags; in gpio_v2_line_info_to_v1()
1861 memcpy(info_v1->name, info_v2->name, sizeof(info_v1->name)); in gpio_v2_line_info_to_v1()
1862 memcpy(info_v1->consumer, info_v2->consumer, sizeof(info_v1->consumer)); in gpio_v2_line_info_to_v1()
1863 info_v1->line_offset = info_v2->offset; in gpio_v2_line_info_to_v1()
1864 info_v1->flags = 0; in gpio_v2_line_info_to_v1()
1867 info_v1->flags |= GPIOLINE_FLAG_KERNEL; in gpio_v2_line_info_to_v1()
1870 info_v1->flags |= GPIOLINE_FLAG_IS_OUT; in gpio_v2_line_info_to_v1()
1873 info_v1->flags |= GPIOLINE_FLAG_ACTIVE_LOW; in gpio_v2_line_info_to_v1()
1876 info_v1->flags |= GPIOLINE_FLAG_OPEN_DRAIN; in gpio_v2_line_info_to_v1()
1878 info_v1->flags |= GPIOLINE_FLAG_OPEN_SOURCE; in gpio_v2_line_info_to_v1()
1881 info_v1->flags |= GPIOLINE_FLAG_BIAS_PULL_UP; in gpio_v2_line_info_to_v1()
1883 info_v1->flags |= GPIOLINE_FLAG_BIAS_PULL_DOWN; in gpio_v2_line_info_to_v1()
1885 info_v1->flags |= GPIOLINE_FLAG_BIAS_DISABLE; in gpio_v2_line_info_to_v1()
1893 gpio_v2_line_info_to_v1(&lic_v2->info, &lic_v1->info); in gpio_v2_line_info_changed_to_v1()
1894 lic_v1->timestamp = lic_v2->timestamp_ns; in gpio_v2_line_info_changed_to_v1()
1895 lic_v1->event_type = lic_v2->event_type; in gpio_v2_line_info_changed_to_v1()
1903 struct gpio_chip *gc = desc->gdev->chip; in gpio_desc_to_lineinfo()
1910 info->offset = gpio_chip_hwgpio(desc); in gpio_desc_to_lineinfo()
1916 * FIXME: find a non-racy way to retrieve this information. Maybe a in gpio_desc_to_lineinfo()
1920 pinctrl_gpio_can_use_line(gc->base + info->offset); in gpio_desc_to_lineinfo()
1924 if (desc->name) in gpio_desc_to_lineinfo()
1925 strscpy(info->name, desc->name, sizeof(info->name)); in gpio_desc_to_lineinfo()
1927 if (desc->label) in gpio_desc_to_lineinfo()
1928 strscpy(info->consumer, desc->label, sizeof(info->consumer)); in gpio_desc_to_lineinfo()
1934 info->flags = 0; in gpio_desc_to_lineinfo()
1935 if (test_bit(FLAG_REQUESTED, &desc->flags) || in gpio_desc_to_lineinfo()
1936 test_bit(FLAG_IS_HOGGED, &desc->flags) || in gpio_desc_to_lineinfo()
1937 test_bit(FLAG_USED_AS_IRQ, &desc->flags) || in gpio_desc_to_lineinfo()
1938 test_bit(FLAG_EXPORT, &desc->flags) || in gpio_desc_to_lineinfo()
1939 test_bit(FLAG_SYSFS, &desc->flags) || in gpio_desc_to_lineinfo()
1941 info->flags |= GPIO_V2_LINE_FLAG_USED; in gpio_desc_to_lineinfo()
1943 if (test_bit(FLAG_IS_OUT, &desc->flags)) in gpio_desc_to_lineinfo()
1944 info->flags |= GPIO_V2_LINE_FLAG_OUTPUT; in gpio_desc_to_lineinfo()
1946 info->flags |= GPIO_V2_LINE_FLAG_INPUT; in gpio_desc_to_lineinfo()
1948 if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) in gpio_desc_to_lineinfo()
1949 info->flags |= GPIO_V2_LINE_FLAG_ACTIVE_LOW; in gpio_desc_to_lineinfo()
1951 if (test_bit(FLAG_OPEN_DRAIN, &desc->flags)) in gpio_desc_to_lineinfo()
1952 info->flags |= GPIO_V2_LINE_FLAG_OPEN_DRAIN; in gpio_desc_to_lineinfo()
1953 if (test_bit(FLAG_OPEN_SOURCE, &desc->flags)) in gpio_desc_to_lineinfo()
1954 info->flags |= GPIO_V2_LINE_FLAG_OPEN_SOURCE; in gpio_desc_to_lineinfo()
1956 if (test_bit(FLAG_BIAS_DISABLE, &desc->flags)) in gpio_desc_to_lineinfo()
1957 info->flags |= GPIO_V2_LINE_FLAG_BIAS_DISABLED; in gpio_desc_to_lineinfo()
1958 if (test_bit(FLAG_PULL_DOWN, &desc->flags)) in gpio_desc_to_lineinfo()
1959 info->flags |= GPIO_V2_LINE_FLAG_BIAS_PULL_DOWN; in gpio_desc_to_lineinfo()
1960 if (test_bit(FLAG_PULL_UP, &desc->flags)) in gpio_desc_to_lineinfo()
1961 info->flags |= GPIO_V2_LINE_FLAG_BIAS_PULL_UP; in gpio_desc_to_lineinfo()
1963 if (test_bit(FLAG_EDGE_RISING, &desc->flags)) in gpio_desc_to_lineinfo()
1964 info->flags |= GPIO_V2_LINE_FLAG_EDGE_RISING; in gpio_desc_to_lineinfo()
1965 if (test_bit(FLAG_EDGE_FALLING, &desc->flags)) in gpio_desc_to_lineinfo()
1966 info->flags |= GPIO_V2_LINE_FLAG_EDGE_FALLING; in gpio_desc_to_lineinfo()
1968 debounce_period_us = READ_ONCE(desc->debounce_period_us); in gpio_desc_to_lineinfo()
1970 info->attrs[num_attrs].id = GPIO_V2_LINE_ATTR_ID_DEBOUNCE; in gpio_desc_to_lineinfo()
1971 info->attrs[num_attrs].debounce_period_us = debounce_period_us; in gpio_desc_to_lineinfo()
1974 info->num_attrs = num_attrs; in gpio_desc_to_lineinfo()
1992 struct gpio_device *gdev = cdev->gdev; in chipinfo_get()
1997 strscpy(chipinfo.name, dev_name(&gdev->dev), sizeof(chipinfo.name)); in chipinfo_get()
1998 strscpy(chipinfo.label, gdev->label, sizeof(chipinfo.label)); in chipinfo_get()
1999 chipinfo.lines = gdev->ngpio; in chipinfo_get()
2001 return -EFAULT; in chipinfo_get()
2012 int abiv = atomic_cmpxchg(&cdata->watch_abi_version, 0, version); in lineinfo_ensure_abi_version()
2028 return -EFAULT; in lineinfo_get_v1()
2031 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.line_offset); in lineinfo_get_v1()
2037 return -EPERM; in lineinfo_get_v1()
2039 if (test_and_set_bit(lineinfo.line_offset, cdev->watched_lines)) in lineinfo_get_v1()
2040 return -EBUSY; in lineinfo_get_v1()
2048 clear_bit(lineinfo.line_offset, cdev->watched_lines); in lineinfo_get_v1()
2049 return -EFAULT; in lineinfo_get_v1()
2063 return -EFAULT; in lineinfo_get()
2066 return -EINVAL; in lineinfo_get()
2068 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.offset); in lineinfo_get()
2075 return -EPERM; in lineinfo_get()
2077 if (test_and_set_bit(lineinfo.offset, cdev->watched_lines)) in lineinfo_get()
2078 return -EBUSY; in lineinfo_get()
2084 clear_bit(lineinfo.offset, cdev->watched_lines); in lineinfo_get()
2085 return -EFAULT; in lineinfo_get()
2096 return -EFAULT; in lineinfo_unwatch()
2098 if (offset >= cdev->gdev->ngpio) in lineinfo_unwatch()
2099 return -EINVAL; in lineinfo_unwatch()
2101 if (!test_and_clear_bit(offset, cdev->watched_lines)) in lineinfo_unwatch()
2102 return -EBUSY; in lineinfo_unwatch()
2108 * gpio_ioctl() - ioctl handler for the GPIO chardev
2112 struct gpio_chardev_data *cdev = file->private_data; in gpio_ioctl()
2113 struct gpio_device *gdev = cdev->gdev; in gpio_ioctl()
2117 if (!gdev->chip) in gpio_ioctl()
2118 return -ENODEV; in gpio_ioctl()
2143 return -EINVAL; in gpio_ioctl()
2165 struct gpio_v2_line_info_changed chg; in lineinfo_changed_notify() local
2169 if (!test_bit(gpio_chip_hwgpio(desc), cdev->watched_lines)) in lineinfo_changed_notify()
2172 memset(&chg, 0, sizeof(chg)); in lineinfo_changed_notify()
2173 chg.event_type = action; in lineinfo_changed_notify()
2174 chg.timestamp_ns = ktime_get_ns(); in lineinfo_changed_notify()
2175 gpio_desc_to_lineinfo(desc, &chg.info); in lineinfo_changed_notify()
2177 ret = kfifo_in_spinlocked(&cdev->events, &chg, 1, &cdev->wait.lock); in lineinfo_changed_notify()
2179 wake_up_poll(&cdev->wait, EPOLLIN); in lineinfo_changed_notify()
2181 pr_debug_ratelimited("lineinfo event FIFO is full - event dropped\n"); in lineinfo_changed_notify()
2189 struct gpio_chardev_data *cdev = file->private_data; in lineinfo_watch_poll()
2192 if (!cdev->gdev->chip) in lineinfo_watch_poll()
2195 poll_wait(file, &cdev->wait, pollt); in lineinfo_watch_poll()
2197 if (!kfifo_is_empty_spinlocked_noirqsave(&cdev->events, in lineinfo_watch_poll()
2198 &cdev->wait.lock)) in lineinfo_watch_poll()
2207 struct gpio_chardev_data *cdev = file->private_data; in lineinfo_watch_read()
2213 if (!cdev->gdev->chip) in lineinfo_watch_read()
2214 return -ENODEV; in lineinfo_watch_read()
2219 return -EINVAL; in lineinfo_watch_read()
2223 spin_lock(&cdev->wait.lock); in lineinfo_watch_read()
2224 if (kfifo_is_empty(&cdev->events)) { in lineinfo_watch_read()
2226 spin_unlock(&cdev->wait.lock); in lineinfo_watch_read()
2230 if (file->f_flags & O_NONBLOCK) { in lineinfo_watch_read()
2231 spin_unlock(&cdev->wait.lock); in lineinfo_watch_read()
2232 return -EAGAIN; in lineinfo_watch_read()
2235 ret = wait_event_interruptible_locked(cdev->wait, in lineinfo_watch_read()
2236 !kfifo_is_empty(&cdev->events)); in lineinfo_watch_read()
2238 spin_unlock(&cdev->wait.lock); in lineinfo_watch_read()
2244 if (atomic_read(&cdev->watch_abi_version) == 2) in lineinfo_watch_read()
2249 spin_unlock(&cdev->wait.lock); in lineinfo_watch_read()
2250 return -EINVAL; in lineinfo_watch_read()
2253 ret = kfifo_out(&cdev->events, &event, 1); in lineinfo_watch_read()
2254 spin_unlock(&cdev->wait.lock); in lineinfo_watch_read()
2256 ret = -EIO; in lineinfo_watch_read()
2264 return -EFAULT; in lineinfo_watch_read()
2271 return -EFAULT; in lineinfo_watch_read()
2275 return -EFAULT; in lineinfo_watch_read()
2284 * gpio_chrdev_open() - open the chardev for ioctl operations
2291 struct gpio_device *gdev = container_of(inode->i_cdev, in gpio_chrdev_open()
2294 int ret = -ENOMEM; in gpio_chrdev_open()
2297 if (!gdev->chip) in gpio_chrdev_open()
2298 return -ENODEV; in gpio_chrdev_open()
2302 return -ENOMEM; in gpio_chrdev_open()
2304 cdev->watched_lines = bitmap_zalloc(gdev->chip->ngpio, GFP_KERNEL); in gpio_chrdev_open()
2305 if (!cdev->watched_lines) in gpio_chrdev_open()
2308 init_waitqueue_head(&cdev->wait); in gpio_chrdev_open()
2309 INIT_KFIFO(cdev->events); in gpio_chrdev_open()
2310 cdev->gdev = gdev; in gpio_chrdev_open()
2312 cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; in gpio_chrdev_open()
2313 ret = blocking_notifier_chain_register(&gdev->notifier, in gpio_chrdev_open()
2314 &cdev->lineinfo_changed_nb); in gpio_chrdev_open()
2318 get_device(&gdev->dev); in gpio_chrdev_open()
2319 file->private_data = cdev; in gpio_chrdev_open()
2328 blocking_notifier_chain_unregister(&gdev->notifier, in gpio_chrdev_open()
2329 &cdev->lineinfo_changed_nb); in gpio_chrdev_open()
2331 bitmap_free(cdev->watched_lines); in gpio_chrdev_open()
2338 * gpio_chrdev_release() - close chardev after ioctl operations
2345 struct gpio_chardev_data *cdev = file->private_data; in gpio_chrdev_release()
2346 struct gpio_device *gdev = cdev->gdev; in gpio_chrdev_release()
2348 blocking_notifier_chain_unregister(&gdev->notifier, in gpio_chrdev_release()
2349 &cdev->lineinfo_changed_nb); in gpio_chrdev_release()
2350 bitmap_free(cdev->watched_lines); in gpio_chrdev_release()
2351 put_device(&gdev->dev); in gpio_chrdev_release()
2374 cdev_init(&gdev->chrdev, &gpio_fileops); in gpiolib_cdev_register()
2375 gdev->chrdev.owner = THIS_MODULE; in gpiolib_cdev_register()
2376 gdev->dev.devt = MKDEV(MAJOR(devt), gdev->id); in gpiolib_cdev_register()
2378 ret = cdev_device_add(&gdev->chrdev, &gdev->dev); in gpiolib_cdev_register()
2382 chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n", in gpiolib_cdev_register()
2383 MAJOR(devt), gdev->id); in gpiolib_cdev_register()
2390 cdev_device_del(&gdev->chrdev, &gdev->dev); in gpiolib_cdev_unregister()