5
* @author Alexander Kalmuk
6
* @author Anton Kozlov:
7
* splitted with fs, simplifying
12
#include <kernel/irq.h>
13
#include <lib/libds/dlist.h>
15
#include <kernel/lthread/lthread.h>
16
#include <kernel/sched/schedee_priority.h>
18
#include <drivers/input/input_dev.h>
20
static DLIST_DEFINE(input_devices);
22
void input_dev_report_event(struct input_dev *dev, struct input_event *ev) {
25
if (!(dev->flags & INPUT_DEV_OPENED)) {
31
ev->devtype = dev->type;
33
ring_buff_enqueue(&dev->rbuf, ev, 1);
35
input_dev_private_notify(dev, ev);
40
int input_dev_register(struct input_dev *dev) {
41
if (!dev || !dev->ops) {
46
ring_buff_init(&dev->rbuf, sizeof(struct input_event),
47
INPUT_DEV_EVENT_QUEUE_LEN, &dev->event_buf);
49
dlist_add_prev(dlist_head_init(&dev->dev_link), &input_devices);
51
input_dev_private_register(dev);
56
int input_dev_event(struct input_dev *dev, struct input_event *ev) {
65
if (0 == ring_buff_get_cnt(&dev->rbuf)) {
70
ring_buff_dequeue(&dev->rbuf, ev, 1);
78
int input_dev_open(struct input_dev *dev, indev_event_cb_t *event_cb) {
84
dev->event_cb = event_cb;
86
if (dev->ops->start) {
87
res = dev->ops->start(dev);
93
dev->flags |= INPUT_DEV_OPENED;
98
int input_dev_close(struct input_dev *dev) {
103
dev->event_cb = NULL;
105
if (dev->ops->stop) {
109
dev->flags &= ~INPUT_DEV_OPENED;
114
struct input_dev *input_dev_lookup(const char *name) {
115
struct input_dev *dev;
117
dlist_foreach_entry(dev, &input_devices, dev_link) {
118
if (0 == strcmp(dev->name, name)) {
126
struct input_dev *input_dev_iterate(struct input_dev *dev) {
127
struct dlist_head *link;
129
link = dev ? dev->dev_link.next : input_devices.next;
130
if (link == &input_devices) {
133
return member_cast_out(link, struct input_dev, dev_link);