Root/
1 | /* |
2 | * Filename: cfag12864bfb.c |
3 | * Version: 0.1.0 |
4 | * Description: cfag12864b LCD framebuffer driver |
5 | * License: GPLv2 |
6 | * Depends: cfag12864b |
7 | * |
8 | * Author: Copyright (C) Miguel Ojeda Sandonis |
9 | * Date: 2006-10-31 |
10 | * |
11 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License version 2 as |
13 | * published by the Free Software Foundation. |
14 | * |
15 | * This program is distributed in the hope that it will be useful, |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | * GNU General Public License for more details. |
19 | * |
20 | * You should have received a copy of the GNU General Public License |
21 | * along with this program; if not, write to the Free Software |
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 | * |
24 | */ |
25 | |
26 | #include <linux/init.h> |
27 | #include <linux/module.h> |
28 | #include <linux/kernel.h> |
29 | #include <linux/delay.h> |
30 | #include <linux/errno.h> |
31 | #include <linux/fb.h> |
32 | #include <linux/mm.h> |
33 | #include <linux/platform_device.h> |
34 | #include <linux/string.h> |
35 | #include <linux/uaccess.h> |
36 | #include <linux/cfag12864b.h> |
37 | |
38 | #define CFAG12864BFB_NAME "cfag12864bfb" |
39 | |
40 | static struct fb_fix_screeninfo cfag12864bfb_fix __devinitdata = { |
41 | .id = "cfag12864b", |
42 | .type = FB_TYPE_PACKED_PIXELS, |
43 | .visual = FB_VISUAL_MONO10, |
44 | .xpanstep = 0, |
45 | .ypanstep = 0, |
46 | .ywrapstep = 0, |
47 | .line_length = CFAG12864B_WIDTH / 8, |
48 | .accel = FB_ACCEL_NONE, |
49 | }; |
50 | |
51 | static struct fb_var_screeninfo cfag12864bfb_var __devinitdata = { |
52 | .xres = CFAG12864B_WIDTH, |
53 | .yres = CFAG12864B_HEIGHT, |
54 | .xres_virtual = CFAG12864B_WIDTH, |
55 | .yres_virtual = CFAG12864B_HEIGHT, |
56 | .bits_per_pixel = 1, |
57 | .red = { 0, 1, 0 }, |
58 | .green = { 0, 1, 0 }, |
59 | .blue = { 0, 1, 0 }, |
60 | .left_margin = 0, |
61 | .right_margin = 0, |
62 | .upper_margin = 0, |
63 | .lower_margin = 0, |
64 | .vmode = FB_VMODE_NONINTERLACED, |
65 | }; |
66 | |
67 | static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma) |
68 | { |
69 | return vm_insert_page(vma, vma->vm_start, |
70 | virt_to_page(cfag12864b_buffer)); |
71 | } |
72 | |
73 | static struct fb_ops cfag12864bfb_ops = { |
74 | .owner = THIS_MODULE, |
75 | .fb_read = fb_sys_read, |
76 | .fb_write = fb_sys_write, |
77 | .fb_fillrect = sys_fillrect, |
78 | .fb_copyarea = sys_copyarea, |
79 | .fb_imageblit = sys_imageblit, |
80 | .fb_mmap = cfag12864bfb_mmap, |
81 | }; |
82 | |
83 | static int __devinit cfag12864bfb_probe(struct platform_device *device) |
84 | { |
85 | int ret = -EINVAL; |
86 | struct fb_info *info = framebuffer_alloc(0, &device->dev); |
87 | |
88 | if (!info) |
89 | goto none; |
90 | |
91 | info->screen_base = (char __iomem *) cfag12864b_buffer; |
92 | info->screen_size = CFAG12864B_SIZE; |
93 | info->fbops = &cfag12864bfb_ops; |
94 | info->fix = cfag12864bfb_fix; |
95 | info->var = cfag12864bfb_var; |
96 | info->pseudo_palette = NULL; |
97 | info->par = NULL; |
98 | info->flags = FBINFO_FLAG_DEFAULT; |
99 | |
100 | if (register_framebuffer(info) < 0) |
101 | goto fballoced; |
102 | |
103 | platform_set_drvdata(device, info); |
104 | |
105 | printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, |
106 | info->fix.id); |
107 | |
108 | return 0; |
109 | |
110 | fballoced: |
111 | framebuffer_release(info); |
112 | |
113 | none: |
114 | return ret; |
115 | } |
116 | |
117 | static int __devexit cfag12864bfb_remove(struct platform_device *device) |
118 | { |
119 | struct fb_info *info = platform_get_drvdata(device); |
120 | |
121 | if (info) { |
122 | unregister_framebuffer(info); |
123 | framebuffer_release(info); |
124 | } |
125 | |
126 | return 0; |
127 | } |
128 | |
129 | static struct platform_driver cfag12864bfb_driver = { |
130 | .probe = cfag12864bfb_probe, |
131 | .remove = __devexit_p(cfag12864bfb_remove), |
132 | .driver = { |
133 | .name = CFAG12864BFB_NAME, |
134 | }, |
135 | }; |
136 | |
137 | static struct platform_device *cfag12864bfb_device; |
138 | |
139 | static int __init cfag12864bfb_init(void) |
140 | { |
141 | int ret = -EINVAL; |
142 | |
143 | /* cfag12864b_init() must be called first */ |
144 | if (!cfag12864b_isinited()) { |
145 | printk(KERN_ERR CFAG12864BFB_NAME ": ERROR: " |
146 | "cfag12864b is not initialized\n"); |
147 | goto none; |
148 | } |
149 | |
150 | if (cfag12864b_enable()) { |
151 | printk(KERN_ERR CFAG12864BFB_NAME ": ERROR: " |
152 | "can't enable cfag12864b refreshing (being used)\n"); |
153 | return -ENODEV; |
154 | } |
155 | |
156 | ret = platform_driver_register(&cfag12864bfb_driver); |
157 | |
158 | if (!ret) { |
159 | cfag12864bfb_device = |
160 | platform_device_alloc(CFAG12864BFB_NAME, 0); |
161 | |
162 | if (cfag12864bfb_device) |
163 | ret = platform_device_add(cfag12864bfb_device); |
164 | else |
165 | ret = -ENOMEM; |
166 | |
167 | if (ret) { |
168 | platform_device_put(cfag12864bfb_device); |
169 | platform_driver_unregister(&cfag12864bfb_driver); |
170 | } |
171 | } |
172 | |
173 | none: |
174 | return ret; |
175 | } |
176 | |
177 | static void __exit cfag12864bfb_exit(void) |
178 | { |
179 | platform_device_unregister(cfag12864bfb_device); |
180 | platform_driver_unregister(&cfag12864bfb_driver); |
181 | cfag12864b_disable(); |
182 | } |
183 | |
184 | module_init(cfag12864bfb_init); |
185 | module_exit(cfag12864bfb_exit); |
186 | |
187 | MODULE_LICENSE("GPL v2"); |
188 | MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>"); |
189 | MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver"); |
190 |
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