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