22 #include <linux/module.h>
23 #include <linux/kernel.h>
24 #include <linux/string.h>
26 #include <linux/errno.h>
28 #include <linux/slab.h>
29 #include <linux/tty.h>
56 NULL, 60, 640, 480, 40000, 48, 16, 39, 11, 96, 2,
60 NULL, 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4,
64 NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6,
68 NULL, 60, 1024, 768, 15385, 160, 24, 29, 3, 136, 6,
107 if (info->
fix.smem_len) {
113 for (i = 0; i <= 3 ; i++) {
122 switch (info->
var.bits_per_pixel) {
149 static int grvga_set_par(
struct fb_info *info)
156 &par->
regs->video_length);
159 &par->
regs->front_porch);
162 &par->
regs->sync_length);
165 (info->
var.xres + info->
var.right_margin + info->
var.left_margin + info->
var.hsync_len - 1),
166 &par->
regs->line_length);
168 switch (info->
var.bits_per_pixel) {
189 info->
fix.line_length = (info->
var.xres_virtual*info->
var.bits_per_pixel)/8;
193 static int grvga_setcolreg(
unsigned regno,
unsigned red,
unsigned green,
unsigned blue,
unsigned transp,
struct fb_info *info)
201 if (info->
var.grayscale) {
203 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
208 #define CNVT_TOHW(val, width) ((((val)<<(width))+0x7FFF-(val))>>16)
219 __raw_writel((regno << 24) | (red << 16) | (green << 8) | blue,
229 v = (red << info->
var.red.offset) |
230 (green << info->
var.green.offset) |
231 (blue << info->
var.blue.offset) |
232 (transp << info->
var.transp.offset);
259 static struct fb_ops grvga_ops = {
261 .fb_check_var = grvga_check_var,
262 .fb_set_par = grvga_set_par,
263 .fb_setcolreg = grvga_setcolreg,
264 .fb_pan_display = grvga_pan_display,
275 if (!options || !*options)
278 while ((this_opt =
strsep(&options,
" ")) !=
NULL) {
336 unsigned long virtual_start;
337 unsigned long grvga_fix_addr = 0;
338 unsigned long physical_start = 0;
339 unsigned long grvga_mem_size = 0;
341 char *options =
NULL, *mode_opt =
NULL;
345 dev_err(&dev->
dev,
"framebuffer_alloc failed\n");
360 if (!options || !*options)
361 options =
"640x480-8@60";
364 char *this_opt =
strsep(&options,
",");
369 if (!
strncmp(this_opt,
"custom", 6)) {
370 if (grvga_parse_custom(this_opt, &info->
var) < 0) {
371 dev_err(&dev->
dev,
"Failed to parse custom mode (%s).\n", this_opt);
375 }
else if (!
strncmp(this_opt,
"addr", 4))
377 else if (!
strncmp(this_opt,
"size", 4))
384 info->
fbops = &grvga_ops;
385 info->
fix = grvga_fix;
388 info->
fix.smem_len = grvga_mem_size;
391 resource_size(&dev->
resource[0]),
"grlib-svgactrl regs")) {
392 dev_err(&dev->
dev,
"registers already mapped\n");
399 "grlib-svgactrl regs");
402 dev_err(&dev->
dev,
"failed to map registers\n");
409 dev_err(&dev->
dev,
"failed to allocate mem with fb_alloc_cmap\n");
416 grvga_modedb,
sizeof(grvga_modedb), &grvga_modedb[0], 8);
417 if (!retval || retval == 4) {
424 grvga_mem_size = info->
var.xres_virtual * info->
var.yres_virtual * info->
var.bits_per_pixel/8;
426 if (grvga_fix_addr) {
429 physical_start = grvga_fix_addr;
432 grvga_mem_size, dev->
name)) {
433 dev_err(&dev->
dev,
"failed to request memory region\n");
438 virtual_start = (
unsigned long)
ioremap(physical_start, grvga_mem_size);
440 if (!virtual_start) {
441 dev_err(&dev->
dev,
"error mapping framebuffer memory\n");
451 if (!virtual_start) {
453 "unable to allocate framebuffer memory (%lu bytes)\n",
464 for (page = virtual_start;
465 page <
PAGE_ALIGN(virtual_start + grvga_mem_size);
473 memset((
unsigned long *) virtual_start, 0, grvga_mem_size);
476 info->
fix.smem_start = physical_start;
477 info->
fix.smem_len = grvga_mem_size;
482 "Aeroflex Gaisler framebuffer device (fb%d), %dx%d-%d, using %luK of video memory @ %p\n",
483 info->
node, info->
var.xres, info->
var.yres, info->
var.bits_per_pixel,
488 dev_err(&dev->
dev,
"failed to register framebuffer\n");
501 iounmap((
void *)virtual_start);
503 kfree((
void *)virtual_start);
525 resource_size(&device->
resource[0]));
541 .name =
"GAISLER_SVGACTRL",
552 .name =
"grlib-svgactrl",
554 .of_match_table = svgactrl_of_match,
556 .probe = grvga_probe,
561 static int __init grvga_init(
void)
566 static void __exit grvga_exit(
void)