Lines Matching +full:sync +full:- +full:on +full:- +full:green

7  * based on 2.4 driver:
8 * Copyright (c) 1998-2000 Ilario Nardinocchi (nardinoc@CS.UniBO.IT)
14 * I have a Creative Graphics Blaster Exxtreme card - pm2fb on x86. I
16 * hopefully other big-endian) devices now work, thanks to a lot of
20 * Multiple boards support has been on the TODO list for ages.
70 * support on TVP4010 and similar where there is no RAMDAC - see
71 * comment in set_video) always request +ve sync regardless of what
73 * fixed-frequency monitor which absolutely has to have -ve sync. So
74 * these flags allow the user to specify that requests for +ve sync
75 * should be silently turned in -ve sync.
125 .green = {0, 8, 0},
127 .height = -1,
128 .width = -1,
146 return fb_readl(p->v_regs + off); in pm2_RD()
151 fb_writel(v, p->v_regs + off); in pm2_WR()
267 curr = (clk > f) ? clk - f : f - clk; in pm2_mnp()
294 if (clk > f - delta && clk < f + delta) { in pm2v_mnp()
295 delta = (clk > f) ? clk - f : f - clk; in pm2v_mnp()
312 while (i--) { in clear_palette()
322 if (p->type == PM2_TYPE_PERMEDIA2V) in reset_card()
337 pm2_WR(p, PM2R_MEM_CONTROL, p->mem_control); in reset_card()
338 pm2_WR(p, PM2R_BOOT_ADDRESS, p->boot_address); in reset_card()
340 pm2_WR(p, PM2R_MEM_CONFIG, p->mem_config); in reset_card()
383 switch (p->type) { in reset_config()
403 * The hardware is little-endian. When used in big-endian in set_aperture()
404 * hosts, the on-chip aperture settings are used where in set_aperture()
412 case 24: /* RGB->BGR */ in set_aperture()
418 case 8: /* B->B */ in set_aperture()
421 case 16: /* HL->LH */ in set_aperture()
424 case 32: /* RGBA->ABGR */ in set_aperture()
452 switch (par->type) { in set_memclock()
463 for (i = 256; i; i--) in set_memclock()
477 for (i = 256; i; i--) in set_memclock()
489 switch (par->type) { in set_pixclock()
499 for (i = 256; i; i--) in set_pixclock()
526 * the RAMDAC to invert the sync if necessary. in set_video()
534 switch (p->type) { in set_video()
555 * pm2fb_check_var - Optional function. Validates a var passed in.
562 * Returns negative errno on error, or zero on success.
568 if (var->bits_per_pixel != 8 && var->bits_per_pixel != 16 && in pm2fb_check_var()
569 var->bits_per_pixel != 24 && var->bits_per_pixel != 32) { in pm2fb_check_var()
570 DPRINTK("depth not supported: %u\n", var->bits_per_pixel); in pm2fb_check_var()
571 return -EINVAL; in pm2fb_check_var()
574 if (var->xres != var->xres_virtual) { in pm2fb_check_var()
577 return -EINVAL; in pm2fb_check_var()
580 if (var->yres > var->yres_virtual) { in pm2fb_check_var()
583 return -EINVAL; in pm2fb_check_var()
587 if (var->yres_virtual > 2047) { in pm2fb_check_var()
588 var->yres_virtual = 2047; in pm2fb_check_var()
591 if (var->xoffset) { in pm2fb_check_var()
593 return -EINVAL; in pm2fb_check_var()
596 if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { in pm2fb_check_var()
598 return -EINVAL; in pm2fb_check_var()
601 var->xres = (var->xres + 15) & ~15; /* could sometimes be 8 */ in pm2fb_check_var()
602 lpitch = var->xres * ((var->bits_per_pixel + 7) >> 3); in pm2fb_check_var()
604 if (var->xres < 320 || var->xres > 1600) { in pm2fb_check_var()
605 DPRINTK("width not supported: %u\n", var->xres); in pm2fb_check_var()
606 return -EINVAL; in pm2fb_check_var()
609 if (var->yres < 200 || var->yres > 1200) { in pm2fb_check_var()
610 DPRINTK("height not supported: %u\n", var->yres); in pm2fb_check_var()
611 return -EINVAL; in pm2fb_check_var()
614 if (lpitch * var->yres_virtual > info->fix.smem_len) { in pm2fb_check_var()
616 var->xres, var->yres_virtual, var->bits_per_pixel); in pm2fb_check_var()
617 return -EINVAL; in pm2fb_check_var()
620 if (PICOS2KHZ(var->pixclock) > PM2_MAX_PIXCLOCK) { in pm2fb_check_var()
622 PICOS2KHZ(var->pixclock)); in pm2fb_check_var()
623 return -EINVAL; in pm2fb_check_var()
626 var->transp.offset = 0; in pm2fb_check_var()
627 var->transp.length = 0; in pm2fb_check_var()
628 switch (var->bits_per_pixel) { in pm2fb_check_var()
630 var->red.length = 8; in pm2fb_check_var()
631 var->green.length = 8; in pm2fb_check_var()
632 var->blue.length = 8; in pm2fb_check_var()
635 var->red.offset = 11; in pm2fb_check_var()
636 var->red.length = 5; in pm2fb_check_var()
637 var->green.offset = 5; in pm2fb_check_var()
638 var->green.length = 6; in pm2fb_check_var()
639 var->blue.offset = 0; in pm2fb_check_var()
640 var->blue.length = 5; in pm2fb_check_var()
643 var->transp.offset = 24; in pm2fb_check_var()
644 var->transp.length = 8; in pm2fb_check_var()
645 var->red.offset = 16; in pm2fb_check_var()
646 var->green.offset = 8; in pm2fb_check_var()
647 var->blue.offset = 0; in pm2fb_check_var()
648 var->red.length = 8; in pm2fb_check_var()
649 var->green.length = 8; in pm2fb_check_var()
650 var->blue.length = 8; in pm2fb_check_var()
654 var->red.offset = 0; in pm2fb_check_var()
655 var->blue.offset = 16; in pm2fb_check_var()
657 var->red.offset = 16; in pm2fb_check_var()
658 var->blue.offset = 0; in pm2fb_check_var()
660 var->green.offset = 8; in pm2fb_check_var()
661 var->red.length = 8; in pm2fb_check_var()
662 var->green.length = 8; in pm2fb_check_var()
663 var->blue.length = 8; in pm2fb_check_var()
666 var->height = -1; in pm2fb_check_var()
667 var->width = -1; in pm2fb_check_var()
669 var->accel_flags = 0; /* Can't mmap if this is on */ in pm2fb_check_var()
672 var->xres, var->yres, var->bits_per_pixel); in pm2fb_check_var()
677 * pm2fb_set_par - Alters the hardware state.
685 struct pm2fb_par *par = info->par; in pm2fb_set_par()
687 u32 width = (info->var.xres_virtual + 7) & ~7; in pm2fb_set_par()
688 u32 height = info->var.yres_virtual; in pm2fb_set_par()
689 u32 depth = (info->var.bits_per_pixel + 7) & ~7; in pm2fb_set_par()
699 u32 misc = 1; /* 8-bit DAC */ in pm2fb_set_par()
700 u32 xres = (info->var.xres + 31) & ~31; in pm2fb_set_par()
706 if (par->memclock) in pm2fb_set_par()
707 set_memclock(par, par->memclock); in pm2fb_set_par()
710 data64 = depth > 8 || par->type == PM2_TYPE_PERMEDIA2V; in pm2fb_set_par()
712 pixclock = PICOS2KHZ(info->var.pixclock); in pm2fb_set_par()
715 return -EINVAL; in pm2fb_set_par()
718 hsstart = to3264(info->var.right_margin, depth, data64); in pm2fb_set_par()
719 hsend = hsstart + to3264(info->var.hsync_len, depth, data64); in pm2fb_set_par()
720 hbend = hsend + to3264(info->var.left_margin, depth, data64); in pm2fb_set_par()
721 htotal = to3264(xres, depth, data64) + hbend - 1; in pm2fb_set_par()
722 vsstart = (info->var.lower_margin) in pm2fb_set_par()
723 ? info->var.lower_margin - 1 in pm2fb_set_par()
725 vsend = info->var.lower_margin + info->var.vsync_len - 1; in pm2fb_set_par()
726 vbend = info->var.lower_margin + info->var.vsync_len + in pm2fb_set_par()
727 info->var.upper_margin; in pm2fb_set_par()
728 vtotal = info->var.yres + vbend - 1; in pm2fb_set_par()
730 base = to3264(info->var.yoffset * xres + info->var.xoffset, depth, 1); in pm2fb_set_par()
734 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT) { in pm2fb_set_par()
736 DPRINTK("ignoring +hsync, using -hsync.\n"); in pm2fb_set_par()
743 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT) { in pm2fb_set_par()
745 DPRINTK("ignoring +vsync, using -vsync.\n"); in pm2fb_set_par()
752 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { in pm2fb_set_par()
754 return -EINVAL; in pm2fb_set_par()
756 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) in pm2fb_set_par()
758 if ((info->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) in pm2fb_set_par()
760 par->video = video; in pm2fb_set_par()
762 info->fix.visual = in pm2fb_set_par()
764 info->fix.line_length = info->var.xres * depth / 8; in pm2fb_set_par()
765 info->cmap.len = 256; in pm2fb_set_par()
770 if (par->type == PM2_TYPE_PERMEDIA2V) { in pm2fb_set_par()
832 switch (par->type) { in pm2fb_set_par()
848 info->var.xres, info->var.yres, info->var.bits_per_pixel); in pm2fb_set_par()
853 * pm2fb_setcolreg - Sets a color register.
856 * @green: The green value which can be up to 16 bits wide
865 * Returns negative errno on error, or zero on success.
867 static int pm2fb_setcolreg(unsigned regno, unsigned red, unsigned green, in pm2fb_setcolreg() argument
871 struct pm2fb_par *par = info->par; in pm2fb_setcolreg()
873 if (regno >= info->cmap.len) /* no. of hw registers */ in pm2fb_setcolreg()
874 return -EINVAL; in pm2fb_setcolreg()
881 if (info->var.grayscale) in pm2fb_setcolreg()
882 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8; in pm2fb_setcolreg()
885 * var->{color}.offset contains start of bitfield in pm2fb_setcolreg()
886 * var->{color}.length contains length of bitfield in pm2fb_setcolreg()
889 * (X << red.offset) | (X << green.offset) | (X << blue.offset) in pm2fb_setcolreg()
890 * RAMDAC[X] is programmed to (red, green, blue) in pm2fb_setcolreg()
894 * var->{color}.offset is 0 in pm2fb_setcolreg()
895 * var->{color}.length contains width of DAC in pm2fb_setcolreg()
897 * DAC[X] is programmed to (red, green, blue) in pm2fb_setcolreg()
900 * var->{color}.offset contains start of bitfield in pm2fb_setcolreg()
901 * var->{color}.length contains length of bitfield in pm2fb_setcolreg()
903 * (red << red.offset) | (green << green.offset) | in pm2fb_setcolreg()
907 #define CNVT_TOHW(val, width) ((((val) << (width)) + 0x7FFF -(val)) >> 16) in pm2fb_setcolreg()
908 switch (info->fix.visual) { in pm2fb_setcolreg()
911 red = CNVT_TOHW(red, info->var.red.length); in pm2fb_setcolreg()
912 green = CNVT_TOHW(green, info->var.green.length); in pm2fb_setcolreg()
913 blue = CNVT_TOHW(blue, info->var.blue.length); in pm2fb_setcolreg()
914 transp = CNVT_TOHW(transp, info->var.transp.length); in pm2fb_setcolreg()
920 green = CNVT_TOHW(green, 8); in pm2fb_setcolreg()
928 if (info->fix.visual == FB_VISUAL_TRUECOLOR) { in pm2fb_setcolreg()
932 return -EINVAL; in pm2fb_setcolreg()
934 v = (red << info->var.red.offset) | in pm2fb_setcolreg()
935 (green << info->var.green.offset) | in pm2fb_setcolreg()
936 (blue << info->var.blue.offset) | in pm2fb_setcolreg()
937 (transp << info->var.transp.offset); in pm2fb_setcolreg()
939 switch (info->var.bits_per_pixel) { in pm2fb_setcolreg()
945 par->palette[regno] = v; in pm2fb_setcolreg()
949 } else if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) in pm2fb_setcolreg()
950 set_color(par, regno, red, green, blue); in pm2fb_setcolreg()
956 * pm2fb_pan_display - Pans the display.
960 * Pan (or wrap, depending on the `vmode' field) the display using the
962 * If the values don't fit, return -EINVAL.
964 * Returns negative errno on error, or zero on success.
970 struct pm2fb_par *p = info->par; in pm2fb_pan_display()
972 u32 depth = (info->var.bits_per_pixel + 7) & ~7; in pm2fb_pan_display()
973 u32 xres = (info->var.xres + 31) & ~31; in pm2fb_pan_display()
976 base = to3264(var->yoffset * xres + var->xoffset, depth, 1); in pm2fb_pan_display()
983 * pm2fb_blank - Blanks the display.
988 * blanking succeeded, != 0 if un-/blanking failed due to e.g. a
990 * and powerdown modes on hardware that supports disabling hsync/vsync:
995 * Returns negative errno on error, or zero on success.
1000 struct pm2fb_par *par = info->par; in pm2fb_blank()
1001 u32 video = par->video; in pm2fb_blank()
1007 /* Screen: On */ in pm2fb_blank()
1033 struct pm2fb_par *par = info->par; in pm2fb_sync()
1049 struct pm2fb_par *par = info->par; in pm2fb_fillrect()
1052 u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ? in pm2fb_fillrect()
1053 ((u32 *)info->pseudo_palette)[region->color] : region->color; in pm2fb_fillrect()
1055 if (info->state != FBINFO_STATE_RUNNING) in pm2fb_fillrect()
1057 if ((info->flags & FBINFO_HWACCEL_DISABLED) || in pm2fb_fillrect()
1058 region->rop != ROP_COPY ) { in pm2fb_fillrect()
1063 vxres = info->var.xres_virtual; in pm2fb_fillrect()
1064 vyres = info->var.yres_virtual; in pm2fb_fillrect()
1073 modded.width = vxres - modded.dx; in pm2fb_fillrect()
1075 modded.height = vyres - modded.dy; in pm2fb_fillrect()
1077 if (info->var.bits_per_pixel == 8) in pm2fb_fillrect()
1079 if (info->var.bits_per_pixel <= 16) in pm2fb_fillrect()
1086 if (info->var.bits_per_pixel != 24) { in pm2fb_fillrect()
1107 struct pm2fb_par *par = info->par; in pm2fb_copyarea()
1111 if (info->state != FBINFO_STATE_RUNNING) in pm2fb_copyarea()
1113 if (info->flags & FBINFO_HWACCEL_DISABLED) { in pm2fb_copyarea()
1120 vxres = info->var.xres_virtual; in pm2fb_copyarea()
1121 vyres = info->var.yres_virtual; in pm2fb_copyarea()
1129 modded.width = vxres - modded.sx; in pm2fb_copyarea()
1131 modded.width = vxres - modded.dx; in pm2fb_copyarea()
1133 modded.height = vyres - modded.sy; in pm2fb_copyarea()
1135 modded.height = vyres - modded.dy; in pm2fb_copyarea()
1141 ((modded.sy - modded.dy) & 0xfff) << 16 | in pm2fb_copyarea()
1142 ((modded.sx - modded.dx) & 0xfff)); in pm2fb_copyarea()
1153 struct pm2fb_par *par = info->par; in pm2fb_imageblit()
1154 u32 height = image->height; in pm2fb_imageblit()
1156 const u32 *src = (const u32 *)image->data; in pm2fb_imageblit()
1157 u32 xres = (info->var.xres + 31) & ~31; in pm2fb_imageblit()
1164 if (info->state != FBINFO_STATE_RUNNING) in pm2fb_imageblit()
1166 if (info->flags & FBINFO_HWACCEL_DISABLED || image->depth != 1) { in pm2fb_imageblit()
1170 switch (info->fix.visual) { in pm2fb_imageblit()
1172 fgx = image->fg_color; in pm2fb_imageblit()
1173 bgx = image->bg_color; in pm2fb_imageblit()
1177 fgx = par->palette[image->fg_color]; in pm2fb_imageblit()
1178 bgx = par->palette[image->bg_color]; in pm2fb_imageblit()
1181 if (info->var.bits_per_pixel == 8) { in pm2fb_imageblit()
1185 if (info->var.bits_per_pixel <= 16) { in pm2fb_imageblit()
1193 ((image->dy & 0xfff) << 16) | (image->dx & 0x0fff)); in pm2fb_imageblit()
1195 (((image->dy + image->height) & 0x0fff) << 16) | in pm2fb_imageblit()
1196 ((image->dx + image->width) & 0x0fff)); in pm2fb_imageblit()
1201 ((image->dy & 0xfff) << 16) | (image->dx & 0x0fff)); in pm2fb_imageblit()
1203 ((image->height & 0x0fff) << 16) | in pm2fb_imageblit()
1204 ((image->width) & 0x0fff)); in pm2fb_imageblit()
1205 if (info->var.bits_per_pixel == 24) { in pm2fb_imageblit()
1236 while (height--) { in pm2fb_imageblit()
1237 int width = ((image->width + 7) >> 3) in pm2fb_imageblit()
1238 + info->pixmap.scan_align - 1; in pm2fb_imageblit()
1241 while (width--) { in pm2fb_imageblit()
1262 struct pm2fb_par *par = info->par; in pm2vfb_cursor()
1264 int x = cursor->image.dx - info->var.xoffset; in pm2vfb_cursor()
1265 int y = cursor->image.dy - info->var.yoffset; in pm2vfb_cursor()
1267 if (cursor->enable) in pm2vfb_cursor()
1272 if (!cursor->enable) in pm2vfb_cursor()
1284 if (!cursor->set) in pm2vfb_cursor()
1287 if (cursor->set & FB_CUR_SETHOT) { in pm2vfb_cursor()
1289 cursor->hot.x & 0x3f); in pm2vfb_cursor()
1291 cursor->hot.y & 0x3f); in pm2vfb_cursor()
1294 if (cursor->set & FB_CUR_SETCMAP) { in pm2vfb_cursor()
1295 u32 fg_idx = cursor->image.fg_color; in pm2vfb_cursor()
1296 u32 bg_idx = cursor->image.bg_color; in pm2vfb_cursor()
1297 struct fb_cmap cmap = info->cmap; in pm2vfb_cursor()
1304 cmap.green[bg_idx] >> 8 ); in pm2vfb_cursor()
1311 cmap.green[fg_idx] >> 8 ); in pm2vfb_cursor()
1317 if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE)) { in pm2vfb_cursor()
1318 u8 *bitmap = (u8 *)cursor->image.data; in pm2vfb_cursor()
1319 u8 *mask = (u8 *)cursor->mask; in pm2vfb_cursor()
1323 for (i = 0; i < cursor->image.height; i++) { in pm2vfb_cursor()
1324 int j = (cursor->image.width + 7) >> 3; in pm2vfb_cursor()
1325 int k = 8 - j; in pm2vfb_cursor()
1329 for (; j > 0; j--) { in pm2vfb_cursor()
1332 if (cursor->rop == ROP_COPY) in pm2vfb_cursor()
1345 for (; k > 0; k--) { in pm2vfb_cursor()
1363 struct pm2fb_par *par = info->par; in pm2fb_cursor()
1367 return -EINVAL; /* just to force soft_cursor() call */ in pm2fb_cursor()
1369 /* Too large of a cursor or wrong bpp :-( */ in pm2fb_cursor()
1370 if (cursor->image.width > 64 || in pm2fb_cursor()
1371 cursor->image.height > 64 || in pm2fb_cursor()
1372 cursor->image.depth > 1) in pm2fb_cursor()
1373 return -EINVAL; in pm2fb_cursor()
1375 if (par->type == PM2_TYPE_PERMEDIA2V) in pm2fb_cursor()
1379 if (cursor->enable) in pm2fb_cursor()
1389 if (!cursor->set) in pm2fb_cursor()
1392 if (cursor->set & FB_CUR_SETPOS) { in pm2fb_cursor()
1393 int x = cursor->image.dx - info->var.xoffset + 63; in pm2fb_cursor()
1394 int y = cursor->image.dy - info->var.yoffset + 63; in pm2fb_cursor()
1403 if (cursor->set & FB_CUR_SETCMAP) { in pm2fb_cursor()
1404 u32 fg_idx = cursor->image.fg_color; in pm2fb_cursor()
1405 u32 bg_idx = cursor->image.bg_color; in pm2fb_cursor()
1410 info->cmap.red[bg_idx] >> 8); in pm2fb_cursor()
1412 info->cmap.green[bg_idx] >> 8); in pm2fb_cursor()
1414 info->cmap.blue[bg_idx] >> 8); in pm2fb_cursor()
1417 info->cmap.red[fg_idx] >> 8); in pm2fb_cursor()
1419 info->cmap.green[fg_idx] >> 8); in pm2fb_cursor()
1421 info->cmap.blue[fg_idx] >> 8); in pm2fb_cursor()
1424 if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE)) { in pm2fb_cursor()
1425 u8 *bitmap = (u8 *)cursor->image.data; in pm2fb_cursor()
1426 u8 *mask = (u8 *)cursor->mask; in pm2fb_cursor()
1432 for (i = 0; i < cursor->image.height; i++) { in pm2fb_cursor()
1433 int j = (cursor->image.width + 7) >> 3; in pm2fb_cursor()
1434 int k = 8 - j; in pm2fb_cursor()
1437 for (; j > 0; j--) { in pm2fb_cursor()
1440 if (cursor->rop == ROP_COPY) in pm2fb_cursor()
1447 for (; k > 0; k--) in pm2fb_cursor()
1453 while (j-- > 0) in pm2fb_cursor()
1457 mask = (u8 *)cursor->mask; in pm2fb_cursor()
1458 for (i = 0; i < cursor->image.height; i++) { in pm2fb_cursor()
1459 int j = (cursor->image.width + 7) >> 3; in pm2fb_cursor()
1460 int k = 8 - j; in pm2fb_cursor()
1463 for (; j > 0; j--) { in pm2fb_cursor()
1468 for (; k > 0; k--) in pm2fb_cursor()
1474 while (j-- > 0) in pm2fb_cursor()
1481 /* ------------ Hardware Independent Functions ------------ */
1519 int retval = -ENXIO; in pm2fb_probe()
1527 info = framebuffer_alloc(sizeof(struct pm2fb_par), &pdev->dev); in pm2fb_probe()
1529 return -ENOMEM; in pm2fb_probe()
1530 default_par = info->par; in pm2fb_probe()
1532 switch (pdev->device) { in pm2fb_probe()
1535 default_par->type = PM2_TYPE_PERMEDIA2; in pm2fb_probe()
1539 default_par->type = PM2_TYPE_PERMEDIA2; in pm2fb_probe()
1543 default_par->type = PM2_TYPE_PERMEDIA2V; in pm2fb_probe()
1553 * map is little-endian, upper map is big-endian. in pm2fb_probe()
1556 DPRINTK("Adjusting register base for big-endian.\n"); in pm2fb_probe()
1560 /* Registers - request region and map it. */ in pm2fb_probe()
1566 default_par->v_regs = in pm2fb_probe()
1568 if (!default_par->v_regs) { in pm2fb_probe()
1576 default_par->mem_control = pm2_RD(default_par, PM2R_MEM_CONTROL); in pm2fb_probe()
1577 default_par->boot_address = pm2_RD(default_par, PM2R_BOOT_ADDRESS); in pm2fb_probe()
1578 default_par->mem_config = pm2_RD(default_par, PM2R_MEM_CONFIG); in pm2fb_probe()
1580 default_par->mem_control, default_par->boot_address, in pm2fb_probe()
1581 default_par->mem_config); in pm2fb_probe()
1583 if (default_par->mem_control == 0 && in pm2fb_probe()
1584 default_par->boot_address == 0x31 && in pm2fb_probe()
1585 default_par->mem_config == 0x259fffff) { in pm2fb_probe()
1586 default_par->memclock = CVPPC_MEMCLOCK; in pm2fb_probe()
1587 default_par->mem_control = 0; in pm2fb_probe()
1588 default_par->boot_address = 0x20; in pm2fb_probe()
1589 default_par->mem_config = 0xe6002021; in pm2fb_probe()
1590 if (pdev->subsystem_vendor == 0x1048 && in pm2fb_probe()
1591 pdev->subsystem_device == 0x0a31) { in pm2fb_probe()
1594 pdev->subsystem_vendor, pdev->subsystem_device); in pm2fb_probe()
1596 "are running on an Elsa Winner 2000 Office\n"); in pm2fb_probe()
1598 default_par->memclock = 100000; in pm2fb_probe()
1600 if (pdev->subsystem_vendor == 0x3d3d && in pm2fb_probe()
1601 pdev->subsystem_device == 0x0100) { in pm2fb_probe()
1604 pdev->subsystem_vendor, pdev->subsystem_device); in pm2fb_probe()
1606 "are running on an 3dlabs reference board\n"); in pm2fb_probe()
1608 default_par->memclock = 74894; in pm2fb_probe()
1613 switch (default_par->mem_config & PM2F_MEM_CONFIG_RAM_MASK) { in pm2fb_probe()
1629 /* Linear frame buffer - request region and map it. */ in pm2fb_probe()
1635 info->screen_base = in pm2fb_probe()
1637 if (!info->screen_base) { in pm2fb_probe()
1644 default_par->wc_cookie = arch_phys_wc_add(pm2fb_fix.smem_start, in pm2fb_probe()
1647 info->fbops = &pm2fb_ops; in pm2fb_probe()
1648 info->fix = pm2fb_fix; in pm2fb_probe()
1649 info->pseudo_palette = default_par->palette; in pm2fb_probe()
1650 info->flags = FBINFO_DEFAULT | in pm2fb_probe()
1656 info->pixmap.addr = kmalloc(PM2_PIXMAP_SIZE, GFP_KERNEL); in pm2fb_probe()
1657 if (!info->pixmap.addr) { in pm2fb_probe()
1658 retval = -ENOMEM; in pm2fb_probe()
1661 info->pixmap.size = PM2_PIXMAP_SIZE; in pm2fb_probe()
1662 info->pixmap.buf_align = 4; in pm2fb_probe()
1663 info->pixmap.scan_align = 4; in pm2fb_probe()
1664 info->pixmap.access_align = 32; in pm2fb_probe()
1665 info->pixmap.flags = FB_PIXMAP_SYSTEM; in pm2fb_probe()
1669 info->flags |= FBINFO_HWACCEL_DISABLED; in pm2fb_probe()
1670 info->pixmap.scan_align = 1; in pm2fb_probe()
1676 err = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, 8); in pm2fb_probe()
1678 info->var = pm2fb_var; in pm2fb_probe()
1680 retval = fb_alloc_cmap(&info->cmap, 256, 0); in pm2fb_probe()
1689 info->fix.id, pm2fb_fix.smem_len / 1024); in pm2fb_probe()
1699 fb_dealloc_cmap(&info->cmap); in pm2fb_probe()
1701 kfree(info->pixmap.addr); in pm2fb_probe()
1703 iounmap(info->screen_base); in pm2fb_probe()
1706 iounmap(default_par->v_regs); in pm2fb_probe()
1723 struct fb_fix_screeninfo *fix = &info->fix; in pm2fb_remove()
1724 struct pm2fb_par *par = info->par; in pm2fb_remove()
1727 arch_phys_wc_del(par->wc_cookie); in pm2fb_remove()
1728 iounmap(info->screen_base); in pm2fb_remove()
1729 release_mem_region(fix->smem_start, fix->smem_len); in pm2fb_remove()
1730 iounmap(par->v_regs); in pm2fb_remove()
1731 release_mem_region(fix->mmio_start, fix->mmio_len); in pm2fb_remove()
1733 fb_dealloc_cmap(&info->cmap); in pm2fb_remove()
1734 kfree(info->pixmap.addr); in pm2fb_remove()
1762 * This is, comma-separated options following `video=pm2fb:'.
1798 return -ENODEV; in pm2fb_init()
1822 MODULE_PARM_DESC(mode_option, "Initial video mode e.g. '648x480-8@60'");
1824 MODULE_PARM_DESC(mode, "Initial video mode e.g. '648x480-8@60' (deprecated)");
1826 MODULE_PARM_DESC(lowhsync, "Force horizontal sync low regardless of mode");
1828 MODULE_PARM_DESC(lowvsync, "Force vertical sync low regardless of mode");