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