ARM: s3c64xx: bring back notes from removed debug-macro.S
[linux-2.6-microblaze.git] / drivers / video / fbdev / cirrusfb.c
1 /*
2  * drivers/video/cirrusfb.c - driver for Cirrus Logic chipsets
3  *
4  * Copyright 1999-2001 Jeff Garzik <jgarzik@pobox.com>
5  *
6  * Contributors (thanks, all!)
7  *
8  *      David Eger:
9  *      Overhaul for Linux 2.6
10  *
11  *      Jeff Rugen:
12  *      Major contributions;  Motorola PowerStack (PPC and PCI) support,
13  *      GD54xx, 1280x1024 mode support, change MCLK based on VCLK.
14  *
15  *      Geert Uytterhoeven:
16  *      Excellent code review.
17  *
18  *      Lars Hecking:
19  *      Amiga updates and testing.
20  *
21  * Original cirrusfb author:  Frank Neumann
22  *
23  * Based on retz3fb.c and cirrusfb.c:
24  *      Copyright (C) 1997 Jes Sorensen
25  *      Copyright (C) 1996 Frank Neumann
26  *
27  ***************************************************************
28  *
29  * Format this code with GNU indent '-kr -i8 -pcs' options.
30  *
31  * This file is subject to the terms and conditions of the GNU General Public
32  * License.  See the file COPYING in the main directory of this archive
33  * for more details.
34  *
35  */
36
37 #include <linux/module.h>
38 #include <linux/kernel.h>
39 #include <linux/errno.h>
40 #include <linux/string.h>
41 #include <linux/mm.h>
42 #include <linux/delay.h>
43 #include <linux/fb.h>
44 #include <linux/init.h>
45
46 #ifdef CONFIG_ZORRO
47 #include <linux/zorro.h>
48 #endif
49 #ifdef CONFIG_PCI
50 #include <linux/pci.h>
51 #endif
52 #ifdef CONFIG_AMIGA
53 #include <asm/amigahw.h>
54 #endif
55
56 #include <video/vga.h>
57 #include <video/cirrus.h>
58
59 /*****************************************************************
60  *
61  * debugging and utility macros
62  *
63  */
64
65 /* disable runtime assertions? */
66 /* #define CIRRUSFB_NDEBUG */
67
68 /* debugging assertions */
69 #ifndef CIRRUSFB_NDEBUG
70 #define assert(expr) \
71         if (!(expr)) { \
72                 printk("Assertion failed! %s,%s,%s,line=%d\n", \
73                 #expr, __FILE__, __func__, __LINE__); \
74         }
75 #else
76 #define assert(expr)
77 #endif
78
79 #define MB_ (1024 * 1024)
80
81 /*****************************************************************
82  *
83  * chipset information
84  *
85  */
86
87 /* board types */
88 enum cirrus_board {
89         BT_NONE = 0,
90         BT_SD64,        /* GD5434 */
91         BT_PICCOLO,     /* GD5426 */
92         BT_PICASSO,     /* GD5426 or GD5428 */
93         BT_SPECTRUM,    /* GD5426 or GD5428 */
94         BT_PICASSO4,    /* GD5446 */
95         BT_ALPINE,      /* GD543x/4x */
96         BT_GD5480,
97         BT_LAGUNA,      /* GD5462/64 */
98         BT_LAGUNAB,     /* GD5465 */
99 };
100
101 /*
102  * per-board-type information, used for enumerating and abstracting
103  * chip-specific information
104  * NOTE: MUST be in the same order as enum cirrus_board in order to
105  * use direct indexing on this array
106  * NOTE: '__initdata' cannot be used as some of this info
107  * is required at runtime.  Maybe separate into an init-only and
108  * a run-time table?
109  */
110 static const struct cirrusfb_board_info_rec {
111         char *name;             /* ASCII name of chipset */
112         long maxclock[5];               /* maximum video clock */
113         /* for  1/4bpp, 8bpp 15/16bpp, 24bpp, 32bpp - numbers from xorg code */
114         bool init_sr07 : 1; /* init SR07 during init_vgachip() */
115         bool init_sr1f : 1; /* write SR1F during init_vgachip() */
116         /* construct bit 19 of screen start address */
117         bool scrn_start_bit19 : 1;
118
119         /* initial SR07 value, then for each mode */
120         unsigned char sr07;
121         unsigned char sr07_1bpp;
122         unsigned char sr07_1bpp_mux;
123         unsigned char sr07_8bpp;
124         unsigned char sr07_8bpp_mux;
125
126         unsigned char sr1f;     /* SR1F VGA initial register value */
127 } cirrusfb_board_info[] = {
128         [BT_SD64] = {
129                 .name                   = "CL SD64",
130                 .maxclock               = {
131                         /* guess */
132                         /* the SD64/P4 have a higher max. videoclock */
133                         135100, 135100, 85500, 85500, 0
134                 },
135                 .init_sr07              = true,
136                 .init_sr1f              = true,
137                 .scrn_start_bit19       = true,
138                 .sr07                   = 0xF0,
139                 .sr07_1bpp              = 0xF0,
140                 .sr07_1bpp_mux          = 0xF6,
141                 .sr07_8bpp              = 0xF1,
142                 .sr07_8bpp_mux          = 0xF7,
143                 .sr1f                   = 0x1E
144         },
145         [BT_PICCOLO] = {
146                 .name                   = "CL Piccolo",
147                 .maxclock               = {
148                         /* guess */
149                         90000, 90000, 90000, 90000, 90000
150                 },
151                 .init_sr07              = true,
152                 .init_sr1f              = true,
153                 .scrn_start_bit19       = false,
154                 .sr07                   = 0x80,
155                 .sr07_1bpp              = 0x80,
156                 .sr07_8bpp              = 0x81,
157                 .sr1f                   = 0x22
158         },
159         [BT_PICASSO] = {
160                 .name                   = "CL Picasso",
161                 .maxclock               = {
162                         /* guess */
163                         90000, 90000, 90000, 90000, 90000
164                 },
165                 .init_sr07              = true,
166                 .init_sr1f              = true,
167                 .scrn_start_bit19       = false,
168                 .sr07                   = 0x20,
169                 .sr07_1bpp              = 0x20,
170                 .sr07_8bpp              = 0x21,
171                 .sr1f                   = 0x22
172         },
173         [BT_SPECTRUM] = {
174                 .name                   = "CL Spectrum",
175                 .maxclock               = {
176                         /* guess */
177                         90000, 90000, 90000, 90000, 90000
178                 },
179                 .init_sr07              = true,
180                 .init_sr1f              = true,
181                 .scrn_start_bit19       = false,
182                 .sr07                   = 0x80,
183                 .sr07_1bpp              = 0x80,
184                 .sr07_8bpp              = 0x81,
185                 .sr1f                   = 0x22
186         },
187         [BT_PICASSO4] = {
188                 .name                   = "CL Picasso4",
189                 .maxclock               = {
190                         135100, 135100, 85500, 85500, 0
191                 },
192                 .init_sr07              = true,
193                 .init_sr1f              = false,
194                 .scrn_start_bit19       = true,
195                 .sr07                   = 0xA0,
196                 .sr07_1bpp              = 0xA0,
197                 .sr07_1bpp_mux          = 0xA6,
198                 .sr07_8bpp              = 0xA1,
199                 .sr07_8bpp_mux          = 0xA7,
200                 .sr1f                   = 0
201         },
202         [BT_ALPINE] = {
203                 .name                   = "CL Alpine",
204                 .maxclock               = {
205                         /* for the GD5430.  GD5446 can do more... */
206                         85500, 85500, 50000, 28500, 0
207                 },
208                 .init_sr07              = true,
209                 .init_sr1f              = true,
210                 .scrn_start_bit19       = true,
211                 .sr07                   = 0xA0,
212                 .sr07_1bpp              = 0xA0,
213                 .sr07_1bpp_mux          = 0xA6,
214                 .sr07_8bpp              = 0xA1,
215                 .sr07_8bpp_mux          = 0xA7,
216                 .sr1f                   = 0x1C
217         },
218         [BT_GD5480] = {
219                 .name                   = "CL GD5480",
220                 .maxclock               = {
221                         135100, 200000, 200000, 135100, 135100
222                 },
223                 .init_sr07              = true,
224                 .init_sr1f              = true,
225                 .scrn_start_bit19       = true,
226                 .sr07                   = 0x10,
227                 .sr07_1bpp              = 0x11,
228                 .sr07_8bpp              = 0x11,
229                 .sr1f                   = 0x1C
230         },
231         [BT_LAGUNA] = {
232                 .name                   = "CL Laguna",
233                 .maxclock               = {
234                         /* taken from X11 code */
235                         170000, 170000, 170000, 170000, 135100,
236                 },
237                 .init_sr07              = false,
238                 .init_sr1f              = false,
239                 .scrn_start_bit19       = true,
240         },
241         [BT_LAGUNAB] = {
242                 .name                   = "CL Laguna AGP",
243                 .maxclock               = {
244                         /* taken from X11 code */
245                         170000, 250000, 170000, 170000, 135100,
246                 },
247                 .init_sr07              = false,
248                 .init_sr1f              = false,
249                 .scrn_start_bit19       = true,
250         }
251 };
252
253 #ifdef CONFIG_PCI
254 #define CHIP(id, btype) \
255         { PCI_VENDOR_ID_CIRRUS, id, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (btype) }
256
257 static struct pci_device_id cirrusfb_pci_table[] = {
258         CHIP(PCI_DEVICE_ID_CIRRUS_5436, BT_ALPINE),
259         CHIP(PCI_DEVICE_ID_CIRRUS_5434_8, BT_SD64),
260         CHIP(PCI_DEVICE_ID_CIRRUS_5434_4, BT_SD64),
261         CHIP(PCI_DEVICE_ID_CIRRUS_5430, BT_ALPINE), /* GD-5440 is same id */
262         CHIP(PCI_DEVICE_ID_CIRRUS_7543, BT_ALPINE),
263         CHIP(PCI_DEVICE_ID_CIRRUS_7548, BT_ALPINE),
264         CHIP(PCI_DEVICE_ID_CIRRUS_5480, BT_GD5480), /* MacPicasso likely */
265         CHIP(PCI_DEVICE_ID_CIRRUS_5446, BT_PICASSO4), /* Picasso 4 is 5446 */
266         CHIP(PCI_DEVICE_ID_CIRRUS_5462, BT_LAGUNA), /* CL Laguna */
267         CHIP(PCI_DEVICE_ID_CIRRUS_5464, BT_LAGUNA), /* CL Laguna 3D */
268         CHIP(PCI_DEVICE_ID_CIRRUS_5465, BT_LAGUNAB), /* CL Laguna 3DA*/
269         { 0, }
270 };
271 MODULE_DEVICE_TABLE(pci, cirrusfb_pci_table);
272 #undef CHIP
273 #endif /* CONFIG_PCI */
274
275 #ifdef CONFIG_ZORRO
276 struct zorrocl {
277         enum cirrus_board type; /* Board type */
278         u32 regoffset;          /* Offset of registers in first Zorro device */
279         u32 ramsize;            /* Size of video RAM in first Zorro device */
280                                 /* If zero, use autoprobe on RAM device */
281         u32 ramoffset;          /* Offset of video RAM in first Zorro device */
282         zorro_id ramid;         /* Zorro ID of RAM device */
283         zorro_id ramid2;        /* Zorro ID of optional second RAM device */
284 };
285
286 static const struct zorrocl zcl_sd64 = {
287         .type           = BT_SD64,
288         .ramid          = ZORRO_PROD_HELFRICH_SD64_RAM,
289 };
290
291 static const struct zorrocl zcl_piccolo = {
292         .type           = BT_PICCOLO,
293         .ramid          = ZORRO_PROD_HELFRICH_PICCOLO_RAM,
294 };
295
296 static const struct zorrocl zcl_picasso = {
297         .type           = BT_PICASSO,
298         .ramid          = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_RAM,
299 };
300
301 static const struct zorrocl zcl_spectrum = {
302         .type           = BT_SPECTRUM,
303         .ramid          = ZORRO_PROD_GVP_EGS_28_24_SPECTRUM_RAM,
304 };
305
306 static const struct zorrocl zcl_picasso4_z3 = {
307         .type           = BT_PICASSO4,
308         .regoffset      = 0x00600000,
309         .ramsize        = 4 * MB_,
310         .ramoffset      = 0x01000000,   /* 0x02000000 for 64 MiB boards */
311 };
312
313 static const struct zorrocl zcl_picasso4_z2 = {
314         .type           = BT_PICASSO4,
315         .regoffset      = 0x10000,
316         .ramid          = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM1,
317         .ramid2         = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM2,
318 };
319
320
321 static const struct zorro_device_id cirrusfb_zorro_table[] = {
322         {
323                 .id             = ZORRO_PROD_HELFRICH_SD64_REG,
324                 .driver_data    = (unsigned long)&zcl_sd64,
325         }, {
326                 .id             = ZORRO_PROD_HELFRICH_PICCOLO_REG,
327                 .driver_data    = (unsigned long)&zcl_piccolo,
328         }, {
329                 .id     = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_REG,
330                 .driver_data    = (unsigned long)&zcl_picasso,
331         }, {
332                 .id             = ZORRO_PROD_GVP_EGS_28_24_SPECTRUM_REG,
333                 .driver_data    = (unsigned long)&zcl_spectrum,
334         }, {
335                 .id             = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z3,
336                 .driver_data    = (unsigned long)&zcl_picasso4_z3,
337         }, {
338                 .id             = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_REG,
339                 .driver_data    = (unsigned long)&zcl_picasso4_z2,
340         },
341         { 0 }
342 };
343 MODULE_DEVICE_TABLE(zorro, cirrusfb_zorro_table);
344 #endif /* CONFIG_ZORRO */
345
346 #ifdef CIRRUSFB_DEBUG
347 enum cirrusfb_dbg_reg_class {
348         CRT,
349         SEQ
350 };
351 #endif          /* CIRRUSFB_DEBUG */
352
353 /* info about board */
354 struct cirrusfb_info {
355         u8 __iomem *regbase;
356         u8 __iomem *laguna_mmio;
357         enum cirrus_board btype;
358         unsigned char SFR;      /* Shadow of special function register */
359
360         int multiplexing;
361         int doubleVCLK;
362         int blank_mode;
363         u32 pseudo_palette[16];
364
365         void (*unmap)(struct fb_info *info);
366 };
367
368 static bool noaccel;
369 static char *mode_option = "640x480@60";
370
371 /****************************************************************************/
372 /**** BEGIN PROTOTYPES ******************************************************/
373
374 /*--- Interface used by the world ------------------------------------------*/
375 static int cirrusfb_pan_display(struct fb_var_screeninfo *var,
376                                 struct fb_info *info);
377
378 /*--- Internal routines ----------------------------------------------------*/
379 static void init_vgachip(struct fb_info *info);
380 static void switch_monitor(struct cirrusfb_info *cinfo, int on);
381 static void WGen(const struct cirrusfb_info *cinfo,
382                  int regnum, unsigned char val);
383 static unsigned char RGen(const struct cirrusfb_info *cinfo, int regnum);
384 static void AttrOn(const struct cirrusfb_info *cinfo);
385 static void WHDR(const struct cirrusfb_info *cinfo, unsigned char val);
386 static void WSFR(struct cirrusfb_info *cinfo, unsigned char val);
387 static void WSFR2(struct cirrusfb_info *cinfo, unsigned char val);
388 static void WClut(struct cirrusfb_info *cinfo, unsigned char regnum,
389                   unsigned char red, unsigned char green, unsigned char blue);
390 #if 0
391 static void RClut(struct cirrusfb_info *cinfo, unsigned char regnum,
392                   unsigned char *red, unsigned char *green,
393                   unsigned char *blue);
394 #endif
395 static void cirrusfb_WaitBLT(u8 __iomem *regbase);
396 static void cirrusfb_BitBLT(u8 __iomem *regbase, int bits_per_pixel,
397                             u_short curx, u_short cury,
398                             u_short destx, u_short desty,
399                             u_short width, u_short height,
400                             u_short line_length);
401 static void cirrusfb_RectFill(u8 __iomem *regbase, int bits_per_pixel,
402                               u_short x, u_short y,
403                               u_short width, u_short height,
404                               u32 fg_color, u32 bg_color,
405                               u_short line_length, u_char blitmode);
406
407 static void bestclock(long freq, int *nom, int *den, int *div);
408
409 #ifdef CIRRUSFB_DEBUG
410 static void cirrusfb_dbg_reg_dump(struct fb_info *info, caddr_t regbase);
411 static void cirrusfb_dbg_print_regs(struct fb_info *info,
412                                     caddr_t regbase,
413                                     enum cirrusfb_dbg_reg_class reg_class, ...);
414 #endif /* CIRRUSFB_DEBUG */
415
416 /*** END   PROTOTYPES ********************************************************/
417 /*****************************************************************************/
418 /*** BEGIN Interface Used by the World ***************************************/
419
420 static inline int is_laguna(const struct cirrusfb_info *cinfo)
421 {
422         return cinfo->btype == BT_LAGUNA || cinfo->btype == BT_LAGUNAB;
423 }
424
425 static int opencount;
426
427 /*--- Open /dev/fbx ---------------------------------------------------------*/
428 static int cirrusfb_open(struct fb_info *info, int user)
429 {
430         if (opencount++ == 0)
431                 switch_monitor(info->par, 1);
432         return 0;
433 }
434
435 /*--- Close /dev/fbx --------------------------------------------------------*/
436 static int cirrusfb_release(struct fb_info *info, int user)
437 {
438         if (--opencount == 0)
439                 switch_monitor(info->par, 0);
440         return 0;
441 }
442
443 /**** END   Interface used by the World *************************************/
444 /****************************************************************************/
445 /**** BEGIN Hardware specific Routines **************************************/
446
447 /* Check if the MCLK is not a better clock source */
448 static int cirrusfb_check_mclk(struct fb_info *info, long freq)
449 {
450         struct cirrusfb_info *cinfo = info->par;
451         long mclk = vga_rseq(cinfo->regbase, CL_SEQR1F) & 0x3f;
452
453         /* Read MCLK value */
454         mclk = (14318 * mclk) >> 3;
455         dev_dbg(info->device, "Read MCLK of %ld kHz\n", mclk);
456
457         /* Determine if we should use MCLK instead of VCLK, and if so, what we
458          * should divide it by to get VCLK
459          */
460
461         if (abs(freq - mclk) < 250) {
462                 dev_dbg(info->device, "Using VCLK = MCLK\n");
463                 return 1;
464         } else if (abs(freq - (mclk / 2)) < 250) {
465                 dev_dbg(info->device, "Using VCLK = MCLK/2\n");
466                 return 2;
467         }
468
469         return 0;
470 }
471
472 static int cirrusfb_check_pixclock(const struct fb_var_screeninfo *var,
473                                    struct fb_info *info)
474 {
475         long freq;
476         long maxclock;
477         struct cirrusfb_info *cinfo = info->par;
478         unsigned maxclockidx = var->bits_per_pixel >> 3;
479
480         /* convert from ps to kHz */
481         freq = PICOS2KHZ(var->pixclock);
482
483         dev_dbg(info->device, "desired pixclock: %ld kHz\n", freq);
484
485         maxclock = cirrusfb_board_info[cinfo->btype].maxclock[maxclockidx];
486         cinfo->multiplexing = 0;
487
488         /* If the frequency is greater than we can support, we might be able
489          * to use multiplexing for the video mode */
490         if (freq > maxclock) {
491                 dev_err(info->device,
492                         "Frequency greater than maxclock (%ld kHz)\n",
493                         maxclock);
494                 return -EINVAL;
495         }
496         /*
497          * Additional constraint: 8bpp uses DAC clock doubling to allow maximum
498          * pixel clock
499          */
500         if (var->bits_per_pixel == 8) {
501                 switch (cinfo->btype) {
502                 case BT_ALPINE:
503                 case BT_SD64:
504                 case BT_PICASSO4:
505                         if (freq > 85500)
506                                 cinfo->multiplexing = 1;
507                         break;
508                 case BT_GD5480:
509                         if (freq > 135100)
510                                 cinfo->multiplexing = 1;
511                         break;
512
513                 default:
514                         break;
515                 }
516         }
517
518         /* If we have a 1MB 5434, we need to put ourselves in a mode where
519          * the VCLK is double the pixel clock. */
520         cinfo->doubleVCLK = 0;
521         if (cinfo->btype == BT_SD64 && info->fix.smem_len <= MB_ &&
522             var->bits_per_pixel == 16) {
523                 cinfo->doubleVCLK = 1;
524         }
525
526         return 0;
527 }
528
529 static int cirrusfb_check_var(struct fb_var_screeninfo *var,
530                               struct fb_info *info)
531 {
532         int yres;
533         /* memory size in pixels */
534         unsigned pixels = info->screen_size * 8 / var->bits_per_pixel;
535         struct cirrusfb_info *cinfo = info->par;
536
537         switch (var->bits_per_pixel) {
538         case 1:
539                 var->red.offset = 0;
540                 var->red.length = 1;
541                 var->green = var->red;
542                 var->blue = var->red;
543                 break;
544
545         case 8:
546                 var->red.offset = 0;
547                 var->red.length = 8;
548                 var->green = var->red;
549                 var->blue = var->red;
550                 break;
551
552         case 16:
553                 var->red.offset = 11;
554                 var->green.offset = 5;
555                 var->blue.offset = 0;
556                 var->red.length = 5;
557                 var->green.length = 6;
558                 var->blue.length = 5;
559                 break;
560
561         case 24:
562                 var->red.offset = 16;
563                 var->green.offset = 8;
564                 var->blue.offset = 0;
565                 var->red.length = 8;
566                 var->green.length = 8;
567                 var->blue.length = 8;
568                 break;
569
570         default:
571                 dev_dbg(info->device,
572                         "Unsupported bpp size: %d\n", var->bits_per_pixel);
573                 return -EINVAL;
574         }
575
576         if (var->xres_virtual < var->xres)
577                 var->xres_virtual = var->xres;
578         /* use highest possible virtual resolution */
579         if (var->yres_virtual == -1) {
580                 var->yres_virtual = pixels / var->xres_virtual;
581
582                 dev_info(info->device,
583                          "virtual resolution set to maximum of %dx%d\n",
584                          var->xres_virtual, var->yres_virtual);
585         }
586         if (var->yres_virtual < var->yres)
587                 var->yres_virtual = var->yres;
588
589         if (var->xres_virtual * var->yres_virtual > pixels) {
590                 dev_err(info->device, "mode %dx%dx%d rejected... "
591                       "virtual resolution too high to fit into video memory!\n",
592                         var->xres_virtual, var->yres_virtual,
593                         var->bits_per_pixel);
594                 return -EINVAL;
595         }
596
597         /* truncate xoffset and yoffset to maximum if too high */
598         if (var->xoffset > var->xres_virtual - var->xres)
599                 var->xoffset = var->xres_virtual - var->xres - 1;
600         if (var->yoffset > var->yres_virtual - var->yres)
601                 var->yoffset = var->yres_virtual - var->yres - 1;
602
603         var->red.msb_right =
604             var->green.msb_right =
605             var->blue.msb_right =
606             var->transp.offset =
607             var->transp.length =
608             var->transp.msb_right = 0;
609
610         yres = var->yres;
611         if (var->vmode & FB_VMODE_DOUBLE)
612                 yres *= 2;
613         else if (var->vmode & FB_VMODE_INTERLACED)
614                 yres = (yres + 1) / 2;
615
616         if (yres >= 1280) {
617                 dev_err(info->device, "ERROR: VerticalTotal >= 1280; "
618                         "special treatment required! (TODO)\n");
619                 return -EINVAL;
620         }
621
622         if (cirrusfb_check_pixclock(var, info))
623                 return -EINVAL;
624
625         if (!is_laguna(cinfo))
626                 var->accel_flags = FB_ACCELF_TEXT;
627
628         return 0;
629 }
630
631 static void cirrusfb_set_mclk_as_source(const struct fb_info *info, int div)
632 {
633         struct cirrusfb_info *cinfo = info->par;
634         unsigned char old1f, old1e;
635
636         assert(cinfo != NULL);
637         old1f = vga_rseq(cinfo->regbase, CL_SEQR1F) & ~0x40;
638
639         if (div) {
640                 dev_dbg(info->device, "Set %s as pixclock source.\n",
641                         (div == 2) ? "MCLK/2" : "MCLK");
642                 old1f |= 0x40;
643                 old1e = vga_rseq(cinfo->regbase, CL_SEQR1E) & ~0x1;
644                 if (div == 2)
645                         old1e |= 1;
646
647                 vga_wseq(cinfo->regbase, CL_SEQR1E, old1e);
648         }
649         vga_wseq(cinfo->regbase, CL_SEQR1F, old1f);
650 }
651
652 /*************************************************************************
653         cirrusfb_set_par_foo()
654
655         actually writes the values for a new video mode into the hardware,
656 **************************************************************************/
657 static int cirrusfb_set_par_foo(struct fb_info *info)
658 {
659         struct cirrusfb_info *cinfo = info->par;
660         struct fb_var_screeninfo *var = &info->var;
661         u8 __iomem *regbase = cinfo->regbase;
662         unsigned char tmp;
663         int pitch;
664         const struct cirrusfb_board_info_rec *bi;
665         int hdispend, hsyncstart, hsyncend, htotal;
666         int yres, vdispend, vsyncstart, vsyncend, vtotal;
667         long freq;
668         int nom, den, div;
669         unsigned int control = 0, format = 0, threshold = 0;
670
671         dev_dbg(info->device, "Requested mode: %dx%dx%d\n",
672                var->xres, var->yres, var->bits_per_pixel);
673
674         switch (var->bits_per_pixel) {
675         case 1:
676                 info->fix.line_length = var->xres_virtual / 8;
677                 info->fix.visual = FB_VISUAL_MONO10;
678                 break;
679
680         case 8:
681                 info->fix.line_length = var->xres_virtual;
682                 info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
683                 break;
684
685         case 16:
686         case 24:
687                 info->fix.line_length = var->xres_virtual *
688                                         var->bits_per_pixel >> 3;
689                 info->fix.visual = FB_VISUAL_TRUECOLOR;
690                 break;
691         }
692         info->fix.type = FB_TYPE_PACKED_PIXELS;
693
694         init_vgachip(info);
695
696         bi = &cirrusfb_board_info[cinfo->btype];
697
698         hsyncstart = var->xres + var->right_margin;
699         hsyncend = hsyncstart + var->hsync_len;
700         htotal = (hsyncend + var->left_margin) / 8;
701         hdispend = var->xres / 8;
702         hsyncstart = hsyncstart / 8;
703         hsyncend = hsyncend / 8;
704
705         vdispend = var->yres;
706         vsyncstart = vdispend + var->lower_margin;
707         vsyncend = vsyncstart + var->vsync_len;
708         vtotal = vsyncend + var->upper_margin;
709
710         if (var->vmode & FB_VMODE_DOUBLE) {
711                 vdispend *= 2;
712                 vsyncstart *= 2;
713                 vsyncend *= 2;
714                 vtotal *= 2;
715         } else if (var->vmode & FB_VMODE_INTERLACED) {
716                 vdispend = (vdispend + 1) / 2;
717                 vsyncstart = (vsyncstart + 1) / 2;
718                 vsyncend = (vsyncend + 1) / 2;
719                 vtotal = (vtotal + 1) / 2;
720         }
721         yres = vdispend;
722         if (yres >= 1024) {
723                 vtotal /= 2;
724                 vsyncstart /= 2;
725                 vsyncend /= 2;
726                 vdispend /= 2;
727         }
728
729         vdispend -= 1;
730         vsyncstart -= 1;
731         vsyncend -= 1;
732         vtotal -= 2;
733
734         if (cinfo->multiplexing) {
735                 htotal /= 2;
736                 hsyncstart /= 2;
737                 hsyncend /= 2;
738                 hdispend /= 2;
739         }
740
741         htotal -= 5;
742         hdispend -= 1;
743         hsyncstart += 1;
744         hsyncend += 1;
745
746         /* unlock register VGA_CRTC_H_TOTAL..CRT7 */
747         vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, 0x20);   /* previously: 0x00) */
748
749         /* if debugging is enabled, all parameters get output before writing */
750         dev_dbg(info->device, "CRT0: %d\n", htotal);
751         vga_wcrt(regbase, VGA_CRTC_H_TOTAL, htotal);
752
753         dev_dbg(info->device, "CRT1: %d\n", hdispend);
754         vga_wcrt(regbase, VGA_CRTC_H_DISP, hdispend);
755
756         dev_dbg(info->device, "CRT2: %d\n", var->xres / 8);
757         vga_wcrt(regbase, VGA_CRTC_H_BLANK_START, var->xres / 8);
758
759         /*  + 128: Compatible read */
760         dev_dbg(info->device, "CRT3: 128+%d\n", (htotal + 5) % 32);
761         vga_wcrt(regbase, VGA_CRTC_H_BLANK_END,
762                  128 + ((htotal + 5) % 32));
763
764         dev_dbg(info->device, "CRT4: %d\n", hsyncstart);
765         vga_wcrt(regbase, VGA_CRTC_H_SYNC_START, hsyncstart);
766
767         tmp = hsyncend % 32;
768         if ((htotal + 5) & 32)
769                 tmp += 128;
770         dev_dbg(info->device, "CRT5: %d\n", tmp);
771         vga_wcrt(regbase, VGA_CRTC_H_SYNC_END, tmp);
772
773         dev_dbg(info->device, "CRT6: %d\n", vtotal & 0xff);
774         vga_wcrt(regbase, VGA_CRTC_V_TOTAL, vtotal & 0xff);
775
776         tmp = 16;               /* LineCompare bit #9 */
777         if (vtotal & 256)
778                 tmp |= 1;
779         if (vdispend & 256)
780                 tmp |= 2;
781         if (vsyncstart & 256)
782                 tmp |= 4;
783         if ((vdispend + 1) & 256)
784                 tmp |= 8;
785         if (vtotal & 512)
786                 tmp |= 32;
787         if (vdispend & 512)
788                 tmp |= 64;
789         if (vsyncstart & 512)
790                 tmp |= 128;
791         dev_dbg(info->device, "CRT7: %d\n", tmp);
792         vga_wcrt(regbase, VGA_CRTC_OVERFLOW, tmp);
793
794         tmp = 0x40;             /* LineCompare bit #8 */
795         if ((vdispend + 1) & 512)
796                 tmp |= 0x20;
797         if (var->vmode & FB_VMODE_DOUBLE)
798                 tmp |= 0x80;
799         dev_dbg(info->device, "CRT9: %d\n", tmp);
800         vga_wcrt(regbase, VGA_CRTC_MAX_SCAN, tmp);
801
802         dev_dbg(info->device, "CRT10: %d\n", vsyncstart & 0xff);
803         vga_wcrt(regbase, VGA_CRTC_V_SYNC_START, vsyncstart & 0xff);
804
805         dev_dbg(info->device, "CRT11: 64+32+%d\n", vsyncend % 16);
806         vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, vsyncend % 16 + 64 + 32);
807
808         dev_dbg(info->device, "CRT12: %d\n", vdispend & 0xff);
809         vga_wcrt(regbase, VGA_CRTC_V_DISP_END, vdispend & 0xff);
810
811         dev_dbg(info->device, "CRT15: %d\n", (vdispend + 1) & 0xff);
812         vga_wcrt(regbase, VGA_CRTC_V_BLANK_START, (vdispend + 1) & 0xff);
813
814         dev_dbg(info->device, "CRT16: %d\n", vtotal & 0xff);
815         vga_wcrt(regbase, VGA_CRTC_V_BLANK_END, vtotal & 0xff);
816
817         dev_dbg(info->device, "CRT18: 0xff\n");
818         vga_wcrt(regbase, VGA_CRTC_LINE_COMPARE, 0xff);
819
820         tmp = 0;
821         if (var->vmode & FB_VMODE_INTERLACED)
822                 tmp |= 1;
823         if ((htotal + 5) & 64)
824                 tmp |= 16;
825         if ((htotal + 5) & 128)
826                 tmp |= 32;
827         if (vtotal & 256)
828                 tmp |= 64;
829         if (vtotal & 512)
830                 tmp |= 128;
831
832         dev_dbg(info->device, "CRT1a: %d\n", tmp);
833         vga_wcrt(regbase, CL_CRT1A, tmp);
834
835         freq = PICOS2KHZ(var->pixclock);
836         if (var->bits_per_pixel == 24)
837                 if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64)
838                         freq *= 3;
839         if (cinfo->multiplexing)
840                 freq /= 2;
841         if (cinfo->doubleVCLK)
842                 freq *= 2;
843
844         bestclock(freq, &nom, &den, &div);
845
846         dev_dbg(info->device, "VCLK freq: %ld kHz  nom: %d  den: %d  div: %d\n",
847                 freq, nom, den, div);
848
849         /* set VCLK0 */
850         /* hardware RefClock: 14.31818 MHz */
851         /* formula: VClk = (OSC * N) / (D * (1+P)) */
852         /* Example: VClk = (14.31818 * 91) / (23 * (1+1)) = 28.325 MHz */
853
854         if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_PICASSO4 ||
855             cinfo->btype == BT_SD64) {
856                 /* if freq is close to mclk or mclk/2 select mclk
857                  * as clock source
858                  */
859                 int divMCLK = cirrusfb_check_mclk(info, freq);
860                 if (divMCLK)
861                         nom = 0;
862                 cirrusfb_set_mclk_as_source(info, divMCLK);
863         }
864         if (is_laguna(cinfo)) {
865                 long pcifc = fb_readl(cinfo->laguna_mmio + 0x3fc);
866                 unsigned char tile = fb_readb(cinfo->laguna_mmio + 0x407);
867                 unsigned short tile_control;
868
869                 if (cinfo->btype == BT_LAGUNAB) {
870                         tile_control = fb_readw(cinfo->laguna_mmio + 0x2c4);
871                         tile_control &= ~0x80;
872                         fb_writew(tile_control, cinfo->laguna_mmio + 0x2c4);
873                 }
874
875                 fb_writel(pcifc | 0x10000000l, cinfo->laguna_mmio + 0x3fc);
876                 fb_writeb(tile & 0x3f, cinfo->laguna_mmio + 0x407);
877                 control = fb_readw(cinfo->laguna_mmio + 0x402);
878                 threshold = fb_readw(cinfo->laguna_mmio + 0xea);
879                 control &= ~0x6800;
880                 format = 0;
881                 threshold &= 0xffc0 & 0x3fbf;
882         }
883         if (nom) {
884                 tmp = den << 1;
885                 if (div != 0)
886                         tmp |= 1;
887                 /* 6 bit denom; ONLY 5434!!! (bugged me 10 days) */
888                 if ((cinfo->btype == BT_SD64) ||
889                     (cinfo->btype == BT_ALPINE) ||
890                     (cinfo->btype == BT_GD5480))
891                         tmp |= 0x80;
892
893                 /* Laguna chipset has reversed clock registers */
894                 if (is_laguna(cinfo)) {
895                         vga_wseq(regbase, CL_SEQRE, tmp);
896                         vga_wseq(regbase, CL_SEQR1E, nom);
897                 } else {
898                         vga_wseq(regbase, CL_SEQRE, nom);
899                         vga_wseq(regbase, CL_SEQR1E, tmp);
900                 }
901         }
902
903         if (yres >= 1024)
904                 /* 1280x1024 */
905                 vga_wcrt(regbase, VGA_CRTC_MODE, 0xc7);
906         else
907                 /* mode control: VGA_CRTC_START_HI enable, ROTATE(?), 16bit
908                  * address wrap, no compat. */
909                 vga_wcrt(regbase, VGA_CRTC_MODE, 0xc3);
910
911         /* don't know if it would hurt to also program this if no interlaced */
912         /* mode is used, but I feel better this way.. :-) */
913         if (var->vmode & FB_VMODE_INTERLACED)
914                 vga_wcrt(regbase, VGA_CRTC_REGS, htotal / 2);
915         else
916                 vga_wcrt(regbase, VGA_CRTC_REGS, 0x00); /* interlace control */
917
918         /* adjust horizontal/vertical sync type (low/high), use VCLK3 */
919         /* enable display memory & CRTC I/O address for color mode */
920         tmp = 0x03 | 0xc;
921         if (var->sync & FB_SYNC_HOR_HIGH_ACT)
922                 tmp |= 0x40;
923         if (var->sync & FB_SYNC_VERT_HIGH_ACT)
924                 tmp |= 0x80;
925         WGen(cinfo, VGA_MIS_W, tmp);
926
927         /* text cursor on and start line */
928         vga_wcrt(regbase, VGA_CRTC_CURSOR_START, 0);
929         /* text cursor end line */
930         vga_wcrt(regbase, VGA_CRTC_CURSOR_END, 31);
931
932         /******************************************************
933          *
934          * 1 bpp
935          *
936          */
937
938         /* programming for different color depths */
939         if (var->bits_per_pixel == 1) {
940                 dev_dbg(info->device, "preparing for 1 bit deep display\n");
941                 vga_wgfx(regbase, VGA_GFX_MODE, 0);     /* mode register */
942
943                 /* SR07 */
944                 switch (cinfo->btype) {
945                 case BT_SD64:
946                 case BT_PICCOLO:
947                 case BT_PICASSO:
948                 case BT_SPECTRUM:
949                 case BT_PICASSO4:
950                 case BT_ALPINE:
951                 case BT_GD5480:
952                         vga_wseq(regbase, CL_SEQR7,
953                                  cinfo->multiplexing ?
954                                         bi->sr07_1bpp_mux : bi->sr07_1bpp);
955                         break;
956
957                 case BT_LAGUNA:
958                 case BT_LAGUNAB:
959                         vga_wseq(regbase, CL_SEQR7,
960                                 vga_rseq(regbase, CL_SEQR7) & ~0x01);
961                         break;
962
963                 default:
964                         dev_warn(info->device, "unknown Board\n");
965                         break;
966                 }
967
968                 /* Extended Sequencer Mode */
969                 switch (cinfo->btype) {
970
971                 case BT_PICCOLO:
972                 case BT_SPECTRUM:
973                         /* evtl d0 bei 1 bit? avoid FIFO underruns..? */
974                         vga_wseq(regbase, CL_SEQRF, 0xb0);
975                         break;
976
977                 case BT_PICASSO:
978                         /* ## vorher d0 avoid FIFO underruns..? */
979                         vga_wseq(regbase, CL_SEQRF, 0xd0);
980                         break;
981
982                 case BT_SD64:
983                 case BT_PICASSO4:
984                 case BT_ALPINE:
985                 case BT_GD5480:
986                 case BT_LAGUNA:
987                 case BT_LAGUNAB:
988                         /* do nothing */
989                         break;
990
991                 default:
992                         dev_warn(info->device, "unknown Board\n");
993                         break;
994                 }
995
996                 /* pixel mask: pass-through for first plane */
997                 WGen(cinfo, VGA_PEL_MSK, 0x01);
998                 if (cinfo->multiplexing)
999                         /* hidden dac reg: 1280x1024 */
1000                         WHDR(cinfo, 0x4a);
1001                 else
1002                         /* hidden dac: nothing */
1003                         WHDR(cinfo, 0);
1004                 /* memory mode: odd/even, ext. memory */
1005                 vga_wseq(regbase, VGA_SEQ_MEMORY_MODE, 0x06);
1006                 /* plane mask: only write to first plane */
1007                 vga_wseq(regbase, VGA_SEQ_PLANE_WRITE, 0x01);
1008         }
1009
1010         /******************************************************
1011          *
1012          * 8 bpp
1013          *
1014          */
1015
1016         else if (var->bits_per_pixel == 8) {
1017                 dev_dbg(info->device, "preparing for 8 bit deep display\n");
1018                 switch (cinfo->btype) {
1019                 case BT_SD64:
1020                 case BT_PICCOLO:
1021                 case BT_PICASSO:
1022                 case BT_SPECTRUM:
1023                 case BT_PICASSO4:
1024                 case BT_ALPINE:
1025                 case BT_GD5480:
1026                         vga_wseq(regbase, CL_SEQR7,
1027                                   cinfo->multiplexing ?
1028                                         bi->sr07_8bpp_mux : bi->sr07_8bpp);
1029                         break;
1030
1031                 case BT_LAGUNA:
1032                 case BT_LAGUNAB:
1033                         vga_wseq(regbase, CL_SEQR7,
1034                                 vga_rseq(regbase, CL_SEQR7) | 0x01);
1035                         threshold |= 0x10;
1036                         break;
1037
1038                 default:
1039                         dev_warn(info->device, "unknown Board\n");
1040                         break;
1041                 }
1042
1043                 switch (cinfo->btype) {
1044                 case BT_PICCOLO:
1045                 case BT_PICASSO:
1046                 case BT_SPECTRUM:
1047                         /* Fast Page-Mode writes */
1048                         vga_wseq(regbase, CL_SEQRF, 0xb0);
1049                         break;
1050
1051                 case BT_PICASSO4:
1052 #ifdef CONFIG_ZORRO
1053                         /* ### INCOMPLETE!! */
1054                         vga_wseq(regbase, CL_SEQRF, 0xb8);
1055 #endif
1056                 case BT_ALPINE:
1057                 case BT_SD64:
1058                 case BT_GD5480:
1059                 case BT_LAGUNA:
1060                 case BT_LAGUNAB:
1061                         /* do nothing */
1062                         break;
1063
1064                 default:
1065                         dev_warn(info->device, "unknown board\n");
1066                         break;
1067                 }
1068
1069                 /* mode register: 256 color mode */
1070                 vga_wgfx(regbase, VGA_GFX_MODE, 64);
1071                 if (cinfo->multiplexing)
1072                         /* hidden dac reg: 1280x1024 */
1073                         WHDR(cinfo, 0x4a);
1074                 else
1075                         /* hidden dac: nothing */
1076                         WHDR(cinfo, 0);
1077         }
1078
1079         /******************************************************
1080          *
1081          * 16 bpp
1082          *
1083          */
1084
1085         else if (var->bits_per_pixel == 16) {
1086                 dev_dbg(info->device, "preparing for 16 bit deep display\n");
1087                 switch (cinfo->btype) {
1088                 case BT_PICCOLO:
1089                 case BT_SPECTRUM:
1090                         vga_wseq(regbase, CL_SEQR7, 0x87);
1091                         /* Fast Page-Mode writes */
1092                         vga_wseq(regbase, CL_SEQRF, 0xb0);
1093                         break;
1094
1095                 case BT_PICASSO:
1096                         vga_wseq(regbase, CL_SEQR7, 0x27);
1097                         /* Fast Page-Mode writes */
1098                         vga_wseq(regbase, CL_SEQRF, 0xb0);
1099                         break;
1100
1101                 case BT_SD64:
1102                 case BT_PICASSO4:
1103                 case BT_ALPINE:
1104                         /* Extended Sequencer Mode: 256c col. mode */
1105                         vga_wseq(regbase, CL_SEQR7,
1106                                         cinfo->doubleVCLK ? 0xa3 : 0xa7);
1107                         break;
1108
1109                 case BT_GD5480:
1110                         vga_wseq(regbase, CL_SEQR7, 0x17);
1111                         /* We already set SRF and SR1F */
1112                         break;
1113
1114                 case BT_LAGUNA:
1115                 case BT_LAGUNAB:
1116                         vga_wseq(regbase, CL_SEQR7,
1117                                 vga_rseq(regbase, CL_SEQR7) & ~0x01);
1118                         control |= 0x2000;
1119                         format |= 0x1400;
1120                         threshold |= 0x10;
1121                         break;
1122
1123                 default:
1124                         dev_warn(info->device, "unknown Board\n");
1125                         break;
1126                 }
1127
1128                 /* mode register: 256 color mode */
1129                 vga_wgfx(regbase, VGA_GFX_MODE, 64);
1130 #ifdef CONFIG_PCI
1131                 WHDR(cinfo, cinfo->doubleVCLK ? 0xe1 : 0xc1);
1132 #elif defined(CONFIG_ZORRO)
1133                 /* FIXME: CONFIG_PCI and CONFIG_ZORRO may be defined both */
1134                 WHDR(cinfo, 0xa0);      /* hidden dac reg: nothing special */
1135 #endif
1136         }
1137
1138         /******************************************************
1139          *
1140          * 24 bpp
1141          *
1142          */
1143
1144         else if (var->bits_per_pixel == 24) {
1145                 dev_dbg(info->device, "preparing for 24 bit deep display\n");
1146                 switch (cinfo->btype) {
1147                 case BT_PICCOLO:
1148                 case BT_SPECTRUM:
1149                         vga_wseq(regbase, CL_SEQR7, 0x85);
1150                         /* Fast Page-Mode writes */
1151                         vga_wseq(regbase, CL_SEQRF, 0xb0);
1152                         break;
1153
1154                 case BT_PICASSO:
1155                         vga_wseq(regbase, CL_SEQR7, 0x25);
1156                         /* Fast Page-Mode writes */
1157                         vga_wseq(regbase, CL_SEQRF, 0xb0);
1158                         break;
1159
1160                 case BT_SD64:
1161                 case BT_PICASSO4:
1162                 case BT_ALPINE:
1163                         /* Extended Sequencer Mode: 256c col. mode */
1164                         vga_wseq(regbase, CL_SEQR7, 0xa5);
1165                         break;
1166
1167                 case BT_GD5480:
1168                         vga_wseq(regbase, CL_SEQR7, 0x15);
1169                         /* We already set SRF and SR1F */
1170                         break;
1171
1172                 case BT_LAGUNA:
1173                 case BT_LAGUNAB:
1174                         vga_wseq(regbase, CL_SEQR7,
1175                                 vga_rseq(regbase, CL_SEQR7) & ~0x01);
1176                         control |= 0x4000;
1177                         format |= 0x2400;
1178                         threshold |= 0x20;
1179                         break;
1180
1181                 default:
1182                         dev_warn(info->device, "unknown Board\n");
1183                         break;
1184                 }
1185
1186                 /* mode register: 256 color mode */
1187                 vga_wgfx(regbase, VGA_GFX_MODE, 64);
1188                 /* hidden dac reg: 8-8-8 mode (24 or 32) */
1189                 WHDR(cinfo, 0xc5);
1190         }
1191
1192         /******************************************************
1193          *
1194          * unknown/unsupported bpp
1195          *
1196          */
1197
1198         else
1199                 dev_err(info->device,
1200                         "What's this? requested color depth == %d.\n",
1201                         var->bits_per_pixel);
1202
1203         pitch = info->fix.line_length >> 3;
1204         vga_wcrt(regbase, VGA_CRTC_OFFSET, pitch & 0xff);
1205         tmp = 0x22;
1206         if (pitch & 0x100)
1207                 tmp |= 0x10;    /* offset overflow bit */
1208
1209         /* screen start addr #16-18, fastpagemode cycles */
1210         vga_wcrt(regbase, CL_CRT1B, tmp);
1211
1212         /* screen start address bit 19 */
1213         if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19)
1214                 vga_wcrt(regbase, CL_CRT1D, (pitch >> 9) & 1);
1215
1216         if (is_laguna(cinfo)) {
1217                 tmp = 0;
1218                 if ((htotal + 5) & 256)
1219                         tmp |= 128;
1220                 if (hdispend & 256)
1221                         tmp |= 64;
1222                 if (hsyncstart & 256)
1223                         tmp |= 48;
1224                 if (vtotal & 1024)
1225                         tmp |= 8;
1226                 if (vdispend & 1024)
1227                         tmp |= 4;
1228                 if (vsyncstart & 1024)
1229                         tmp |= 3;
1230
1231                 vga_wcrt(regbase, CL_CRT1E, tmp);
1232                 dev_dbg(info->device, "CRT1e: %d\n", tmp);
1233         }
1234
1235         /* pixel panning */
1236         vga_wattr(regbase, CL_AR33, 0);
1237
1238         /* [ EGS: SetOffset(); ] */
1239         /* From SetOffset(): Turn on VideoEnable bit in Attribute controller */
1240         AttrOn(cinfo);
1241
1242         if (is_laguna(cinfo)) {
1243                 /* no tiles */
1244                 fb_writew(control | 0x1000, cinfo->laguna_mmio + 0x402);
1245                 fb_writew(format, cinfo->laguna_mmio + 0xc0);
1246                 fb_writew(threshold, cinfo->laguna_mmio + 0xea);
1247         }
1248         /* finally, turn on everything - turn off "FullBandwidth" bit */
1249         /* also, set "DotClock%2" bit where requested */
1250         tmp = 0x01;
1251
1252 /*** FB_VMODE_CLOCK_HALVE in linux/fb.h not defined anymore ?
1253     if (var->vmode & FB_VMODE_CLOCK_HALVE)
1254         tmp |= 0x08;
1255 */
1256
1257         vga_wseq(regbase, VGA_SEQ_CLOCK_MODE, tmp);
1258         dev_dbg(info->device, "CL_SEQR1: %d\n", tmp);
1259
1260 #ifdef CIRRUSFB_DEBUG
1261         cirrusfb_dbg_reg_dump(info, NULL);
1262 #endif
1263
1264         return 0;
1265 }
1266
1267 /* for some reason incomprehensible to me, cirrusfb requires that you write
1268  * the registers twice for the settings to take..grr. -dte */
1269 static int cirrusfb_set_par(struct fb_info *info)
1270 {
1271         cirrusfb_set_par_foo(info);
1272         return cirrusfb_set_par_foo(info);
1273 }
1274
1275 static int cirrusfb_setcolreg(unsigned regno, unsigned red, unsigned green,
1276                               unsigned blue, unsigned transp,
1277                               struct fb_info *info)
1278 {
1279         struct cirrusfb_info *cinfo = info->par;
1280
1281         if (regno > 255)
1282                 return -EINVAL;
1283
1284         if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
1285                 u32 v;
1286                 red >>= (16 - info->var.red.length);
1287                 green >>= (16 - info->var.green.length);
1288                 blue >>= (16 - info->var.blue.length);
1289
1290                 if (regno >= 16)
1291                         return 1;
1292                 v = (red << info->var.red.offset) |
1293                     (green << info->var.green.offset) |
1294                     (blue << info->var.blue.offset);
1295
1296                 cinfo->pseudo_palette[regno] = v;
1297                 return 0;
1298         }
1299
1300         if (info->var.bits_per_pixel == 8)
1301                 WClut(cinfo, regno, red >> 10, green >> 10, blue >> 10);
1302
1303         return 0;
1304
1305 }
1306
1307 /*************************************************************************
1308         cirrusfb_pan_display()
1309
1310         performs display panning - provided hardware permits this
1311 **************************************************************************/
1312 static int cirrusfb_pan_display(struct fb_var_screeninfo *var,
1313                                 struct fb_info *info)
1314 {
1315         int xoffset;
1316         unsigned long base;
1317         unsigned char tmp, xpix;
1318         struct cirrusfb_info *cinfo = info->par;
1319
1320         /* no range checks for xoffset and yoffset,   */
1321         /* as fb_pan_display has already done this */
1322         if (var->vmode & FB_VMODE_YWRAP)
1323                 return -EINVAL;
1324
1325         xoffset = var->xoffset * info->var.bits_per_pixel / 8;
1326
1327         base = var->yoffset * info->fix.line_length + xoffset;
1328
1329         if (info->var.bits_per_pixel == 1) {
1330                 /* base is already correct */
1331                 xpix = (unsigned char) (var->xoffset % 8);
1332         } else {
1333                 base /= 4;
1334                 xpix = (unsigned char) ((xoffset % 4) * 2);
1335         }
1336
1337         if (!is_laguna(cinfo))
1338                 cirrusfb_WaitBLT(cinfo->regbase);
1339
1340         /* lower 8 + 8 bits of screen start address */
1341         vga_wcrt(cinfo->regbase, VGA_CRTC_START_LO, base & 0xff);
1342         vga_wcrt(cinfo->regbase, VGA_CRTC_START_HI, (base >> 8) & 0xff);
1343
1344         /* 0xf2 is %11110010, exclude tmp bits */
1345         tmp = vga_rcrt(cinfo->regbase, CL_CRT1B) & 0xf2;
1346         /* construct bits 16, 17 and 18 of screen start address */
1347         if (base & 0x10000)
1348                 tmp |= 0x01;
1349         if (base & 0x20000)
1350                 tmp |= 0x04;
1351         if (base & 0x40000)
1352                 tmp |= 0x08;
1353
1354         vga_wcrt(cinfo->regbase, CL_CRT1B, tmp);
1355
1356         /* construct bit 19 of screen start address */
1357         if (cirrusfb_board_info[cinfo->btype].scrn_start_bit19) {
1358                 tmp = vga_rcrt(cinfo->regbase, CL_CRT1D);
1359                 if (is_laguna(cinfo))
1360                         tmp = (tmp & ~0x18) | ((base >> 16) & 0x18);
1361                 else
1362                         tmp = (tmp & ~0x80) | ((base >> 12) & 0x80);
1363                 vga_wcrt(cinfo->regbase, CL_CRT1D, tmp);
1364         }
1365
1366         /* write pixel panning value to AR33; this does not quite work in 8bpp
1367          *
1368          * ### Piccolo..? Will this work?
1369          */
1370         if (info->var.bits_per_pixel == 1)
1371                 vga_wattr(cinfo->regbase, CL_AR33, xpix);
1372
1373         return 0;
1374 }
1375
1376 static int cirrusfb_blank(int blank_mode, struct fb_info *info)
1377 {
1378         /*
1379          * Blank the screen if blank_mode != 0, else unblank. If blank == NULL
1380          * then the caller blanks by setting the CLUT (Color Look Up Table)
1381          * to all black. Return 0 if blanking succeeded, != 0 if un-/blanking
1382          * failed due to e.g. a video mode which doesn't support it.
1383          * Implements VESA suspend and powerdown modes on hardware that
1384          * supports disabling hsync/vsync:
1385          *   blank_mode == 2: suspend vsync
1386          *   blank_mode == 3: suspend hsync
1387          *   blank_mode == 4: powerdown
1388          */
1389         unsigned char val;
1390         struct cirrusfb_info *cinfo = info->par;
1391         int current_mode = cinfo->blank_mode;
1392
1393         dev_dbg(info->device, "ENTER, blank mode = %d\n", blank_mode);
1394
1395         if (info->state != FBINFO_STATE_RUNNING ||
1396             current_mode == blank_mode) {
1397                 dev_dbg(info->device, "EXIT, returning 0\n");
1398                 return 0;
1399         }
1400
1401         /* Undo current */
1402         if (current_mode == FB_BLANK_NORMAL ||
1403             current_mode == FB_BLANK_UNBLANK)
1404                 /* clear "FullBandwidth" bit */
1405                 val = 0;
1406         else
1407                 /* set "FullBandwidth" bit */
1408                 val = 0x20;
1409
1410         val |= vga_rseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE) & 0xdf;
1411         vga_wseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE, val);
1412
1413         switch (blank_mode) {
1414         case FB_BLANK_UNBLANK:
1415         case FB_BLANK_NORMAL:
1416                 val = 0x00;
1417                 break;
1418         case FB_BLANK_VSYNC_SUSPEND:
1419                 val = 0x04;
1420                 break;
1421         case FB_BLANK_HSYNC_SUSPEND:
1422                 val = 0x02;
1423                 break;
1424         case FB_BLANK_POWERDOWN:
1425                 val = 0x06;
1426                 break;
1427         default:
1428                 dev_dbg(info->device, "EXIT, returning 1\n");
1429                 return 1;
1430         }
1431
1432         vga_wgfx(cinfo->regbase, CL_GRE, val);
1433
1434         cinfo->blank_mode = blank_mode;
1435         dev_dbg(info->device, "EXIT, returning 0\n");
1436
1437         /* Let fbcon do a soft blank for us */
1438         return (blank_mode == FB_BLANK_NORMAL) ? 1 : 0;
1439 }
1440
1441 /**** END   Hardware specific Routines **************************************/
1442 /****************************************************************************/
1443 /**** BEGIN Internal Routines ***********************************************/
1444
1445 static void init_vgachip(struct fb_info *info)
1446 {
1447         struct cirrusfb_info *cinfo = info->par;
1448         const struct cirrusfb_board_info_rec *bi;
1449
1450         assert(cinfo != NULL);
1451
1452         bi = &cirrusfb_board_info[cinfo->btype];
1453
1454         /* reset board globally */
1455         switch (cinfo->btype) {
1456         case BT_PICCOLO:
1457                 WSFR(cinfo, 0x01);
1458                 udelay(500);
1459                 WSFR(cinfo, 0x51);
1460                 udelay(500);
1461                 break;
1462         case BT_PICASSO:
1463                 WSFR2(cinfo, 0xff);
1464                 udelay(500);
1465                 break;
1466         case BT_SD64:
1467         case BT_SPECTRUM:
1468                 WSFR(cinfo, 0x1f);
1469                 udelay(500);
1470                 WSFR(cinfo, 0x4f);
1471                 udelay(500);
1472                 break;
1473         case BT_PICASSO4:
1474                 /* disable flickerfixer */
1475                 vga_wcrt(cinfo->regbase, CL_CRT51, 0x00);
1476                 mdelay(100);
1477                 /* mode */
1478                 vga_wgfx(cinfo->regbase, CL_GR31, 0x00);
1479                 /* fall through */
1480         case BT_GD5480:
1481                 /* from Klaus' NetBSD driver: */
1482                 vga_wgfx(cinfo->regbase, CL_GR2F, 0x00);
1483                 /* fall through */
1484         case BT_ALPINE:
1485                 /* put blitter into 542x compat */
1486                 vga_wgfx(cinfo->regbase, CL_GR33, 0x00);
1487                 break;
1488
1489         case BT_LAGUNA:
1490         case BT_LAGUNAB:
1491                 /* Nothing to do to reset the board. */
1492                 break;
1493
1494         default:
1495                 dev_err(info->device, "Warning: Unknown board type\n");
1496                 break;
1497         }
1498
1499         /* make sure RAM size set by this point */
1500         assert(info->screen_size > 0);
1501
1502         /* the P4 is not fully initialized here; I rely on it having been */
1503         /* inited under AmigaOS already, which seems to work just fine    */
1504         /* (Klaus advised to do it this way)                          */
1505
1506         if (cinfo->btype != BT_PICASSO4) {
1507                 WGen(cinfo, CL_VSSM, 0x10);     /* EGS: 0x16 */
1508                 WGen(cinfo, CL_POS102, 0x01);
1509                 WGen(cinfo, CL_VSSM, 0x08);     /* EGS: 0x0e */
1510
1511                 if (cinfo->btype != BT_SD64)
1512                         WGen(cinfo, CL_VSSM2, 0x01);
1513
1514                 /* reset sequencer logic */
1515                 vga_wseq(cinfo->regbase, VGA_SEQ_RESET, 0x03);
1516
1517                 /* FullBandwidth (video off) and 8/9 dot clock */
1518                 vga_wseq(cinfo->regbase, VGA_SEQ_CLOCK_MODE, 0x21);
1519
1520                 /* "magic cookie" - doesn't make any sense to me.. */
1521 /*      vga_wgfx(cinfo->regbase, CL_GRA, 0xce);   */
1522                 /* unlock all extension registers */
1523                 vga_wseq(cinfo->regbase, CL_SEQR6, 0x12);
1524
1525                 switch (cinfo->btype) {
1526                 case BT_GD5480:
1527                         vga_wseq(cinfo->regbase, CL_SEQRF, 0x98);
1528                         break;
1529                 case BT_ALPINE:
1530                 case BT_LAGUNA:
1531                 case BT_LAGUNAB:
1532                         break;
1533                 case BT_SD64:
1534 #ifdef CONFIG_ZORRO
1535                         vga_wseq(cinfo->regbase, CL_SEQRF, 0xb8);
1536 #endif
1537                         break;
1538                 default:
1539                         vga_wseq(cinfo->regbase, CL_SEQR16, 0x0f);
1540                         vga_wseq(cinfo->regbase, CL_SEQRF, 0xb0);
1541                         break;
1542                 }
1543         }
1544         /* plane mask: nothing */
1545         vga_wseq(cinfo->regbase, VGA_SEQ_PLANE_WRITE, 0xff);
1546         /* character map select: doesn't even matter in gx mode */
1547         vga_wseq(cinfo->regbase, VGA_SEQ_CHARACTER_MAP, 0x00);
1548         /* memory mode: chain4, ext. memory */
1549         vga_wseq(cinfo->regbase, VGA_SEQ_MEMORY_MODE, 0x0a);
1550
1551         /* controller-internal base address of video memory */
1552         if (bi->init_sr07)
1553                 vga_wseq(cinfo->regbase, CL_SEQR7, bi->sr07);
1554
1555         /*  vga_wseq(cinfo->regbase, CL_SEQR8, 0x00); */
1556         /* EEPROM control: shouldn't be necessary to write to this at all.. */
1557
1558         /* graphics cursor X position (incomplete; position gives rem. 3 bits */
1559         vga_wseq(cinfo->regbase, CL_SEQR10, 0x00);
1560         /* graphics cursor Y position (..."... ) */
1561         vga_wseq(cinfo->regbase, CL_SEQR11, 0x00);
1562         /* graphics cursor attributes */
1563         vga_wseq(cinfo->regbase, CL_SEQR12, 0x00);
1564         /* graphics cursor pattern address */
1565         vga_wseq(cinfo->regbase, CL_SEQR13, 0x00);
1566
1567         /* writing these on a P4 might give problems..  */
1568         if (cinfo->btype != BT_PICASSO4) {
1569                 /* configuration readback and ext. color */
1570                 vga_wseq(cinfo->regbase, CL_SEQR17, 0x00);
1571                 /* signature generator */
1572                 vga_wseq(cinfo->regbase, CL_SEQR18, 0x02);
1573         }
1574
1575         /* Screen A preset row scan: none */
1576         vga_wcrt(cinfo->regbase, VGA_CRTC_PRESET_ROW, 0x00);
1577         /* Text cursor start: disable text cursor */
1578         vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_START, 0x20);
1579         /* Text cursor end: - */
1580         vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_END, 0x00);
1581         /* text cursor location high: 0 */
1582         vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_HI, 0x00);
1583         /* text cursor location low: 0 */
1584         vga_wcrt(cinfo->regbase, VGA_CRTC_CURSOR_LO, 0x00);
1585
1586         /* Underline Row scanline: - */
1587         vga_wcrt(cinfo->regbase, VGA_CRTC_UNDERLINE, 0x00);
1588         /* ### add 0x40 for text modes with > 30 MHz pixclock */
1589         /* ext. display controls: ext.adr. wrap */
1590         vga_wcrt(cinfo->regbase, CL_CRT1B, 0x02);
1591
1592         /* Set/Reset registers: - */
1593         vga_wgfx(cinfo->regbase, VGA_GFX_SR_VALUE, 0x00);
1594         /* Set/Reset enable: - */
1595         vga_wgfx(cinfo->regbase, VGA_GFX_SR_ENABLE, 0x00);
1596         /* Color Compare: - */
1597         vga_wgfx(cinfo->regbase, VGA_GFX_COMPARE_VALUE, 0x00);
1598         /* Data Rotate: - */
1599         vga_wgfx(cinfo->regbase, VGA_GFX_DATA_ROTATE, 0x00);
1600         /* Read Map Select: - */
1601         vga_wgfx(cinfo->regbase, VGA_GFX_PLANE_READ, 0x00);
1602         /* Mode: conf. for 16/4/2 color mode, no odd/even, read/write mode 0 */
1603         vga_wgfx(cinfo->regbase, VGA_GFX_MODE, 0x00);
1604         /* Miscellaneous: memory map base address, graphics mode */
1605         vga_wgfx(cinfo->regbase, VGA_GFX_MISC, 0x01);
1606         /* Color Don't care: involve all planes */
1607         vga_wgfx(cinfo->regbase, VGA_GFX_COMPARE_MASK, 0x0f);
1608         /* Bit Mask: no mask at all */
1609         vga_wgfx(cinfo->regbase, VGA_GFX_BIT_MASK, 0xff);
1610
1611         if (cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64 ||
1612             is_laguna(cinfo))
1613                 /* (5434 can't have bit 3 set for bitblt) */
1614                 vga_wgfx(cinfo->regbase, CL_GRB, 0x20);
1615         else
1616         /* Graphics controller mode extensions: finer granularity,
1617          * 8byte data latches
1618          */
1619                 vga_wgfx(cinfo->regbase, CL_GRB, 0x28);
1620
1621         vga_wgfx(cinfo->regbase, CL_GRC, 0xff); /* Color Key compare: - */
1622         vga_wgfx(cinfo->regbase, CL_GRD, 0x00); /* Color Key compare mask: - */
1623         vga_wgfx(cinfo->regbase, CL_GRE, 0x00); /* Miscellaneous control: - */
1624         /* Background color byte 1: - */
1625         /*  vga_wgfx (cinfo->regbase, CL_GR10, 0x00); */
1626         /*  vga_wgfx (cinfo->regbase, CL_GR11, 0x00); */
1627
1628         /* Attribute Controller palette registers: "identity mapping" */
1629         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE0, 0x00);
1630         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE1, 0x01);
1631         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE2, 0x02);
1632         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE3, 0x03);
1633         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE4, 0x04);
1634         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE5, 0x05);
1635         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE6, 0x06);
1636         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE7, 0x07);
1637         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE8, 0x08);
1638         vga_wattr(cinfo->regbase, VGA_ATC_PALETTE9, 0x09);
1639         vga_wattr(cinfo->regbase, VGA_ATC_PALETTEA, 0x0a);
1640         vga_wattr(cinfo->regbase, VGA_ATC_PALETTEB, 0x0b);
1641         vga_wattr(cinfo->regbase, VGA_ATC_PALETTEC, 0x0c);
1642         vga_wattr(cinfo->regbase, VGA_ATC_PALETTED, 0x0d);
1643         vga_wattr(cinfo->regbase, VGA_ATC_PALETTEE, 0x0e);
1644         vga_wattr(cinfo->regbase, VGA_ATC_PALETTEF, 0x0f);
1645
1646         /* Attribute Controller mode: graphics mode */
1647         vga_wattr(cinfo->regbase, VGA_ATC_MODE, 0x01);
1648         /* Overscan color reg.: reg. 0 */
1649         vga_wattr(cinfo->regbase, VGA_ATC_OVERSCAN, 0x00);
1650         /* Color Plane enable: Enable all 4 planes */
1651         vga_wattr(cinfo->regbase, VGA_ATC_PLANE_ENABLE, 0x0f);
1652         /* Color Select: - */
1653         vga_wattr(cinfo->regbase, VGA_ATC_COLOR_PAGE, 0x00);
1654
1655         WGen(cinfo, VGA_PEL_MSK, 0xff); /* Pixel mask: no mask */
1656
1657         /* BLT Start/status: Blitter reset */
1658         vga_wgfx(cinfo->regbase, CL_GR31, 0x04);
1659         /* - " -           : "end-of-reset" */
1660         vga_wgfx(cinfo->regbase, CL_GR31, 0x00);
1661
1662         /* misc... */
1663         WHDR(cinfo, 0); /* Hidden DAC register: - */
1664         return;
1665 }
1666
1667 static void switch_monitor(struct cirrusfb_info *cinfo, int on)
1668 {
1669 #ifdef CONFIG_ZORRO /* only works on Zorro boards */
1670         static int IsOn = 0;    /* XXX not ok for multiple boards */
1671
1672         if (cinfo->btype == BT_PICASSO4)
1673                 return;         /* nothing to switch */
1674         if (cinfo->btype == BT_ALPINE)
1675                 return;         /* nothing to switch */
1676         if (cinfo->btype == BT_GD5480)
1677                 return;         /* nothing to switch */
1678         if (cinfo->btype == BT_PICASSO) {
1679                 if ((on && !IsOn) || (!on && IsOn))
1680                         WSFR(cinfo, 0xff);
1681                 return;
1682         }
1683         if (on) {
1684                 switch (cinfo->btype) {
1685                 case BT_SD64:
1686                         WSFR(cinfo, cinfo->SFR | 0x21);
1687                         break;
1688                 case BT_PICCOLO:
1689                         WSFR(cinfo, cinfo->SFR | 0x28);
1690                         break;
1691                 case BT_SPECTRUM:
1692                         WSFR(cinfo, 0x6f);
1693                         break;
1694                 default: /* do nothing */ break;
1695                 }
1696         } else {
1697                 switch (cinfo->btype) {
1698                 case BT_SD64:
1699                         WSFR(cinfo, cinfo->SFR & 0xde);
1700                         break;
1701                 case BT_PICCOLO:
1702                         WSFR(cinfo, cinfo->SFR & 0xd7);
1703                         break;
1704                 case BT_SPECTRUM:
1705                         WSFR(cinfo, 0x4f);
1706                         break;
1707                 default: /* do nothing */
1708                         break;
1709                 }
1710         }
1711 #endif /* CONFIG_ZORRO */
1712 }
1713
1714 /******************************************/
1715 /* Linux 2.6-style  accelerated functions */
1716 /******************************************/
1717
1718 static int cirrusfb_sync(struct fb_info *info)
1719 {
1720         struct cirrusfb_info *cinfo = info->par;
1721
1722         if (!is_laguna(cinfo)) {
1723                 while (vga_rgfx(cinfo->regbase, CL_GR31) & 0x03)
1724                         cpu_relax();
1725         }
1726         return 0;
1727 }
1728
1729 static void cirrusfb_fillrect(struct fb_info *info,
1730                               const struct fb_fillrect *region)
1731 {
1732         struct fb_fillrect modded;
1733         int vxres, vyres;
1734         struct cirrusfb_info *cinfo = info->par;
1735         int m = info->var.bits_per_pixel;
1736         u32 color = (info->fix.visual == FB_VISUAL_TRUECOLOR) ?
1737                 cinfo->pseudo_palette[region->color] : region->color;
1738
1739         if (info->state != FBINFO_STATE_RUNNING)
1740                 return;
1741         if (info->flags & FBINFO_HWACCEL_DISABLED) {
1742                 cfb_fillrect(info, region);
1743                 return;
1744         }
1745
1746         vxres = info->var.xres_virtual;
1747         vyres = info->var.yres_virtual;
1748
1749         memcpy(&modded, region, sizeof(struct fb_fillrect));
1750
1751         if (!modded.width || !modded.height ||
1752            modded.dx >= vxres || modded.dy >= vyres)
1753                 return;
1754
1755         if (modded.dx + modded.width  > vxres)
1756                 modded.width  = vxres - modded.dx;
1757         if (modded.dy + modded.height > vyres)
1758                 modded.height = vyres - modded.dy;
1759
1760         cirrusfb_RectFill(cinfo->regbase,
1761                           info->var.bits_per_pixel,
1762                           (region->dx * m) / 8, region->dy,
1763                           (region->width * m) / 8, region->height,
1764                           color, color,
1765                           info->fix.line_length, 0x40);
1766 }
1767
1768 static void cirrusfb_copyarea(struct fb_info *info,
1769                               const struct fb_copyarea *area)
1770 {
1771         struct fb_copyarea modded;
1772         u32 vxres, vyres;
1773         struct cirrusfb_info *cinfo = info->par;
1774         int m = info->var.bits_per_pixel;
1775
1776         if (info->state != FBINFO_STATE_RUNNING)
1777                 return;
1778         if (info->flags & FBINFO_HWACCEL_DISABLED) {
1779                 cfb_copyarea(info, area);
1780                 return;
1781         }
1782
1783         vxres = info->var.xres_virtual;
1784         vyres = info->var.yres_virtual;
1785         memcpy(&modded, area, sizeof(struct fb_copyarea));
1786
1787         if (!modded.width || !modded.height ||
1788            modded.sx >= vxres || modded.sy >= vyres ||
1789            modded.dx >= vxres || modded.dy >= vyres)
1790                 return;
1791
1792         if (modded.sx + modded.width > vxres)
1793                 modded.width = vxres - modded.sx;
1794         if (modded.dx + modded.width > vxres)
1795                 modded.width = vxres - modded.dx;
1796         if (modded.sy + modded.height > vyres)
1797                 modded.height = vyres - modded.sy;
1798         if (modded.dy + modded.height > vyres)
1799                 modded.height = vyres - modded.dy;
1800
1801         cirrusfb_BitBLT(cinfo->regbase, info->var.bits_per_pixel,
1802                         (area->sx * m) / 8, area->sy,
1803                         (area->dx * m) / 8, area->dy,
1804                         (area->width * m) / 8, area->height,
1805                         info->fix.line_length);
1806
1807 }
1808
1809 static void cirrusfb_imageblit(struct fb_info *info,
1810                                const struct fb_image *image)
1811 {
1812         struct cirrusfb_info *cinfo = info->par;
1813         unsigned char op = (info->var.bits_per_pixel == 24) ? 0xc : 0x4;
1814
1815         if (info->state != FBINFO_STATE_RUNNING)
1816                 return;
1817         /* Alpine/SD64 does not work at 24bpp ??? */
1818         if (info->flags & FBINFO_HWACCEL_DISABLED || image->depth != 1)
1819                 cfb_imageblit(info, image);
1820         else if ((cinfo->btype == BT_ALPINE || cinfo->btype == BT_SD64) &&
1821                   op == 0xc)
1822                 cfb_imageblit(info, image);
1823         else {
1824                 unsigned size = ((image->width + 7) >> 3) * image->height;
1825                 int m = info->var.bits_per_pixel;
1826                 u32 fg, bg;
1827
1828                 if (info->var.bits_per_pixel == 8) {
1829                         fg = image->fg_color;
1830                         bg = image->bg_color;
1831                 } else {
1832                         fg = ((u32 *)(info->pseudo_palette))[image->fg_color];
1833                         bg = ((u32 *)(info->pseudo_palette))[image->bg_color];
1834                 }
1835                 if (info->var.bits_per_pixel == 24) {
1836                         /* clear background first */
1837                         cirrusfb_RectFill(cinfo->regbase,
1838                                           info->var.bits_per_pixel,
1839                                           (image->dx * m) / 8, image->dy,
1840                                           (image->width * m) / 8,
1841                                           image->height,
1842                                           bg, bg,
1843                                           info->fix.line_length, 0x40);
1844                 }
1845                 cirrusfb_RectFill(cinfo->regbase,
1846                                   info->var.bits_per_pixel,
1847                                   (image->dx * m) / 8, image->dy,
1848                                   (image->width * m) / 8, image->height,
1849                                   fg, bg,
1850                                   info->fix.line_length, op);
1851                 memcpy(info->screen_base, image->data, size);
1852         }
1853 }
1854
1855 #ifdef CONFIG_PCI
1856 static int release_io_ports;
1857
1858 /* Pulled the logic from XFree86 Cirrus driver to get the memory size,
1859  * based on the DRAM bandwidth bit and DRAM bank switching bit.  This
1860  * works with 1MB, 2MB and 4MB configurations (which the Motorola boards
1861  * seem to have. */
1862 static unsigned int cirrusfb_get_memsize(struct fb_info *info,
1863                                          u8 __iomem *regbase)
1864 {
1865         unsigned long mem;
1866         struct cirrusfb_info *cinfo = info->par;
1867
1868         if (is_laguna(cinfo)) {
1869                 unsigned char SR14 = vga_rseq(regbase, CL_SEQR14);
1870
1871                 mem = ((SR14 & 7) + 1) << 20;
1872         } else {
1873                 unsigned char SRF = vga_rseq(regbase, CL_SEQRF);
1874                 switch ((SRF & 0x18)) {
1875                 case 0x08:
1876                         mem = 512 * 1024;
1877                         break;
1878                 case 0x10:
1879                         mem = 1024 * 1024;
1880                         break;
1881                 /* 64-bit DRAM data bus width; assume 2MB.
1882                  * Also indicates 2MB memory on the 5430.
1883                  */
1884                 case 0x18:
1885                         mem = 2048 * 1024;
1886                         break;
1887                 default:
1888                         dev_warn(info->device, "Unknown memory size!\n");
1889                         mem = 1024 * 1024;
1890                 }
1891                 /* If DRAM bank switching is enabled, there must be
1892                  * twice as much memory installed. (4MB on the 5434)
1893                  */
1894                 if (cinfo->btype != BT_ALPINE && (SRF & 0x80) != 0)
1895                         mem *= 2;
1896         }
1897
1898         /* TODO: Handling of GD5446/5480 (see XF86 sources ...) */
1899         return mem;
1900 }
1901
1902 static void get_pci_addrs(const struct pci_dev *pdev,
1903                           unsigned long *display, unsigned long *registers)
1904 {
1905         assert(pdev != NULL);
1906         assert(display != NULL);
1907         assert(registers != NULL);
1908
1909         *display = 0;
1910         *registers = 0;
1911
1912         /* This is a best-guess for now */
1913
1914         if (pci_resource_flags(pdev, 0) & IORESOURCE_IO) {
1915                 *display = pci_resource_start(pdev, 1);
1916                 *registers = pci_resource_start(pdev, 0);
1917         } else {
1918                 *display = pci_resource_start(pdev, 0);
1919                 *registers = pci_resource_start(pdev, 1);
1920         }
1921
1922         assert(*display != 0);
1923 }
1924
1925 static void cirrusfb_pci_unmap(struct fb_info *info)
1926 {
1927         struct pci_dev *pdev = to_pci_dev(info->device);
1928         struct cirrusfb_info *cinfo = info->par;
1929
1930         if (cinfo->laguna_mmio == NULL)
1931                 iounmap(cinfo->laguna_mmio);
1932         iounmap(info->screen_base);
1933 #if 0 /* if system didn't claim this region, we would... */
1934         release_mem_region(0xA0000, 65535);
1935 #endif
1936         if (release_io_ports)
1937                 release_region(0x3C0, 32);
1938         pci_release_regions(pdev);
1939 }
1940 #endif /* CONFIG_PCI */
1941
1942 #ifdef CONFIG_ZORRO
1943 static void cirrusfb_zorro_unmap(struct fb_info *info)
1944 {
1945         struct cirrusfb_info *cinfo = info->par;
1946         struct zorro_dev *zdev = to_zorro_dev(info->device);
1947
1948         if (info->fix.smem_start > 16 * MB_)
1949                 iounmap(info->screen_base);
1950         if (info->fix.mmio_start > 16 * MB_)
1951                 iounmap(cinfo->regbase);
1952
1953         zorro_release_device(zdev);
1954 }
1955 #endif /* CONFIG_ZORRO */
1956
1957 /* function table of the above functions */
1958 static const struct fb_ops cirrusfb_ops = {
1959         .owner          = THIS_MODULE,
1960         .fb_open        = cirrusfb_open,
1961         .fb_release     = cirrusfb_release,
1962         .fb_setcolreg   = cirrusfb_setcolreg,
1963         .fb_check_var   = cirrusfb_check_var,
1964         .fb_set_par     = cirrusfb_set_par,
1965         .fb_pan_display = cirrusfb_pan_display,
1966         .fb_blank       = cirrusfb_blank,
1967         .fb_fillrect    = cirrusfb_fillrect,
1968         .fb_copyarea    = cirrusfb_copyarea,
1969         .fb_sync        = cirrusfb_sync,
1970         .fb_imageblit   = cirrusfb_imageblit,
1971 };
1972
1973 static int cirrusfb_set_fbinfo(struct fb_info *info)
1974 {
1975         struct cirrusfb_info *cinfo = info->par;
1976         struct fb_var_screeninfo *var = &info->var;
1977
1978         info->pseudo_palette = cinfo->pseudo_palette;
1979         info->flags = FBINFO_DEFAULT
1980                     | FBINFO_HWACCEL_XPAN
1981                     | FBINFO_HWACCEL_YPAN
1982                     | FBINFO_HWACCEL_FILLRECT
1983                     | FBINFO_HWACCEL_IMAGEBLIT
1984                     | FBINFO_HWACCEL_COPYAREA;
1985         if (noaccel || is_laguna(cinfo)) {
1986                 info->flags |= FBINFO_HWACCEL_DISABLED;
1987                 info->fix.accel = FB_ACCEL_NONE;
1988         } else
1989                 info->fix.accel = FB_ACCEL_CIRRUS_ALPINE;
1990
1991         info->fbops = &cirrusfb_ops;
1992
1993         if (cinfo->btype == BT_GD5480) {
1994                 if (var->bits_per_pixel == 16)
1995                         info->screen_base += 1 * MB_;
1996                 if (var->bits_per_pixel == 32)
1997                         info->screen_base += 2 * MB_;
1998         }
1999
2000         /* Fill fix common fields */
2001         strlcpy(info->fix.id, cirrusfb_board_info[cinfo->btype].name,
2002                 sizeof(info->fix.id));
2003
2004         /* monochrome: only 1 memory plane */
2005         /* 8 bit and above: Use whole memory area */
2006         info->fix.smem_len   = info->screen_size;
2007         if (var->bits_per_pixel == 1)
2008                 info->fix.smem_len /= 4;
2009         info->fix.type_aux   = 0;
2010         info->fix.xpanstep   = 1;
2011         info->fix.ypanstep   = 1;
2012         info->fix.ywrapstep  = 0;
2013
2014         /* FIXME: map region at 0xB8000 if available, fill in here */
2015         info->fix.mmio_len   = 0;
2016
2017         fb_alloc_cmap(&info->cmap, 256, 0);
2018
2019         return 0;
2020 }
2021
2022 static int cirrusfb_register(struct fb_info *info)
2023 {
2024         struct cirrusfb_info *cinfo = info->par;
2025         int err;
2026
2027         /* sanity checks */
2028         assert(cinfo->btype != BT_NONE);
2029
2030         /* set all the vital stuff */
2031         cirrusfb_set_fbinfo(info);
2032
2033         dev_dbg(info->device, "(RAM start set to: 0x%p)\n", info->screen_base);
2034
2035         err = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, 8);
2036         if (!err) {
2037                 dev_dbg(info->device, "wrong initial video mode\n");
2038                 err = -EINVAL;
2039                 goto err_dealloc_cmap;
2040         }
2041
2042         info->var.activate = FB_ACTIVATE_NOW;
2043
2044         err = cirrusfb_check_var(&info->var, info);
2045         if (err < 0) {
2046                 /* should never happen */
2047                 dev_dbg(info->device,
2048                         "choking on default var... umm, no good.\n");
2049                 goto err_dealloc_cmap;
2050         }
2051
2052         err = register_framebuffer(info);
2053         if (err < 0) {
2054                 dev_err(info->device,
2055                         "could not register fb device; err = %d!\n", err);
2056                 goto err_dealloc_cmap;
2057         }
2058
2059         return 0;
2060
2061 err_dealloc_cmap:
2062         fb_dealloc_cmap(&info->cmap);
2063         return err;
2064 }
2065
2066 static void cirrusfb_cleanup(struct fb_info *info)
2067 {
2068         struct cirrusfb_info *cinfo = info->par;
2069
2070         switch_monitor(cinfo, 0);
2071         unregister_framebuffer(info);
2072         fb_dealloc_cmap(&info->cmap);
2073         dev_dbg(info->device, "Framebuffer unregistered\n");
2074         cinfo->unmap(info);
2075         framebuffer_release(info);
2076 }
2077
2078 #ifdef CONFIG_PCI
2079 static int cirrusfb_pci_register(struct pci_dev *pdev,
2080                                  const struct pci_device_id *ent)
2081 {
2082         struct cirrusfb_info *cinfo;
2083         struct fb_info *info;
2084         unsigned long board_addr, board_size;
2085         int ret;
2086
2087         ret = pci_enable_device(pdev);
2088         if (ret < 0) {
2089                 printk(KERN_ERR "cirrusfb: Cannot enable PCI device\n");
2090                 goto err_out;
2091         }
2092
2093         info = framebuffer_alloc(sizeof(struct cirrusfb_info), &pdev->dev);
2094         if (!info) {
2095                 ret = -ENOMEM;
2096                 goto err_out;
2097         }
2098
2099         cinfo = info->par;
2100         cinfo->btype = (enum cirrus_board) ent->driver_data;
2101
2102         dev_dbg(info->device,
2103                 " Found PCI device, base address 0 is 0x%Lx, btype set to %d\n",
2104                 (unsigned long long)pdev->resource[0].start,  cinfo->btype);
2105         dev_dbg(info->device, " base address 1 is 0x%Lx\n",
2106                 (unsigned long long)pdev->resource[1].start);
2107
2108         dev_dbg(info->device,
2109                 "Attempt to get PCI info for Cirrus Graphics Card\n");
2110         get_pci_addrs(pdev, &board_addr, &info->fix.mmio_start);
2111         /* FIXME: this forces VGA.  alternatives? */
2112         cinfo->regbase = NULL;
2113         cinfo->laguna_mmio = ioremap(info->fix.mmio_start, 0x1000);
2114
2115         dev_dbg(info->device, "Board address: 0x%lx, register address: 0x%lx\n",
2116                 board_addr, info->fix.mmio_start);
2117
2118         board_size = (cinfo->btype == BT_GD5480) ?
2119                 32 * MB_ : cirrusfb_get_memsize(info, cinfo->regbase);
2120
2121         ret = pci_request_regions(pdev, "cirrusfb");
2122         if (ret < 0) {
2123                 dev_err(info->device, "cannot reserve region 0x%lx, abort\n",
2124                         board_addr);
2125                 goto err_release_fb;
2126         }
2127 #if 0 /* if the system didn't claim this region, we would... */
2128         if (!request_mem_region(0xA0000, 65535, "cirrusfb")) {
2129                 dev_err(info->device, "cannot reserve region 0x%lx, abort\n",
2130                         0xA0000L);
2131                 ret = -EBUSY;
2132                 goto err_release_regions;
2133         }
2134 #endif
2135         if (request_region(0x3C0, 32, "cirrusfb"))
2136                 release_io_ports = 1;
2137
2138         info->screen_base = ioremap(board_addr, board_size);
2139         if (!info->screen_base) {
2140                 ret = -EIO;
2141                 goto err_release_legacy;
2142         }
2143
2144         info->fix.smem_start = board_addr;
2145         info->screen_size = board_size;
2146         cinfo->unmap = cirrusfb_pci_unmap;
2147
2148         dev_info(info->device,
2149                  "Cirrus Logic chipset on PCI bus, RAM (%lu kB) at 0x%lx\n",
2150                  info->screen_size >> 10, board_addr);
2151         pci_set_drvdata(pdev, info);
2152
2153         ret = cirrusfb_register(info);
2154         if (!ret)
2155                 return 0;
2156
2157         iounmap(info->screen_base);
2158 err_release_legacy:
2159         if (release_io_ports)
2160                 release_region(0x3C0, 32);
2161 #if 0
2162         release_mem_region(0xA0000, 65535);
2163 err_release_regions:
2164 #endif
2165         pci_release_regions(pdev);
2166 err_release_fb:
2167         if (cinfo->laguna_mmio != NULL)
2168                 iounmap(cinfo->laguna_mmio);
2169         framebuffer_release(info);
2170 err_out:
2171         return ret;
2172 }
2173
2174 static void cirrusfb_pci_unregister(struct pci_dev *pdev)
2175 {
2176         struct fb_info *info = pci_get_drvdata(pdev);
2177
2178         cirrusfb_cleanup(info);
2179 }
2180
2181 static struct pci_driver cirrusfb_pci_driver = {
2182         .name           = "cirrusfb",
2183         .id_table       = cirrusfb_pci_table,
2184         .probe          = cirrusfb_pci_register,
2185         .remove         = cirrusfb_pci_unregister,
2186 #ifdef CONFIG_PM
2187 #if 0
2188         .suspend        = cirrusfb_pci_suspend,
2189         .resume         = cirrusfb_pci_resume,
2190 #endif
2191 #endif
2192 };
2193 #endif /* CONFIG_PCI */
2194
2195 #ifdef CONFIG_ZORRO
2196 static int cirrusfb_zorro_register(struct zorro_dev *z,
2197                                    const struct zorro_device_id *ent)
2198 {
2199         struct fb_info *info;
2200         int error;
2201         const struct zorrocl *zcl;
2202         enum cirrus_board btype;
2203         unsigned long regbase, ramsize, rambase;
2204         struct cirrusfb_info *cinfo;
2205
2206         info = framebuffer_alloc(sizeof(struct cirrusfb_info), &z->dev);
2207         if (!info)
2208                 return -ENOMEM;
2209
2210         zcl = (const struct zorrocl *)ent->driver_data;
2211         btype = zcl->type;
2212         regbase = zorro_resource_start(z) + zcl->regoffset;
2213         ramsize = zcl->ramsize;
2214         if (ramsize) {
2215                 rambase = zorro_resource_start(z) + zcl->ramoffset;
2216                 if (zorro_resource_len(z) == 64 * MB_) {
2217                         /* Quirk for 64 MiB Picasso IV */
2218                         rambase += zcl->ramoffset;
2219                 }
2220         } else {
2221                 struct zorro_dev *ram = zorro_find_device(zcl->ramid, NULL);
2222                 if (!ram || !zorro_resource_len(ram)) {
2223                         dev_err(info->device, "No video RAM found\n");
2224                         error = -ENODEV;
2225                         goto err_release_fb;
2226                 }
2227                 rambase = zorro_resource_start(ram);
2228                 ramsize = zorro_resource_len(ram);
2229                 if (zcl->ramid2 &&
2230                     (ram = zorro_find_device(zcl->ramid2, NULL))) {
2231                         if (zorro_resource_start(ram) != rambase + ramsize) {
2232                                 dev_warn(info->device,
2233                                          "Skipping non-contiguous RAM at %pR\n",
2234                                          &ram->resource);
2235                         } else {
2236                                 ramsize += zorro_resource_len(ram);
2237                         }
2238                 }
2239         }
2240
2241         dev_info(info->device,
2242                  "%s board detected, REG at 0x%lx, %lu MiB RAM at 0x%lx\n",
2243                  cirrusfb_board_info[btype].name, regbase, ramsize / MB_,
2244                  rambase);
2245
2246         if (!zorro_request_device(z, "cirrusfb")) {
2247                 dev_err(info->device, "Cannot reserve %pR\n", &z->resource);
2248                 error = -EBUSY;
2249                 goto err_release_fb;
2250         }
2251
2252         cinfo = info->par;
2253         cinfo->btype = btype;
2254
2255         info->fix.mmio_start = regbase;
2256         cinfo->regbase = regbase > 16 * MB_ ? ioremap(regbase, 64 * 1024)
2257                                             : ZTWO_VADDR(regbase);
2258         if (!cinfo->regbase) {
2259                 dev_err(info->device, "Cannot map registers\n");
2260                 error = -EIO;
2261                 goto err_release_dev;
2262         }
2263
2264         info->fix.smem_start = rambase;
2265         info->screen_size = ramsize;
2266         info->screen_base = rambase > 16 * MB_ ? ioremap(rambase, ramsize)
2267                                                : ZTWO_VADDR(rambase);
2268         if (!info->screen_base) {
2269                 dev_err(info->device, "Cannot map video RAM\n");
2270                 error = -EIO;
2271                 goto err_unmap_reg;
2272         }
2273
2274         cinfo->unmap = cirrusfb_zorro_unmap;
2275
2276         dev_info(info->device,
2277                  "Cirrus Logic chipset on Zorro bus, RAM (%lu MiB) at 0x%lx\n",
2278                  ramsize / MB_, rambase);
2279
2280         /* MCLK select etc. */
2281         if (cirrusfb_board_info[btype].init_sr1f)
2282                 vga_wseq(cinfo->regbase, CL_SEQR1F,
2283                          cirrusfb_board_info[btype].sr1f);
2284
2285         error = cirrusfb_register(info);
2286         if (error) {
2287                 dev_err(info->device, "Failed to register device, error %d\n",
2288                         error);
2289                 goto err_unmap_ram;
2290         }
2291
2292         zorro_set_drvdata(z, info);
2293         return 0;
2294
2295 err_unmap_ram:
2296         if (rambase > 16 * MB_)
2297                 iounmap(info->screen_base);
2298
2299 err_unmap_reg:
2300         if (regbase > 16 * MB_)
2301                 iounmap(cinfo->regbase);
2302 err_release_dev:
2303         zorro_release_device(z);
2304 err_release_fb:
2305         framebuffer_release(info);
2306         return error;
2307 }
2308
2309 void cirrusfb_zorro_unregister(struct zorro_dev *z)
2310 {
2311         struct fb_info *info = zorro_get_drvdata(z);
2312
2313         cirrusfb_cleanup(info);
2314         zorro_set_drvdata(z, NULL);
2315 }
2316
2317 static struct zorro_driver cirrusfb_zorro_driver = {
2318         .name           = "cirrusfb",
2319         .id_table       = cirrusfb_zorro_table,
2320         .probe          = cirrusfb_zorro_register,
2321         .remove         = cirrusfb_zorro_unregister,
2322 };
2323 #endif /* CONFIG_ZORRO */
2324
2325 #ifndef MODULE
2326 static int __init cirrusfb_setup(char *options)
2327 {
2328         char *this_opt;
2329
2330         if (!options || !*options)
2331                 return 0;
2332
2333         while ((this_opt = strsep(&options, ",")) != NULL) {
2334                 if (!*this_opt)
2335                         continue;
2336
2337                 if (!strcmp(this_opt, "noaccel"))
2338                         noaccel = 1;
2339                 else if (!strncmp(this_opt, "mode:", 5))
2340                         mode_option = this_opt + 5;
2341                 else
2342                         mode_option = this_opt;
2343         }
2344         return 0;
2345 }
2346 #endif
2347
2348     /*
2349      *  Modularization
2350      */
2351
2352 MODULE_AUTHOR("Copyright 1999,2000 Jeff Garzik <jgarzik@pobox.com>");
2353 MODULE_DESCRIPTION("Accelerated FBDev driver for Cirrus Logic chips");
2354 MODULE_LICENSE("GPL");
2355
2356 static int __init cirrusfb_init(void)
2357 {
2358         int error = 0;
2359
2360 #ifndef MODULE
2361         char *option = NULL;
2362
2363         if (fb_get_options("cirrusfb", &option))
2364                 return -ENODEV;
2365         cirrusfb_setup(option);
2366 #endif
2367
2368 #ifdef CONFIG_ZORRO
2369         error |= zorro_register_driver(&cirrusfb_zorro_driver);
2370 #endif
2371 #ifdef CONFIG_PCI
2372         error |= pci_register_driver(&cirrusfb_pci_driver);
2373 #endif
2374         return error;
2375 }
2376
2377 static void __exit cirrusfb_exit(void)
2378 {
2379 #ifdef CONFIG_PCI
2380         pci_unregister_driver(&cirrusfb_pci_driver);
2381 #endif
2382 #ifdef CONFIG_ZORRO
2383         zorro_unregister_driver(&cirrusfb_zorro_driver);
2384 #endif
2385 }
2386
2387 module_init(cirrusfb_init);
2388
2389 module_param(mode_option, charp, 0);
2390 MODULE_PARM_DESC(mode_option, "Initial video mode e.g. '648x480-8@60'");
2391 module_param(noaccel, bool, 0);
2392 MODULE_PARM_DESC(noaccel, "Disable acceleration");
2393
2394 #ifdef MODULE
2395 module_exit(cirrusfb_exit);
2396 #endif
2397
2398 /**********************************************************************/
2399 /* about the following functions - I have used the same names for the */
2400 /* functions as Markus Wild did in his Retina driver for NetBSD as    */
2401 /* they just made sense for this purpose. Apart from that, I wrote    */
2402 /* these functions myself.                                          */
2403 /**********************************************************************/
2404
2405 /*** WGen() - write into one of the external/general registers ***/
2406 static void WGen(const struct cirrusfb_info *cinfo,
2407                   int regnum, unsigned char val)
2408 {
2409         unsigned long regofs = 0;
2410
2411         if (cinfo->btype == BT_PICASSO) {
2412                 /* Picasso II specific hack */
2413 /*            if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D ||
2414                   regnum == CL_VSSM2) */
2415                 if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D)
2416                         regofs = 0xfff;
2417         }
2418
2419         vga_w(cinfo->regbase, regofs + regnum, val);
2420 }
2421
2422 /*** RGen() - read out one of the external/general registers ***/
2423 static unsigned char RGen(const struct cirrusfb_info *cinfo, int regnum)
2424 {
2425         unsigned long regofs = 0;
2426
2427         if (cinfo->btype == BT_PICASSO) {
2428                 /* Picasso II specific hack */
2429 /*            if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D ||
2430                   regnum == CL_VSSM2) */
2431                 if (regnum == VGA_PEL_IR || regnum == VGA_PEL_D)
2432                         regofs = 0xfff;
2433         }
2434
2435         return vga_r(cinfo->regbase, regofs + regnum);
2436 }
2437
2438 /*** AttrOn() - turn on VideoEnable for Attribute controller ***/
2439 static void AttrOn(const struct cirrusfb_info *cinfo)
2440 {
2441         assert(cinfo != NULL);
2442
2443         if (vga_rcrt(cinfo->regbase, CL_CRT24) & 0x80) {
2444                 /* if we're just in "write value" mode, write back the */
2445                 /* same value as before to not modify anything */
2446                 vga_w(cinfo->regbase, VGA_ATT_IW,
2447                       vga_r(cinfo->regbase, VGA_ATT_R));
2448         }
2449         /* turn on video bit */
2450 /*      vga_w(cinfo->regbase, VGA_ATT_IW, 0x20); */
2451         vga_w(cinfo->regbase, VGA_ATT_IW, 0x33);
2452
2453         /* dummy write on Reg0 to be on "write index" mode next time */
2454         vga_w(cinfo->regbase, VGA_ATT_IW, 0x00);
2455 }
2456
2457 /*** WHDR() - write into the Hidden DAC register ***/
2458 /* as the HDR is the only extension register that requires special treatment
2459  * (the other extension registers are accessible just like the "ordinary"
2460  * registers of their functional group) here is a specialized routine for
2461  * accessing the HDR
2462  */
2463 static void WHDR(const struct cirrusfb_info *cinfo, unsigned char val)
2464 {
2465         unsigned char dummy;
2466
2467         if (is_laguna(cinfo))
2468                 return;
2469         if (cinfo->btype == BT_PICASSO) {
2470                 /* Klaus' hint for correct access to HDR on some boards */
2471                 /* first write 0 to pixel mask (3c6) */
2472                 WGen(cinfo, VGA_PEL_MSK, 0x00);
2473                 udelay(200);
2474                 /* next read dummy from pixel address (3c8) */
2475                 dummy = RGen(cinfo, VGA_PEL_IW);
2476                 udelay(200);
2477         }
2478         /* now do the usual stuff to access the HDR */
2479
2480         dummy = RGen(cinfo, VGA_PEL_MSK);
2481         udelay(200);
2482         dummy = RGen(cinfo, VGA_PEL_MSK);
2483         udelay(200);
2484         dummy = RGen(cinfo, VGA_PEL_MSK);
2485         udelay(200);
2486         dummy = RGen(cinfo, VGA_PEL_MSK);
2487         udelay(200);
2488
2489         WGen(cinfo, VGA_PEL_MSK, val);
2490         udelay(200);
2491
2492         if (cinfo->btype == BT_PICASSO) {
2493                 /* now first reset HDR access counter */
2494                 dummy = RGen(cinfo, VGA_PEL_IW);
2495                 udelay(200);
2496
2497                 /* and at the end, restore the mask value */
2498                 /* ## is this mask always 0xff? */
2499                 WGen(cinfo, VGA_PEL_MSK, 0xff);
2500                 udelay(200);
2501         }
2502 }
2503
2504 /*** WSFR() - write to the "special function register" (SFR) ***/
2505 static void WSFR(struct cirrusfb_info *cinfo, unsigned char val)
2506 {
2507 #ifdef CONFIG_ZORRO
2508         assert(cinfo->regbase != NULL);
2509         cinfo->SFR = val;
2510         z_writeb(val, cinfo->regbase + 0x8000);
2511 #endif
2512 }
2513
2514 /* The Picasso has a second register for switching the monitor bit */
2515 static void WSFR2(struct cirrusfb_info *cinfo, unsigned char val)
2516 {
2517 #ifdef CONFIG_ZORRO
2518         /* writing an arbitrary value to this one causes the monitor switcher */
2519         /* to flip to Amiga display */
2520         assert(cinfo->regbase != NULL);
2521         cinfo->SFR = val;
2522         z_writeb(val, cinfo->regbase + 0x9000);
2523 #endif
2524 }
2525
2526 /*** WClut - set CLUT entry (range: 0..63) ***/
2527 static void WClut(struct cirrusfb_info *cinfo, unsigned char regnum, unsigned char red,
2528             unsigned char green, unsigned char blue)
2529 {
2530         unsigned int data = VGA_PEL_D;
2531
2532         /* address write mode register is not translated.. */
2533         vga_w(cinfo->regbase, VGA_PEL_IW, regnum);
2534
2535         if (cinfo->btype == BT_PICASSO || cinfo->btype == BT_PICASSO4 ||
2536             cinfo->btype == BT_ALPINE || cinfo->btype == BT_GD5480 ||
2537             cinfo->btype == BT_SD64 || is_laguna(cinfo)) {
2538                 /* but DAC data register IS, at least for Picasso II */
2539                 if (cinfo->btype == BT_PICASSO)
2540                         data += 0xfff;
2541                 vga_w(cinfo->regbase, data, red);
2542                 vga_w(cinfo->regbase, data, green);
2543                 vga_w(cinfo->regbase, data, blue);
2544         } else {
2545                 vga_w(cinfo->regbase, data, blue);
2546                 vga_w(cinfo->regbase, data, green);
2547                 vga_w(cinfo->regbase, data, red);
2548         }
2549 }
2550
2551 #if 0
2552 /*** RClut - read CLUT entry (range 0..63) ***/
2553 static void RClut(struct cirrusfb_info *cinfo, unsigned char regnum, unsigned char *red,
2554             unsigned char *green, unsigned char *blue)
2555 {
2556         unsigned int data = VGA_PEL_D;
2557
2558         vga_w(cinfo->regbase, VGA_PEL_IR, regnum);
2559
2560         if (cinfo->btype == BT_PICASSO || cinfo->btype == BT_PICASSO4 ||
2561             cinfo->btype == BT_ALPINE || cinfo->btype == BT_GD5480) {
2562                 if (cinfo->btype == BT_PICASSO)
2563                         data += 0xfff;
2564                 *red = vga_r(cinfo->regbase, data);
2565                 *green = vga_r(cinfo->regbase, data);
2566                 *blue = vga_r(cinfo->regbase, data);
2567         } else {
2568                 *blue = vga_r(cinfo->regbase, data);
2569                 *green = vga_r(cinfo->regbase, data);
2570                 *red = vga_r(cinfo->regbase, data);
2571         }
2572 }
2573 #endif
2574
2575 /*******************************************************************
2576         cirrusfb_WaitBLT()
2577
2578         Wait for the BitBLT engine to complete a possible earlier job
2579 *********************************************************************/
2580
2581 /* FIXME: use interrupts instead */
2582 static void cirrusfb_WaitBLT(u8 __iomem *regbase)
2583 {
2584         while (vga_rgfx(regbase, CL_GR31) & 0x08)
2585                 cpu_relax();
2586 }
2587
2588 /*******************************************************************
2589         cirrusfb_BitBLT()
2590
2591         perform accelerated "scrolling"
2592 ********************************************************************/
2593
2594 static void cirrusfb_set_blitter(u8 __iomem *regbase,
2595                             u_short nwidth, u_short nheight,
2596                             u_long nsrc, u_long ndest,
2597                             u_short bltmode, u_short line_length)
2598
2599 {
2600         /* pitch: set to line_length */
2601         /* dest pitch low */
2602         vga_wgfx(regbase, CL_GR24, line_length & 0xff);
2603         /* dest pitch hi */
2604         vga_wgfx(regbase, CL_GR25, line_length >> 8);
2605         /* source pitch low */
2606         vga_wgfx(regbase, CL_GR26, line_length & 0xff);
2607         /* source pitch hi */
2608         vga_wgfx(regbase, CL_GR27, line_length >> 8);
2609
2610         /* BLT width: actual number of pixels - 1 */
2611         /* BLT width low */
2612         vga_wgfx(regbase, CL_GR20, nwidth & 0xff);
2613         /* BLT width hi */
2614         vga_wgfx(regbase, CL_GR21, nwidth >> 8);
2615
2616         /* BLT height: actual number of lines -1 */
2617         /* BLT height low */
2618         vga_wgfx(regbase, CL_GR22, nheight & 0xff);
2619         /* BLT width hi */
2620         vga_wgfx(regbase, CL_GR23, nheight >> 8);
2621
2622         /* BLT destination */
2623         /* BLT dest low */
2624         vga_wgfx(regbase, CL_GR28, (u_char) (ndest & 0xff));
2625         /* BLT dest mid */
2626         vga_wgfx(regbase, CL_GR29, (u_char) (ndest >> 8));
2627         /* BLT dest hi */
2628         vga_wgfx(regbase, CL_GR2A, (u_char) (ndest >> 16));
2629
2630         /* BLT source */
2631         /* BLT src low */
2632         vga_wgfx(regbase, CL_GR2C, (u_char) (nsrc & 0xff));
2633         /* BLT src mid */
2634         vga_wgfx(regbase, CL_GR2D, (u_char) (nsrc >> 8));
2635         /* BLT src hi */
2636         vga_wgfx(regbase, CL_GR2E, (u_char) (nsrc >> 16));
2637
2638         /* BLT mode */
2639         vga_wgfx(regbase, CL_GR30, bltmode);    /* BLT mode */
2640
2641         /* BLT ROP: SrcCopy */
2642         vga_wgfx(regbase, CL_GR32, 0x0d);       /* BLT ROP */
2643
2644         /* and finally: GO! */
2645         vga_wgfx(regbase, CL_GR31, 0x02);       /* BLT Start/status */
2646 }
2647
2648 /*******************************************************************
2649         cirrusfb_BitBLT()
2650
2651         perform accelerated "scrolling"
2652 ********************************************************************/
2653
2654 static void cirrusfb_BitBLT(u8 __iomem *regbase, int bits_per_pixel,
2655                             u_short curx, u_short cury,
2656                             u_short destx, u_short desty,
2657                             u_short width, u_short height,
2658                             u_short line_length)
2659 {
2660         u_short nwidth = width - 1;
2661         u_short nheight = height - 1;
2662         u_long nsrc, ndest;
2663         u_char bltmode;
2664
2665         bltmode = 0x00;
2666         /* if source adr < dest addr, do the Blt backwards */
2667         if (cury <= desty) {
2668                 if (cury == desty) {
2669                         /* if src and dest are on the same line, check x */
2670                         if (curx < destx)
2671                                 bltmode |= 0x01;
2672                 } else
2673                         bltmode |= 0x01;
2674         }
2675         /* standard case: forward blitting */
2676         nsrc = (cury * line_length) + curx;
2677         ndest = (desty * line_length) + destx;
2678         if (bltmode) {
2679                 /* this means start addresses are at the end,
2680                  * counting backwards
2681                  */
2682                 nsrc += nheight * line_length + nwidth;
2683                 ndest += nheight * line_length + nwidth;
2684         }
2685
2686         cirrusfb_WaitBLT(regbase);
2687
2688         cirrusfb_set_blitter(regbase, nwidth, nheight,
2689                             nsrc, ndest, bltmode, line_length);
2690 }
2691
2692 /*******************************************************************
2693         cirrusfb_RectFill()
2694
2695         perform accelerated rectangle fill
2696 ********************************************************************/
2697
2698 static void cirrusfb_RectFill(u8 __iomem *regbase, int bits_per_pixel,
2699                      u_short x, u_short y, u_short width, u_short height,
2700                      u32 fg_color, u32 bg_color, u_short line_length,
2701                      u_char blitmode)
2702 {
2703         u_long ndest = (y * line_length) + x;
2704         u_char op;
2705
2706         cirrusfb_WaitBLT(regbase);
2707
2708         /* This is a ColorExpand Blt, using the */
2709         /* same color for foreground and background */
2710         vga_wgfx(regbase, VGA_GFX_SR_VALUE, bg_color);
2711         vga_wgfx(regbase, VGA_GFX_SR_ENABLE, fg_color);
2712
2713         op = 0x80;
2714         if (bits_per_pixel >= 16) {
2715                 vga_wgfx(regbase, CL_GR10, bg_color >> 8);
2716                 vga_wgfx(regbase, CL_GR11, fg_color >> 8);
2717                 op = 0x90;
2718         }
2719         if (bits_per_pixel >= 24) {
2720                 vga_wgfx(regbase, CL_GR12, bg_color >> 16);
2721                 vga_wgfx(regbase, CL_GR13, fg_color >> 16);
2722                 op = 0xa0;
2723         }
2724         if (bits_per_pixel == 32) {
2725                 vga_wgfx(regbase, CL_GR14, bg_color >> 24);
2726                 vga_wgfx(regbase, CL_GR15, fg_color >> 24);
2727                 op = 0xb0;
2728         }
2729         cirrusfb_set_blitter(regbase, width - 1, height - 1,
2730                             0, ndest, op | blitmode, line_length);
2731 }
2732
2733 /**************************************************************************
2734  * bestclock() - determine closest possible clock lower(?) than the
2735  * desired pixel clock
2736  **************************************************************************/
2737 static void bestclock(long freq, int *nom, int *den, int *div)
2738 {
2739         int n, d;
2740         long h, diff;
2741
2742         assert(nom != NULL);
2743         assert(den != NULL);
2744         assert(div != NULL);
2745
2746         *nom = 0;
2747         *den = 0;
2748         *div = 0;
2749
2750         if (freq < 8000)
2751                 freq = 8000;
2752
2753         diff = freq;
2754
2755         for (n = 32; n < 128; n++) {
2756                 int s = 0;
2757
2758                 d = (14318 * n) / freq;
2759                 if ((d >= 7) && (d <= 63)) {
2760                         int temp = d;
2761
2762                         if (temp > 31) {
2763                                 s = 1;
2764                                 temp >>= 1;
2765                         }
2766                         h = ((14318 * n) / temp) >> s;
2767                         h = h > freq ? h - freq : freq - h;
2768                         if (h < diff) {
2769                                 diff = h;
2770                                 *nom = n;
2771                                 *den = temp;
2772                                 *div = s;
2773                         }
2774                 }
2775                 d++;
2776                 if ((d >= 7) && (d <= 63)) {
2777                         if (d > 31) {
2778                                 s = 1;
2779                                 d >>= 1;
2780                         }
2781                         h = ((14318 * n) / d) >> s;
2782                         h = h > freq ? h - freq : freq - h;
2783                         if (h < diff) {
2784                                 diff = h;
2785                                 *nom = n;
2786                                 *den = d;
2787                                 *div = s;
2788                         }
2789                 }
2790         }
2791 }
2792
2793 /* -------------------------------------------------------------------------
2794  *
2795  * debugging functions
2796  *
2797  * -------------------------------------------------------------------------
2798  */
2799
2800 #ifdef CIRRUSFB_DEBUG
2801
2802 /**
2803  * cirrusfb_dbg_print_regs
2804  * @base: If using newmmio, the newmmio base address, otherwise %NULL
2805  * @reg_class: type of registers to read: %CRT, or %SEQ
2806  *
2807  * DESCRIPTION:
2808  * Dumps the given list of VGA CRTC registers.  If @base is %NULL,
2809  * old-style I/O ports are queried for information, otherwise MMIO is
2810  * used at the given @base address to query the information.
2811  */
2812
2813 static void cirrusfb_dbg_print_regs(struct fb_info *info,
2814                                     caddr_t regbase,
2815                                     enum cirrusfb_dbg_reg_class reg_class, ...)
2816 {
2817         va_list list;
2818         unsigned char val = 0;
2819         unsigned reg;
2820         char *name;
2821
2822         va_start(list, reg_class);
2823
2824         name = va_arg(list, char *);
2825         while (name != NULL) {
2826                 reg = va_arg(list, int);
2827
2828                 switch (reg_class) {
2829                 case CRT:
2830                         val = vga_rcrt(regbase, (unsigned char) reg);
2831                         break;
2832                 case SEQ:
2833                         val = vga_rseq(regbase, (unsigned char) reg);
2834                         break;
2835                 default:
2836                         /* should never occur */
2837                         assert(false);
2838                         break;
2839                 }
2840
2841                 dev_dbg(info->device, "%8s = 0x%02X\n", name, val);
2842
2843                 name = va_arg(list, char *);
2844         }
2845
2846         va_end(list);
2847 }
2848
2849 /**
2850  * cirrusfb_dbg_reg_dump
2851  * @base: If using newmmio, the newmmio base address, otherwise %NULL
2852  *
2853  * DESCRIPTION:
2854  * Dumps a list of interesting VGA and CIRRUSFB registers.  If @base is %NULL,
2855  * old-style I/O ports are queried for information, otherwise MMIO is
2856  * used at the given @base address to query the information.
2857  */
2858
2859 static void cirrusfb_dbg_reg_dump(struct fb_info *info, caddr_t regbase)
2860 {
2861         dev_dbg(info->device, "VGA CRTC register dump:\n");
2862
2863         cirrusfb_dbg_print_regs(info, regbase, CRT,
2864                            "CR00", 0x00,
2865                            "CR01", 0x01,
2866                            "CR02", 0x02,
2867                            "CR03", 0x03,
2868                            "CR04", 0x04,
2869                            "CR05", 0x05,
2870                            "CR06", 0x06,
2871                            "CR07", 0x07,
2872                            "CR08", 0x08,
2873                            "CR09", 0x09,
2874                            "CR0A", 0x0A,
2875                            "CR0B", 0x0B,
2876                            "CR0C", 0x0C,
2877                            "CR0D", 0x0D,
2878                            "CR0E", 0x0E,
2879                            "CR0F", 0x0F,
2880                            "CR10", 0x10,
2881                            "CR11", 0x11,
2882                            "CR12", 0x12,
2883                            "CR13", 0x13,
2884                            "CR14", 0x14,
2885                            "CR15", 0x15,
2886                            "CR16", 0x16,
2887                            "CR17", 0x17,
2888                            "CR18", 0x18,
2889                            "CR22", 0x22,
2890                            "CR24", 0x24,
2891                            "CR26", 0x26,
2892                            "CR2D", 0x2D,
2893                            "CR2E", 0x2E,
2894                            "CR2F", 0x2F,
2895                            "CR30", 0x30,
2896                            "CR31", 0x31,
2897                            "CR32", 0x32,
2898                            "CR33", 0x33,
2899                            "CR34", 0x34,
2900                            "CR35", 0x35,
2901                            "CR36", 0x36,
2902                            "CR37", 0x37,
2903                            "CR38", 0x38,
2904                            "CR39", 0x39,
2905                            "CR3A", 0x3A,
2906                            "CR3B", 0x3B,
2907                            "CR3C", 0x3C,
2908                            "CR3D", 0x3D,
2909                            "CR3E", 0x3E,
2910                            "CR3F", 0x3F,
2911                            NULL);
2912
2913         dev_dbg(info->device, "\n");
2914
2915         dev_dbg(info->device, "VGA SEQ register dump:\n");
2916
2917         cirrusfb_dbg_print_regs(info, regbase, SEQ,
2918                            "SR00", 0x00,
2919                            "SR01", 0x01,
2920                            "SR02", 0x02,
2921                            "SR03", 0x03,
2922                            "SR04", 0x04,
2923                            "SR08", 0x08,
2924                            "SR09", 0x09,
2925                            "SR0A", 0x0A,
2926                            "SR0B", 0x0B,
2927                            "SR0D", 0x0D,
2928                            "SR10", 0x10,
2929                            "SR11", 0x11,
2930                            "SR12", 0x12,
2931                            "SR13", 0x13,
2932                            "SR14", 0x14,
2933                            "SR15", 0x15,
2934                            "SR16", 0x16,
2935                            "SR17", 0x17,
2936                            "SR18", 0x18,
2937                            "SR19", 0x19,
2938                            "SR1A", 0x1A,
2939                            "SR1B", 0x1B,
2940                            "SR1C", 0x1C,
2941                            "SR1D", 0x1D,
2942                            "SR1E", 0x1E,
2943                            "SR1F", 0x1F,
2944                            NULL);
2945
2946         dev_dbg(info->device, "\n");
2947 }
2948
2949 #endif                          /* CIRRUSFB_DEBUG */
2950