1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #include <unistd.h>
7*437bfbebSnyanmisaka #include <errno.h>
8*437bfbebSnyanmisaka #include <poll.h>
9*437bfbebSnyanmisaka #include <sys/eventfd.h>
10*437bfbebSnyanmisaka
11*437bfbebSnyanmisaka #include "mpp_eventfd.h"
12*437bfbebSnyanmisaka
mpp_eventfd_get(RK_U32 init)13*437bfbebSnyanmisaka RK_S32 mpp_eventfd_get(RK_U32 init)
14*437bfbebSnyanmisaka {
15*437bfbebSnyanmisaka RK_S32 fd = eventfd(init, 0);
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka if (fd < 0)
18*437bfbebSnyanmisaka fd = errno;
19*437bfbebSnyanmisaka
20*437bfbebSnyanmisaka return fd;
21*437bfbebSnyanmisaka }
22*437bfbebSnyanmisaka
mpp_eventfd_put(RK_S32 fd)23*437bfbebSnyanmisaka RK_S32 mpp_eventfd_put(RK_S32 fd)
24*437bfbebSnyanmisaka {
25*437bfbebSnyanmisaka if (fd >= 0)
26*437bfbebSnyanmisaka close(fd);
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka return 0;
29*437bfbebSnyanmisaka }
30*437bfbebSnyanmisaka
mpp_eventfd_read(RK_S32 fd,RK_U64 * val,RK_S64 timeout)31*437bfbebSnyanmisaka RK_S32 mpp_eventfd_read(RK_S32 fd, RK_U64 *val, RK_S64 timeout)
32*437bfbebSnyanmisaka {
33*437bfbebSnyanmisaka struct pollfd nfds;
34*437bfbebSnyanmisaka RK_U64 tmp = 0;
35*437bfbebSnyanmisaka RK_S32 ret = 0;
36*437bfbebSnyanmisaka
37*437bfbebSnyanmisaka if (NULL == val)
38*437bfbebSnyanmisaka val = &tmp;
39*437bfbebSnyanmisaka
40*437bfbebSnyanmisaka nfds.fd = fd;
41*437bfbebSnyanmisaka nfds.events = POLLIN;
42*437bfbebSnyanmisaka
43*437bfbebSnyanmisaka ret = poll(&nfds, 1, timeout);
44*437bfbebSnyanmisaka if (ret == 1 && (nfds.revents & POLLIN) &&
45*437bfbebSnyanmisaka sizeof(RK_U64) == read(fd, val, sizeof(RK_U64))) {
46*437bfbebSnyanmisaka ret = 0;
47*437bfbebSnyanmisaka } else
48*437bfbebSnyanmisaka ret = errno;
49*437bfbebSnyanmisaka
50*437bfbebSnyanmisaka return ret;
51*437bfbebSnyanmisaka }
52*437bfbebSnyanmisaka
mpp_eventfd_write(RK_S32 fd,RK_U64 val)53*437bfbebSnyanmisaka RK_S32 mpp_eventfd_write(RK_S32 fd, RK_U64 val)
54*437bfbebSnyanmisaka {
55*437bfbebSnyanmisaka RK_S32 ret = 0;
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka if (sizeof(RK_U64) != write(fd, &val, sizeof(val)))
58*437bfbebSnyanmisaka ret = errno;
59*437bfbebSnyanmisaka
60*437bfbebSnyanmisaka return ret;
61*437bfbebSnyanmisaka }
62