Lines Matching +full:sync +full:- +full:on +full:- +full:green
2 * linux/drivers/video/atafb.c -- Atari builtin chipset frame buffer device
11 * - 03 Jan 95: Original version by Martin Schaller: The TT driver and
13 * - 09 Jan 95: Roman: I've added the hardware abstraction (hw_switch)
15 * based on the original TT driver.
16 * - 07 May 95: Martin: Added colormap operations for the external driver
17 * - 21 May 95: Martin: Added support for overscan
19 * - Jul 95: Guenther Kelleter <guenther@pool.informatik.rwth-aachen.de>:
23 * - 27 Dec 95: Guenther: Implemented user definable video modes "user[0-7]"
24 * on minor 24...31. "user0" may be set on commandline by
25 * "R<x>;<y>;<depth>". (Makes sense only on Falcon)
26 * Video mode switch on Falcon now done at next VBL interrupt
28 * - 23 Sep 97: Juergen: added xres_virtual for cards like ProMST
29 * The external-part is legacy, therefore hardware-specific
32 * - 29 Sep 97: Juergen: added Romans suggestion for pan_display
33 * (var->xoffset was changed even if no set_screen_base avail.)
34 * - 05 Oct 97: Juergen: extfb (PACKED_PIXEL) is FB_PSEUDOCOLOR 'cause
40 * - For the Falcon it is not possible to set random video modes on
74 #define SWITCH_ACIA 0x01 /* modes for switch on OverScan */
79 #define up(x, r) (((x) + (r) - 1) & ~((r)-1))
86 static int hwscroll = -1;
106 int sync; member
114 short sync; member
189 * not needed - atafb will never support panning/hardwarescroll with external
259 * * set the video mode according to info->var *
263 * int (*fb_setcolreg)(unsigned int regno, unsigned int red, unsigned int green,
314 * This function should fill in the 'fix' structure based on the
328 * Fill the 'var' structure based on the values in 'par' and maybe
345 * succeeded, !=0 if un-/blanking failed due to e.g. a video mode which
346 * doesn't support it. Implements VESA suspend and powerdown modes on
400 * yres_virtual == 0 means use hw-scrolling if possible, else yres
403 0, 0, 0, 0, 0, 0, 0, 0, /* xres-grayscale */
404 {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, /* red green blue tran*/
405 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
409 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
413 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
417 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
421 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
425 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
429 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
433 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
437 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
441 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
445 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
449 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
453 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
471 "st-low", 60, 320, 200, 32000, 32, 16, 31, 14, 96, 4,
475 "st-mid", 60, 640, 200, 32000, 32, 16, 31, 14, 96, 4,
479 "st-high", 63, 640, 400, 32000, 128, 0, 40, 14, 128, 4,
483 "tt-low", 60, 320, 480, 31041, 120, 100, 8, 16, 140, 30,
487 "tt-mid", 60, 640, 480, 31041, 120, 100, 8, 16, 140, 30,
491 "tt-high", 57, 640, 960, 31041, 120, 100, 8, 16, 140, 30,
526 #define DEFMODE_TT 5 /* "tt-high" for TT */
528 #define DEFMODE_STE 2 /* "st-high" for ST/E */
554 /* ------------------- TT specific functions ---------------------- */
562 strcpy(fix->id, "Atari Builtin"); in tt_encode_fix()
563 fix->smem_start = phys_screen_base; in tt_encode_fix()
564 fix->smem_len = screen_len; in tt_encode_fix()
565 fix->type = FB_TYPE_INTERLEAVED_PLANES; in tt_encode_fix()
566 fix->type_aux = 2; in tt_encode_fix()
567 fix->visual = FB_VISUAL_PSEUDOCOLOR; in tt_encode_fix()
568 mode = par->hw.tt.mode & TT_SHIFTER_MODEMASK; in tt_encode_fix()
570 fix->type = FB_TYPE_PACKED_PIXELS; in tt_encode_fix()
571 fix->type_aux = 0; in tt_encode_fix()
573 fix->visual = FB_VISUAL_MONO01; in tt_encode_fix()
575 fix->xpanstep = 0; in tt_encode_fix()
576 fix->ypanstep = 1; in tt_encode_fix()
577 fix->ywrapstep = 0; in tt_encode_fix()
578 fix->line_length = par->next_line; in tt_encode_fix()
579 fix->accel = FB_ACCEL_ATARIBLITT; in tt_encode_fix()
585 int xres = var->xres; in tt_decode_var()
586 int yres = var->yres; in tt_decode_var()
587 int bpp = var->bits_per_pixel; in tt_decode_var()
589 int yres_virtual = var->yres_virtual; in tt_decode_var()
593 return -EINVAL; in tt_decode_var()
594 par->hw.tt.mode = TT_SHIFTER_TTHIGH; in tt_decode_var()
600 return -EINVAL; in tt_decode_var()
603 return -EINVAL; in tt_decode_var()
604 par->hw.tt.mode = TT_SHIFTER_TTLOW; in tt_decode_var()
610 return -EINVAL; in tt_decode_var()
612 par->hw.tt.mode = TT_SHIFTER_TTMID; in tt_decode_var()
617 par->hw.tt.mode = TT_SHIFTER_STLOW; in tt_decode_var()
624 return -EINVAL; in tt_decode_var()
625 par->hw.tt.mode = TT_SHIFTER_STMID; in tt_decode_var()
629 } else if (var->xres > sttt_xres || var->yres > st_yres) { in tt_decode_var()
630 return -EINVAL; in tt_decode_var()
632 par->hw.tt.mode = TT_SHIFTER_STHIGH; in tt_decode_var()
642 if (var->sync & FB_SYNC_EXT) in tt_decode_var()
643 par->hw.tt.sync = 0; in tt_decode_var()
645 par->hw.tt.sync = 1; in tt_decode_var()
648 return -EINVAL; in tt_decode_var()
650 return -EINVAL; in tt_decode_var()
651 if (var->yoffset + yres > yres_virtual && yres_virtual) in tt_decode_var()
652 return -EINVAL; in tt_decode_var()
653 par->yres_virtual = yres_virtual; in tt_decode_var()
654 par->screen_base = screen_base + var->yoffset * linelen; in tt_decode_var()
655 par->next_line = linelen; in tt_decode_var()
663 var->red.offset = 0; in tt_encode_var()
664 var->red.length = 4; in tt_encode_var()
665 var->red.msb_right = 0; in tt_encode_var()
666 var->grayscale = 0; in tt_encode_var()
668 var->pixclock = 31041; in tt_encode_var()
669 var->left_margin = 120; /* these may be incorrect */ in tt_encode_var()
670 var->right_margin = 100; in tt_encode_var()
671 var->upper_margin = 8; in tt_encode_var()
672 var->lower_margin = 16; in tt_encode_var()
673 var->hsync_len = 140; in tt_encode_var()
674 var->vsync_len = 30; in tt_encode_var()
676 var->height = -1; in tt_encode_var()
677 var->width = -1; in tt_encode_var()
679 if (par->hw.tt.sync & 1) in tt_encode_var()
680 var->sync = 0; in tt_encode_var()
682 var->sync = FB_SYNC_EXT; in tt_encode_var()
684 switch (par->hw.tt.mode & TT_SHIFTER_MODEMASK) { in tt_encode_var()
686 var->xres = sttt_xres / 2; in tt_encode_var()
687 var->xres_virtual = sttt_xres_virtual / 2; in tt_encode_var()
688 var->yres = st_yres / 2; in tt_encode_var()
689 var->bits_per_pixel = 4; in tt_encode_var()
692 var->xres = sttt_xres; in tt_encode_var()
693 var->xres_virtual = sttt_xres_virtual; in tt_encode_var()
694 var->yres = st_yres / 2; in tt_encode_var()
695 var->bits_per_pixel = 2; in tt_encode_var()
698 var->xres = sttt_xres; in tt_encode_var()
699 var->xres_virtual = sttt_xres_virtual; in tt_encode_var()
700 var->yres = st_yres; in tt_encode_var()
701 var->bits_per_pixel = 1; in tt_encode_var()
704 var->xres = sttt_xres / 2; in tt_encode_var()
705 var->xres_virtual = sttt_xres_virtual / 2; in tt_encode_var()
706 var->yres = tt_yres; in tt_encode_var()
707 var->bits_per_pixel = 8; in tt_encode_var()
710 var->xres = sttt_xres; in tt_encode_var()
711 var->xres_virtual = sttt_xres_virtual; in tt_encode_var()
712 var->yres = tt_yres; in tt_encode_var()
713 var->bits_per_pixel = 4; in tt_encode_var()
716 var->red.length = 0; in tt_encode_var()
717 var->xres = sttt_xres * 2; in tt_encode_var()
718 var->xres_virtual = sttt_xres_virtual * 2; in tt_encode_var()
719 var->yres = tt_yres * 2; in tt_encode_var()
720 var->bits_per_pixel = 1; in tt_encode_var()
723 var->blue = var->green = var->red; in tt_encode_var()
724 var->transp.offset = 0; in tt_encode_var()
725 var->transp.length = 0; in tt_encode_var()
726 var->transp.msb_right = 0; in tt_encode_var()
727 linelen = var->xres_virtual * var->bits_per_pixel / 8; in tt_encode_var()
729 var->yres_virtual = var->yres; in tt_encode_var()
731 if (par->yres_virtual) in tt_encode_var()
732 var->yres_virtual = par->yres_virtual; in tt_encode_var()
735 var->yres_virtual = screen_len / linelen; in tt_encode_var()
738 var->yres_virtual = 2 * var->yres; in tt_encode_var()
740 var->yres_virtual = var->yres + hwscroll * 16; in tt_encode_var()
742 var->xoffset = 0; in tt_encode_var()
744 var->yoffset = (par->screen_base - screen_base) / linelen; in tt_encode_var()
746 var->yoffset = 0; in tt_encode_var()
747 var->nonstd = 0; in tt_encode_var()
748 var->activate = 0; in tt_encode_var()
749 var->vmode = FB_VMODE_NONINTERLACED; in tt_encode_var()
756 par->hw.tt.mode = shifter_tt.tt_shiftmode; in tt_get_par()
757 par->hw.tt.sync = shifter_st.syncmode; in tt_get_par()
761 par->screen_base = atari_stram_to_virt(addr); in tt_get_par()
766 shifter_tt.tt_shiftmode = par->hw.tt.mode; in tt_set_par()
767 shifter_st.syncmode = par->hw.tt.sync; in tt_set_par()
769 if (current_par.screen_base != par->screen_base) in tt_set_par()
770 fbhw->set_screen_base(par->screen_base); in tt_set_par()
774 unsigned int green, unsigned int blue, in tt_setcolreg() argument
781 tt_palette[regno] = (((red >> 12) << 8) | ((green >> 12) << 4) | in tt_setcolreg()
797 * Even on a TT, we should look if there is a DMA sound. It was in tt_detect()
815 /* ------------------- Falcon specific functions ---------------------- */
831 int sync_mask; /* or-mask for hw.falcon.sync to set this clock */
841 /* VIDEL-prescale values [mon_type][pixel_length from VCO] */
851 return hw->ste_mode ? 16 in hxx_prescale()
852 : vdl_prescale[mon_type][hw->vid_mode >> 2 & 0x3]; in hxx_prescale()
858 strcpy(fix->id, "Atari Builtin"); in falcon_encode_fix()
859 fix->smem_start = phys_screen_base; in falcon_encode_fix()
860 fix->smem_len = screen_len; in falcon_encode_fix()
861 fix->type = FB_TYPE_INTERLEAVED_PLANES; in falcon_encode_fix()
862 fix->type_aux = 2; in falcon_encode_fix()
863 fix->visual = FB_VISUAL_PSEUDOCOLOR; in falcon_encode_fix()
864 fix->xpanstep = 1; in falcon_encode_fix()
865 fix->ypanstep = 1; in falcon_encode_fix()
866 fix->ywrapstep = 0; in falcon_encode_fix()
867 if (par->hw.falcon.mono) { in falcon_encode_fix()
868 fix->type = FB_TYPE_PACKED_PIXELS; in falcon_encode_fix()
869 fix->type_aux = 0; in falcon_encode_fix()
871 fix->xpanstep = 32; in falcon_encode_fix()
872 } else if (par->hw.falcon.f_shift & 0x100) { in falcon_encode_fix()
873 fix->type = FB_TYPE_PACKED_PIXELS; in falcon_encode_fix()
874 fix->type_aux = 0; in falcon_encode_fix()
876 fix->visual = FB_VISUAL_TRUECOLOR; in falcon_encode_fix()
877 fix->xpanstep = 2; in falcon_encode_fix()
879 fix->line_length = par->next_line; in falcon_encode_fix()
880 fix->accel = FB_ACCEL_ATARIBLITT; in falcon_encode_fix()
887 int bpp = var->bits_per_pixel; in falcon_decode_var()
888 int xres = var->xres; in falcon_decode_var()
889 int yres = var->yres; in falcon_decode_var()
890 int xres_virtual = var->xres_virtual; in falcon_decode_var()
891 int yres_virtual = var->yres_virtual; in falcon_decode_var()
913 and minimum frame rate -- (X+hmarg.)*(Y+vmarg.)*vfmin <= pixelclock. in falcon_decode_var()
924 On SM124 and TV only the standard resolutions can be used. in falcon_decode_var()
929 return -EINVAL; in falcon_decode_var()
932 return -EINVAL; in falcon_decode_var()
936 par->hw.falcon.f_shift = 0x400; in falcon_decode_var()
937 par->hw.falcon.st_shift = 0x200; in falcon_decode_var()
940 par->hw.falcon.f_shift = 0x000; in falcon_decode_var()
941 par->hw.falcon.st_shift = 0x100; in falcon_decode_var()
944 par->hw.falcon.f_shift = 0x000; in falcon_decode_var()
945 par->hw.falcon.st_shift = 0x000; in falcon_decode_var()
948 par->hw.falcon.f_shift = 0x010; in falcon_decode_var()
951 par->hw.falcon.f_shift = 0x100; /* hicolor, no overlay */ in falcon_decode_var()
953 return -EINVAL; in falcon_decode_var()
954 par->hw.falcon.bpp = bpp; in falcon_decode_var()
960 if (bpp > myvar->bits_per_pixel || in falcon_decode_var()
961 var->xres > myvar->xres || in falcon_decode_var()
962 var->yres > myvar->yres) in falcon_decode_var()
963 return -EINVAL; in falcon_decode_var()
964 fbhw->get_par(par); /* Current par will be new par */ in falcon_decode_var()
981 par->hw.falcon.ste_mode = bpp == 2; in falcon_decode_var()
982 par->hw.falcon.mono = bpp == 1; in falcon_decode_var()
992 if (par->hw.falcon.ste_mode) in falcon_decode_var()
1015 /* backward bug-compatibility */ in falcon_decode_var()
1016 if (var->pixclock > 1) in falcon_decode_var()
1017 var->pixclock -= 1; in falcon_decode_var()
1019 par->hw.falcon.line_width = bpp * xres / 16; in falcon_decode_var()
1020 par->hw.falcon.line_offset = bpp * (xres_virtual - xres) / 16; in falcon_decode_var()
1028 return -EINVAL; in falcon_decode_var()
1031 /* SM124-mode is special */ in falcon_decode_var()
1032 par->hw.falcon.ste_mode = 1; in falcon_decode_var()
1033 par->hw.falcon.f_shift = 0x000; in falcon_decode_var()
1034 par->hw.falcon.st_shift = 0x200; in falcon_decode_var()
1042 if (var->pixclock > f32.t * plen) in falcon_decode_var()
1043 return -EINVAL; in falcon_decode_var()
1047 if (var->pixclock == 0) { in falcon_decode_var()
1051 hsync_len = pclock->hsync / plen; in falcon_decode_var()
1056 left_margin = var->left_margin; in falcon_decode_var()
1057 right_margin = var->right_margin; in falcon_decode_var()
1058 hsync_len = var->hsync_len; in falcon_decode_var()
1059 upper_margin = var->upper_margin; in falcon_decode_var()
1060 lower_margin = var->lower_margin; in falcon_decode_var()
1061 vsync_len = var->vsync_len; in falcon_decode_var()
1062 if (var->vmode & FB_VMODE_INTERLACED) { in falcon_decode_var()
1066 } else if (var->vmode & FB_VMODE_DOUBLE) { in falcon_decode_var()
1076 if (var->pixclock == 0) { in falcon_decode_var()
1079 /* Choose master pixelclock depending on hor. timing */ in falcon_decode_var()
1092 return -EINVAL; in falcon_decode_var()
1094 left_margin = pclock->left / plen; in falcon_decode_var()
1095 right_margin = pclock->right / plen; in falcon_decode_var()
1096 hsync_len = pclock->hsync / plen; in falcon_decode_var()
1107 if (f25.t * i >= var->pixclock && in falcon_decode_var()
1112 if (f32.t * i >= var->pixclock && in falcon_decode_var()
1117 if (fext.t && fext.t * i >= var->pixclock && in falcon_decode_var()
1124 return -EINVAL; in falcon_decode_var()
1125 plen = pcl / pclock->t; in falcon_decode_var()
1127 left_margin = var->left_margin; in falcon_decode_var()
1128 right_margin = var->right_margin; in falcon_decode_var()
1129 hsync_len = var->hsync_len; in falcon_decode_var()
1130 upper_margin = var->upper_margin; in falcon_decode_var()
1131 lower_margin = var->lower_margin; in falcon_decode_var()
1132 vsync_len = var->vsync_len; in falcon_decode_var()
1133 /* Internal unit is [single lines per (half-)frame] */ in falcon_decode_var()
1134 if (var->vmode & FB_VMODE_INTERLACED) { in falcon_decode_var()
1140 } else if (var->vmode & FB_VMODE_DOUBLE) { in falcon_decode_var()
1148 longoffset = 1; /* VIDEL doesn't synchronize on short offset */ in falcon_decode_var()
1152 if (pclock->f / plen / 8 * bpp > 32000000L) in falcon_decode_var()
1153 return -EINVAL; in falcon_decode_var()
1158 /* include sync lengths in right/lower margin for all calculations */ in falcon_decode_var()
1163 * (which is a full frame in non-interlace mode), so we can switch in falcon_decode_var()
1164 * between interlace and non-interlace without messing around in falcon_decode_var()
1169 par->hw.falcon.vid_control = mon_type | f030_bus_width; in falcon_decode_var()
1171 par->hw.falcon.vid_control |= VCO_SHORTOFFS; /* base_offset 64 */ in falcon_decode_var()
1172 if (var->sync & FB_SYNC_HOR_HIGH_ACT) in falcon_decode_var()
1173 par->hw.falcon.vid_control |= VCO_HSYPOS; in falcon_decode_var()
1174 if (var->sync & FB_SYNC_VERT_HIGH_ACT) in falcon_decode_var()
1175 par->hw.falcon.vid_control |= VCO_VSYPOS; in falcon_decode_var()
1177 par->hw.falcon.vid_control |= pclock->control_mask; in falcon_decode_var()
1179 par->hw.falcon.sync = pclock->sync_mask | 0x2; in falcon_decode_var()
1181 par->hw.falcon.vid_mode = (2 / plen) << 2; in falcon_decode_var()
1183 par->hw.falcon.vid_mode |= VMO_DOUBLE; in falcon_decode_var()
1185 par->hw.falcon.vid_mode |= VMO_INTER; in falcon_decode_var()
1189 * unit of hxx-registers: [master clock cycles * prescale] in falcon_decode_var()
1190 * Hxx-registers are 9 bit wide in falcon_decode_var()
1195 * ((hht + 2) * 2 - hdb + hde) * prescale - hdboff + hdeoff: in falcon_decode_var()
1196 * (hht + 2 - hdb + hde) * prescale - hdboff + hdeoff in falcon_decode_var()
1197 * (this must be a multiple of plen*128/bpp, on VGA pixels in falcon_decode_var()
1201 * (hdb - hht - 2) * prescale + hdboff : in falcon_decode_var()
1209 prescale = hxx_prescale(&par->hw.falcon); in falcon_decode_var()
1210 base_off = par->hw.falcon.vid_control & VCO_SHORTOFFS ? 64 : 128; in falcon_decode_var()
1212 /* Offsets depend on video mode */ in falcon_decode_var()
1214 * calculate hd[be]-registers in falcon_decode_var()
1216 if (par->hw.falcon.f_shift & 0x100) { in falcon_decode_var()
1223 if (par->hw.falcon.ste_mode) in falcon_decode_var()
1230 /* gend1 is for hde (gend-gstart multiple of align), shifter's xres */ in falcon_decode_var()
1234 par->HHT = plen * (left_margin + xres + right_margin) / in falcon_decode_var()
1235 (2 * prescale) - 2; in falcon_decode_var()
1236 /* par->HHT = (gend2 + plen * right_margin / prescale) / 2 - 2;*/ in falcon_decode_var()
1238 par->HDB = gstart - hdb_off / prescale; in falcon_decode_var()
1239 par->HBE = gstart; in falcon_decode_var()
1240 if (par->HDB < 0) in falcon_decode_var()
1241 par->HDB += par->HHT + 2 + 0x200; in falcon_decode_var()
1242 par->HDE = gend1 - par->HHT - 2 - hde_off / prescale; in falcon_decode_var()
1243 par->HBB = gend2 - par->HHT - 2; in falcon_decode_var()
1246 if ((par->HDB & 0x200) && (par->HDB & ~0x200) - par->HDE <= 5) { in falcon_decode_var()
1251 par->HBB++; /* compensate for non matching hde and hbb */ in falcon_decode_var()
1252 par->HSS = par->HHT + 2 - plen * hsync_len / prescale; in falcon_decode_var()
1253 if (par->HSS < par->HBB) in falcon_decode_var()
1254 par->HSS = par->HBB; in falcon_decode_var()
1258 hfreq = pclock->f / ((par->HHT + 2) * prescale * 2); in falcon_decode_var()
1261 /* Too high -> enlarge margin */ in falcon_decode_var()
1267 return -EINVAL; in falcon_decode_var()
1269 /* Vxx-registers */ in falcon_decode_var()
1270 /* All Vxx must be odd in non-interlace, since frame starts in the middle in falcon_decode_var()
1273 * non-interlace, odd in interlace mode for synchronisation. in falcon_decode_var()
1274 * Vxx-registers are 11 bit wide in falcon_decode_var()
1276 par->VBE = (upper_margin * 2 + 1); /* must begin on odd halfline */ in falcon_decode_var()
1277 par->VDB = par->VBE; in falcon_decode_var()
1278 par->VDE = yres; in falcon_decode_var()
1280 par->VDE <<= 1; in falcon_decode_var()
1282 par->VDE <<= 1; /* VDE now half lines per (half-)frame */ in falcon_decode_var()
1283 par->VDE += par->VDB; in falcon_decode_var()
1284 par->VBB = par->VDE; in falcon_decode_var()
1285 par->VFT = par->VBB + (lower_margin * 2 - 1) - 1; in falcon_decode_var()
1286 par->VSS = par->VFT + 1 - (vsync_len * 2 - 1); in falcon_decode_var()
1289 par->VBB++; in falcon_decode_var()
1290 par->VSS++; in falcon_decode_var()
1291 par->VFT++; in falcon_decode_var()
1294 /* V-frequency check, hope I didn't create any loop here. */ in falcon_decode_var()
1296 vfreq = (hfreq * 2) / (par->VFT + 1); in falcon_decode_var()
1298 /* Too high -> try again with doubleline */ in falcon_decode_var()
1302 /* Too low -> try again with interlace */ in falcon_decode_var()
1306 /* Doubleline too low -> clear doubleline and enlarge margins */ in falcon_decode_var()
1310 (hfreq * 2) / (par->VFT + 1 + 4 * lines - 2 * yres) > in falcon_decode_var()
1318 /* Doubleline too high -> enlarge margins */ in falcon_decode_var()
1321 (hfreq * 2) / (par->VFT + 1 + 4 * lines) > in falcon_decode_var()
1329 /* Interlace, too high -> enlarge margins */ in falcon_decode_var()
1332 (hfreq * 2) / (par->VFT + 1 + 4 * lines) > in falcon_decode_var()
1341 return -EINVAL; in falcon_decode_var()
1346 return -EINVAL; in falcon_decode_var()
1348 return -EINVAL; in falcon_decode_var()
1349 if (var->yoffset + yres > yres_virtual && yres_virtual) in falcon_decode_var()
1350 return -EINVAL; in falcon_decode_var()
1351 par->yres_virtual = yres_virtual; in falcon_decode_var()
1352 par->screen_base = screen_base + var->yoffset * linelen; in falcon_decode_var()
1353 par->hw.falcon.xoffset = 0; in falcon_decode_var()
1355 par->next_line = linelen; in falcon_decode_var()
1367 struct falcon_hw *hw = &par->hw.falcon; in falcon_encode_var()
1371 var->pixclock = hw->sync & 0x1 ? fext.t : in falcon_encode_var()
1372 hw->vid_control & VCO_CLOCK25 ? f25.t : f32.t; in falcon_encode_var()
1374 var->height = -1; in falcon_encode_var()
1375 var->width = -1; in falcon_encode_var()
1377 var->sync = 0; in falcon_encode_var()
1378 if (hw->vid_control & VCO_HSYPOS) in falcon_encode_var()
1379 var->sync |= FB_SYNC_HOR_HIGH_ACT; in falcon_encode_var()
1380 if (hw->vid_control & VCO_VSYPOS) in falcon_encode_var()
1381 var->sync |= FB_SYNC_VERT_HIGH_ACT; in falcon_encode_var()
1383 var->vmode = FB_VMODE_NONINTERLACED; in falcon_encode_var()
1384 if (hw->vid_mode & VMO_INTER) in falcon_encode_var()
1385 var->vmode |= FB_VMODE_INTERLACED; in falcon_encode_var()
1386 if (hw->vid_mode & VMO_DOUBLE) in falcon_encode_var()
1387 var->vmode |= FB_VMODE_DOUBLE; in falcon_encode_var()
1391 * VDE. If interlace mode off unit of VC-registers is in falcon_encode_var()
1394 var->yres = hw->vde - hw->vdb; in falcon_encode_var()
1395 if (!(var->vmode & FB_VMODE_INTERLACED)) in falcon_encode_var()
1396 var->yres >>= 1; in falcon_encode_var()
1397 if (var->vmode & FB_VMODE_DOUBLE) in falcon_encode_var()
1398 var->yres >>= 1; in falcon_encode_var()
1408 if (hw->f_shift & 0x400) /* 2 colors */ in falcon_encode_var()
1409 var->bits_per_pixel = 1; in falcon_encode_var()
1410 else if (hw->f_shift & 0x100) /* hicolor */ in falcon_encode_var()
1411 var->bits_per_pixel = 16; in falcon_encode_var()
1412 else if (hw->f_shift & 0x010) /* 8 bitplanes */ in falcon_encode_var()
1413 var->bits_per_pixel = 8; in falcon_encode_var()
1414 else if (hw->st_shift == 0) in falcon_encode_var()
1415 var->bits_per_pixel = 4; in falcon_encode_var()
1416 else if (hw->st_shift == 0x100) in falcon_encode_var()
1417 var->bits_per_pixel = 2; in falcon_encode_var()
1418 else /* if (hw->st_shift == 0x200) */ in falcon_encode_var()
1419 var->bits_per_pixel = 1; in falcon_encode_var()
1421 var->xres = hw->line_width * 16 / var->bits_per_pixel; in falcon_encode_var()
1422 var->xres_virtual = var->xres + hw->line_offset * 16 / var->bits_per_pixel; in falcon_encode_var()
1423 if (hw->xoffset) in falcon_encode_var()
1424 var->xres_virtual += 16; in falcon_encode_var()
1426 if (var->bits_per_pixel == 16) { in falcon_encode_var()
1427 var->red.offset = 11; in falcon_encode_var()
1428 var->red.length = 5; in falcon_encode_var()
1429 var->red.msb_right = 0; in falcon_encode_var()
1430 var->green.offset = 5; in falcon_encode_var()
1431 var->green.length = 6; in falcon_encode_var()
1432 var->green.msb_right = 0; in falcon_encode_var()
1433 var->blue.offset = 0; in falcon_encode_var()
1434 var->blue.length = 5; in falcon_encode_var()
1435 var->blue.msb_right = 0; in falcon_encode_var()
1437 var->red.offset = 0; in falcon_encode_var()
1438 var->red.length = hw->ste_mode ? 4 : 6; in falcon_encode_var()
1439 if (var->red.length > var->bits_per_pixel) in falcon_encode_var()
1440 var->red.length = var->bits_per_pixel; in falcon_encode_var()
1441 var->red.msb_right = 0; in falcon_encode_var()
1442 var->grayscale = 0; in falcon_encode_var()
1443 var->blue = var->green = var->red; in falcon_encode_var()
1445 var->transp.offset = 0; in falcon_encode_var()
1446 var->transp.length = 0; in falcon_encode_var()
1447 var->transp.msb_right = 0; in falcon_encode_var()
1449 linelen = var->xres_virtual * var->bits_per_pixel / 8; in falcon_encode_var()
1451 if (par->yres_virtual) in falcon_encode_var()
1452 var->yres_virtual = par->yres_virtual; in falcon_encode_var()
1455 var->yres_virtual = screen_len / linelen; in falcon_encode_var()
1458 var->yres_virtual = 2 * var->yres; in falcon_encode_var()
1460 var->yres_virtual = var->yres + hwscroll * 16; in falcon_encode_var()
1462 var->xoffset = 0; /* TODO change this */ in falcon_encode_var()
1464 /* hdX-offsets */ in falcon_encode_var()
1466 plen = 4 >> (hw->vid_mode >> 2 & 0x3); in falcon_encode_var()
1467 base_off = hw->vid_control & VCO_SHORTOFFS ? 64 : 128; in falcon_encode_var()
1468 if (hw->f_shift & 0x100) { in falcon_encode_var()
1472 hde_off = ((128 / var->bits_per_pixel + 2) * plen); in falcon_encode_var()
1473 if (hw->ste_mode) in falcon_encode_var()
1474 hdb_off = (64 + base_off + (128 / var->bits_per_pixel + 2) * plen) in falcon_encode_var()
1477 hdb_off = (base_off + (128 / var->bits_per_pixel + 18) * plen) in falcon_encode_var()
1482 var->left_margin = hdb_off + prescale * ((hw->hdb & 0x1ff) - in falcon_encode_var()
1483 (hw->hdb & 0x200 ? 2 + hw->hht : 0)); in falcon_encode_var()
1484 if (hw->ste_mode || mon_type != F_MON_VGA) in falcon_encode_var()
1485 var->right_margin = prescale * (hw->hht + 2 - hw->hde) - hde_off; in falcon_encode_var()
1488 var->right_margin = prescale * (hw->hht + 2 - hw->hbb); in falcon_encode_var()
1489 var->hsync_len = prescale * (hw->hht + 2 - hw->hss); in falcon_encode_var()
1492 var->upper_margin = hw->vdb / 2; /* round down to full lines */ in falcon_encode_var()
1493 var->lower_margin = (hw->vft + 1 - hw->vde + 1) / 2; /* round up */ in falcon_encode_var()
1494 var->vsync_len = (hw->vft + 1 - hw->vss + 1) / 2; /* round up */ in falcon_encode_var()
1495 if (var->vmode & FB_VMODE_INTERLACED) { in falcon_encode_var()
1496 var->upper_margin *= 2; in falcon_encode_var()
1497 var->lower_margin *= 2; in falcon_encode_var()
1498 var->vsync_len *= 2; in falcon_encode_var()
1499 } else if (var->vmode & FB_VMODE_DOUBLE) { in falcon_encode_var()
1500 var->upper_margin = (var->upper_margin + 1) / 2; in falcon_encode_var()
1501 var->lower_margin = (var->lower_margin + 1) / 2; in falcon_encode_var()
1502 var->vsync_len = (var->vsync_len + 1) / 2; in falcon_encode_var()
1505 var->pixclock *= plen; in falcon_encode_var()
1506 var->left_margin /= plen; in falcon_encode_var()
1507 var->right_margin /= plen; in falcon_encode_var()
1508 var->hsync_len /= plen; in falcon_encode_var()
1510 var->right_margin -= var->hsync_len; in falcon_encode_var()
1511 var->lower_margin -= var->vsync_len; in falcon_encode_var()
1514 var->yoffset = (par->screen_base - screen_base) / linelen; in falcon_encode_var()
1516 var->yoffset = 0; in falcon_encode_var()
1517 var->nonstd = 0; /* what is this for? */ in falcon_encode_var()
1518 var->activate = 0; in falcon_encode_var()
1529 struct falcon_hw *hw = &par->hw.falcon; in falcon_get_par()
1531 hw->line_width = shifter_f030.scn_width; in falcon_get_par()
1532 hw->line_offset = shifter_f030.off_next; in falcon_get_par()
1533 hw->st_shift = videl.st_shift & 0x300; in falcon_get_par()
1534 hw->f_shift = videl.f_shift; in falcon_get_par()
1535 hw->vid_control = videl.control; in falcon_get_par()
1536 hw->vid_mode = videl.mode; in falcon_get_par()
1537 hw->sync = shifter_st.syncmode & 0x1; in falcon_get_par()
1538 hw->xoffset = videl.xoffset & 0xf; in falcon_get_par()
1539 hw->hht = videl.hht; in falcon_get_par()
1540 hw->hbb = videl.hbb; in falcon_get_par()
1541 hw->hbe = videl.hbe; in falcon_get_par()
1542 hw->hdb = videl.hdb; in falcon_get_par()
1543 hw->hde = videl.hde; in falcon_get_par()
1544 hw->hss = videl.hss; in falcon_get_par()
1545 hw->vft = videl.vft; in falcon_get_par()
1546 hw->vbb = videl.vbb; in falcon_get_par()
1547 hw->vbe = videl.vbe; in falcon_get_par()
1548 hw->vdb = videl.vdb; in falcon_get_par()
1549 hw->vde = videl.vde; in falcon_get_par()
1550 hw->vss = videl.vss; in falcon_get_par()
1555 par->screen_base = atari_stram_to_virt(addr); in falcon_get_par()
1558 hw->ste_mode = (hw->f_shift & 0x510) == 0 && hw->st_shift == 0x100; in falcon_get_par()
1559 hw->mono = (hw->f_shift & 0x400) || in falcon_get_par()
1560 ((hw->f_shift & 0x510) == 0 && hw->st_shift == 0x200); in falcon_get_par()
1568 if (current_par.screen_base != par->screen_base) in falcon_set_par()
1569 fbhw->set_screen_base(par->screen_base); in falcon_set_par()
1575 /* Tell vbl-handler to change video mode. in falcon_set_par()
1576 * We change modes only on next VBL, to avoid desynchronisation in falcon_set_par()
1579 * This seems to work on my Falcon. in falcon_set_par()
1581 f_new_mode = par->hw.falcon; in falcon_set_par()
1592 if (hw->sync & 0x1) { in falcon_vbl_switcher()
1599 shifter_st.syncmode = hw->sync; in falcon_vbl_switcher()
1601 videl.hht = hw->hht; in falcon_vbl_switcher()
1602 videl.hbb = hw->hbb; in falcon_vbl_switcher()
1603 videl.hbe = hw->hbe; in falcon_vbl_switcher()
1604 videl.hdb = hw->hdb; in falcon_vbl_switcher()
1605 videl.hde = hw->hde; in falcon_vbl_switcher()
1606 videl.hss = hw->hss; in falcon_vbl_switcher()
1607 videl.vft = hw->vft; in falcon_vbl_switcher()
1608 videl.vbb = hw->vbb; in falcon_vbl_switcher()
1609 videl.vbe = hw->vbe; in falcon_vbl_switcher()
1610 videl.vdb = hw->vdb; in falcon_vbl_switcher()
1611 videl.vde = hw->vde; in falcon_vbl_switcher()
1612 videl.vss = hw->vss; in falcon_vbl_switcher()
1615 if (hw->ste_mode) { in falcon_vbl_switcher()
1616 videl.st_shift = hw->st_shift; /* write enables STE palette */ in falcon_vbl_switcher()
1619 * set st_shift 0, so we can tell the screen-depth if f_shift == 0. in falcon_vbl_switcher()
1626 videl.f_shift = hw->f_shift; in falcon_vbl_switcher()
1629 videl.xoffset = hw->xoffset; in falcon_vbl_switcher()
1630 shifter_f030.scn_width = hw->line_width; in falcon_vbl_switcher()
1631 shifter_f030.off_next = hw->line_offset; in falcon_vbl_switcher()
1632 videl.control = hw->vid_control; in falcon_vbl_switcher()
1633 videl.mode = hw->vid_mode; in falcon_vbl_switcher()
1646 struct atafb_par *par = (struct atafb_par *)info->par; in falcon_pan_display()
1649 int bpp = info->var.bits_per_pixel; in falcon_pan_display()
1652 var->xoffset = up(var->xoffset, 32); in falcon_pan_display()
1654 par->hw.falcon.xoffset = var->xoffset & 15; in falcon_pan_display()
1656 par->hw.falcon.xoffset = 0; in falcon_pan_display()
1657 var->xoffset = up(var->xoffset, 2); in falcon_pan_display()
1659 par->hw.falcon.line_offset = bpp * in falcon_pan_display()
1660 (info->var.xres_virtual - info->var.xres) / 16; in falcon_pan_display()
1661 if (par->hw.falcon.xoffset) in falcon_pan_display()
1662 par->hw.falcon.line_offset -= bpp; in falcon_pan_display()
1663 xoffset = var->xoffset - par->hw.falcon.xoffset; in falcon_pan_display()
1665 par->screen_base = screen_base + in falcon_pan_display()
1666 (var->yoffset * info->var.xres_virtual + xoffset) * bpp / 8; in falcon_pan_display()
1667 if (fbhw->set_screen_base) in falcon_pan_display()
1668 fbhw->set_screen_base(par->screen_base); in falcon_pan_display()
1670 return -EINVAL; /* shouldn't happen */ in falcon_pan_display()
1676 unsigned int green, unsigned int blue, in falcon_setcolreg() argument
1682 ((green & 0xfc00) << 8) | in falcon_setcolreg()
1687 (((green & 0xe000) >> 13) | ((green & 0x1000) >> 12) << 4) | in falcon_setcolreg()
1689 ((u32 *)info->pseudo_palette)[regno] = ((red & 0xf800) | in falcon_setcolreg()
1690 ((green & 0xfc00) >> 5) | in falcon_setcolreg()
1704 if (mon_type == F_MON_SM) /* this doesn't work on SM124 */ in falcon_blank()
1718 /* use VESA suspend modes on VGA monitors */ in falcon_blank()
1760 /* initialize hsync-len */ in falcon_detect()
1775 /* ------------------- ST(E) specific functions ---------------------- */
1784 strcpy(fix->id, "Atari Builtin"); in stste_encode_fix()
1785 fix->smem_start = phys_screen_base; in stste_encode_fix()
1786 fix->smem_len = screen_len; in stste_encode_fix()
1787 fix->type = FB_TYPE_INTERLEAVED_PLANES; in stste_encode_fix()
1788 fix->type_aux = 2; in stste_encode_fix()
1789 fix->visual = FB_VISUAL_PSEUDOCOLOR; in stste_encode_fix()
1790 mode = par->hw.st.mode & 3; in stste_encode_fix()
1792 fix->type = FB_TYPE_PACKED_PIXELS; in stste_encode_fix()
1793 fix->type_aux = 0; in stste_encode_fix()
1794 fix->visual = FB_VISUAL_MONO10; in stste_encode_fix()
1797 fix->xpanstep = 16; in stste_encode_fix()
1798 fix->ypanstep = 1; in stste_encode_fix()
1800 fix->xpanstep = 0; in stste_encode_fix()
1801 fix->ypanstep = 0; in stste_encode_fix()
1803 fix->ywrapstep = 0; in stste_encode_fix()
1804 fix->line_length = par->next_line; in stste_encode_fix()
1805 fix->accel = FB_ACCEL_ATARIBLITT; in stste_encode_fix()
1812 int xres = var->xres; in stste_decode_var()
1813 int yres = var->yres; in stste_decode_var()
1814 int bpp = var->bits_per_pixel; in stste_decode_var()
1816 int yres_virtual = var->yres_virtual; in stste_decode_var()
1820 return -EINVAL; in stste_decode_var()
1821 par->hw.st.mode = ST_HIGH; in stste_decode_var()
1827 return -EINVAL; in stste_decode_var()
1830 return -EINVAL; in stste_decode_var()
1831 par->hw.st.mode = ST_LOW; in stste_decode_var()
1837 return -EINVAL; in stste_decode_var()
1838 par->hw.st.mode = ST_MID; in stste_decode_var()
1843 return -EINVAL; in stste_decode_var()
1849 if (var->sync & FB_SYNC_EXT) in stste_decode_var()
1850 par->hw.st.sync = (par->hw.st.sync & ~1) | 1; in stste_decode_var()
1852 par->hw.st.sync = (par->hw.st.sync & ~1); in stste_decode_var()
1855 return -EINVAL; in stste_decode_var()
1857 return -EINVAL; in stste_decode_var()
1858 if (var->yoffset + yres > yres_virtual && yres_virtual) in stste_decode_var()
1859 return -EINVAL; in stste_decode_var()
1860 par->yres_virtual = yres_virtual; in stste_decode_var()
1861 par->screen_base = screen_base + var->yoffset * linelen; in stste_decode_var()
1862 par->next_line = linelen; in stste_decode_var()
1871 var->red.offset = 0; in stste_encode_var()
1872 var->red.length = ATARIHW_PRESENT(EXTD_SHIFTER) ? 4 : 3; in stste_encode_var()
1873 var->red.msb_right = 0; in stste_encode_var()
1874 var->grayscale = 0; in stste_encode_var()
1876 var->pixclock = 31041; in stste_encode_var()
1877 var->left_margin = 120; /* these are incorrect */ in stste_encode_var()
1878 var->right_margin = 100; in stste_encode_var()
1879 var->upper_margin = 8; in stste_encode_var()
1880 var->lower_margin = 16; in stste_encode_var()
1881 var->hsync_len = 140; in stste_encode_var()
1882 var->vsync_len = 30; in stste_encode_var()
1884 var->height = -1; in stste_encode_var()
1885 var->width = -1; in stste_encode_var()
1887 if (!(par->hw.st.sync & 1)) in stste_encode_var()
1888 var->sync = 0; in stste_encode_var()
1890 var->sync = FB_SYNC_EXT; in stste_encode_var()
1892 switch (par->hw.st.mode & 3) { in stste_encode_var()
1894 var->xres = sttt_xres / 2; in stste_encode_var()
1895 var->yres = st_yres / 2; in stste_encode_var()
1896 var->bits_per_pixel = 4; in stste_encode_var()
1899 var->xres = sttt_xres; in stste_encode_var()
1900 var->yres = st_yres / 2; in stste_encode_var()
1901 var->bits_per_pixel = 2; in stste_encode_var()
1904 var->xres = sttt_xres; in stste_encode_var()
1905 var->yres = st_yres; in stste_encode_var()
1906 var->bits_per_pixel = 1; in stste_encode_var()
1909 var->blue = var->green = var->red; in stste_encode_var()
1910 var->transp.offset = 0; in stste_encode_var()
1911 var->transp.length = 0; in stste_encode_var()
1912 var->transp.msb_right = 0; in stste_encode_var()
1913 var->xres_virtual = sttt_xres_virtual; in stste_encode_var()
1914 linelen = var->xres_virtual * var->bits_per_pixel / 8; in stste_encode_var()
1915 ovsc_addlen = linelen * (sttt_yres_virtual - st_yres); in stste_encode_var()
1918 var->yres_virtual = var->yres; in stste_encode_var()
1920 if (par->yres_virtual) in stste_encode_var()
1921 var->yres_virtual = par->yres_virtual; in stste_encode_var()
1924 var->yres_virtual = screen_len / linelen; in stste_encode_var()
1927 var->yres_virtual = 2 * var->yres; in stste_encode_var()
1929 var->yres_virtual = var->yres + hwscroll * 16; in stste_encode_var()
1931 var->xoffset = 0; in stste_encode_var()
1933 var->yoffset = (par->screen_base - screen_base) / linelen; in stste_encode_var()
1935 var->yoffset = 0; in stste_encode_var()
1936 var->nonstd = 0; in stste_encode_var()
1937 var->activate = 0; in stste_encode_var()
1938 var->vmode = FB_VMODE_NONINTERLACED; in stste_encode_var()
1945 par->hw.st.mode = shifter_tt.st_shiftmode; in stste_get_par()
1946 par->hw.st.sync = shifter_st.syncmode; in stste_get_par()
1951 par->screen_base = atari_stram_to_virt(addr); in stste_get_par()
1956 shifter_tt.st_shiftmode = par->hw.st.mode; in stste_set_par()
1957 shifter_st.syncmode = par->hw.st.sync; in stste_set_par()
1959 if (current_par.screen_base != par->screen_base) in stste_set_par()
1960 fbhw->set_screen_base(par->screen_base); in stste_set_par()
1964 unsigned int green, unsigned int blue, in stste_setcolreg() argument
1971 green >>= 12; in stste_setcolreg()
1975 (((green & 0xe) >> 1) | ((green & 1) << 3) << 4) | in stste_setcolreg()
1980 ((green & 0xe) << 3) | in stste_setcolreg()
2025 * vertical blank interrupt is no longer in time on machines with
2030 * This might not work on every machine.
2077 /* ------------------- External Video ---------------------- */
2083 strcpy(fix->id, "Unknown Extern"); in ext_encode_fix()
2084 fix->smem_start = external_addr; in ext_encode_fix()
2085 fix->smem_len = PAGE_ALIGN(external_len); in ext_encode_fix()
2087 fix->type = FB_TYPE_PACKED_PIXELS; in ext_encode_fix()
2090 fix->visual = in ext_encode_fix()
2100 case -1: /* truecolor */ in ext_encode_fix()
2101 fix->type = FB_TYPE_PACKED_PIXELS; in ext_encode_fix()
2102 fix->visual = FB_VISUAL_TRUECOLOR; in ext_encode_fix()
2105 fix->type = FB_TYPE_PACKED_PIXELS; in ext_encode_fix()
2106 fix->visual = visual; in ext_encode_fix()
2109 fix->type = FB_TYPE_PLANES; in ext_encode_fix()
2110 fix->visual = visual; in ext_encode_fix()
2113 fix->type = FB_TYPE_INTERLEAVED_PLANES; in ext_encode_fix()
2114 fix->type_aux = 2; in ext_encode_fix()
2115 fix->visual = visual; in ext_encode_fix()
2119 fix->xpanstep = 0; in ext_encode_fix()
2120 fix->ypanstep = 0; in ext_encode_fix()
2121 fix->ywrapstep = 0; in ext_encode_fix()
2122 fix->line_length = par->next_line; in ext_encode_fix()
2130 if (var->bits_per_pixel > myvar->bits_per_pixel || in ext_decode_var()
2131 var->xres > myvar->xres || in ext_decode_var()
2132 var->xres_virtual > myvar->xres_virtual || in ext_decode_var()
2133 var->yres > myvar->yres || in ext_decode_var()
2134 var->xoffset > 0 || in ext_decode_var()
2135 var->yoffset > 0) in ext_decode_var()
2136 return -EINVAL; in ext_decode_var()
2138 par->next_line = external_xres_virtual * external_depth / 8; in ext_decode_var()
2145 var->red.offset = 0; in ext_encode_var()
2146 var->red.length = (external_pmode == -1) ? external_depth / 3 : in ext_encode_var()
2148 var->red.msb_right = 0; in ext_encode_var()
2149 var->grayscale = 0; in ext_encode_var()
2151 var->pixclock = 31041; in ext_encode_var()
2152 var->left_margin = 120; /* these are surely incorrect */ in ext_encode_var()
2153 var->right_margin = 100; in ext_encode_var()
2154 var->upper_margin = 8; in ext_encode_var()
2155 var->lower_margin = 16; in ext_encode_var()
2156 var->hsync_len = 140; in ext_encode_var()
2157 var->vsync_len = 30; in ext_encode_var()
2159 var->height = -1; in ext_encode_var()
2160 var->width = -1; in ext_encode_var()
2162 var->sync = 0; in ext_encode_var()
2164 var->xres = external_xres; in ext_encode_var()
2165 var->yres = external_yres; in ext_encode_var()
2166 var->xres_virtual = external_xres_virtual; in ext_encode_var()
2167 var->bits_per_pixel = external_depth; in ext_encode_var()
2169 var->blue = var->green = var->red; in ext_encode_var()
2170 var->transp.offset = 0; in ext_encode_var()
2171 var->transp.length = 0; in ext_encode_var()
2172 var->transp.msb_right = 0; in ext_encode_var()
2173 var->yres_virtual = var->yres; in ext_encode_var()
2174 var->xoffset = 0; in ext_encode_var()
2175 var->yoffset = 0; in ext_encode_var()
2176 var->nonstd = 0; in ext_encode_var()
2177 var->activate = 0; in ext_encode_var()
2178 var->vmode = FB_VMODE_NONINTERLACED; in ext_encode_var()
2184 par->screen_base = external_screen_base; in ext_get_par()
2202 unsigned int green, unsigned int blue, in ext_setcolreg() argument
2205 unsigned char colmask = (1 << external_bitspercol) - 1; in ext_setcolreg()
2219 OUTB(0x3c9, green & colmask); in ext_setcolreg()
2227 OUTB((MV300_reg[regno] << 2) + 1, green); in ext_setcolreg()
2241 myvar->xres = external_xres; in ext_detect()
2242 myvar->xres_virtual = external_xres_virtual; in ext_detect()
2243 myvar->yres = external_yres; in ext_detect()
2244 myvar->bits_per_pixel = external_depth; in ext_detect()
2251 /* ------ This is the same for most hardware types -------- */
2266 struct atafb_par *par = (struct atafb_par *)info->par; in pan_display()
2268 if (!fbhw->set_screen_base || in pan_display()
2269 (!ATARIHW_PRESENT(EXTD_SHIFTER) && var->xoffset)) in pan_display()
2270 return -EINVAL; in pan_display()
2271 var->xoffset = up(var->xoffset, 16); in pan_display()
2272 par->screen_base = screen_base + in pan_display()
2273 (var->yoffset * info->var.xres_virtual + var->xoffset) in pan_display()
2274 * info->var.bits_per_pixel / 8; in pan_display()
2275 fbhw->set_screen_base(par->screen_base); in pan_display()
2279 /* ------------ Interfaces to hardware functions ------------ */
2337 fbhw->get_par(par); in ata_get_par()
2342 fbhw->set_par(par); in ata_set_par()
2359 err = fbhw->decode_var(var, &par); in do_fb_set_var()
2362 activate = var->activate; in do_fb_set_var()
2363 if (((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) && isactive) in do_fb_set_var()
2365 fbhw->encode_var(var, &par); in do_fb_set_var()
2366 var->activate = activate; in do_fb_set_var()
2370 /* fbhw->encode_fix() must be called with fb_info->mm_lock held
2371 * if it is called after the register_framebuffer() - not a case here
2377 // Get fix directly (case con == -1 before)?? in atafb_get_fix()
2378 err = fbhw->decode_var(&info->var, &par); in atafb_get_fix()
2382 err = fbhw->encode_fix(fix, &par); in atafb_get_fix()
2391 fbhw->encode_var(var, &par); in atafb_get_var()
2401 atafb_get_var(&info->var, info); in atafb_set_disp()
2402 atafb_get_fix(&info->fix, info); in atafb_set_disp()
2405 info->screen_base = (external_addr ? external_screen_base : in atafb_set_disp()
2406 atari_stram_to_virt(info->fix.smem_start)); in atafb_set_disp()
2409 static int atafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, in atafb_setcolreg() argument
2413 green >>= 8; in atafb_setcolreg()
2416 return info->fbops->fb_setcolreg(regno, red, green, blue, transp, info); in atafb_setcolreg()
2422 int xoffset = var->xoffset; in atafb_pan_display()
2423 int yoffset = var->yoffset; in atafb_pan_display()
2426 if (var->vmode & FB_VMODE_YWRAP) { in atafb_pan_display()
2427 if (yoffset < 0 || yoffset >= info->var.yres_virtual || xoffset) in atafb_pan_display()
2428 return -EINVAL; in atafb_pan_display()
2430 if (xoffset + info->var.xres > info->var.xres_virtual || in atafb_pan_display()
2431 yoffset + info->var.yres > info->var.yres_virtual) in atafb_pan_display()
2432 return -EINVAL; in atafb_pan_display()
2435 if (fbhw->pan_display) { in atafb_pan_display()
2436 err = fbhw->pan_display(var, info); in atafb_pan_display()
2440 return -EINVAL; in atafb_pan_display()
2442 info->var.xoffset = xoffset; in atafb_pan_display()
2443 info->var.yoffset = yoffset; in atafb_pan_display()
2445 if (var->vmode & FB_VMODE_YWRAP) in atafb_pan_display()
2446 info->var.vmode |= FB_VMODE_YWRAP; in atafb_pan_display()
2448 info->var.vmode &= ~FB_VMODE_YWRAP; in atafb_pan_display()
2470 struct atafb_par *par = (struct atafb_par *)info->par; in atafb_fillrect()
2474 if (!rect->width || !rect->height) in atafb_fillrect()
2478 if (info->var.bits_per_pixel == 16) { in atafb_fillrect()
2485 * We could use hardware clipping but on many cards you get around in atafb_fillrect()
2488 x2 = rect->dx + rect->width; in atafb_fillrect()
2489 y2 = rect->dy + rect->height; in atafb_fillrect()
2490 x2 = x2 < info->var.xres_virtual ? x2 : info->var.xres_virtual; in atafb_fillrect()
2491 y2 = y2 < info->var.yres_virtual ? y2 : info->var.yres_virtual; in atafb_fillrect()
2492 width = x2 - rect->dx; in atafb_fillrect()
2493 height = y2 - rect->dy; in atafb_fillrect()
2495 if (info->var.bits_per_pixel == 1) in atafb_fillrect()
2496 atafb_mfb_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2497 rect->dy, rect->dx, height, width); in atafb_fillrect()
2498 else if (info->var.bits_per_pixel == 2) in atafb_fillrect()
2499 atafb_iplan2p2_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2500 rect->dy, rect->dx, height, width); in atafb_fillrect()
2501 else if (info->var.bits_per_pixel == 4) in atafb_fillrect()
2502 atafb_iplan2p4_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2503 rect->dy, rect->dx, height, width); in atafb_fillrect()
2505 atafb_iplan2p8_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2506 rect->dy, rect->dx, height, width); in atafb_fillrect()
2513 struct atafb_par *par = (struct atafb_par *)info->par; in atafb_copyarea()
2519 if (info->var.bits_per_pixel == 16) { in atafb_copyarea()
2526 x2 = area->dx + area->width; in atafb_copyarea()
2527 y2 = area->dy + area->height; in atafb_copyarea()
2528 dx = area->dx > 0 ? area->dx : 0; in atafb_copyarea()
2529 dy = area->dy > 0 ? area->dy : 0; in atafb_copyarea()
2530 x2 = x2 < info->var.xres_virtual ? x2 : info->var.xres_virtual; in atafb_copyarea()
2531 y2 = y2 < info->var.yres_virtual ? y2 : info->var.yres_virtual; in atafb_copyarea()
2532 width = x2 - dx; in atafb_copyarea()
2533 height = y2 - dy; in atafb_copyarea()
2535 if (area->sx + dx < area->dx || area->sy + dy < area->dy) in atafb_copyarea()
2539 sx = area->sx + (dx - area->dx); in atafb_copyarea()
2540 sy = area->sy + (dy - area->dy); in atafb_copyarea()
2543 if (sx + width > info->var.xres_virtual || in atafb_copyarea()
2544 sy + height > info->var.yres_virtual) in atafb_copyarea()
2553 if (info->var.bits_per_pixel == 1) in atafb_copyarea()
2554 atafb_mfb_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2555 else if (info->var.bits_per_pixel == 2) in atafb_copyarea()
2556 atafb_iplan2p2_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2557 else if (info->var.bits_per_pixel == 4) in atafb_copyarea()
2558 atafb_iplan2p4_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2560 atafb_iplan2p8_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2567 struct atafb_par *par = (struct atafb_par *)info->par; in atafb_imageblit()
2575 if (info->var.bits_per_pixel == 16) { in atafb_imageblit()
2582 * We could use hardware clipping but on many cards you get around in atafb_imageblit()
2586 x2 = image->dx + image->width; in atafb_imageblit()
2587 y2 = image->dy + image->height; in atafb_imageblit()
2588 dx = image->dx; in atafb_imageblit()
2589 dy = image->dy; in atafb_imageblit()
2590 x2 = x2 < info->var.xres_virtual ? x2 : info->var.xres_virtual; in atafb_imageblit()
2591 y2 = y2 < info->var.yres_virtual ? y2 : info->var.yres_virtual; in atafb_imageblit()
2592 width = x2 - dx; in atafb_imageblit()
2593 height = y2 - dy; in atafb_imageblit()
2595 if (image->depth == 1) { in atafb_imageblit()
2598 ((unsigned long)info->screen_base & ~(BYTES_PER_LONG - 1)); in atafb_imageblit()
2599 dst_idx = ((unsigned long)info->screen_base & (BYTES_PER_LONG - 1)) * 8; in atafb_imageblit()
2600 dst_idx += dy * par->next_line * 8 + dx; in atafb_imageblit()
2601 src = image->data; in atafb_imageblit()
2602 pitch = (image->width + 7) / 8; in atafb_imageblit()
2603 while (height--) { in atafb_imageblit()
2605 if (info->var.bits_per_pixel == 1) in atafb_imageblit()
2606 atafb_mfb_linefill(info, par->next_line, in atafb_imageblit()
2608 image->bg_color, image->fg_color); in atafb_imageblit()
2609 else if (info->var.bits_per_pixel == 2) in atafb_imageblit()
2610 atafb_iplan2p2_linefill(info, par->next_line, in atafb_imageblit()
2612 image->bg_color, image->fg_color); in atafb_imageblit()
2613 else if (info->var.bits_per_pixel == 4) in atafb_imageblit()
2614 atafb_iplan2p4_linefill(info, par->next_line, in atafb_imageblit()
2616 image->bg_color, image->fg_color); in atafb_imageblit()
2618 atafb_iplan2p8_linefill(info, par->next_line, in atafb_imageblit()
2620 image->bg_color, image->fg_color); in atafb_imageblit()
2625 c2p_iplan2(info->screen_base, image->data, dx, dy, width, in atafb_imageblit()
2626 height, par->next_line, image->width, in atafb_imageblit()
2627 info->var.bits_per_pixel); in atafb_imageblit()
2639 return -EFAULT; in atafb_ioctl()
2646 return -EFAULT; in atafb_ioctl()
2651 return -EINVAL; in atafb_ioctl()
2665 if (fbhw->blank && !fbhw->blank(blank)) in atafb_blank()
2670 cmap.green = black; in atafb_blank()
2697 err = fbhw->decode_var(var, &par); in atafb_check_var()
2702 fbhw->encode_var(var, &par); in atafb_check_var()
2710 struct atafb_par *par = (struct atafb_par *)info->par; in atafb_set_par()
2713 fbhw->decode_var(&info->var, par); in atafb_set_par()
2714 mutex_lock(&info->mm_lock); in atafb_set_par()
2715 fbhw->encode_fix(&info->fix, par); in atafb_set_par()
2716 mutex_unlock(&info->mm_lock); in atafb_set_par()
2747 var = atafb_predefined[default_par - 1]; in check_default_par()
2754 var = atafb_predefined[detected_mode - 1]; /* autodetect */ in check_default_par()
2767 var = atafb_predefined[default_par - 1]; in check_default_par()
2787 * [;<screen mem length>[;<vgaiobase>[;<bits-per-col>[;<colorreg-type> in atafb_setup_ext()
2788 * [;<xres-virtual>]]]]] in atafb_setup_ext()
2791 * <xres_virtual>: hardware's x-resolution (f.e. ProMST) in atafb_setup_ext()
2793 * Even xres_virtual is available, we neither support panning nor hw-scrolling! in atafb_setup_ext()
2827 planes = -1; /* true color */ in atafb_setup_ext()
2901 * <xres>: x-resolution in atafb_setup_int()
2902 * <yres>: y-resolution in atafb_setup_int()
2991 atafb_predefined[default_par - 1].xres = xres; in atafb_setup_user()
2992 atafb_predefined[default_par - 1].yres = yres; in atafb_setup_user()
2993 atafb_predefined[default_par - 1].bits_per_pixel = depth; in atafb_setup_user()
3032 /* external pixelclock in kHz --> ps */ in atafb_setup()
3054 return -ENODEV; in atafb_probe()
3056 dev_dbg(&pdev->dev, "%s: start\n", __func__); in atafb_probe()
3061 dev_dbg(&pdev->dev, "initializing external hw\n"); in atafb_probe()
3070 dev_dbg(&pdev->dev, "initializing TT hw\n"); in atafb_probe()
3079 dev_dbg(&pdev->dev, "initializing Falcon hw\n"); in atafb_probe()
3094 dev_dbg(&pdev->dev, "initializing ST/E hw\n"); in atafb_probe()
3102 dev_warn(&pdev->dev, in atafb_probe()
3106 /* Nobody will ever see this message :-) */ in atafb_probe()
3112 /* Atari-TOS defaults if no boot option present */ in atafb_probe()
3120 detected_mode = fbhw->detect(); in atafb_probe()
3131 pad = -(unsigned long)screen_base & (PAGE_SIZE - 1); in atafb_probe()
3134 screen_len = (mem_req - pad - ovsc_offset) & PAGE_MASK; in atafb_probe()
3137 /* On a '040+, the cache mode of video RAM must be set to in atafb_probe()
3138 * write-through also for internal video hardware! */ in atafb_probe()
3143 dev_info(&pdev->dev, "phys_screen_base %lx screen_len %d\n", in atafb_probe()
3161 // strcpy(fb_info.mode->name, "Atari Builtin "); in atafb_probe()
3164 do_fb_set_var(&atafb_predefined[default_par - 1], 1); in atafb_probe()
3180 return -EINVAL; in atafb_probe()
3191 dev_info(&pdev->dev, "Determined %dx%d, depth %d\n", fb_info.var.xres, in atafb_probe()
3195 dev_info(&pdev->dev, " virtual %dx%d\n", in atafb_probe()
3209 return -EINVAL; in atafb_probe()
3222 if (fbhw->blank) in atafb_shutdown()
3223 fbhw->blank(0); in atafb_shutdown()
3238 return -ENODEV; in atafb_init()
3240 pdev = platform_device_register_simple("atafb", -1, NULL, 0); in atafb_init()