Lines Matching defs:cdev
7 #include <linux/cdev.h>
30 #include "gpiolib-cdev.h"
1990 static int chipinfo_get(struct gpio_chardev_data *cdev, void __user *ip)
1992 struct gpio_device *gdev = cdev->gdev;
2020 static int lineinfo_get_v1(struct gpio_chardev_data *cdev, void __user *ip,
2031 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.line_offset);
2036 if (lineinfo_ensure_abi_version(cdev, 1))
2039 if (test_and_set_bit(lineinfo.line_offset, cdev->watched_lines))
2048 clear_bit(lineinfo.line_offset, cdev->watched_lines);
2056 static int lineinfo_get(struct gpio_chardev_data *cdev, void __user *ip,
2068 desc = gpiochip_get_desc(cdev->gdev->chip, lineinfo.offset);
2074 if (lineinfo_ensure_abi_version(cdev, 2))
2077 if (test_and_set_bit(lineinfo.offset, cdev->watched_lines))
2084 clear_bit(lineinfo.offset, cdev->watched_lines);
2091 static int lineinfo_unwatch(struct gpio_chardev_data *cdev, void __user *ip)
2098 if (offset >= cdev->gdev->ngpio)
2101 if (!test_and_clear_bit(offset, cdev->watched_lines))
2112 struct gpio_chardev_data *cdev = file->private_data;
2113 struct gpio_device *gdev = cdev->gdev;
2123 return chipinfo_get(cdev, ip);
2130 return lineinfo_get_v1(cdev, ip, false);
2132 return lineinfo_get_v1(cdev, ip, true);
2135 return lineinfo_get(cdev, ip, false);
2137 return lineinfo_get(cdev, ip, true);
2141 return lineinfo_unwatch(cdev, ip);
2164 struct gpio_chardev_data *cdev = to_gpio_chardev_data(nb);
2169 if (!test_bit(gpio_chip_hwgpio(desc), cdev->watched_lines))
2177 ret = kfifo_in_spinlocked(&cdev->events, &chg, 1, &cdev->wait.lock);
2179 wake_up_poll(&cdev->wait, EPOLLIN);
2189 struct gpio_chardev_data *cdev = file->private_data;
2192 if (!cdev->gdev->chip)
2195 poll_wait(file, &cdev->wait, pollt);
2197 if (!kfifo_is_empty_spinlocked_noirqsave(&cdev->events,
2198 &cdev->wait.lock))
2207 struct gpio_chardev_data *cdev = file->private_data;
2213 if (!cdev->gdev->chip)
2223 spin_lock(&cdev->wait.lock);
2224 if (kfifo_is_empty(&cdev->events)) {
2226 spin_unlock(&cdev->wait.lock);
2231 spin_unlock(&cdev->wait.lock);
2235 ret = wait_event_interruptible_locked(cdev->wait,
2236 !kfifo_is_empty(&cdev->events));
2238 spin_unlock(&cdev->wait.lock);
2244 if (atomic_read(&cdev->watch_abi_version) == 2)
2249 spin_unlock(&cdev->wait.lock);
2253 ret = kfifo_out(&cdev->events, &event, 1);
2254 spin_unlock(&cdev->wait.lock);
2293 struct gpio_chardev_data *cdev;
2300 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
2301 if (!cdev)
2304 cdev->watched_lines = bitmap_zalloc(gdev->chip->ngpio, GFP_KERNEL);
2305 if (!cdev->watched_lines)
2308 init_waitqueue_head(&cdev->wait);
2309 INIT_KFIFO(cdev->events);
2310 cdev->gdev = gdev;
2312 cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify;
2314 &cdev->lineinfo_changed_nb);
2319 file->private_data = cdev;
2329 &cdev->lineinfo_changed_nb);
2331 bitmap_free(cdev->watched_lines);
2333 kfree(cdev);
2345 struct gpio_chardev_data *cdev = file->private_data;
2346 struct gpio_device *gdev = cdev->gdev;
2349 &cdev->lineinfo_changed_nb);
2350 bitmap_free(cdev->watched_lines);
2352 kfree(cdev);