Lines Matching defs:cdev
7 #include <linux/cdev.h>
33 #include "gpiolib-cdev.h"
2368 static int chipinfo_get(struct gpio_chardev_data *cdev, void __user *ip)
2370 struct gpio_device *gdev = cdev->gdev;
2398 static int lineinfo_get_v1(struct gpio_chardev_data *cdev, void __user *ip,
2409 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.line_offset);
2414 if (lineinfo_ensure_abi_version(cdev, 1))
2417 if (test_and_set_bit(lineinfo.line_offset, cdev->watched_lines))
2426 clear_bit(lineinfo.line_offset, cdev->watched_lines);
2434 static int lineinfo_get(struct gpio_chardev_data *cdev, void __user *ip,
2446 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.offset);
2452 if (lineinfo_ensure_abi_version(cdev, 2))
2455 if (test_and_set_bit(lineinfo.offset, cdev->watched_lines))
2462 clear_bit(lineinfo.offset, cdev->watched_lines);
2469 static int lineinfo_unwatch(struct gpio_chardev_data *cdev, void __user *ip)
2476 if (offset >= cdev->gdev->ngpio)
2479 if (!test_and_clear_bit(offset, cdev->watched_lines))
2487 struct gpio_chardev_data *cdev = file->private_data;
2488 struct gpio_device *gdev = cdev->gdev;
2498 return chipinfo_get(cdev, ip);
2505 return lineinfo_get_v1(cdev, ip, false);
2507 return lineinfo_get_v1(cdev, ip, true);
2510 return lineinfo_get(cdev, ip, false);
2512 return lineinfo_get(cdev, ip, true);
2516 return lineinfo_unwatch(cdev, ip);
2527 struct gpio_chardev_data *cdev = file->private_data;
2529 return call_ioctl_locked(file, cmd, arg, cdev->gdev,
2544 struct gpio_chardev_data *cdev =
2550 if (!test_bit(gpio_chip_hwgpio(desc), cdev->watched_lines))
2558 ret = kfifo_in_spinlocked(&cdev->events, &chg, 1, &cdev->wait.lock);
2560 wake_up_poll(&cdev->wait, EPOLLIN);
2570 struct gpio_chardev_data *cdev = container_of(nb,
2574 wake_up_poll(&cdev->wait, EPOLLIN | EPOLLERR);
2582 struct gpio_chardev_data *cdev = file->private_data;
2585 if (!cdev->gdev->chip)
2588 poll_wait(file, &cdev->wait, pollt);
2590 if (!kfifo_is_empty_spinlocked_noirqsave(&cdev->events,
2591 &cdev->wait.lock))
2600 struct gpio_chardev_data *cdev = file->private_data;
2602 return call_poll_locked(file, pollt, cdev->gdev,
2609 struct gpio_chardev_data *cdev = file->private_data;
2615 if (!cdev->gdev->chip)
2625 spin_lock(&cdev->wait.lock);
2626 if (kfifo_is_empty(&cdev->events)) {
2628 spin_unlock(&cdev->wait.lock);
2633 spin_unlock(&cdev->wait.lock);
2637 ret = wait_event_interruptible_locked(cdev->wait,
2638 !kfifo_is_empty(&cdev->events));
2640 spin_unlock(&cdev->wait.lock);
2646 if (atomic_read(&cdev->watch_abi_version) == 2)
2651 spin_unlock(&cdev->wait.lock);
2655 ret = kfifo_out(&cdev->events, &event, 1);
2656 spin_unlock(&cdev->wait.lock);
2688 struct gpio_chardev_data *cdev = file->private_data;
2690 return call_read_locked(file, buf, count, off, cdev->gdev,
2704 struct gpio_chardev_data *cdev;
2715 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
2716 if (!cdev)
2719 cdev->watched_lines = bitmap_zalloc(gdev->chip->ngpio, GFP_KERNEL);
2720 if (!cdev->watched_lines)
2723 init_waitqueue_head(&cdev->wait);
2724 INIT_KFIFO(cdev->events);
2725 cdev->gdev = gpio_device_get(gdev);
2727 cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify;
2729 &cdev->lineinfo_changed_nb);
2733 cdev->device_unregistered_nb.notifier_call =
2736 &cdev->device_unregistered_nb);
2740 file->private_data = cdev;
2752 &cdev->device_unregistered_nb);
2755 &cdev->lineinfo_changed_nb);
2758 bitmap_free(cdev->watched_lines);
2760 kfree(cdev);
2774 struct gpio_chardev_data *cdev = file->private_data;
2775 struct gpio_device *gdev = cdev->gdev;
2777 bitmap_free(cdev->watched_lines);
2779 &cdev->device_unregistered_nb);
2781 &cdev->lineinfo_changed_nb);
2783 kfree(cdev);