Lines Matching +full:turn +full:- +full:round +full:- +full:delay
2 * linux/drivers/video/neofb.c -- NeoMagic Framebuffer Driver
4 * Copyright (c) 2001-2002 Denis Oliver Kropp <dok@directfb.org>
16 * - Cosmetic changes (dok)
19 * - Toshiba Libretto support, allow modes larger than LCD size if
25 * - Porting over to new fbdev api. (jsimmons)
28 * - got rid of all floating point (dok)
31 * - added module license (dok)
34 * - hardware accelerated clear and move for 2200 and above (dok)
35 * - maximum allowed dotclock is handled now (dok)
38 * - correct panning after X usage (dok)
39 * - added module and kernel parameters (dok)
40 * - no stretching if external display is enabled (dok)
43 * - initial version (dok)
47 * - ioctl for internal/external switching
48 * - blanking
49 * - 32bit depth support, maybe impossible
50 * - disable pan-on-sync, need specs
53 * - white margin on bootup like with tdfxfb (colormap problem?)
64 #include <linux/delay.h>
79 /* --------------------------------------------------------------------- */
90 MODULE_AUTHOR("(c) 2001-2002 Denis Oliver Kropp <dok@convergence.de>");
105 MODULE_PARM_DESC(mode_option, "Preferred video mode ('640x480-8@60', etc)");
110 /* --------------------------------------------------------------------- */
147 writel(val, par->neo2200 + par->cursorOff + regindex); in write_le32()
184 return mode[i - 1].mode; in neoFindMode()
190 return mode[size - 1].mode; in neoFindMode()
194 * neoCalcVCLK --
216 f_diff = abs(f_out - freq); in neoCalcVCLK()
227 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 || in neoCalcVCLK()
228 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 || in neoCalcVCLK()
229 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 || in neoCalcVCLK()
230 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) { in neoCalcVCLK()
233 par->VCLK3NumeratorLow = n_best; in neoCalcVCLK()
234 par->VCLK3NumeratorHigh = (f_best << 7); in neoCalcVCLK()
236 par->VCLK3NumeratorLow = n_best | (f_best << 7); in neoCalcVCLK()
238 par->VCLK3Denominator = d_best; in neoCalcVCLK()
243 par->VCLK3NumeratorLow, in neoCalcVCLK()
244 par->VCLK3NumeratorHigh, in neoCalcVCLK()
245 par->VCLK3Denominator, f_best_diff); in neoCalcVCLK()
250 * vgaHWInit --
258 int hsync_end = var->xres + var->right_margin + var->hsync_len; in vgaHWInit()
259 int htotal = (hsync_end + var->left_margin) >> 3; in vgaHWInit()
260 int vsync_start = var->yres + var->lower_margin; in vgaHWInit()
261 int vsync_end = vsync_start + var->vsync_len; in vgaHWInit()
262 int vtotal = vsync_end + var->upper_margin; in vgaHWInit()
264 par->MiscOutReg = 0x23; in vgaHWInit()
266 if (!(var->sync & FB_SYNC_HOR_HIGH_ACT)) in vgaHWInit()
267 par->MiscOutReg |= 0x40; in vgaHWInit()
269 if (!(var->sync & FB_SYNC_VERT_HIGH_ACT)) in vgaHWInit()
270 par->MiscOutReg |= 0x80; in vgaHWInit()
275 par->Sequencer[0] = 0x00; in vgaHWInit()
276 par->Sequencer[1] = 0x01; in vgaHWInit()
277 par->Sequencer[2] = 0x0F; in vgaHWInit()
278 par->Sequencer[3] = 0x00; /* Font select */ in vgaHWInit()
279 par->Sequencer[4] = 0x0E; /* Misc */ in vgaHWInit()
284 par->CRTC[0] = htotal - 5; in vgaHWInit()
285 par->CRTC[1] = (var->xres >> 3) - 1; in vgaHWInit()
286 par->CRTC[2] = (var->xres >> 3) - 1; in vgaHWInit()
287 par->CRTC[3] = ((htotal - 1) & 0x1F) | 0x80; in vgaHWInit()
288 par->CRTC[4] = ((var->xres + var->right_margin) >> 3); in vgaHWInit()
289 par->CRTC[5] = (((htotal - 1) & 0x20) << 2) in vgaHWInit()
291 par->CRTC[6] = (vtotal - 2) & 0xFF; in vgaHWInit()
292 par->CRTC[7] = (((vtotal - 2) & 0x100) >> 8) in vgaHWInit()
293 | (((var->yres - 1) & 0x100) >> 7) in vgaHWInit()
295 | (((var->yres - 1) & 0x100) >> 5) in vgaHWInit()
296 | 0x10 | (((vtotal - 2) & 0x200) >> 4) in vgaHWInit()
297 | (((var->yres - 1) & 0x200) >> 3) in vgaHWInit()
299 par->CRTC[8] = 0x00; in vgaHWInit()
300 par->CRTC[9] = (((var->yres - 1) & 0x200) >> 4) | 0x40; in vgaHWInit()
302 if (var->vmode & FB_VMODE_DOUBLE) in vgaHWInit()
303 par->CRTC[9] |= 0x80; in vgaHWInit()
305 par->CRTC[10] = 0x00; in vgaHWInit()
306 par->CRTC[11] = 0x00; in vgaHWInit()
307 par->CRTC[12] = 0x00; in vgaHWInit()
308 par->CRTC[13] = 0x00; in vgaHWInit()
309 par->CRTC[14] = 0x00; in vgaHWInit()
310 par->CRTC[15] = 0x00; in vgaHWInit()
311 par->CRTC[16] = vsync_start & 0xFF; in vgaHWInit()
312 par->CRTC[17] = (vsync_end & 0x0F) | 0x20; in vgaHWInit()
313 par->CRTC[18] = (var->yres - 1) & 0xFF; in vgaHWInit()
314 par->CRTC[19] = var->xres_virtual >> 4; in vgaHWInit()
315 par->CRTC[20] = 0x00; in vgaHWInit()
316 par->CRTC[21] = (var->yres - 1) & 0xFF; in vgaHWInit()
317 par->CRTC[22] = (vtotal - 1) & 0xFF; in vgaHWInit()
318 par->CRTC[23] = 0xC3; in vgaHWInit()
319 par->CRTC[24] = 0xFF; in vgaHWInit()
330 par->Graphics[0] = 0x00; in vgaHWInit()
331 par->Graphics[1] = 0x00; in vgaHWInit()
332 par->Graphics[2] = 0x00; in vgaHWInit()
333 par->Graphics[3] = 0x00; in vgaHWInit()
334 par->Graphics[4] = 0x00; in vgaHWInit()
335 par->Graphics[5] = 0x40; in vgaHWInit()
336 par->Graphics[6] = 0x05; /* only map 64k VGA memory !!!! */ in vgaHWInit()
337 par->Graphics[7] = 0x0F; in vgaHWInit()
338 par->Graphics[8] = 0xFF; in vgaHWInit()
341 par->Attribute[0] = 0x00; /* standard colormap translation */ in vgaHWInit()
342 par->Attribute[1] = 0x01; in vgaHWInit()
343 par->Attribute[2] = 0x02; in vgaHWInit()
344 par->Attribute[3] = 0x03; in vgaHWInit()
345 par->Attribute[4] = 0x04; in vgaHWInit()
346 par->Attribute[5] = 0x05; in vgaHWInit()
347 par->Attribute[6] = 0x06; in vgaHWInit()
348 par->Attribute[7] = 0x07; in vgaHWInit()
349 par->Attribute[8] = 0x08; in vgaHWInit()
350 par->Attribute[9] = 0x09; in vgaHWInit()
351 par->Attribute[10] = 0x0A; in vgaHWInit()
352 par->Attribute[11] = 0x0B; in vgaHWInit()
353 par->Attribute[12] = 0x0C; in vgaHWInit()
354 par->Attribute[13] = 0x0D; in vgaHWInit()
355 par->Attribute[14] = 0x0E; in vgaHWInit()
356 par->Attribute[15] = 0x0F; in vgaHWInit()
357 par->Attribute[16] = 0x41; in vgaHWInit()
358 par->Attribute[17] = 0xFF; in vgaHWInit()
359 par->Attribute[18] = 0x0F; in vgaHWInit()
360 par->Attribute[19] = 0x00; in vgaHWInit()
361 par->Attribute[20] = 0x00; in vgaHWInit()
367 /* Protect CRTC[0-7] */ in vgaHWLock()
368 vga_wcrt(state->vgabase, 0x11, vga_rcrt(state->vgabase, 0x11) | 0x80); in vgaHWLock()
373 /* Unprotect CRTC[0-7] */ in vgaHWUnlock()
379 vga_wgfx(state->vgabase, 0x09, 0x00); in neoLock()
426 * Turn off screen and disable sequencer. in vgaHWProtect()
434 * Reenable sequencer, then turn on screen. in vgaHWProtect()
448 vga_w(NULL, VGA_MIS_W, par->MiscOutReg); in vgaHWRestore()
451 vga_wseq(NULL, i, par->Sequencer[i]); in vgaHWRestore()
453 /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 or CRTC[17] */ in vgaHWRestore()
454 vga_wcrt(NULL, 17, par->CRTC[17] & ~0x80); in vgaHWRestore()
457 vga_wcrt(NULL, i, par->CRTC[i]); in vgaHWRestore()
460 vga_wgfx(NULL, i, par->Graphics[i]); in vgaHWRestore()
465 VGAwATTR(i, par->Attribute[i]); in vgaHWRestore()
471 /* -------------------- Hardware specific routines ------------------------- */
478 struct neofb_par *par = info->par; in neo2200_sync()
480 while (readl(&par->neo2200->bltStat) & 1) in neo2200_sync()
488 // ndev->neo.waitfifo_calls++; in neo2200_wait_fifo()
489 // ndev->neo.waitfifo_sum += requested_fifo_space; in neo2200_wait_fifo()
498 neo_fifo_space = (neo2200->bltStat >> 8); in neo2200_wait_fifo()
508 neo_fifo_space -= requested_fifo_space; in neo2200_wait_fifo()
517 struct neofb_par *par = info->par; in neo2200_accel_init()
518 Neo2200 __iomem *neo2200 = par->neo2200; in neo2200_accel_init()
523 switch (var->bits_per_pixel) { in neo2200_accel_init()
526 pitch = var->xres_virtual; in neo2200_accel_init()
531 pitch = var->xres_virtual * 2; in neo2200_accel_init()
535 pitch = var->xres_virtual * 3; in neo2200_accel_init()
543 writel(bltMod << 16, &neo2200->bltStat); in neo2200_accel_init()
544 writel((pitch << 16) | pitch, &neo2200->pitch); in neo2200_accel_init()
547 /* --------------------------------------------------------------------- */
552 struct neofb_par *par = info->par; in neofb_open()
554 if (!par->ref_count) { in neofb_open()
555 memset(&par->state, 0, sizeof(struct vgastate)); in neofb_open()
556 par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS; in neofb_open()
557 save_vga(&par->state); in neofb_open()
559 par->ref_count++; in neofb_open()
567 struct neofb_par *par = info->par; in neofb_release()
569 if (!par->ref_count) in neofb_release()
570 return -EINVAL; in neofb_release()
572 if (par->ref_count == 1) { in neofb_release()
573 restore_vga(&par->state); in neofb_release()
575 par->ref_count--; in neofb_release()
583 struct neofb_par *par = info->par; in neofb_check_var()
589 if (!var->pixclock || PICOS2KHZ(var->pixclock) > par->maxClock) in neofb_check_var()
590 return -EINVAL; in neofb_check_var()
593 if (par->internal_display && in neofb_check_var()
594 ((var->xres > par->NeoPanelWidth) || in neofb_check_var()
595 (var->yres > par->NeoPanelHeight))) { in neofb_check_var()
598 var->xres, var->yres, par->NeoPanelWidth, in neofb_check_var()
599 par->NeoPanelHeight); in neofb_check_var()
600 return -EINVAL; in neofb_check_var()
604 if (!par->internal_display) in neofb_check_var()
607 switch (var->xres) { in neofb_check_var()
609 if (var->yres == 1024) in neofb_check_var()
613 if (var->yres == 768) in neofb_check_var()
617 if (var->yres == (par->libretto ? 480 : 600)) in neofb_check_var()
621 if (var->yres == 480) in neofb_check_var()
630 var->xres, var->yres); in neofb_check_var()
631 return -EINVAL; in neofb_check_var()
634 var->red.msb_right = 0; in neofb_check_var()
635 var->green.msb_right = 0; in neofb_check_var()
636 var->blue.msb_right = 0; in neofb_check_var()
637 var->transp.msb_right = 0; in neofb_check_var()
639 var->transp.offset = 0; in neofb_check_var()
640 var->transp.length = 0; in neofb_check_var()
641 switch (var->bits_per_pixel) { in neofb_check_var()
643 var->red.offset = 0; in neofb_check_var()
644 var->red.length = 8; in neofb_check_var()
645 var->green.offset = 0; in neofb_check_var()
646 var->green.length = 8; in neofb_check_var()
647 var->blue.offset = 0; in neofb_check_var()
648 var->blue.length = 8; in neofb_check_var()
652 var->red.offset = 11; in neofb_check_var()
653 var->red.length = 5; in neofb_check_var()
654 var->green.offset = 5; in neofb_check_var()
655 var->green.length = 6; in neofb_check_var()
656 var->blue.offset = 0; in neofb_check_var()
657 var->blue.length = 5; in neofb_check_var()
661 var->red.offset = 16; in neofb_check_var()
662 var->red.length = 8; in neofb_check_var()
663 var->green.offset = 8; in neofb_check_var()
664 var->green.length = 8; in neofb_check_var()
665 var->blue.offset = 0; in neofb_check_var()
666 var->blue.length = 8; in neofb_check_var()
671 var->transp.offset = 24; in neofb_check_var()
672 var->transp.length = 8; in neofb_check_var()
673 var->red.offset = 16; in neofb_check_var()
674 var->red.length = 8; in neofb_check_var()
675 var->green.offset = 8; in neofb_check_var()
676 var->green.length = 8; in neofb_check_var()
677 var->blue.offset = 0; in neofb_check_var()
678 var->blue.length = 8; in neofb_check_var()
683 var->bits_per_pixel); in neofb_check_var()
684 return -EINVAL; in neofb_check_var()
687 vramlen = info->fix.smem_len; in neofb_check_var()
691 if (var->xres_virtual < var->xres) in neofb_check_var()
692 var->xres_virtual = var->xres; in neofb_check_var()
694 memlen = var->xres_virtual * var->bits_per_pixel * var->yres_virtual >> 3; in neofb_check_var()
697 var->yres_virtual = vramlen * 8 / (var->xres_virtual * in neofb_check_var()
698 var->bits_per_pixel); in neofb_check_var()
699 memlen = var->xres_virtual * var->bits_per_pixel * in neofb_check_var()
700 var->yres_virtual / 8; in neofb_check_var()
703 /* we must round yres/xres down, we already rounded y/xres_virtual up in neofb_check_var()
704 if it was possible. We should return -EINVAL, but I disagree */ in neofb_check_var()
705 if (var->yres_virtual < var->yres) in neofb_check_var()
706 var->yres = var->yres_virtual; in neofb_check_var()
707 if (var->xoffset + var->xres > var->xres_virtual) in neofb_check_var()
708 var->xoffset = var->xres_virtual - var->xres; in neofb_check_var()
709 if (var->yoffset + var->yres > var->yres_virtual) in neofb_check_var()
710 var->yoffset = var->yres_virtual - var->yres; in neofb_check_var()
712 var->nonstd = 0; in neofb_check_var()
713 var->height = -1; in neofb_check_var()
714 var->width = -1; in neofb_check_var()
716 if (var->bits_per_pixel >= 24 || !par->neo2200) in neofb_check_var()
717 var->accel_flags &= ~FB_ACCELF_TEXT; in neofb_check_var()
723 struct neofb_par *par = info->par; in neofb_set_par()
736 vsync_start = info->var.yres + info->var.lower_margin; in neofb_set_par()
737 vtotal = vsync_start + info->var.vsync_len + info->var.upper_margin; in neofb_set_par()
744 if (vgaHWInit(&info->var, par)) in neofb_set_par()
745 return -EINVAL; in neofb_set_par()
751 par->Attribute[16] = 0x01; in neofb_set_par()
753 switch (info->var.bits_per_pixel) { in neofb_set_par()
755 par->CRTC[0x13] = info->var.xres_virtual >> 3; in neofb_set_par()
756 par->ExtCRTOffset = info->var.xres_virtual >> 11; in neofb_set_par()
757 par->ExtColorModeSelect = 0x11; in neofb_set_par()
760 par->CRTC[0x13] = info->var.xres_virtual >> 2; in neofb_set_par()
761 par->ExtCRTOffset = info->var.xres_virtual >> 10; in neofb_set_par()
762 par->ExtColorModeSelect = 0x13; in neofb_set_par()
765 par->CRTC[0x13] = (info->var.xres_virtual * 3) >> 3; in neofb_set_par()
766 par->ExtCRTOffset = (info->var.xres_virtual * 3) >> 11; in neofb_set_par()
767 par->ExtColorModeSelect = 0x14; in neofb_set_par()
771 par->CRTC[0x13] = info->var.xres_virtual >> 1; in neofb_set_par()
772 par->ExtCRTOffset = info->var.xres_virtual >> 9; in neofb_set_par()
773 par->ExtColorModeSelect = 0x15; in neofb_set_par()
780 par->ExtCRTDispAddr = 0x10; in neofb_set_par()
783 par->VerticalExt = (((vtotal - 2) & 0x400) >> 10) in neofb_set_par()
784 | (((info->var.yres - 1) & 0x400) >> 9) in neofb_set_par()
789 if (par->pci_burst) in neofb_set_par()
790 par->SysIfaceCntl1 = 0x30; in neofb_set_par()
792 par->SysIfaceCntl1 = 0x00; in neofb_set_par()
794 par->SysIfaceCntl2 = 0xc0; /* VESA Bios sets this to 0x80! */ in neofb_set_par()
797 par->PanelDispCntlRegRead = 1; in neofb_set_par()
800 par->PanelDispCntlReg1 = 0x00; in neofb_set_par()
801 if (par->internal_display) in neofb_set_par()
802 par->PanelDispCntlReg1 |= 0x02; in neofb_set_par()
803 if (par->external_display) in neofb_set_par()
804 par->PanelDispCntlReg1 |= 0x01; in neofb_set_par()
807 if (par->PanelDispCntlReg1 == 0x00) { in neofb_set_par()
809 par->PanelDispCntlReg1 = vga_rgfx(NULL, 0x20) & 0x03; in neofb_set_par()
813 switch (info->var.xres) { in neofb_set_par()
815 par->PanelDispCntlReg1 |= 0x60; in neofb_set_par()
818 par->PanelDispCntlReg1 |= 0x40; in neofb_set_par()
821 par->PanelDispCntlReg1 |= 0x20; in neofb_set_par()
829 switch (par->PanelDispCntlReg1 & 0x03) { in neofb_set_par()
831 par->GeneralLockReg = 0x00; in neofb_set_par()
833 par->ProgramVCLK = 1; in neofb_set_par()
837 par->GeneralLockReg = 0x01; in neofb_set_par()
839 par->ProgramVCLK = 0; in neofb_set_par()
844 * If the screen is to be stretched, turn on stretching for the in neofb_set_par()
849 par->PanelDispCntlReg2 = 0x00; in neofb_set_par()
850 par->PanelDispCntlReg3 = 0x00; in neofb_set_par()
852 if (par->lcd_stretch && (par->PanelDispCntlReg1 == 0x02) && /* LCD only */ in neofb_set_par()
853 (info->var.xres != par->NeoPanelWidth)) { in neofb_set_par()
854 switch (info->var.xres) { in neofb_set_par()
855 case 320: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
856 case 400: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
861 par->PanelDispCntlReg2 |= 0xC6; in neofb_set_par()
871 * If the screen is to be centerd, turn on the centering for the in neofb_set_par()
874 par->PanelVertCenterReg1 = 0x00; in neofb_set_par()
875 par->PanelVertCenterReg2 = 0x00; in neofb_set_par()
876 par->PanelVertCenterReg3 = 0x00; in neofb_set_par()
877 par->PanelVertCenterReg4 = 0x00; in neofb_set_par()
878 par->PanelVertCenterReg5 = 0x00; in neofb_set_par()
879 par->PanelHorizCenterReg1 = 0x00; in neofb_set_par()
880 par->PanelHorizCenterReg2 = 0x00; in neofb_set_par()
881 par->PanelHorizCenterReg3 = 0x00; in neofb_set_par()
882 par->PanelHorizCenterReg4 = 0x00; in neofb_set_par()
883 par->PanelHorizCenterReg5 = 0x00; in neofb_set_par()
886 if (par->PanelDispCntlReg1 & 0x02) { in neofb_set_par()
887 if (info->var.xres == par->NeoPanelWidth) { in neofb_set_par()
893 par->PanelDispCntlReg2 |= 0x01; in neofb_set_par()
894 par->PanelDispCntlReg3 |= 0x10; in neofb_set_par()
899 ((par->NeoPanelWidth - in neofb_set_par()
900 info->var.xres) >> 4) - 1; in neofb_set_par()
902 ((par->NeoPanelHeight - in neofb_set_par()
903 info->var.yres) >> 1) - 2; in neofb_set_par()
910 switch (info->var.xres) { in neofb_set_par()
911 case 320: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
912 par->PanelHorizCenterReg3 = hoffset; in neofb_set_par()
913 par->PanelVertCenterReg2 = voffset; in neofb_set_par()
915 case 400: /* Needs testing. KEM -- 24 May 98 */ in neofb_set_par()
916 par->PanelHorizCenterReg4 = hoffset; in neofb_set_par()
917 par->PanelVertCenterReg1 = voffset; in neofb_set_par()
920 par->PanelHorizCenterReg1 = hoffset; in neofb_set_par()
921 par->PanelVertCenterReg3 = voffset; in neofb_set_par()
924 par->PanelHorizCenterReg2 = hoffset; in neofb_set_par()
925 par->PanelVertCenterReg4 = voffset; in neofb_set_par()
928 par->PanelHorizCenterReg5 = hoffset; in neofb_set_par()
929 par->PanelVertCenterReg5 = voffset; in neofb_set_par()
939 par->biosMode = in neofb_set_par()
940 neoFindMode(info->var.xres, info->var.yres, in neofb_set_par()
941 info->var.bits_per_pixel); in neofb_set_par()
947 neoCalcVCLK(info, par, PICOS2KHZ(info->var.pixclock)); in neofb_set_par()
950 par->MiscOutReg |= 0x0C; in neofb_set_par()
959 vga_wgfx(NULL, 0x0A, par->GeneralLockReg); in neofb_set_par()
969 switch (info->fix.accel) { in neofb_set_par()
972 temp |= (par->ExtColorModeSelect & ~0xF0); in neofb_set_par()
983 temp |= (par->ExtColorModeSelect & ~0x70); in neofb_set_par()
990 * In some rare cases a lockup might occur if we don't delay in neofb_set_par()
1014 switch (info->var.bits_per_pixel) { in neofb_set_par()
1017 info->fix.visual = FB_VISUAL_PSEUDOCOLOR; in neofb_set_par()
1021 info->fix.visual = FB_VISUAL_TRUECOLOR; in neofb_set_par()
1036 info->fix.visual = FB_VISUAL_TRUECOLOR; in neofb_set_par()
1048 vga_wgfx(NULL, 0x0E, par->ExtCRTDispAddr); in neofb_set_par()
1049 vga_wgfx(NULL, 0x0F, par->ExtCRTOffset); in neofb_set_par()
1052 temp |= (par->SysIfaceCntl1 & ~0x0F); /* VESA Bios sets bit 1! */ in neofb_set_par()
1055 vga_wgfx(NULL, 0x11, par->SysIfaceCntl2); in neofb_set_par()
1056 vga_wgfx(NULL, 0x15, 0 /*par->SingleAddrPage */ ); in neofb_set_par()
1057 vga_wgfx(NULL, 0x16, 0 /*par->DualAddrPage */ ); in neofb_set_par()
1060 switch (info->fix.accel) { in neofb_set_par()
1063 temp |= (par->PanelDispCntlReg1 & ~0xFC); in neofb_set_par()
1070 temp |= (par->PanelDispCntlReg1 & ~0xDC); in neofb_set_par()
1077 temp |= (par->PanelDispCntlReg1 & ~0x98); in neofb_set_par()
1084 temp |= (par->PanelDispCntlReg2 & ~0x38); in neofb_set_par()
1087 if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) { in neofb_set_par()
1090 temp |= (par->PanelDispCntlReg3 & ~0xEF); in neofb_set_par()
1094 vga_wgfx(NULL, 0x28, par->PanelVertCenterReg1); in neofb_set_par()
1095 vga_wgfx(NULL, 0x29, par->PanelVertCenterReg2); in neofb_set_par()
1096 vga_wgfx(NULL, 0x2a, par->PanelVertCenterReg3); in neofb_set_par()
1098 if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) { in neofb_set_par()
1099 vga_wgfx(NULL, 0x32, par->PanelVertCenterReg4); in neofb_set_par()
1100 vga_wgfx(NULL, 0x33, par->PanelHorizCenterReg1); in neofb_set_par()
1101 vga_wgfx(NULL, 0x34, par->PanelHorizCenterReg2); in neofb_set_par()
1102 vga_wgfx(NULL, 0x35, par->PanelHorizCenterReg3); in neofb_set_par()
1105 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2160) in neofb_set_par()
1106 vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4); in neofb_set_par()
1108 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 || in neofb_set_par()
1109 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 || in neofb_set_par()
1110 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 || in neofb_set_par()
1111 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) { in neofb_set_par()
1112 vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4); in neofb_set_par()
1113 vga_wgfx(NULL, 0x37, par->PanelVertCenterReg5); in neofb_set_par()
1114 vga_wgfx(NULL, 0x38, par->PanelHorizCenterReg5); in neofb_set_par()
1120 if (par->ProgramVCLK && ((vga_rgfx(NULL, 0x9B) != par->VCLK3NumeratorLow) in neofb_set_par()
1121 || (vga_rgfx(NULL, 0x9F) != par->VCLK3Denominator) in neofb_set_par()
1123 != (par->VCLK3NumeratorHigh & in neofb_set_par()
1125 vga_wgfx(NULL, 0x9B, par->VCLK3NumeratorLow); in neofb_set_par()
1129 temp |= (par->VCLK3NumeratorHigh & ~0x0F); in neofb_set_par()
1132 vga_wgfx(NULL, 0x9F, par->VCLK3Denominator); in neofb_set_par()
1135 if (par->biosMode) in neofb_set_par()
1136 vga_wcrt(NULL, 0x23, par->biosMode); in neofb_set_par()
1141 if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 || in neofb_set_par()
1142 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 || in neofb_set_par()
1143 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 || in neofb_set_par()
1144 info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) { in neofb_set_par()
1145 vga_wcrt(NULL, 0x70, par->VerticalExt); in neofb_set_par()
1148 vgaHWProtect(0); /* Turn on screen */ in neofb_set_par()
1151 neoLock(&par->state); in neofb_set_par()
1153 info->fix.line_length = in neofb_set_par()
1154 info->var.xres_virtual * (info->var.bits_per_pixel >> 3); in neofb_set_par()
1156 switch (info->fix.accel) { in neofb_set_par()
1161 neo2200_accel_init(info, &info->var); in neofb_set_par()
1175 struct neofb_par *par = info->par; in neofb_pan_display()
1176 struct vgastate *state = &par->state; in neofb_pan_display()
1182 Base = (var->yoffset * info->var.xres_virtual + var->xoffset) >> 2; in neofb_pan_display()
1183 Base *= (info->var.bits_per_pixel + 7) / 8; in neofb_pan_display()
1190 vga_wcrt(state->vgabase, 0x0C, (Base & 0x00FF00) >> 8); in neofb_pan_display()
1191 vga_wcrt(state->vgabase, 0x0D, (Base & 0x00FF)); in neofb_pan_display()
1199 vga_wgfx(state->vgabase, 0x0E, (((Base >> 16) & 0x0f) | (oldExtCRTDispAddr & 0xf0))); in neofb_pan_display()
1209 if (regno >= fb->cmap.len || regno > 255) in neofb_setcolreg()
1210 return -EINVAL; in neofb_setcolreg()
1212 if (fb->var.bits_per_pixel <= 8) { in neofb_setcolreg()
1219 switch (fb->var.bits_per_pixel) { in neofb_setcolreg()
1221 ((u32 *) fb->pseudo_palette)[regno] = in neofb_setcolreg()
1226 ((u32 *) fb->pseudo_palette)[regno] = in neofb_setcolreg()
1232 ((u32 *) fb->pseudo_palette)[regno] = in neofb_setcolreg()
1252 * Return 0 if blanking succeeded, != 0 if un-/blanking failed due to in neofb_blank()
1262 * run "setterm -powersave powerdown" to take advantage in neofb_blank()
1264 struct neofb_par *par = info->par; in neofb_blank()
1273 neoLock(&par->state); in neofb_blank()
1276 * configuration in the driver. During un-blank, we re-apply this setting, in neofb_blank()
1279 if (par->PanelDispCntlRegRead) { in neofb_blank()
1280 par->PanelDispCntlReg1 = tmpdisp; in neofb_blank()
1282 par->PanelDispCntlRegRead = !blank_mode; in neofb_blank()
1285 case FB_BLANK_POWERDOWN: /* powerdown - both sync lines down */ in neofb_blank()
1292 /* attempt to turn off backlight on toshiba; also turns off external */ in neofb_blank()
1318 * back on, and we turn it back off once we "unblank". in neofb_blank()
1320 * So here is an attempt to implement ">=" - if we are in the process in neofb_blank()
1324 lcdflags = ((par->PanelDispCntlReg1 | tmpdisp) & 0x02); /* LCD normal */ in neofb_blank()
1329 lcdflags = ((par->PanelDispCntlReg1 | tmpdisp) & 0x02); /* LCD normal */ in neofb_blank()
1333 /* attempt to re-enable backlight/external on toshiba */ in neofb_blank()
1356 neoLock(&par->state); in neofb_blank()
1363 struct neofb_par *par = info->par; in neo2200_fillrect()
1366 dst = rect->dx + rect->dy * info->var.xres_virtual; in neo2200_fillrect()
1367 rop = rect->rop ? 0x060000 : 0x0c0000; in neo2200_fillrect()
1376 rop, &par->neo2200->bltCntl); in neo2200_fillrect()
1378 switch (info->var.bits_per_pixel) { in neo2200_fillrect()
1380 writel(rect->color, &par->neo2200->fgColor); in neo2200_fillrect()
1384 writel(((u32 *) (info->pseudo_palette))[rect->color], in neo2200_fillrect()
1385 &par->neo2200->fgColor); in neo2200_fillrect()
1389 writel(dst * ((info->var.bits_per_pixel + 7) >> 3), in neo2200_fillrect()
1390 &par->neo2200->dstStart); in neo2200_fillrect()
1391 writel((rect->height << 16) | (rect->width & 0xffff), in neo2200_fillrect()
1392 &par->neo2200->xyExt); in neo2200_fillrect()
1398 u32 sx = area->sx, sy = area->sy, dx = area->dx, dy = area->dy; in neo2200_copyarea()
1399 struct neofb_par *par = info->par; in neo2200_copyarea()
1406 sy += (area->height - 1); in neo2200_copyarea()
1407 dy += (area->height - 1); in neo2200_copyarea()
1408 sx += (area->width - 1); in neo2200_copyarea()
1409 dx += (area->width - 1); in neo2200_copyarea()
1414 src = sx * (info->var.bits_per_pixel >> 3) + sy*info->fix.line_length; in neo2200_copyarea()
1415 dst = dx * (info->var.bits_per_pixel >> 3) + dy*info->fix.line_length; in neo2200_copyarea()
1420 writel(bltCntl, &par->neo2200->bltCntl); in neo2200_copyarea()
1422 writel(src, &par->neo2200->srcStart); in neo2200_copyarea()
1423 writel(dst, &par->neo2200->dstStart); in neo2200_copyarea()
1424 writel((area->height << 16) | (area->width & 0xffff), in neo2200_copyarea()
1425 &par->neo2200->xyExt); in neo2200_copyarea()
1431 struct neofb_par *par = info->par; in neo2200_imageblit()
1432 int s_pitch = (image->width * image->depth + 7) >> 3; in neo2200_imageblit()
1433 int scan_align = info->pixmap.scan_align - 1; in neo2200_imageblit()
1434 int buf_align = info->pixmap.buf_align - 1; in neo2200_imageblit()
1439 data_len = ((d_pitch * image->height) + buf_align) & ~buf_align; in neo2200_imageblit()
1443 if (image->depth == 1) { in neo2200_imageblit()
1444 if (info->var.bits_per_pixel == 24 && image->width < 16) { in neo2200_imageblit()
1445 /* FIXME. There is a bug with accelerated color-expanded in neo2200_imageblit()
1454 } else if (image->depth == info->var.bits_per_pixel) { in neo2200_imageblit()
1463 switch (info->var.bits_per_pixel) { in neo2200_imageblit()
1465 writel(image->fg_color, &par->neo2200->fgColor); in neo2200_imageblit()
1466 writel(image->bg_color, &par->neo2200->bgColor); in neo2200_imageblit()
1470 writel(((u32 *) (info->pseudo_palette))[image->fg_color], in neo2200_imageblit()
1471 &par->neo2200->fgColor); in neo2200_imageblit()
1472 writel(((u32 *) (info->pseudo_palette))[image->bg_color], in neo2200_imageblit()
1473 &par->neo2200->bgColor); in neo2200_imageblit()
1480 0x0c0000, &par->neo2200->bltCntl); in neo2200_imageblit()
1482 writel(0, &par->neo2200->srcStart); in neo2200_imageblit()
1483 // par->neo2200->dstStart = (image->dy << 16) | (image->dx & 0xffff); in neo2200_imageblit()
1484 writel(((image->dx & 0xffff) * (info->var.bits_per_pixel >> 3) + in neo2200_imageblit()
1485 image->dy * info->fix.line_length), &par->neo2200->dstStart); in neo2200_imageblit()
1486 writel((image->height << 16) | (image->width & 0xffff), in neo2200_imageblit()
1487 &par->neo2200->xyExt); in neo2200_imageblit()
1489 memcpy_toio(par->mmio_vbase + 0x100000, image->data, data_len); in neo2200_imageblit()
1495 switch (info->fix.accel) { in neofb_fillrect()
1511 switch (info->fix.accel) { in neofb_copyarea()
1527 switch (info->fix.accel) { in neofb_imageblit()
1543 switch (info->fix.accel) { in neofb_sync()
1560 //memset_io(info->sprite.addr, 0xff, 1);
1566 struct neofb_par *par = (struct neofb_par *) info->par;
1571 if (cursor->set & FB_CUR_SETPOS) {
1572 u32 x = cursor->image.dx;
1573 u32 y = cursor->image.dy;
1575 info->cursor.image.dx = x;
1576 info->cursor.image.dy = y;
1581 if (cursor->set & FB_CUR_SETSIZE) {
1582 info->cursor.image.height = cursor->image.height;
1583 info->cursor.image.width = cursor->image.width;
1586 if (cursor->set & FB_CUR_SETHOT)
1587 info->cursor.hot = cursor->hot;
1589 if (cursor->set & FB_CUR_SETCMAP) {
1590 if (cursor->image.depth == 1) {
1591 u32 fg = cursor->image.fg_color;
1592 u32 bg = cursor->image.bg_color;
1594 info->cursor.image.fg_color = fg;
1595 info->cursor.image.bg_color = bg;
1604 if (cursor->set & FB_CUR_SETSHAPE)
1607 if (info->cursor.enable)
1630 /* --------------------------------------------------------------------- */
1648 struct neofb_par *par = info->par; in neo_map_mmio()
1652 switch (info->fix.accel) { in neo_map_mmio()
1654 info->fix.mmio_start = pci_resource_start(dev, 0)+ in neo_map_mmio()
1659 info->fix.mmio_start = pci_resource_start(dev, 0)+ in neo_map_mmio()
1668 info->fix.mmio_start = pci_resource_start(dev, 1); in neo_map_mmio()
1671 info->fix.mmio_start = pci_resource_start(dev, 0); in neo_map_mmio()
1673 info->fix.mmio_len = MMIO_SIZE; in neo_map_mmio()
1676 (info->fix.mmio_start, MMIO_SIZE, "memory mapped I/O")) { in neo_map_mmio()
1678 return -EBUSY; in neo_map_mmio()
1681 par->mmio_vbase = ioremap(info->fix.mmio_start, MMIO_SIZE); in neo_map_mmio()
1682 if (!par->mmio_vbase) { in neo_map_mmio()
1684 release_mem_region(info->fix.mmio_start, in neo_map_mmio()
1685 info->fix.mmio_len); in neo_map_mmio()
1686 return -ENOMEM; in neo_map_mmio()
1689 par->mmio_vbase); in neo_map_mmio()
1695 struct neofb_par *par = info->par; in neo_unmap_mmio()
1699 iounmap(par->mmio_vbase); in neo_unmap_mmio()
1700 par->mmio_vbase = NULL; in neo_unmap_mmio()
1702 release_mem_region(info->fix.mmio_start, in neo_unmap_mmio()
1703 info->fix.mmio_len); in neo_unmap_mmio()
1710 struct neofb_par *par = info->par; in neo_map_video()
1714 info->fix.smem_start = pci_resource_start(dev, 0); in neo_map_video()
1715 info->fix.smem_len = video_len; in neo_map_video()
1717 if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, in neo_map_video()
1720 return -EBUSY; in neo_map_video()
1723 info->screen_base = in neo_map_video()
1724 ioremap_wc(info->fix.smem_start, info->fix.smem_len); in neo_map_video()
1725 if (!info->screen_base) { in neo_map_video()
1727 release_mem_region(info->fix.smem_start, in neo_map_video()
1728 info->fix.smem_len); in neo_map_video()
1729 return -ENOMEM; in neo_map_video()
1732 info->screen_base); in neo_map_video()
1734 par->wc_cookie = arch_phys_wc_add(info->fix.smem_start, in neo_map_video()
1738 memset_io(info->screen_base, 0, info->fix.smem_len); in neo_map_video()
1741 info->fix.smem_len -= PAGE_SIZE; in neo_map_video()
1742 addr = info->fix.smem_start + info->fix.smem_len; in neo_map_video()
1745 addr = (unsigned long) info->screen_base + info->fix.smem_len; in neo_map_video()
1746 info->sprite.addr = (u8 *) addr; */ in neo_map_video()
1752 struct neofb_par *par = info->par; in neo_unmap_video()
1756 arch_phys_wc_del(par->wc_cookie); in neo_unmap_video()
1757 iounmap(info->screen_base); in neo_unmap_video()
1758 info->screen_base = NULL; in neo_unmap_video()
1760 release_mem_region(info->fix.smem_start, in neo_unmap_video()
1761 info->fix.smem_len); in neo_unmap_video()
1766 struct neofb_par *par = info->par; in neo_scan_monitor()
1771 info->monspecs.modedb = kmalloc(sizeof(struct fb_videomode), GFP_KERNEL); in neo_scan_monitor()
1772 if (!info->monspecs.modedb) in neo_scan_monitor()
1773 return -ENOMEM; in neo_scan_monitor()
1774 info->monspecs.modedb_len = 1; in neo_scan_monitor()
1780 if (!par->internal_display && !par->external_display) { in neo_scan_monitor()
1781 par->internal_display = display & 2 || !(display & 3) ? 1 : 0; in neo_scan_monitor()
1782 par->external_display = display & 1; in neo_scan_monitor()
1784 par->internal_display && par->external_display ? "simultaneous" : in neo_scan_monitor()
1785 par->internal_display ? "internal" : "external"); in neo_scan_monitor()
1788 /* Determine panel width -- used in NeoValidMode. */ in neo_scan_monitor()
1794 par->NeoPanelWidth = 640; in neo_scan_monitor()
1795 par->NeoPanelHeight = 480; in neo_scan_monitor()
1796 memcpy(info->monspecs.modedb, &vesa_modes[3], sizeof(struct fb_videomode)); in neo_scan_monitor()
1799 par->NeoPanelWidth = 800; in neo_scan_monitor()
1800 if (par->libretto) { in neo_scan_monitor()
1801 par->NeoPanelHeight = 480; in neo_scan_monitor()
1802 memcpy(info->monspecs.modedb, &mode800x480, sizeof(struct fb_videomode)); in neo_scan_monitor()
1805 par->NeoPanelHeight = 600; in neo_scan_monitor()
1806 memcpy(info->monspecs.modedb, &vesa_modes[8], sizeof(struct fb_videomode)); in neo_scan_monitor()
1811 par->NeoPanelWidth = 1024; in neo_scan_monitor()
1812 par->NeoPanelHeight = 768; in neo_scan_monitor()
1813 memcpy(info->monspecs.modedb, &vesa_modes[13], sizeof(struct fb_videomode)); in neo_scan_monitor()
1818 par->NeoPanelWidth = 1280; in neo_scan_monitor()
1819 par->NeoPanelHeight = 1024; in neo_scan_monitor()
1820 memcpy(info->monspecs.modedb, &vesa_modes[20], sizeof(struct fb_videomode)); in neo_scan_monitor()
1825 kfree(info->monspecs.modedb); in neo_scan_monitor()
1826 return -1; in neo_scan_monitor()
1830 par->NeoPanelWidth = 640; in neo_scan_monitor()
1831 par->NeoPanelHeight = 480; in neo_scan_monitor()
1832 memcpy(info->monspecs.modedb, &vesa_modes[3], sizeof(struct fb_videomode)); in neo_scan_monitor()
1837 par->NeoPanelWidth, in neo_scan_monitor()
1838 par->NeoPanelHeight, in neo_scan_monitor()
1846 struct neofb_par *par = info->par; in neo_init_hw()
1856 printk(KERN_DEBUG "--- Neo extended register dump ---\n"); in neo_init_hw()
1864 switch (info->fix.accel) { in neo_init_hw()
1896 switch (info->fix.accel) { in neo_init_hw()
1912 par->neo2200 = (Neo2200 __iomem *) par->mmio_vbase; in neo_init_hw()
1916 info->sprite.size = CursorMem; in neo_init_hw()
1917 info->sprite.scan_align = 1; in neo_init_hw()
1918 info->sprite.buf_align = 1; in neo_init_hw()
1919 info->sprite.flags = FB_PIXMAP_IO; in neo_init_hw()
1920 info->sprite.outbuf = neofb_draw_cursor; in neo_init_hw()
1922 par->maxClock = maxClock; in neo_init_hw()
1923 par->cursorOff = CursorOff; in neo_init_hw()
1934 info = framebuffer_alloc(sizeof(struct neofb_par), &dev->dev); in neo_alloc_fb_info()
1939 par = info->par; in neo_alloc_fb_info()
1941 info->fix.accel = id->driver_data; in neo_alloc_fb_info()
1943 par->pci_burst = !nopciburst; in neo_alloc_fb_info()
1944 par->lcd_stretch = !nostretch; in neo_alloc_fb_info()
1945 par->libretto = libretto; in neo_alloc_fb_info()
1947 par->internal_display = internal; in neo_alloc_fb_info()
1948 par->external_display = external; in neo_alloc_fb_info()
1949 info->flags = FBINFO_HWACCEL_YPAN; in neo_alloc_fb_info()
1951 switch (info->fix.accel) { in neo_alloc_fb_info()
1953 strscpy(info->fix.id, "MagicGraph128", sizeof(info->fix.id)); in neo_alloc_fb_info()
1956 strscpy(info->fix.id, "MagicGraph128V", sizeof(info->fix.id)); in neo_alloc_fb_info()
1959 strscpy(info->fix.id, "MagicGraph128ZV", sizeof(info->fix.id)); in neo_alloc_fb_info()
1962 strscpy(info->fix.id, "Mag.Graph128ZV+", sizeof(info->fix.id)); in neo_alloc_fb_info()
1965 strscpy(info->fix.id, "MagicGraph128XD", sizeof(info->fix.id)); in neo_alloc_fb_info()
1968 strscpy(info->fix.id, "MagicGraph256AV", sizeof(info->fix.id)); in neo_alloc_fb_info()
1969 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
1974 strscpy(info->fix.id, "Mag.Graph256AV+", sizeof(info->fix.id)); in neo_alloc_fb_info()
1975 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
1980 strscpy(info->fix.id, "MagicGraph256ZX", sizeof(info->fix.id)); in neo_alloc_fb_info()
1981 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
1986 strscpy(info->fix.id, "Mag.Graph256XL+", sizeof(info->fix.id)); in neo_alloc_fb_info()
1987 info->flags |= FBINFO_HWACCEL_IMAGEBLIT | in neo_alloc_fb_info()
1993 info->fix.type = FB_TYPE_PACKED_PIXELS; in neo_alloc_fb_info()
1994 info->fix.type_aux = 0; in neo_alloc_fb_info()
1995 info->fix.xpanstep = 0; in neo_alloc_fb_info()
1996 info->fix.ypanstep = 4; in neo_alloc_fb_info()
1997 info->fix.ywrapstep = 0; in neo_alloc_fb_info()
1998 info->fix.accel = id->driver_data; in neo_alloc_fb_info()
2000 info->fbops = &neofb_ops; in neo_alloc_fb_info()
2001 info->pseudo_palette = par->palette; in neo_alloc_fb_info()
2011 fb_dealloc_cmap(&info->cmap); in neo_free_fb_info()
2016 /* --------------------------------------------------------------------- */
2034 err = -ENOMEM; in neofb_probe()
2057 if (!fb_find_mode(&info->var, info, mode_option, NULL, 0, in neofb_probe()
2058 info->monspecs.modedb, 16)) { in neofb_probe()
2060 err = -EINVAL; in neofb_probe()
2067 * the precision and fit the results into 32-bit registers. in neofb_probe()
2070 h_sync = 1953125000 / info->var.pixclock; in neofb_probe()
2072 h_sync * 512 / (info->var.xres + info->var.left_margin + in neofb_probe()
2073 info->var.right_margin + info->var.hsync_len); in neofb_probe()
2075 h_sync / (info->var.yres + info->var.upper_margin + in neofb_probe()
2076 info->var.lower_margin + info->var.vsync_len); in neofb_probe()
2080 info->fix.smem_len >> 10, info->var.xres, in neofb_probe()
2081 info->var.yres, h_sync / 1000, h_sync % 1000, v_sync); in neofb_probe()
2083 err = fb_alloc_cmap(&info->cmap, 256, 0); in neofb_probe()
2091 fb_info(info, "%s frame buffer device\n", info->fix.id); in neofb_probe()
2100 fb_dealloc_cmap(&info->cmap); in neofb_probe()
2104 fb_destroy_modedb(info->monspecs.modedb); in neofb_probe()
2122 fb_destroy_modedb(info->monspecs.modedb); in neofb_remove()
2168 /* ************************* init in-kernel code ************************** */
2208 return -ENODEV; in neofb_init()
2212 return -ENODEV; in neofb_init()