Lines Matching +full:- +full:clk
1 // SPDX-License-Identifier: GPL-2.0+
10 #include <linux/posix-clock.h>
15 #include "posix-timers.h"
22 struct posix_clock_context *pccontext = fp->private_data; in get_posix_clock()
23 struct posix_clock *clk = pccontext->clk; in get_posix_clock() local
25 down_read(&clk->rwsem); in get_posix_clock()
27 if (!clk->zombie) in get_posix_clock()
28 return clk; in get_posix_clock()
30 up_read(&clk->rwsem); in get_posix_clock()
35 static void put_posix_clock(struct posix_clock *clk) in put_posix_clock() argument
37 up_read(&clk->rwsem); in put_posix_clock()
43 struct posix_clock_context *pccontext = fp->private_data; in posix_clock_read()
44 struct posix_clock *clk = get_posix_clock(fp); in posix_clock_read() local
45 int err = -EINVAL; in posix_clock_read()
47 if (!clk) in posix_clock_read()
48 return -ENODEV; in posix_clock_read()
50 if (clk->ops.read) in posix_clock_read()
51 err = clk->ops.read(pccontext, fp->f_flags, buf, count); in posix_clock_read()
53 put_posix_clock(clk); in posix_clock_read()
60 struct posix_clock_context *pccontext = fp->private_data; in posix_clock_poll()
61 struct posix_clock *clk = get_posix_clock(fp); in posix_clock_poll() local
64 if (!clk) in posix_clock_poll()
67 if (clk->ops.poll) in posix_clock_poll()
68 result = clk->ops.poll(pccontext, fp, wait); in posix_clock_poll()
70 put_posix_clock(clk); in posix_clock_poll()
78 struct posix_clock_context *pccontext = fp->private_data; in posix_clock_ioctl()
79 struct posix_clock *clk = get_posix_clock(fp); in posix_clock_ioctl() local
80 int err = -ENOTTY; in posix_clock_ioctl()
82 if (!clk) in posix_clock_ioctl()
83 return -ENODEV; in posix_clock_ioctl()
85 if (clk->ops.ioctl) in posix_clock_ioctl()
86 err = clk->ops.ioctl(pccontext, cmd, arg); in posix_clock_ioctl()
88 put_posix_clock(clk); in posix_clock_ioctl()
96 struct posix_clock *clk = in posix_clock_open() local
97 container_of(inode->i_cdev, struct posix_clock, cdev); in posix_clock_open()
100 down_read(&clk->rwsem); in posix_clock_open()
102 if (clk->zombie) { in posix_clock_open()
103 err = -ENODEV; in posix_clock_open()
108 err = -ENOMEM; in posix_clock_open()
111 pccontext->clk = clk; in posix_clock_open()
112 pccontext->fp = fp; in posix_clock_open()
113 if (clk->ops.open) { in posix_clock_open()
114 err = clk->ops.open(pccontext, fp->f_mode); in posix_clock_open()
121 fp->private_data = pccontext; in posix_clock_open()
122 get_device(clk->dev); in posix_clock_open()
125 up_read(&clk->rwsem); in posix_clock_open()
131 struct posix_clock_context *pccontext = fp->private_data; in posix_clock_release()
132 struct posix_clock *clk; in posix_clock_release() local
136 return -ENODEV; in posix_clock_release()
137 clk = pccontext->clk; in posix_clock_release()
139 if (clk->ops.release) in posix_clock_release()
140 err = clk->ops.release(pccontext); in posix_clock_release()
142 put_device(clk->dev); in posix_clock_release()
145 fp->private_data = NULL; in posix_clock_release()
160 int posix_clock_register(struct posix_clock *clk, struct device *dev) in posix_clock_register() argument
164 init_rwsem(&clk->rwsem); in posix_clock_register()
166 cdev_init(&clk->cdev, &posix_clock_file_operations); in posix_clock_register()
167 err = cdev_device_add(&clk->cdev, dev); in posix_clock_register()
170 dev_name(dev), MAJOR(dev->devt), MINOR(dev->devt)); in posix_clock_register()
173 clk->cdev.owner = clk->ops.owner; in posix_clock_register()
174 clk->dev = dev; in posix_clock_register()
180 void posix_clock_unregister(struct posix_clock *clk) in posix_clock_unregister() argument
182 cdev_device_del(&clk->cdev, clk->dev); in posix_clock_unregister()
184 down_write(&clk->rwsem); in posix_clock_unregister()
185 clk->zombie = true; in posix_clock_unregister()
186 up_write(&clk->rwsem); in posix_clock_unregister()
188 put_device(clk->dev); in posix_clock_unregister()
194 struct posix_clock *clk; member
200 int err = -EINVAL; in get_clock_desc()
205 if (fp->f_op->open != posix_clock_open || !fp->private_data) in get_clock_desc()
208 cd->fp = fp; in get_clock_desc()
209 cd->clk = get_posix_clock(fp); in get_clock_desc()
211 err = cd->clk ? 0 : -ENODEV; in get_clock_desc()
220 put_posix_clock(cd->clk); in put_clock_desc()
221 fput(cd->fp); in put_clock_desc()
233 if (tx->modes && (cd.fp->f_mode & FMODE_WRITE) == 0) { in pc_clock_adjtime()
234 err = -EACCES; in pc_clock_adjtime()
238 if (cd.clk->ops.clock_adjtime) in pc_clock_adjtime()
239 err = cd.clk->ops.clock_adjtime(cd.clk, tx); in pc_clock_adjtime()
241 err = -EOPNOTSUPP; in pc_clock_adjtime()
257 if (cd.clk->ops.clock_gettime) in pc_clock_gettime()
258 err = cd.clk->ops.clock_gettime(cd.clk, ts); in pc_clock_gettime()
260 err = -EOPNOTSUPP; in pc_clock_gettime()
276 if (cd.clk->ops.clock_getres) in pc_clock_getres()
277 err = cd.clk->ops.clock_getres(cd.clk, ts); in pc_clock_getres()
279 err = -EOPNOTSUPP; in pc_clock_getres()
292 return -EINVAL; in pc_clock_settime()
298 if ((cd.fp->f_mode & FMODE_WRITE) == 0) { in pc_clock_settime()
299 err = -EACCES; in pc_clock_settime()
303 if (cd.clk->ops.clock_settime) in pc_clock_settime()
304 err = cd.clk->ops.clock_settime(cd.clk, ts); in pc_clock_settime()
306 err = -EOPNOTSUPP; in pc_clock_settime()