]>
Commit | Line | Data |
---|---|---|
70e84049 MOS |
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 <[email protected]> | |
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/slab.h> | |
35 | #include <linux/string.h> | |
36 | #include <linux/uaccess.h> | |
37 | #include <linux/cfag12864b.h> | |
38 | ||
39 | #define CFAG12864BFB_NAME "cfag12864bfb" | |
40 | ||
41 | static struct fb_fix_screeninfo cfag12864bfb_fix __initdata = { | |
42 | .id = "cfag12864b", | |
43 | .type = FB_TYPE_PACKED_PIXELS, | |
44 | .visual = FB_VISUAL_MONO10, | |
45 | .xpanstep = 0, | |
46 | .ypanstep = 0, | |
47 | .ywrapstep = 0, | |
48 | .line_length = CFAG12864B_WIDTH / 8, | |
49 | .accel = FB_ACCEL_NONE, | |
50 | }; | |
51 | ||
52 | static struct fb_var_screeninfo cfag12864bfb_var __initdata = { | |
53 | .xres = CFAG12864B_WIDTH, | |
54 | .yres = CFAG12864B_HEIGHT, | |
55 | .xres_virtual = CFAG12864B_WIDTH, | |
56 | .yres_virtual = CFAG12864B_HEIGHT, | |
57 | .bits_per_pixel = 1, | |
58 | .red = { 0, 1, 0 }, | |
59 | .green = { 0, 1, 0 }, | |
60 | .blue = { 0, 1, 0 }, | |
61 | .left_margin = 0, | |
62 | .right_margin = 0, | |
63 | .upper_margin = 0, | |
64 | .lower_margin = 0, | |
65 | .vmode = FB_VMODE_NONINTERLACED, | |
66 | }; | |
67 | ||
68 | static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma) | |
69 | { | |
70 | return vm_insert_page(vma, vma->vm_start, | |
71 | virt_to_page(cfag12864b_buffer)); | |
72 | } | |
73 | ||
74 | static struct fb_ops cfag12864bfb_ops = { | |
75 | .owner = THIS_MODULE, | |
76 | .fb_fillrect = cfb_fillrect, | |
77 | .fb_copyarea = cfb_copyarea, | |
78 | .fb_imageblit = cfb_imageblit, | |
79 | .fb_mmap = cfag12864bfb_mmap, | |
80 | }; | |
81 | ||
82 | static int __init cfag12864bfb_probe(struct platform_device *device) | |
83 | { | |
84 | int ret = -EINVAL; | |
85 | struct fb_info *info = framebuffer_alloc(0, &device->dev); | |
86 | ||
87 | if (!info) | |
88 | goto none; | |
89 | ||
90 | info->screen_base = (char __iomem *) cfag12864b_buffer; | |
91 | info->screen_size = CFAG12864B_SIZE; | |
92 | info->fbops = &cfag12864bfb_ops; | |
93 | info->fix = cfag12864bfb_fix; | |
94 | info->var = cfag12864bfb_var; | |
95 | info->pseudo_palette = NULL; | |
96 | info->par = NULL; | |
97 | info->flags = FBINFO_FLAG_DEFAULT; | |
98 | ||
99 | if (register_framebuffer(info) < 0) | |
100 | goto fballoced; | |
101 | ||
102 | platform_set_drvdata(device, info); | |
103 | ||
104 | printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, | |
105 | info->fix.id); | |
106 | ||
107 | return 0; | |
108 | ||
109 | fballoced: | |
110 | framebuffer_release(info); | |
111 | ||
112 | none: | |
113 | return ret; | |
114 | } | |
115 | ||
116 | static int cfag12864bfb_remove(struct platform_device *device) | |
117 | { | |
118 | struct fb_info *info = platform_get_drvdata(device); | |
119 | ||
120 | if (info) { | |
121 | unregister_framebuffer(info); | |
122 | framebuffer_release(info); | |
123 | } | |
124 | ||
125 | return 0; | |
126 | } | |
127 | ||
128 | static struct platform_driver cfag12864bfb_driver = { | |
129 | .probe = cfag12864bfb_probe, | |
130 | .remove = cfag12864bfb_remove, | |
131 | .driver = { | |
132 | .name = CFAG12864BFB_NAME, | |
133 | }, | |
134 | }; | |
135 | ||
136 | static struct platform_device *cfag12864bfb_device; | |
137 | ||
138 | static int __init cfag12864bfb_init(void) | |
139 | { | |
34173a4a MO |
140 | int ret = -EINVAL; |
141 | ||
142 | /* cfag12864b_init() must be called first */ | |
143 | if (!cfag12864b_isinited()) { | |
144 | printk(KERN_ERR CFAG12864BFB_NAME ": ERROR: " | |
145 | "cfag12864b is not initialized\n"); | |
146 | goto none; | |
147 | } | |
70e84049 MOS |
148 | |
149 | if (cfag12864b_enable()) { | |
150 | printk(KERN_ERR CFAG12864BFB_NAME ": ERROR: " | |
151 | "can't enable cfag12864b refreshing (being used)\n"); | |
152 | return -ENODEV; | |
153 | } | |
154 | ||
155 | ret = platform_driver_register(&cfag12864bfb_driver); | |
156 | ||
157 | if (!ret) { | |
158 | cfag12864bfb_device = | |
159 | platform_device_alloc(CFAG12864BFB_NAME, 0); | |
160 | ||
161 | if (cfag12864bfb_device) | |
162 | ret = platform_device_add(cfag12864bfb_device); | |
163 | else | |
164 | ret = -ENOMEM; | |
165 | ||
166 | if (ret) { | |
167 | platform_device_put(cfag12864bfb_device); | |
168 | platform_driver_unregister(&cfag12864bfb_driver); | |
169 | } | |
170 | } | |
171 | ||
34173a4a | 172 | none: |
70e84049 MOS |
173 | return ret; |
174 | } | |
175 | ||
176 | static void __exit cfag12864bfb_exit(void) | |
177 | { | |
178 | platform_device_unregister(cfag12864bfb_device); | |
179 | platform_driver_unregister(&cfag12864bfb_driver); | |
180 | cfag12864b_disable(); | |
181 | } | |
182 | ||
183 | module_init(cfag12864bfb_init); | |
184 | module_exit(cfag12864bfb_exit); | |
185 | ||
186 | MODULE_LICENSE("GPL v2"); | |
187 | MODULE_AUTHOR("Miguel Ojeda Sandonis <[email protected]>"); | |
188 | MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver"); |