Lines Matching refs:cdev

2339 static int chipinfo_get(struct gpio_chardev_data *cdev, void __user *ip)  in chipinfo_get()  argument
2341 struct gpio_device *gdev = cdev->gdev; in chipinfo_get()
2369 static int lineinfo_get_v1(struct gpio_chardev_data *cdev, void __user *ip, in lineinfo_get_v1() argument
2380 desc = gpio_device_get_desc(cdev->gdev, lineinfo.line_offset); in lineinfo_get_v1()
2385 if (lineinfo_ensure_abi_version(cdev, 1)) in lineinfo_get_v1()
2388 if (test_and_set_bit(lineinfo.line_offset, cdev->watched_lines)) in lineinfo_get_v1()
2397 clear_bit(lineinfo.line_offset, cdev->watched_lines); in lineinfo_get_v1()
2405 static int lineinfo_get(struct gpio_chardev_data *cdev, void __user *ip, in lineinfo_get() argument
2417 desc = gpio_device_get_desc(cdev->gdev, lineinfo.offset); in lineinfo_get()
2423 if (lineinfo_ensure_abi_version(cdev, 2)) in lineinfo_get()
2426 if (test_and_set_bit(lineinfo.offset, cdev->watched_lines)) in lineinfo_get()
2433 clear_bit(lineinfo.offset, cdev->watched_lines); in lineinfo_get()
2440 static int lineinfo_unwatch(struct gpio_chardev_data *cdev, void __user *ip) in lineinfo_unwatch() argument
2447 if (offset >= cdev->gdev->ngpio) in lineinfo_unwatch()
2450 if (!test_and_clear_bit(offset, cdev->watched_lines)) in lineinfo_unwatch()
2461 struct gpio_chardev_data *cdev = file->private_data; in gpio_ioctl() local
2462 struct gpio_device *gdev = cdev->gdev; in gpio_ioctl()
2474 return chipinfo_get(cdev, ip); in gpio_ioctl()
2481 return lineinfo_get_v1(cdev, ip, false); in gpio_ioctl()
2483 return lineinfo_get_v1(cdev, ip, true); in gpio_ioctl()
2486 return lineinfo_get(cdev, ip, false); in gpio_ioctl()
2488 return lineinfo_get(cdev, ip, true); in gpio_ioctl()
2492 return lineinfo_unwatch(cdev, ip); in gpio_ioctl()
2510 struct gpio_chardev_data *cdev; member
2535 ret = kfifo_in_spinlocked(&ctx->cdev->events, &ctx->chg, 1, in lineinfo_changed_func()
2536 &ctx->cdev->wait.lock); in lineinfo_changed_func()
2538 wake_up_poll(&ctx->cdev->wait, EPOLLIN); in lineinfo_changed_func()
2543 fput(ctx->cdev->fp); in lineinfo_changed_func()
2550 struct gpio_chardev_data *cdev = in lineinfo_changed_notify() local
2555 if (!test_bit(gpio_chip_hwgpio(desc), cdev->watched_lines)) in lineinfo_changed_notify()
2580 ctx->cdev = cdev; in lineinfo_changed_notify()
2582 get_file(ctx->cdev->fp); in lineinfo_changed_notify()
2593 struct gpio_chardev_data *cdev = container_of(nb, in gpio_device_unregistered_notify() local
2597 wake_up_poll(&cdev->wait, EPOLLIN | EPOLLERR); in gpio_device_unregistered_notify()
2605 struct gpio_chardev_data *cdev = file->private_data; in lineinfo_watch_poll() local
2608 guard(srcu)(&cdev->gdev->srcu); in lineinfo_watch_poll()
2610 if (!rcu_access_pointer(cdev->gdev->chip)) in lineinfo_watch_poll()
2613 poll_wait(file, &cdev->wait, pollt); in lineinfo_watch_poll()
2615 if (!kfifo_is_empty_spinlocked_noirqsave(&cdev->events, in lineinfo_watch_poll()
2616 &cdev->wait.lock)) in lineinfo_watch_poll()
2625 struct gpio_chardev_data *cdev = file->private_data; in lineinfo_watch_read() local
2631 guard(srcu)(&cdev->gdev->srcu); in lineinfo_watch_read()
2633 if (!rcu_access_pointer(cdev->gdev->chip)) in lineinfo_watch_read()
2643 scoped_guard(spinlock, &cdev->wait.lock) { in lineinfo_watch_read()
2644 if (kfifo_is_empty(&cdev->events)) { in lineinfo_watch_read()
2651 ret = wait_event_interruptible_locked(cdev->wait, in lineinfo_watch_read()
2652 !kfifo_is_empty(&cdev->events)); in lineinfo_watch_read()
2658 if (atomic_read(&cdev->watch_abi_version) == 2) in lineinfo_watch_read()
2665 if (kfifo_out(&cdev->events, &event, 1) != 1) { in lineinfo_watch_read()
2710 struct gpio_chardev_data *cdev; in gpio_chrdev_open() local
2719 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); in gpio_chrdev_open()
2720 if (!cdev) in gpio_chrdev_open()
2723 cdev->watched_lines = bitmap_zalloc(gdev->ngpio, GFP_KERNEL); in gpio_chrdev_open()
2724 if (!cdev->watched_lines) in gpio_chrdev_open()
2727 init_waitqueue_head(&cdev->wait); in gpio_chrdev_open()
2728 INIT_KFIFO(cdev->events); in gpio_chrdev_open()
2729 cdev->gdev = gpio_device_get(gdev); in gpio_chrdev_open()
2731 cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; in gpio_chrdev_open()
2734 &cdev->lineinfo_changed_nb); in gpio_chrdev_open()
2738 cdev->device_unregistered_nb.notifier_call = in gpio_chrdev_open()
2741 &cdev->device_unregistered_nb); in gpio_chrdev_open()
2745 file->private_data = cdev; in gpio_chrdev_open()
2746 cdev->fp = file; in gpio_chrdev_open()
2756 &cdev->device_unregistered_nb); in gpio_chrdev_open()
2760 &cdev->lineinfo_changed_nb); in gpio_chrdev_open()
2763 bitmap_free(cdev->watched_lines); in gpio_chrdev_open()
2765 kfree(cdev); in gpio_chrdev_open()
2779 struct gpio_chardev_data *cdev = file->private_data; in gpio_chrdev_release() local
2780 struct gpio_device *gdev = cdev->gdev; in gpio_chrdev_release()
2783 &cdev->device_unregistered_nb); in gpio_chrdev_release()
2786 &cdev->lineinfo_changed_nb); in gpio_chrdev_release()
2787 bitmap_free(cdev->watched_lines); in gpio_chrdev_release()
2789 kfree(cdev); in gpio_chrdev_release()