xref: /rockchip-linux_mpp/osal/mpp_eventfd.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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