Root/
1 | /* |
2 | * linux/drivers/video/fb_sys_read.c - Generic file operations where |
3 | * framebuffer is in system RAM |
4 | * |
5 | * Copyright (C) 2007 Antonino Daplas <adaplas@pol.net> |
6 | * |
7 | * This file is subject to the terms and conditions of the GNU General Public |
8 | * License. See the file COPYING in the main directory of this archive |
9 | * for more details. |
10 | * |
11 | */ |
12 | #include <linux/fb.h> |
13 | #include <linux/module.h> |
14 | #include <linux/uaccess.h> |
15 | |
16 | ssize_t fb_sys_read(struct fb_info *info, char __user *buf, size_t count, |
17 | loff_t *ppos) |
18 | { |
19 | unsigned long p = *ppos; |
20 | void *src; |
21 | int err = 0; |
22 | unsigned long total_size; |
23 | |
24 | if (info->state != FBINFO_STATE_RUNNING) |
25 | return -EPERM; |
26 | |
27 | total_size = info->screen_size; |
28 | |
29 | if (total_size == 0) |
30 | total_size = info->fix.smem_len; |
31 | |
32 | if (p >= total_size) |
33 | return 0; |
34 | |
35 | if (count >= total_size) |
36 | count = total_size; |
37 | |
38 | if (count + p > total_size) |
39 | count = total_size - p; |
40 | |
41 | src = (void __force *)(info->screen_base + p); |
42 | |
43 | if (info->fbops->fb_sync) |
44 | info->fbops->fb_sync(info); |
45 | |
46 | if (copy_to_user(buf, src, count)) |
47 | err = -EFAULT; |
48 | |
49 | if (!err) |
50 | *ppos += count; |
51 | |
52 | return (err) ? err : count; |
53 | } |
54 | EXPORT_SYMBOL_GPL(fb_sys_read); |
55 | |
56 | ssize_t fb_sys_write(struct fb_info *info, const char __user *buf, |
57 | size_t count, loff_t *ppos) |
58 | { |
59 | unsigned long p = *ppos; |
60 | void *dst; |
61 | int err = 0; |
62 | unsigned long total_size; |
63 | |
64 | if (info->state != FBINFO_STATE_RUNNING) |
65 | return -EPERM; |
66 | |
67 | total_size = info->screen_size; |
68 | |
69 | if (total_size == 0) |
70 | total_size = info->fix.smem_len; |
71 | |
72 | if (p > total_size) |
73 | return -EFBIG; |
74 | |
75 | if (count > total_size) { |
76 | err = -EFBIG; |
77 | count = total_size; |
78 | } |
79 | |
80 | if (count + p > total_size) { |
81 | if (!err) |
82 | err = -ENOSPC; |
83 | |
84 | count = total_size - p; |
85 | } |
86 | |
87 | dst = (void __force *) (info->screen_base + p); |
88 | |
89 | if (info->fbops->fb_sync) |
90 | info->fbops->fb_sync(info); |
91 | |
92 | if (copy_from_user(dst, buf, count)) |
93 | err = -EFAULT; |
94 | |
95 | if (!err) |
96 | *ppos += count; |
97 | |
98 | return (err) ? err : count; |
99 | } |
100 | EXPORT_SYMBOL_GPL(fb_sys_write); |
101 | |
102 | MODULE_AUTHOR("Antonino Daplas <adaplas@pol.net>"); |
103 | MODULE_DESCRIPTION("Generic file read (fb in system RAM)"); |
104 | MODULE_LICENSE("GPL"); |
105 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9