1/*
2 *  ATI Frame Buffer Device Driver Core
3 *
4 *	Copyright (C) 2004  Alex Kern <alex.kern@gmx.de>
5 *	Copyright (C) 1997-2001  Geert Uytterhoeven
6 *	Copyright (C) 1998  Bernd Harries
7 *	Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
8 *
9 *  This driver supports the following ATI graphics chips:
10 *    - ATI Mach64
11 *
12 *  To do: add support for
13 *    - ATI Rage128 (from aty128fb.c)
14 *    - ATI Radeon (from radeonfb.c)
15 *
16 *  This driver is partly based on the PowerMac console driver:
17 *
18 *	Copyright (C) 1996 Paul Mackerras
19 *
20 *  and on the PowerMac ATI/mach64 display driver:
21 *
22 *	Copyright (C) 1997 Michael AK Tesch
23 *
24 *	      with work by Jon Howell
25 *			   Harry AC Eaton
26 *			   Anthony Tong <atong@uiuc.edu>
27 *
28 *  Generic LCD support written by Daniel Mantione, ported from 2.4.20 by Alex Kern
29 *  Many Thanks to Ville Syrj��l�� for patches and fixing nasting 16 bit color bug.
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 for
33 *  more details.
34 *
35 *  Many thanks to Nitya from ATI devrel for support and patience !
36 */
37
38/******************************************************************************
39
40  TODO:
41
42    - cursor support on all cards and all ramdacs.
43    - cursor parameters controlable via ioctl()s.
44    - guess PLL and MCLK based on the original PLL register values initialized
45      by Open Firmware (if they are initialized). BIOS is done
46
47    (Anyone with Mac to help with this?)
48
49******************************************************************************/
50
51
52#include <linux/module.h>
53#include <linux/moduleparam.h>
54#include <linux/kernel.h>
55#include <linux/errno.h>
56#include <linux/string.h>
57#include <linux/mm.h>
58#include <linux/slab.h>
59#include <linux/vmalloc.h>
60#include <linux/delay.h>
61#include <linux/compiler.h>
62#include <linux/console.h>
63#include <linux/fb.h>
64#include <linux/init.h>
65#include <linux/pci.h>
66#include <linux/interrupt.h>
67#include <linux/spinlock.h>
68#include <linux/wait.h>
69#include <linux/backlight.h>
70#include <linux/reboot.h>
71#include <linux/dmi.h>
72
73#include <asm/io.h>
74#include <linux/uaccess.h>
75
76#include <video/mach64.h>
77#include "atyfb.h"
78#include "ati_ids.h"
79
80#ifdef __powerpc__
81#include <asm/machdep.h>
82#include <asm/prom.h>
83#include "../macmodes.h"
84#endif
85#ifdef __sparc__
86#include <asm/fbio.h>
87#include <asm/oplib.h>
88#include <asm/prom.h>
89#endif
90
91#ifdef CONFIG_ADB_PMU
92#include <linux/adb.h>
93#include <linux/pmu.h>
94#endif
95#ifdef CONFIG_BOOTX_TEXT
96#include <asm/btext.h>
97#endif
98#ifdef CONFIG_PMAC_BACKLIGHT
99#include <asm/backlight.h>
100#endif
101
102/*
103 * Debug flags.
104 */
105#undef DEBUG
106/*#define DEBUG*/
107
108/* Make sure n * PAGE_SIZE is protected at end of Aperture for GUI-regs */
109/*  - must be large enough to catch all GUI-Regs   */
110/*  - must be aligned to a PAGE boundary           */
111#define GUI_RESERVE	(1 * PAGE_SIZE)
112
113/* FIXME: remove the FAIL definition */
114#define FAIL(msg) do { \
115	if (!(var->activate & FB_ACTIVATE_TEST)) \
116		printk(KERN_CRIT "atyfb: " msg "\n"); \
117	return -EINVAL; \
118} while (0)
119#define FAIL_MAX(msg, x, _max_) do { \
120	if (x > _max_) { \
121		if (!(var->activate & FB_ACTIVATE_TEST)) \
122			printk(KERN_CRIT "atyfb: " msg " %x(%x)\n", x, _max_); \
123		return -EINVAL; \
124	} \
125} while (0)
126#ifdef DEBUG
127#define DPRINTK(fmt, args...)	printk(KERN_DEBUG "atyfb: " fmt, ## args)
128#else
129#define DPRINTK(fmt, args...)
130#endif
131
132#define PRINTKI(fmt, args...)	printk(KERN_INFO "atyfb: " fmt, ## args)
133#define PRINTKE(fmt, args...)	printk(KERN_ERR "atyfb: " fmt, ## args)
134
135#if defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || \
136defined (CONFIG_FB_ATY_GENERIC_LCD) || defined(CONFIG_FB_ATY_BACKLIGHT)
137static const u32 lt_lcd_regs[] = {
138	CNFG_PANEL_LG,
139	LCD_GEN_CNTL_LG,
140	DSTN_CONTROL_LG,
141	HFB_PITCH_ADDR_LG,
142	HORZ_STRETCHING_LG,
143	VERT_STRETCHING_LG,
144	0, /* EXT_VERT_STRETCH */
145	LT_GIO_LG,
146	POWER_MANAGEMENT_LG
147};
148
149void aty_st_lcd(int index, u32 val, const struct atyfb_par *par)
150{
151	if (M64_HAS(LT_LCD_REGS)) {
152		aty_st_le32(lt_lcd_regs[index], val, par);
153	} else {
154		unsigned long temp;
155
156		/* write addr byte */
157		temp = aty_ld_le32(LCD_INDEX, par);
158		aty_st_le32(LCD_INDEX, (temp & ~LCD_INDEX_MASK) | index, par);
159		/* write the register value */
160		aty_st_le32(LCD_DATA, val, par);
161	}
162}
163
164u32 aty_ld_lcd(int index, const struct atyfb_par *par)
165{
166	if (M64_HAS(LT_LCD_REGS)) {
167		return aty_ld_le32(lt_lcd_regs[index], par);
168	} else {
169		unsigned long temp;
170
171		/* write addr byte */
172		temp = aty_ld_le32(LCD_INDEX, par);
173		aty_st_le32(LCD_INDEX, (temp & ~LCD_INDEX_MASK) | index, par);
174		/* read the register value */
175		return aty_ld_le32(LCD_DATA, par);
176	}
177}
178#endif /* defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || defined (CONFIG_FB_ATY_GENERIC_LCD) */
179
180#ifdef CONFIG_FB_ATY_GENERIC_LCD
181/*
182 * ATIReduceRatio --
183 *
184 * Reduce a fraction by factoring out the largest common divider of the
185 * fraction's numerator and denominator.
186 */
187static void ATIReduceRatio(int *Numerator, int *Denominator)
188{
189	int Multiplier, Divider, Remainder;
190
191	Multiplier = *Numerator;
192	Divider = *Denominator;
193
194	while ((Remainder = Multiplier % Divider)) {
195		Multiplier = Divider;
196		Divider = Remainder;
197	}
198
199	*Numerator /= Divider;
200	*Denominator /= Divider;
201}
202#endif
203/*
204 * The Hardware parameters for each card
205 */
206
207struct pci_mmap_map {
208	unsigned long voff;
209	unsigned long poff;
210	unsigned long size;
211	unsigned long prot_flag;
212	unsigned long prot_mask;
213};
214
215static struct fb_fix_screeninfo atyfb_fix = {
216	.id		= "ATY Mach64",
217	.type		= FB_TYPE_PACKED_PIXELS,
218	.visual		= FB_VISUAL_PSEUDOCOLOR,
219	.xpanstep	= 8,
220	.ypanstep	= 1,
221};
222
223/*
224 * Frame buffer device API
225 */
226
227static int atyfb_open(struct fb_info *info, int user);
228static int atyfb_release(struct fb_info *info, int user);
229static int atyfb_check_var(struct fb_var_screeninfo *var,
230			   struct fb_info *info);
231static int atyfb_set_par(struct fb_info *info);
232static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
233			   u_int transp, struct fb_info *info);
234static int atyfb_pan_display(struct fb_var_screeninfo *var,
235			     struct fb_info *info);
236static int atyfb_blank(int blank, struct fb_info *info);
237static int atyfb_ioctl(struct fb_info *info, u_int cmd, u_long arg);
238#ifdef __sparc__
239static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma);
240#endif
241static int atyfb_sync(struct fb_info *info);
242
243/*
244 * Internal routines
245 */
246
247static int aty_init(struct fb_info *info);
248
249static void aty_get_crtc(const struct atyfb_par *par, struct crtc *crtc);
250
251static void aty_set_crtc(const struct atyfb_par *par, const struct crtc *crtc);
252static int aty_var_to_crtc(const struct fb_info *info,
253			   const struct fb_var_screeninfo *var,
254			   struct crtc *crtc);
255static int aty_crtc_to_var(const struct crtc *crtc,
256			   struct fb_var_screeninfo *var);
257static void set_off_pitch(struct atyfb_par *par, const struct fb_info *info);
258#ifdef CONFIG_PPC
259static int read_aty_sense(const struct atyfb_par *par);
260#endif
261
262static DEFINE_MUTEX(reboot_lock);
263static struct fb_info *reboot_info;
264
265/*
266 * Interface used by the world
267 */
268
269static struct fb_var_screeninfo default_var = {
270	/* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
271	640, 480, 640, 480, 0, 0, 8, 0,
272	{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
273	0, 0, -1, -1, 0, 39722, 48, 16, 33, 10, 96, 2,
274	0, FB_VMODE_NONINTERLACED
275};
276
277static struct fb_videomode defmode = {
278	/* 640x480 @ 60 Hz, 31.5 kHz hsync */
279	NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,
280	0, FB_VMODE_NONINTERLACED
281};
282
283static struct fb_ops atyfb_ops = {
284	.owner		= THIS_MODULE,
285	.fb_open	= atyfb_open,
286	.fb_release	= atyfb_release,
287	.fb_check_var	= atyfb_check_var,
288	.fb_set_par	= atyfb_set_par,
289	.fb_setcolreg	= atyfb_setcolreg,
290	.fb_pan_display	= atyfb_pan_display,
291	.fb_blank	= atyfb_blank,
292	.fb_ioctl	= atyfb_ioctl,
293	.fb_fillrect	= atyfb_fillrect,
294	.fb_copyarea	= atyfb_copyarea,
295	.fb_imageblit	= atyfb_imageblit,
296#ifdef __sparc__
297	.fb_mmap	= atyfb_mmap,
298#endif
299	.fb_sync	= atyfb_sync,
300};
301
302static bool noaccel;
303static bool nomtrr;
304static int vram;
305static int pll;
306static int mclk;
307static int xclk;
308static int comp_sync = -1;
309static char *mode;
310
311#ifdef CONFIG_PMAC_BACKLIGHT
312static int backlight = 1;
313#else
314static int backlight = 0;
315#endif
316
317#ifdef CONFIG_PPC
318static int default_vmode = VMODE_CHOOSE;
319static int default_cmode = CMODE_CHOOSE;
320
321module_param_named(vmode, default_vmode, int, 0);
322MODULE_PARM_DESC(vmode, "int: video mode for mac");
323module_param_named(cmode, default_cmode, int, 0);
324MODULE_PARM_DESC(cmode, "int: color mode for mac");
325#endif
326
327#ifdef CONFIG_ATARI
328static unsigned int mach64_count = 0;
329static unsigned long phys_vmembase[FB_MAX] = { 0, };
330static unsigned long phys_size[FB_MAX] = { 0, };
331static unsigned long phys_guiregbase[FB_MAX] = { 0, };
332#endif
333
334/* top -> down is an evolution of mach64 chipset, any corrections? */
335#define ATI_CHIP_88800GX   (M64F_GX)
336#define ATI_CHIP_88800CX   (M64F_GX)
337
338#define ATI_CHIP_264CT     (M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO)
339#define ATI_CHIP_264ET     (M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO)
340
341#define ATI_CHIP_264VT     (M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_MAGIC_FIFO)
342#define ATI_CHIP_264GT     (M64F_GT | M64F_INTEGRATED               | M64F_MAGIC_FIFO | M64F_EXTRA_BRIGHT)
343
344#define ATI_CHIP_264VTB    (M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP)
345#define ATI_CHIP_264VT3    (M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL)
346#define ATI_CHIP_264VT4    (M64F_VT | M64F_INTEGRATED               | M64F_GTB_DSP)
347
348/* FIXME what is this chip? */
349#define ATI_CHIP_264LT     (M64F_GT | M64F_INTEGRATED               | M64F_GTB_DSP)
350
351/* make sets shorter */
352#define ATI_MODERN_SET     (M64F_GT | M64F_INTEGRATED               | M64F_GTB_DSP | M64F_EXTRA_BRIGHT)
353
354#define ATI_CHIP_264GTB    (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL)
355/*#define ATI_CHIP_264GTDVD  ?*/
356#define ATI_CHIP_264LTG    (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL)
357
358#define ATI_CHIP_264GT2C   (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL | M64F_HW_TRIPLE)
359#define ATI_CHIP_264GTPRO  (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D)
360#define ATI_CHIP_264LTPRO  (ATI_MODERN_SET | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D)
361
362#define ATI_CHIP_264XL     (ATI_MODERN_SET | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D | M64F_XL_DLL | M64F_MFB_FORCE_4 | M64F_XL_MEM)
363#define ATI_CHIP_MOBILITY  (ATI_MODERN_SET | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D | M64F_XL_DLL | M64F_MFB_FORCE_4 | M64F_XL_MEM | M64F_MOBIL_BUS)
364
365static struct {
366	u16 pci_id;
367	const char *name;
368	int pll, mclk, xclk, ecp_max;
369	u32 features;
370} aty_chips[] = {
371#ifdef CONFIG_FB_ATY_GX
372	/* Mach64 GX */
373	{ PCI_CHIP_MACH64GX, "ATI888GX00 (Mach64 GX)", 135, 50, 50, 0, ATI_CHIP_88800GX },
374	{ PCI_CHIP_MACH64CX, "ATI888CX00 (Mach64 CX)", 135, 50, 50, 0, ATI_CHIP_88800CX },
375#endif /* CONFIG_FB_ATY_GX */
376
377#ifdef CONFIG_FB_ATY_CT
378	{ PCI_CHIP_MACH64CT, "ATI264CT (Mach64 CT)", 135, 60, 60, 0, ATI_CHIP_264CT },
379	{ PCI_CHIP_MACH64ET, "ATI264ET (Mach64 ET)", 135, 60, 60, 0, ATI_CHIP_264ET },
380
381	/* FIXME what is this chip? */
382	{ PCI_CHIP_MACH64LT, "ATI264LT (Mach64 LT)", 135, 63, 63, 0, ATI_CHIP_264LT },
383
384	{ PCI_CHIP_MACH64VT, "ATI264VT (Mach64 VT)", 170, 67, 67, 80, ATI_CHIP_264VT },
385	{ PCI_CHIP_MACH64GT, "3D RAGE (Mach64 GT)", 135, 63, 63, 80, ATI_CHIP_264GT },
386
387	{ PCI_CHIP_MACH64VU, "ATI264VT3 (Mach64 VU)", 200, 67, 67, 80, ATI_CHIP_264VT3 },
388	{ PCI_CHIP_MACH64GU, "3D RAGE II+ (Mach64 GU)", 200, 67, 67, 100, ATI_CHIP_264GTB },
389
390	{ PCI_CHIP_MACH64LG, "3D RAGE LT (Mach64 LG)", 230, 63, 63, 100, ATI_CHIP_264LTG | M64F_LT_LCD_REGS | M64F_G3_PB_1024x768 },
391
392	{ PCI_CHIP_MACH64VV, "ATI264VT4 (Mach64 VV)", 230, 83, 83, 100, ATI_CHIP_264VT4 },
393
394	{ PCI_CHIP_MACH64GV, "3D RAGE IIC (Mach64 GV, PCI)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
395	{ PCI_CHIP_MACH64GW, "3D RAGE IIC (Mach64 GW, AGP)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
396	{ PCI_CHIP_MACH64GY, "3D RAGE IIC (Mach64 GY, PCI)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
397	{ PCI_CHIP_MACH64GZ, "3D RAGE IIC (Mach64 GZ, AGP)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
398
399	{ PCI_CHIP_MACH64GB, "3D RAGE PRO (Mach64 GB, BGA, AGP)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
400	{ PCI_CHIP_MACH64GD, "3D RAGE PRO (Mach64 GD, BGA, AGP 1x)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
401	{ PCI_CHIP_MACH64GI, "3D RAGE PRO (Mach64 GI, BGA, PCI)", 230, 100, 100, 125, ATI_CHIP_264GTPRO | M64F_MAGIC_VRAM_SIZE },
402	{ PCI_CHIP_MACH64GP, "3D RAGE PRO (Mach64 GP, PQFP, PCI)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
403	{ PCI_CHIP_MACH64GQ, "3D RAGE PRO (Mach64 GQ, PQFP, PCI, limited 3D)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
404
405	{ PCI_CHIP_MACH64LB, "3D RAGE LT PRO (Mach64 LB, AGP)", 236, 75, 100, 135, ATI_CHIP_264LTPRO },
406	{ PCI_CHIP_MACH64LD, "3D RAGE LT PRO (Mach64 LD, AGP)", 230, 100, 100, 135, ATI_CHIP_264LTPRO },
407	{ PCI_CHIP_MACH64LI, "3D RAGE LT PRO (Mach64 LI, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 },
408	{ PCI_CHIP_MACH64LP, "3D RAGE LT PRO (Mach64 LP, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1024x768 },
409	{ PCI_CHIP_MACH64LQ, "3D RAGE LT PRO (Mach64 LQ, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO },
410
411	{ PCI_CHIP_MACH64GM, "3D RAGE XL (Mach64 GM, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL },
412	{ PCI_CHIP_MACH64GN, "3D RAGE XC (Mach64 GN, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL },
413	{ PCI_CHIP_MACH64GO, "3D RAGE XL (Mach64 GO, PCI-66)", 230, 83, 63, 135, ATI_CHIP_264XL },
414	{ PCI_CHIP_MACH64GL, "3D RAGE XC (Mach64 GL, PCI-66)", 230, 83, 63, 135, ATI_CHIP_264XL },
415	{ PCI_CHIP_MACH64GR, "3D RAGE XL (Mach64 GR, PCI-33)", 230, 83, 63, 135, ATI_CHIP_264XL | M64F_SDRAM_MAGIC_PLL },
416	{ PCI_CHIP_MACH64GS, "3D RAGE XC (Mach64 GS, PCI-33)", 230, 83, 63, 135, ATI_CHIP_264XL },
417
418	{ PCI_CHIP_MACH64LM, "3D RAGE Mobility P/M (Mach64 LM, AGP 2x)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
419	{ PCI_CHIP_MACH64LN, "3D RAGE Mobility L (Mach64 LN, AGP 2x)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
420	{ PCI_CHIP_MACH64LR, "3D RAGE Mobility P/M (Mach64 LR, PCI)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
421	{ PCI_CHIP_MACH64LS, "3D RAGE Mobility L (Mach64 LS, PCI)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
422#endif /* CONFIG_FB_ATY_CT */
423};
424
425/*
426 * Last page of 8 MB (4 MB on ISA) aperture is MMIO,
427 * unless the auxiliary register aperture is used.
428 */
429static void aty_fudge_framebuffer_len(struct fb_info *info)
430{
431	struct atyfb_par *par = (struct atyfb_par *) info->par;
432
433	if (!par->aux_start &&
434	    (info->fix.smem_len == 0x800000 ||
435	     (par->bus_type == ISA && info->fix.smem_len == 0x400000)))
436		info->fix.smem_len -= GUI_RESERVE;
437}
438
439static int correct_chipset(struct atyfb_par *par)
440{
441	u8 rev;
442	u16 type;
443	u32 chip_id;
444	const char *name;
445	int i;
446
447	for (i = (int)ARRAY_SIZE(aty_chips) - 1; i >= 0; i--)
448		if (par->pci_id == aty_chips[i].pci_id)
449			break;
450
451	if (i < 0)
452		return -ENODEV;
453
454	name = aty_chips[i].name;
455	par->pll_limits.pll_max = aty_chips[i].pll;
456	par->pll_limits.mclk = aty_chips[i].mclk;
457	par->pll_limits.xclk = aty_chips[i].xclk;
458	par->pll_limits.ecp_max = aty_chips[i].ecp_max;
459	par->features = aty_chips[i].features;
460
461	chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
462	type = chip_id & CFG_CHIP_TYPE;
463	rev = (chip_id & CFG_CHIP_REV) >> 24;
464
465	switch (par->pci_id) {
466#ifdef CONFIG_FB_ATY_GX
467	case PCI_CHIP_MACH64GX:
468		if (type != 0x00d7)
469			return -ENODEV;
470		break;
471	case PCI_CHIP_MACH64CX:
472		if (type != 0x0057)
473			return -ENODEV;
474		break;
475#endif
476#ifdef CONFIG_FB_ATY_CT
477	case PCI_CHIP_MACH64VT:
478		switch (rev & 0x07) {
479		case 0x00:
480			switch (rev & 0xc0) {
481			case 0x00:
482				name = "ATI264VT (A3) (Mach64 VT)";
483				par->pll_limits.pll_max = 170;
484				par->pll_limits.mclk = 67;
485				par->pll_limits.xclk = 67;
486				par->pll_limits.ecp_max = 80;
487				par->features = ATI_CHIP_264VT;
488				break;
489			case 0x40:
490				name = "ATI264VT2 (A4) (Mach64 VT)";
491				par->pll_limits.pll_max = 200;
492				par->pll_limits.mclk = 67;
493				par->pll_limits.xclk = 67;
494				par->pll_limits.ecp_max = 80;
495				par->features = ATI_CHIP_264VT | M64F_MAGIC_POSTDIV;
496				break;
497			}
498			break;
499		case 0x01:
500			name = "ATI264VT3 (B1) (Mach64 VT)";
501			par->pll_limits.pll_max = 200;
502			par->pll_limits.mclk = 67;
503			par->pll_limits.xclk = 67;
504			par->pll_limits.ecp_max = 80;
505			par->features = ATI_CHIP_264VTB;
506			break;
507		case 0x02:
508			name = "ATI264VT3 (B2) (Mach64 VT)";
509			par->pll_limits.pll_max = 200;
510			par->pll_limits.mclk = 67;
511			par->pll_limits.xclk = 67;
512			par->pll_limits.ecp_max = 80;
513			par->features = ATI_CHIP_264VT3;
514			break;
515		}
516		break;
517	case PCI_CHIP_MACH64GT:
518		switch (rev & 0x07) {
519		case 0x01:
520			name = "3D RAGE II (Mach64 GT)";
521			par->pll_limits.pll_max = 170;
522			par->pll_limits.mclk = 67;
523			par->pll_limits.xclk = 67;
524			par->pll_limits.ecp_max = 80;
525			par->features = ATI_CHIP_264GTB;
526			break;
527		case 0x02:
528			name = "3D RAGE II+ (Mach64 GT)";
529			par->pll_limits.pll_max = 200;
530			par->pll_limits.mclk = 67;
531			par->pll_limits.xclk = 67;
532			par->pll_limits.ecp_max = 100;
533			par->features = ATI_CHIP_264GTB;
534			break;
535		}
536		break;
537#endif
538	}
539
540	PRINTKI("%s [0x%04x rev 0x%02x]\n", name, type, rev);
541	return 0;
542}
543
544static char ram_dram[] __maybe_unused = "DRAM";
545static char ram_resv[] __maybe_unused = "RESV";
546#ifdef CONFIG_FB_ATY_GX
547static char ram_vram[] = "VRAM";
548#endif /* CONFIG_FB_ATY_GX */
549#ifdef CONFIG_FB_ATY_CT
550static char ram_edo[] = "EDO";
551static char ram_sdram[] = "SDRAM (1:1)";
552static char ram_sgram[] = "SGRAM (1:1)";
553static char ram_sdram32[] = "SDRAM (2:1) (32-bit)";
554static char ram_wram[] = "WRAM";
555static char ram_off[] = "OFF";
556#endif /* CONFIG_FB_ATY_CT */
557
558
559#ifdef CONFIG_FB_ATY_GX
560static char *aty_gx_ram[8] = {
561	ram_dram, ram_vram, ram_vram, ram_dram,
562	ram_dram, ram_vram, ram_vram, ram_resv
563};
564#endif /* CONFIG_FB_ATY_GX */
565
566#ifdef CONFIG_FB_ATY_CT
567static char *aty_ct_ram[8] = {
568	ram_off, ram_dram, ram_edo, ram_edo,
569	ram_sdram, ram_sgram, ram_wram, ram_resv
570};
571static char *aty_xl_ram[8] = {
572	ram_off, ram_dram, ram_edo, ram_edo,
573	ram_sdram, ram_sgram, ram_sdram32, ram_resv
574};
575#endif /* CONFIG_FB_ATY_CT */
576
577static u32 atyfb_get_pixclock(struct fb_var_screeninfo *var,
578			      struct atyfb_par *par)
579{
580	u32 pixclock = var->pixclock;
581#ifdef CONFIG_FB_ATY_GENERIC_LCD
582	u32 lcd_on_off;
583	par->pll.ct.xres = 0;
584	if (par->lcd_table != 0) {
585		lcd_on_off = aty_ld_lcd(LCD_GEN_CNTL, par);
586		if (lcd_on_off & LCD_ON) {
587			par->pll.ct.xres = var->xres;
588			pixclock = par->lcd_pixclock;
589		}
590	}
591#endif
592	return pixclock;
593}
594
595#if defined(CONFIG_PPC)
596
597/*
598 * Apple monitor sense
599 */
600
601static int read_aty_sense(const struct atyfb_par *par)
602{
603	int sense, i;
604
605	aty_st_le32(GP_IO, 0x31003100, par); /* drive outputs high */
606	__delay(200);
607	aty_st_le32(GP_IO, 0, par); /* turn off outputs */
608	__delay(2000);
609	i = aty_ld_le32(GP_IO, par); /* get primary sense value */
610	sense = ((i & 0x3000) >> 3) | (i & 0x100);
611
612	/* drive each sense line low in turn and collect the other 2 */
613	aty_st_le32(GP_IO, 0x20000000, par); /* drive A low */
614	__delay(2000);
615	i = aty_ld_le32(GP_IO, par);
616	sense |= ((i & 0x1000) >> 7) | ((i & 0x100) >> 4);
617	aty_st_le32(GP_IO, 0x20002000, par); /* drive A high again */
618	__delay(200);
619
620	aty_st_le32(GP_IO, 0x10000000, par); /* drive B low */
621	__delay(2000);
622	i = aty_ld_le32(GP_IO, par);
623	sense |= ((i & 0x2000) >> 10) | ((i & 0x100) >> 6);
624	aty_st_le32(GP_IO, 0x10001000, par); /* drive B high again */
625	__delay(200);
626
627	aty_st_le32(GP_IO, 0x01000000, par); /* drive C low */
628	__delay(2000);
629	sense |= (aty_ld_le32(GP_IO, par) & 0x3000) >> 12;
630	aty_st_le32(GP_IO, 0, par); /* turn off outputs */
631	return sense;
632}
633
634#endif /* defined(CONFIG_PPC) */
635
636/* ------------------------------------------------------------------------- */
637
638/*
639 * CRTC programming
640 */
641
642static void aty_get_crtc(const struct atyfb_par *par, struct crtc *crtc)
643{
644#ifdef CONFIG_FB_ATY_GENERIC_LCD
645	if (par->lcd_table != 0) {
646		if (!M64_HAS(LT_LCD_REGS)) {
647			crtc->lcd_index = aty_ld_le32(LCD_INDEX, par);
648			aty_st_le32(LCD_INDEX, crtc->lcd_index, par);
649		}
650		crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par);
651		crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par);
652
653
654		/* switch to non shadow registers */
655		aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl &
656			   ~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par);
657
658		/* save stretching */
659		crtc->horz_stretching = aty_ld_lcd(HORZ_STRETCHING, par);
660		crtc->vert_stretching = aty_ld_lcd(VERT_STRETCHING, par);
661		if (!M64_HAS(LT_LCD_REGS))
662			crtc->ext_vert_stretch = aty_ld_lcd(EXT_VERT_STRETCH, par);
663	}
664#endif
665	crtc->h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, par);
666	crtc->h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, par);
667	crtc->v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, par);
668	crtc->v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, par);
669	crtc->vline_crnt_vline = aty_ld_le32(CRTC_VLINE_CRNT_VLINE, par);
670	crtc->off_pitch = aty_ld_le32(CRTC_OFF_PITCH, par);
671	crtc->gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par);
672
673#ifdef CONFIG_FB_ATY_GENERIC_LCD
674	if (par->lcd_table != 0) {
675		/* switch to shadow registers */
676		aty_st_lcd(LCD_GEN_CNTL, (crtc->lcd_gen_cntl & ~CRTC_RW_SELECT) |
677			   SHADOW_EN | SHADOW_RW_EN, par);
678
679		crtc->shadow_h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, par);
680		crtc->shadow_h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, par);
681		crtc->shadow_v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, par);
682		crtc->shadow_v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, par);
683
684		aty_st_le32(LCD_GEN_CNTL, crtc->lcd_gen_cntl, par);
685	}
686#endif /* CONFIG_FB_ATY_GENERIC_LCD */
687}
688
689static void aty_set_crtc(const struct atyfb_par *par, const struct crtc *crtc)
690{
691#ifdef CONFIG_FB_ATY_GENERIC_LCD
692	if (par->lcd_table != 0) {
693		/* stop CRTC */
694		aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl &
695			    ~(CRTC_EXT_DISP_EN | CRTC_EN), par);
696
697		/* update non-shadow registers first */
698		aty_st_lcd(CNFG_PANEL, crtc->lcd_config_panel, par);
699		aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl &
700			   ~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par);
701
702		/* temporarily disable stretching */
703		aty_st_lcd(HORZ_STRETCHING, crtc->horz_stretching &
704			   ~(HORZ_STRETCH_MODE | HORZ_STRETCH_EN), par);
705		aty_st_lcd(VERT_STRETCHING, crtc->vert_stretching &
706			   ~(VERT_STRETCH_RATIO1 | VERT_STRETCH_RATIO2 |
707			     VERT_STRETCH_USE0 | VERT_STRETCH_EN), par);
708	}
709#endif
710	/* turn off CRT */
711	aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl & ~CRTC_EN, par);
712
713	DPRINTK("setting up CRTC\n");
714	DPRINTK("set primary CRT to %ix%i %c%c composite %c\n",
715		((((crtc->h_tot_disp >> 16) & 0xff) + 1) << 3),
716		(((crtc->v_tot_disp >> 16) & 0x7ff) + 1),
717		(crtc->h_sync_strt_wid & 0x200000) ? 'N' : 'P',
718		(crtc->v_sync_strt_wid & 0x200000) ? 'N' : 'P',
719		(crtc->gen_cntl & CRTC_CSYNC_EN) ? 'P' : 'N');
720
721	DPRINTK("CRTC_H_TOTAL_DISP: %x\n", crtc->h_tot_disp);
722	DPRINTK("CRTC_H_SYNC_STRT_WID: %x\n", crtc->h_sync_strt_wid);
723	DPRINTK("CRTC_V_TOTAL_DISP: %x\n", crtc->v_tot_disp);
724	DPRINTK("CRTC_V_SYNC_STRT_WID: %x\n", crtc->v_sync_strt_wid);
725	DPRINTK("CRTC_OFF_PITCH: %x\n", crtc->off_pitch);
726	DPRINTK("CRTC_VLINE_CRNT_VLINE: %x\n", crtc->vline_crnt_vline);
727	DPRINTK("CRTC_GEN_CNTL: %x\n", crtc->gen_cntl);
728
729	aty_st_le32(CRTC_H_TOTAL_DISP, crtc->h_tot_disp, par);
730	aty_st_le32(CRTC_H_SYNC_STRT_WID, crtc->h_sync_strt_wid, par);
731	aty_st_le32(CRTC_V_TOTAL_DISP, crtc->v_tot_disp, par);
732	aty_st_le32(CRTC_V_SYNC_STRT_WID, crtc->v_sync_strt_wid, par);
733	aty_st_le32(CRTC_OFF_PITCH, crtc->off_pitch, par);
734	aty_st_le32(CRTC_VLINE_CRNT_VLINE, crtc->vline_crnt_vline, par);
735
736	aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl, par);
737#if 0
738	FIXME
739	if (par->accel_flags & FB_ACCELF_TEXT)
740		aty_init_engine(par, info);
741#endif
742#ifdef CONFIG_FB_ATY_GENERIC_LCD
743	/* after setting the CRTC registers we should set the LCD registers. */
744	if (par->lcd_table != 0) {
745		/* switch to shadow registers */
746		aty_st_lcd(LCD_GEN_CNTL, (crtc->lcd_gen_cntl & ~CRTC_RW_SELECT) |
747			   SHADOW_EN | SHADOW_RW_EN, par);
748
749		DPRINTK("set shadow CRT to %ix%i %c%c\n",
750			((((crtc->shadow_h_tot_disp >> 16) & 0xff) + 1) << 3),
751			(((crtc->shadow_v_tot_disp >> 16) & 0x7ff) + 1),
752			(crtc->shadow_h_sync_strt_wid & 0x200000) ? 'N' : 'P',
753			(crtc->shadow_v_sync_strt_wid & 0x200000) ? 'N' : 'P');
754
755		DPRINTK("SHADOW CRTC_H_TOTAL_DISP: %x\n",
756			crtc->shadow_h_tot_disp);
757		DPRINTK("SHADOW CRTC_H_SYNC_STRT_WID: %x\n",
758			crtc->shadow_h_sync_strt_wid);
759		DPRINTK("SHADOW CRTC_V_TOTAL_DISP: %x\n",
760			crtc->shadow_v_tot_disp);
761		DPRINTK("SHADOW CRTC_V_SYNC_STRT_WID: %x\n",
762			crtc->shadow_v_sync_strt_wid);
763
764		aty_st_le32(CRTC_H_TOTAL_DISP, crtc->shadow_h_tot_disp, par);
765		aty_st_le32(CRTC_H_SYNC_STRT_WID, crtc->shadow_h_sync_strt_wid, par);
766		aty_st_le32(CRTC_V_TOTAL_DISP, crtc->shadow_v_tot_disp, par);
767		aty_st_le32(CRTC_V_SYNC_STRT_WID, crtc->shadow_v_sync_strt_wid, par);
768
769		/* restore CRTC selection & shadow state and enable stretching */
770		DPRINTK("LCD_GEN_CNTL: %x\n", crtc->lcd_gen_cntl);
771		DPRINTK("HORZ_STRETCHING: %x\n", crtc->horz_stretching);
772		DPRINTK("VERT_STRETCHING: %x\n", crtc->vert_stretching);
773		if (!M64_HAS(LT_LCD_REGS))
774			DPRINTK("EXT_VERT_STRETCH: %x\n", crtc->ext_vert_stretch);
775
776		aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl, par);
777		aty_st_lcd(HORZ_STRETCHING, crtc->horz_stretching, par);
778		aty_st_lcd(VERT_STRETCHING, crtc->vert_stretching, par);
779		if (!M64_HAS(LT_LCD_REGS)) {
780			aty_st_lcd(EXT_VERT_STRETCH, crtc->ext_vert_stretch, par);
781			aty_ld_le32(LCD_INDEX, par);
782			aty_st_le32(LCD_INDEX, crtc->lcd_index, par);
783		}
784	}
785#endif /* CONFIG_FB_ATY_GENERIC_LCD */
786}
787
788static u32 calc_line_length(struct atyfb_par *par, u32 vxres, u32 bpp)
789{
790	u32 line_length = vxres * bpp / 8;
791
792	if (par->ram_type == SGRAM ||
793	    (!M64_HAS(XL_MEM) && par->ram_type == WRAM))
794		line_length = (line_length + 63) & ~63;
795
796	return line_length;
797}
798
799static int aty_var_to_crtc(const struct fb_info *info,
800			   const struct fb_var_screeninfo *var,
801			   struct crtc *crtc)
802{
803	struct atyfb_par *par = (struct atyfb_par *) info->par;
804	u32 xres, yres, vxres, vyres, xoffset, yoffset, bpp;
805	u32 sync, vmode, vdisplay;
806	u32 h_total, h_disp, h_sync_strt, h_sync_end, h_sync_dly, h_sync_wid, h_sync_pol;
807	u32 v_total, v_disp, v_sync_strt, v_sync_end, v_sync_wid, v_sync_pol, c_sync;
808	u32 pix_width, dp_pix_width, dp_chain_mask;
809	u32 line_length;
810
811	/* input */
812	xres = (var->xres + 7) & ~7;
813	yres = var->yres;
814	vxres = (var->xres_virtual + 7) & ~7;
815	vyres = var->yres_virtual;
816	xoffset = (var->xoffset + 7) & ~7;
817	yoffset = var->yoffset;
818	bpp = var->bits_per_pixel;
819	if (bpp == 16)
820		bpp = (var->green.length == 5) ? 15 : 16;
821	sync = var->sync;
822	vmode = var->vmode;
823
824	/* convert (and round up) and validate */
825	if (vxres < xres + xoffset)
826		vxres = xres + xoffset;
827	h_disp = xres;
828
829	if (vyres < yres + yoffset)
830		vyres = yres + yoffset;
831	v_disp = yres;
832
833	if (bpp <= 8) {
834		bpp = 8;
835		pix_width = CRTC_PIX_WIDTH_8BPP;
836		dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP |
837			BYTE_ORDER_LSB_TO_MSB;
838		dp_chain_mask = DP_CHAIN_8BPP;
839	} else if (bpp <= 15) {
840		bpp = 16;
841		pix_width = CRTC_PIX_WIDTH_15BPP;
842		dp_pix_width = HOST_15BPP | SRC_15BPP | DST_15BPP |
843			BYTE_ORDER_LSB_TO_MSB;
844		dp_chain_mask = DP_CHAIN_15BPP;
845	} else if (bpp <= 16) {
846		bpp = 16;
847		pix_width = CRTC_PIX_WIDTH_16BPP;
848		dp_pix_width = HOST_16BPP | SRC_16BPP | DST_16BPP |
849			BYTE_ORDER_LSB_TO_MSB;
850		dp_chain_mask = DP_CHAIN_16BPP;
851	} else if (bpp <= 24 && M64_HAS(INTEGRATED)) {
852		bpp = 24;
853		pix_width = CRTC_PIX_WIDTH_24BPP;
854		dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP |
855			BYTE_ORDER_LSB_TO_MSB;
856		dp_chain_mask = DP_CHAIN_24BPP;
857	} else if (bpp <= 32) {
858		bpp = 32;
859		pix_width = CRTC_PIX_WIDTH_32BPP;
860		dp_pix_width = HOST_32BPP | SRC_32BPP | DST_32BPP |
861			BYTE_ORDER_LSB_TO_MSB;
862		dp_chain_mask = DP_CHAIN_32BPP;
863	} else
864		FAIL("invalid bpp");
865
866	line_length = calc_line_length(par, vxres, bpp);
867
868	if (vyres * line_length > info->fix.smem_len)
869		FAIL("not enough video RAM");
870
871	h_sync_pol = sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
872	v_sync_pol = sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
873
874	if ((xres > 1920) || (yres > 1200)) {
875		FAIL("MACH64 chips are designed for max 1920x1200\n"
876		     "select another resolution.");
877	}
878	h_sync_strt = h_disp + var->right_margin;
879	h_sync_end = h_sync_strt + var->hsync_len;
880	h_sync_dly  = var->right_margin & 7;
881	h_total = h_sync_end + h_sync_dly + var->left_margin;
882
883	v_sync_strt = v_disp + var->lower_margin;
884	v_sync_end = v_sync_strt + var->vsync_len;
885	v_total = v_sync_end + var->upper_margin;
886
887#ifdef CONFIG_FB_ATY_GENERIC_LCD
888	if (par->lcd_table != 0) {
889		if (!M64_HAS(LT_LCD_REGS)) {
890			u32 lcd_index = aty_ld_le32(LCD_INDEX, par);
891			crtc->lcd_index = lcd_index &
892				~(LCD_INDEX_MASK | LCD_DISPLAY_DIS |
893				  LCD_SRC_SEL | CRTC2_DISPLAY_DIS);
894			aty_st_le32(LCD_INDEX, lcd_index, par);
895		}
896
897		if (!M64_HAS(MOBIL_BUS))
898			crtc->lcd_index |= CRTC2_DISPLAY_DIS;
899
900		crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par) | 0x4000;
901		crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par) & ~CRTC_RW_SELECT;
902
903		crtc->lcd_gen_cntl &=
904			~(HORZ_DIVBY2_EN | DIS_HOR_CRT_DIVBY2 | TVCLK_PM_EN |
905			/*VCLK_DAC_PM_EN | USE_SHADOWED_VEND |*/
906			USE_SHADOWED_ROWCUR | SHADOW_EN | SHADOW_RW_EN);
907		crtc->lcd_gen_cntl |= DONT_SHADOW_VPAR | LOCK_8DOT;
908
909		if ((crtc->lcd_gen_cntl & LCD_ON) &&
910		    ((xres > par->lcd_width) || (yres > par->lcd_height))) {
911			/*
912			 * We cannot display the mode on the LCD. If the CRT is
913			 * enabled we can turn off the LCD.
914			 * If the CRT is off, it isn't a good idea to switch it
915			 * on; we don't know if one is connected. So it's better
916			 * to fail then.
917			 */
918			if (crtc->lcd_gen_cntl & CRT_ON) {
919				if (!(var->activate & FB_ACTIVATE_TEST))
920					PRINTKI("Disable LCD panel, because video mode does not fit.\n");
921				crtc->lcd_gen_cntl &= ~LCD_ON;
922				/*aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl, par);*/
923			} else {
924				if (!(var->activate & FB_ACTIVATE_TEST))
925					PRINTKE("Video mode exceeds size of LCD panel.\nConnect this computer to a conventional monitor if you really need this mode.\n");
926				return -EINVAL;
927			}
928		}
929	}
930
931	if ((par->lcd_table != 0) && (crtc->lcd_gen_cntl & LCD_ON)) {
932		int VScan = 1;
933		/* bpp -> bytespp, 1,4 -> 0; 8 -> 2; 15,16 -> 1; 24 -> 6; 32 -> 5
934		const u8 DFP_h_sync_dly_LT[] = { 0, 2, 1, 6, 5 };
935		const u8 ADD_to_strt_wid_and_dly_LT_DAC[] = { 0, 5, 6, 9, 9, 12, 12 };  */
936
937		vmode &= ~(FB_VMODE_DOUBLE | FB_VMODE_INTERLACED);
938
939		/*
940		 * This is horror! When we simulate, say 640x480 on an 800x600
941		 * LCD monitor, the CRTC should be programmed 800x600 values for
942		 * the non visible part, but 640x480 for the visible part.
943		 * This code has been tested on a laptop with it's 1400x1050 LCD
944		 * monitor and a conventional monitor both switched on.
945		 * Tested modes: 1280x1024, 1152x864, 1024x768, 800x600,
946		 * works with little glitches also with DOUBLESCAN modes
947		 */
948		if (yres < par->lcd_height) {
949			VScan = par->lcd_height / yres;
950			if (VScan > 1) {
951				VScan = 2;
952				vmode |= FB_VMODE_DOUBLE;
953			}
954		}
955
956		h_sync_strt = h_disp + par->lcd_right_margin;
957		h_sync_end = h_sync_strt + par->lcd_hsync_len;
958		h_sync_dly = /*DFP_h_sync_dly[ ( bpp + 1 ) / 3 ]; */par->lcd_hsync_dly;
959		h_total = h_disp + par->lcd_hblank_len;
960
961		v_sync_strt = v_disp + par->lcd_lower_margin / VScan;
962		v_sync_end = v_sync_strt + par->lcd_vsync_len / VScan;
963		v_total = v_disp + par->lcd_vblank_len / VScan;
964	}
965#endif /* CONFIG_FB_ATY_GENERIC_LCD */
966
967	h_disp = (h_disp >> 3) - 1;
968	h_sync_strt = (h_sync_strt >> 3) - 1;
969	h_sync_end = (h_sync_end >> 3) - 1;
970	h_total = (h_total >> 3) - 1;
971	h_sync_wid = h_sync_end - h_sync_strt;
972
973	FAIL_MAX("h_disp too large", h_disp, 0xff);
974	FAIL_MAX("h_sync_strt too large", h_sync_strt, 0x1ff);
975	/*FAIL_MAX("h_sync_wid too large", h_sync_wid, 0x1f);*/
976	if (h_sync_wid > 0x1f)
977		h_sync_wid = 0x1f;
978	FAIL_MAX("h_total too large", h_total, 0x1ff);
979
980	if (vmode & FB_VMODE_DOUBLE) {
981		v_disp <<= 1;
982		v_sync_strt <<= 1;
983		v_sync_end <<= 1;
984		v_total <<= 1;
985	}
986
987	vdisplay = yres;
988#ifdef CONFIG_FB_ATY_GENERIC_LCD
989	if ((par->lcd_table != 0) && (crtc->lcd_gen_cntl & LCD_ON))
990		vdisplay  = par->lcd_height;
991#endif
992
993	v_disp--;
994	v_sync_strt--;
995	v_sync_end--;
996	v_total--;
997	v_sync_wid = v_sync_end - v_sync_strt;
998
999	FAIL_MAX("v_disp too large", v_disp, 0x7ff);
1000	FAIL_MAX("v_sync_stsrt too large", v_sync_strt, 0x7ff);
1001	/*FAIL_MAX("v_sync_wid too large", v_sync_wid, 0x1f);*/
1002	if (v_sync_wid > 0x1f)
1003		v_sync_wid = 0x1f;
1004	FAIL_MAX("v_total too large", v_total, 0x7ff);
1005
1006	c_sync = sync & FB_SYNC_COMP_HIGH_ACT ? CRTC_CSYNC_EN : 0;
1007
1008	/* output */
1009	crtc->vxres = vxres;
1010	crtc->vyres = vyres;
1011	crtc->xoffset = xoffset;
1012	crtc->yoffset = yoffset;
1013	crtc->bpp = bpp;
1014	crtc->off_pitch =
1015		((yoffset * line_length + xoffset * bpp / 8) / 8) |
1016		((line_length / bpp) << 22);
1017	crtc->vline_crnt_vline = 0;
1018
1019	crtc->h_tot_disp = h_total | (h_disp << 16);
1020	crtc->h_sync_strt_wid = (h_sync_strt & 0xff) | (h_sync_dly << 8) |
1021		((h_sync_strt & 0x100) << 4) | (h_sync_wid << 16) |
1022		(h_sync_pol << 21);
1023	crtc->v_tot_disp = v_total | (v_disp << 16);
1024	crtc->v_sync_strt_wid = v_sync_strt | (v_sync_wid << 16) |
1025		(v_sync_pol << 21);
1026
1027	/* crtc->gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par) & CRTC_PRESERVED_MASK; */
1028	crtc->gen_cntl = CRTC_EXT_DISP_EN | CRTC_EN | pix_width | c_sync;
1029	crtc->gen_cntl |= CRTC_VGA_LINEAR;
1030
1031	/* Enable doublescan mode if requested */
1032	if (vmode & FB_VMODE_DOUBLE)
1033		crtc->gen_cntl |= CRTC_DBL_SCAN_EN;
1034	/* Enable interlaced mode if requested */
1035	if (vmode & FB_VMODE_INTERLACED)
1036		crtc->gen_cntl |= CRTC_INTERLACE_EN;
1037#ifdef CONFIG_FB_ATY_GENERIC_LCD
1038	if (par->lcd_table != 0) {
1039		vdisplay = yres;
1040		if (vmode & FB_VMODE_DOUBLE)
1041			vdisplay <<= 1;
1042		crtc->gen_cntl &= ~(CRTC2_EN | CRTC2_PIX_WIDTH);
1043		crtc->lcd_gen_cntl &= ~(HORZ_DIVBY2_EN | DIS_HOR_CRT_DIVBY2 |
1044					/*TVCLK_PM_EN | VCLK_DAC_PM_EN |*/
1045					USE_SHADOWED_VEND |
1046					USE_SHADOWED_ROWCUR |
1047					SHADOW_EN | SHADOW_RW_EN);
1048		crtc->lcd_gen_cntl |= DONT_SHADOW_VPAR/* | LOCK_8DOT*/;
1049
1050		/* MOBILITY M1 tested, FIXME: LT */
1051		crtc->horz_stretching = aty_ld_lcd(HORZ_STRETCHING, par);
1052		if (!M64_HAS(LT_LCD_REGS))
1053			crtc->ext_vert_stretch = aty_ld_lcd(EXT_VERT_STRETCH, par) &
1054				~(AUTO_VERT_RATIO | VERT_STRETCH_MODE | VERT_STRETCH_RATIO3);
1055
1056		crtc->horz_stretching &= ~(HORZ_STRETCH_RATIO |
1057					   HORZ_STRETCH_LOOP | AUTO_HORZ_RATIO |
1058					   HORZ_STRETCH_MODE | HORZ_STRETCH_EN);
1059		if (xres < par->lcd_width && crtc->lcd_gen_cntl & LCD_ON) {
1060			do {
1061				/*
1062				 * The horizontal blender misbehaves when
1063				 * HDisplay is less than a certain threshold
1064				 * (440 for a 1024-wide panel).  It doesn't
1065				 * stretch such modes enough.  Use pixel
1066				 * replication instead of blending to stretch
1067				 * modes that can be made to exactly fit the
1068				 * panel width.  The undocumented "NoLCDBlend"
1069				 * option allows the pixel-replicated mode to
1070				 * be slightly wider or narrower than the
1071				 * panel width.  It also causes a mode that is
1072				 * exactly half as wide as the panel to be
1073				 * pixel-replicated, rather than blended.
1074				 */
1075				int HDisplay  = xres & ~7;
1076				int nStretch  = par->lcd_width / HDisplay;
1077				int Remainder = par->lcd_width % HDisplay;
1078
1079				if ((!Remainder && ((nStretch > 2))) ||
1080				    (((HDisplay * 16) / par->lcd_width) < 7)) {
1081					static const char StretchLoops[] = { 10, 12, 13, 15, 16 };
1082					int horz_stretch_loop = -1, BestRemainder;
1083					int Numerator = HDisplay, Denominator = par->lcd_width;
1084					int Index = 5;
1085					ATIReduceRatio(&Numerator, &Denominator);
1086
1087					BestRemainder = (Numerator * 16) / Denominator;
1088					while (--Index >= 0) {
1089						Remainder = ((Denominator - Numerator) * StretchLoops[Index]) %
1090							Denominator;
1091						if (Remainder < BestRemainder) {
1092							horz_stretch_loop = Index;
1093							if (!(BestRemainder = Remainder))
1094								break;
1095						}
1096					}
1097
1098					if ((horz_stretch_loop >= 0) && !BestRemainder) {
1099						int horz_stretch_ratio = 0, Accumulator = 0;
1100						int reuse_previous = 1;
1101
1102						Index = StretchLoops[horz_stretch_loop];
1103
1104						while (--Index >= 0) {
1105							if (Accumulator > 0)
1106								horz_stretch_ratio |= reuse_previous;
1107							else
1108								Accumulator += Denominator;
1109							Accumulator -= Numerator;
1110							reuse_previous <<= 1;
1111						}
1112
1113						crtc->horz_stretching |= (HORZ_STRETCH_EN |
1114							((horz_stretch_loop & HORZ_STRETCH_LOOP) << 16) |
1115							(horz_stretch_ratio & HORZ_STRETCH_RATIO));
1116						break;      /* Out of the do { ... } while (0) */
1117					}
1118				}
1119
1120				crtc->horz_stretching |= (HORZ_STRETCH_MODE | HORZ_STRETCH_EN |
1121					(((HDisplay * (HORZ_STRETCH_BLEND + 1)) / par->lcd_width) & HORZ_STRETCH_BLEND));
1122			} while (0);
1123		}
1124
1125		if (vdisplay < par->lcd_height && crtc->lcd_gen_cntl & LCD_ON) {
1126			crtc->vert_stretching = (VERT_STRETCH_USE0 | VERT_STRETCH_EN |
1127				(((vdisplay * (VERT_STRETCH_RATIO0 + 1)) / par->lcd_height) & VERT_STRETCH_RATIO0));
1128
1129			if (!M64_HAS(LT_LCD_REGS) &&
1130			    xres <= (M64_HAS(MOBIL_BUS) ? 1024 : 800))
1131				crtc->ext_vert_stretch |= VERT_STRETCH_MODE;
1132		} else {
1133			/*
1134			 * Don't use vertical blending if the mode is too wide
1135			 * or not vertically stretched.
1136			 */
1137			crtc->vert_stretching = 0;
1138		}
1139		/* copy to shadow crtc */
1140		crtc->shadow_h_tot_disp = crtc->h_tot_disp;
1141		crtc->shadow_h_sync_strt_wid = crtc->h_sync_strt_wid;
1142		crtc->shadow_v_tot_disp = crtc->v_tot_disp;
1143		crtc->shadow_v_sync_strt_wid = crtc->v_sync_strt_wid;
1144	}
1145#endif /* CONFIG_FB_ATY_GENERIC_LCD */
1146
1147	if (M64_HAS(MAGIC_FIFO)) {
1148		/* FIXME: display FIFO low watermark values */
1149		crtc->gen_cntl |= (aty_ld_le32(CRTC_GEN_CNTL, par) & CRTC_FIFO_LWM);
1150	}
1151	crtc->dp_pix_width = dp_pix_width;
1152	crtc->dp_chain_mask = dp_chain_mask;
1153
1154	return 0;
1155}
1156
1157static int aty_crtc_to_var(const struct crtc *crtc,
1158			   struct fb_var_screeninfo *var)
1159{
1160	u32 xres, yres, bpp, left, right, upper, lower, hslen, vslen, sync;
1161	u32 h_total, h_disp, h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol;
1162	u32 v_total, v_disp, v_sync_strt, v_sync_wid, v_sync_pol, c_sync;
1163	u32 pix_width;
1164	u32 double_scan, interlace;
1165
1166	/* input */
1167	h_total = crtc->h_tot_disp & 0x1ff;
1168	h_disp = (crtc->h_tot_disp >> 16) & 0xff;
1169	h_sync_strt = (crtc->h_sync_strt_wid & 0xff) | ((crtc->h_sync_strt_wid >> 4) & 0x100);
1170	h_sync_dly = (crtc->h_sync_strt_wid >> 8) & 0x7;
1171	h_sync_wid = (crtc->h_sync_strt_wid >> 16) & 0x1f;
1172	h_sync_pol = (crtc->h_sync_strt_wid >> 21) & 0x1;
1173	v_total = crtc->v_tot_disp & 0x7ff;
1174	v_disp = (crtc->v_tot_disp >> 16) & 0x7ff;
1175	v_sync_strt = crtc->v_sync_strt_wid & 0x7ff;
1176	v_sync_wid = (crtc->v_sync_strt_wid >> 16) & 0x1f;
1177	v_sync_pol = (crtc->v_sync_strt_wid >> 21) & 0x1;
1178	c_sync = crtc->gen_cntl & CRTC_CSYNC_EN ? 1 : 0;
1179	pix_width = crtc->gen_cntl & CRTC_PIX_WIDTH_MASK;
1180	double_scan = crtc->gen_cntl & CRTC_DBL_SCAN_EN;
1181	interlace = crtc->gen_cntl & CRTC_INTERLACE_EN;
1182
1183	/* convert */
1184	xres = (h_disp + 1) * 8;
1185	yres = v_disp + 1;
1186	left = (h_total - h_sync_strt - h_sync_wid) * 8 - h_sync_dly;
1187	right = (h_sync_strt - h_disp) * 8 + h_sync_dly;
1188	hslen = h_sync_wid * 8;
1189	upper = v_total - v_sync_strt - v_sync_wid;
1190	lower = v_sync_strt - v_disp;
1191	vslen = v_sync_wid;
1192	sync = (h_sync_pol ? 0 : FB_SYNC_HOR_HIGH_ACT) |
1193		(v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT) |
1194		(c_sync ? FB_SYNC_COMP_HIGH_ACT : 0);
1195
1196	switch (pix_width) {
1197#if 0
1198	case CRTC_PIX_WIDTH_4BPP:
1199		bpp = 4;
1200		var->red.offset = 0;
1201		var->red.length = 8;
1202		var->green.offset = 0;
1203		var->green.length = 8;
1204		var->blue.offset = 0;
1205		var->blue.length = 8;
1206		var->transp.offset = 0;
1207		var->transp.length = 0;
1208		break;
1209#endif
1210	case CRTC_PIX_WIDTH_8BPP:
1211		bpp = 8;
1212		var->red.offset = 0;
1213		var->red.length = 8;
1214		var->green.offset = 0;
1215		var->green.length = 8;
1216		var->blue.offset = 0;
1217		var->blue.length = 8;
1218		var->transp.offset = 0;
1219		var->transp.length = 0;
1220		break;
1221	case CRTC_PIX_WIDTH_15BPP:	/* RGB 555 */
1222		bpp = 16;
1223		var->red.offset = 10;
1224		var->red.length = 5;
1225		var->green.offset = 5;
1226		var->green.length = 5;
1227		var->blue.offset = 0;
1228		var->blue.length = 5;
1229		var->transp.offset = 0;
1230		var->transp.length = 0;
1231		break;
1232	case CRTC_PIX_WIDTH_16BPP:	/* RGB 565 */
1233		bpp = 16;
1234		var->red.offset = 11;
1235		var->red.length = 5;
1236		var->green.offset = 5;
1237		var->green.length = 6;
1238		var->blue.offset = 0;
1239		var->blue.length = 5;
1240		var->transp.offset = 0;
1241		var->transp.length = 0;
1242		break;
1243	case CRTC_PIX_WIDTH_24BPP:	/* RGB 888 */
1244		bpp = 24;
1245		var->red.offset = 16;
1246		var->red.length = 8;
1247		var->green.offset = 8;
1248		var->green.length = 8;
1249		var->blue.offset = 0;
1250		var->blue.length = 8;
1251		var->transp.offset = 0;
1252		var->transp.length = 0;
1253		break;
1254	case CRTC_PIX_WIDTH_32BPP:	/* ARGB 8888 */
1255		bpp = 32;
1256		var->red.offset = 16;
1257		var->red.length = 8;
1258		var->green.offset = 8;
1259		var->green.length = 8;
1260		var->blue.offset = 0;
1261		var->blue.length = 8;
1262		var->transp.offset = 24;
1263		var->transp.length = 8;
1264		break;
1265	default:
1266		PRINTKE("Invalid pixel width\n");
1267		return -EINVAL;
1268	}
1269
1270	/* output */
1271	var->xres = xres;
1272	var->yres = yres;
1273	var->xres_virtual = crtc->vxres;
1274	var->yres_virtual = crtc->vyres;
1275	var->bits_per_pixel = bpp;
1276	var->left_margin = left;
1277	var->right_margin = right;
1278	var->upper_margin = upper;
1279	var->lower_margin = lower;
1280	var->hsync_len = hslen;
1281	var->vsync_len = vslen;
1282	var->sync = sync;
1283	var->vmode = FB_VMODE_NONINTERLACED;
1284	/*
1285	 * In double scan mode, the vertical parameters are doubled,
1286	 * so we need to halve them to get the right values.
1287	 * In interlaced mode the values are already correct,
1288	 * so no correction is necessary.
1289	 */
1290	if (interlace)
1291		var->vmode = FB_VMODE_INTERLACED;
1292
1293	if (double_scan) {
1294		var->vmode = FB_VMODE_DOUBLE;
1295		var->yres >>= 1;
1296		var->upper_margin >>= 1;
1297		var->lower_margin >>= 1;
1298		var->vsync_len >>= 1;
1299	}
1300
1301	return 0;
1302}
1303
1304/* ------------------------------------------------------------------------- */
1305
1306static int atyfb_set_par(struct fb_info *info)
1307{
1308	struct atyfb_par *par = (struct atyfb_par *) info->par;
1309	struct fb_var_screeninfo *var = &info->var;
1310	u32 tmp, pixclock;
1311	int err;
1312#ifdef DEBUG
1313	struct fb_var_screeninfo debug;
1314	u32 pixclock_in_ps;
1315#endif
1316	if (par->asleep)
1317		return 0;
1318
1319	err = aty_var_to_crtc(info, var, &par->crtc);
1320	if (err)
1321		return err;
1322
1323	pixclock = atyfb_get_pixclock(var, par);
1324
1325	if (pixclock == 0) {
1326		PRINTKE("Invalid pixclock\n");
1327		return -EINVAL;
1328	} else {
1329		err = par->pll_ops->var_to_pll(info, pixclock,
1330					       var->bits_per_pixel, &par->pll);
1331		if (err)
1332			return err;
1333	}
1334
1335	par->accel_flags = var->accel_flags; /* hack */
1336
1337	if (var->accel_flags) {
1338		info->fbops->fb_sync = atyfb_sync;
1339		info->flags &= ~FBINFO_HWACCEL_DISABLED;
1340	} else {
1341		info->fbops->fb_sync = NULL;
1342		info->flags |= FBINFO_HWACCEL_DISABLED;
1343	}
1344
1345	if (par->blitter_may_be_busy)
1346		wait_for_idle(par);
1347
1348	aty_set_crtc(par, &par->crtc);
1349	par->dac_ops->set_dac(info, &par->pll,
1350			      var->bits_per_pixel, par->accel_flags);
1351	par->pll_ops->set_pll(info, &par->pll);
1352
1353#ifdef DEBUG
1354	if (par->pll_ops && par->pll_ops->pll_to_var)
1355		pixclock_in_ps = par->pll_ops->pll_to_var(info, &par->pll);
1356	else
1357		pixclock_in_ps = 0;
1358
1359	if (0 == pixclock_in_ps) {
1360		PRINTKE("ALERT ops->pll_to_var get 0\n");
1361		pixclock_in_ps = pixclock;
1362	}
1363
1364	memset(&debug, 0, sizeof(debug));
1365	if (!aty_crtc_to_var(&par->crtc, &debug)) {
1366		u32 hSync, vRefresh;
1367		u32 h_disp, h_sync_strt, h_sync_end, h_total;
1368		u32 v_disp, v_sync_strt, v_sync_end, v_total;
1369
1370		h_disp = debug.xres;
1371		h_sync_strt = h_disp + debug.right_margin;
1372		h_sync_end = h_sync_strt + debug.hsync_len;
1373		h_total = h_sync_end + debug.left_margin;
1374		v_disp = debug.yres;
1375		v_sync_strt = v_disp + debug.lower_margin;
1376		v_sync_end = v_sync_strt + debug.vsync_len;
1377		v_total = v_sync_end + debug.upper_margin;
1378
1379		hSync = 1000000000 / (pixclock_in_ps * h_total);
1380		vRefresh = (hSync * 1000) / v_total;
1381		if (par->crtc.gen_cntl & CRTC_INTERLACE_EN)
1382			vRefresh *= 2;
1383		if (par->crtc.gen_cntl & CRTC_DBL_SCAN_EN)
1384			vRefresh /= 2;
1385
1386		DPRINTK("atyfb_set_par\n");
1387		DPRINTK(" Set Visible Mode to %ix%i-%i\n",
1388			var->xres, var->yres, var->bits_per_pixel);
1389		DPRINTK(" Virtual resolution %ix%i, "
1390			"pixclock_in_ps %i (calculated %i)\n",
1391			var->xres_virtual, var->yres_virtual,
1392			pixclock, pixclock_in_ps);
1393		DPRINTK(" Dot clock:           %i MHz\n",
1394			1000000 / pixclock_in_ps);
1395		DPRINTK(" Horizontal sync:     %i kHz\n", hSync);
1396		DPRINTK(" Vertical refresh:    %i Hz\n", vRefresh);
1397		DPRINTK(" x  style: %i.%03i %i %i %i %i   %i %i %i %i\n",
1398			1000000 / pixclock_in_ps, 1000000 % pixclock_in_ps,
1399			h_disp, h_sync_strt, h_sync_end, h_total,
1400			v_disp, v_sync_strt, v_sync_end, v_total);
1401		DPRINTK(" fb style: %i  %i %i %i %i %i %i %i %i\n",
1402			pixclock_in_ps,
1403			debug.left_margin, h_disp, debug.right_margin, debug.hsync_len,
1404			debug.upper_margin, v_disp, debug.lower_margin, debug.vsync_len);
1405	}
1406#endif /* DEBUG */
1407
1408	if (!M64_HAS(INTEGRATED)) {
1409		/* Don't forget MEM_CNTL */
1410		tmp = aty_ld_le32(MEM_CNTL, par) & 0xf0ffffff;
1411		switch (var->bits_per_pixel) {
1412		case 8:
1413			tmp |= 0x02000000;
1414			break;
1415		case 16:
1416			tmp |= 0x03000000;
1417			break;
1418		case 32:
1419			tmp |= 0x06000000;
1420			break;
1421		}
1422		aty_st_le32(MEM_CNTL, tmp, par);
1423	} else {
1424		tmp = aty_ld_le32(MEM_CNTL, par) & 0xf00fffff;
1425		if (!M64_HAS(MAGIC_POSTDIV))
1426			tmp |= par->mem_refresh_rate << 20;
1427		switch (var->bits_per_pixel) {
1428		case 8:
1429		case 24:
1430			tmp |= 0x00000000;
1431			break;
1432		case 16:
1433			tmp |= 0x04000000;
1434			break;
1435		case 32:
1436			tmp |= 0x08000000;
1437			break;
1438		}
1439		if (M64_HAS(CT_BUS)) {
1440			aty_st_le32(DAC_CNTL, 0x87010184, par);
1441			aty_st_le32(BUS_CNTL, 0x680000f9, par);
1442		} else if (M64_HAS(VT_BUS)) {
1443			aty_st_le32(DAC_CNTL, 0x87010184, par);
1444			aty_st_le32(BUS_CNTL, 0x680000f9, par);
1445		} else if (M64_HAS(MOBIL_BUS)) {
1446			aty_st_le32(DAC_CNTL, 0x80010102, par);
1447			aty_st_le32(BUS_CNTL, 0x7b33a040 | (par->aux_start ? BUS_APER_REG_DIS : 0), par);
1448		} else {
1449			/* GT */
1450			aty_st_le32(DAC_CNTL, 0x86010102, par);
1451			aty_st_le32(BUS_CNTL, 0x7b23a040 | (par->aux_start ? BUS_APER_REG_DIS : 0), par);
1452			aty_st_le32(EXT_MEM_CNTL, aty_ld_le32(EXT_MEM_CNTL, par) | 0x5000001, par);
1453		}
1454		aty_st_le32(MEM_CNTL, tmp, par);
1455	}
1456	aty_st_8(DAC_MASK, 0xff, par);
1457
1458	info->fix.line_length = calc_line_length(par, var->xres_virtual,
1459						 var->bits_per_pixel);
1460
1461	info->fix.visual = var->bits_per_pixel <= 8 ?
1462		FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1463
1464	/* Initialize the graphics engine */
1465	if (par->accel_flags & FB_ACCELF_TEXT)
1466		aty_init_engine(par, info);
1467
1468#ifdef CONFIG_BOOTX_TEXT
1469	btext_update_display(info->fix.smem_start,
1470		(((par->crtc.h_tot_disp >> 16) & 0xff) + 1) * 8,
1471		((par->crtc.v_tot_disp >> 16) & 0x7ff) + 1,
1472		var->bits_per_pixel,
1473		par->crtc.vxres * var->bits_per_pixel / 8);
1474#endif /* CONFIG_BOOTX_TEXT */
1475#if 0
1476	/* switch to accelerator mode */
1477	if (!(par->crtc.gen_cntl & CRTC_EXT_DISP_EN))
1478		aty_st_le32(CRTC_GEN_CNTL, par->crtc.gen_cntl | CRTC_EXT_DISP_EN, par);
1479#endif
1480#ifdef DEBUG
1481{
1482	/* dump non shadow CRTC, pll, LCD registers */
1483	int i; u32 base;
1484
1485	/* CRTC registers */
1486	base = 0x2000;
1487	printk("debug atyfb: Mach64 non-shadow register values:");
1488	for (i = 0; i < 256; i = i+4) {
1489		if (i % 16 == 0)
1490			printk("\ndebug atyfb: 0x%04X: ", base + i);
1491		printk(" %08X", aty_ld_le32(i, par));
1492	}
1493	printk("\n\n");
1494
1495#ifdef CONFIG_FB_ATY_CT
1496	/* PLL registers */
1497	base = 0x00;
1498	printk("debug atyfb: Mach64 PLL register values:");
1499	for (i = 0; i < 64; i++) {
1500		if (i % 16 == 0)
1501			printk("\ndebug atyfb: 0x%02X: ", base + i);
1502		if (i % 4 == 0)
1503			printk(" ");
1504		printk("%02X", aty_ld_pll_ct(i, par));
1505	}
1506	printk("\n\n");
1507#endif	/* CONFIG_FB_ATY_CT */
1508
1509#ifdef CONFIG_FB_ATY_GENERIC_LCD
1510	if (par->lcd_table != 0) {
1511		/* LCD registers */
1512		base = 0x00;
1513		printk("debug atyfb: LCD register values:");
1514		if (M64_HAS(LT_LCD_REGS)) {
1515			for (i = 0; i <= POWER_MANAGEMENT; i++) {
1516				if (i == EXT_VERT_STRETCH)
1517					continue;
1518				printk("\ndebug atyfb: 0x%04X: ",
1519				       lt_lcd_regs[i]);
1520				printk(" %08X", aty_ld_lcd(i, par));
1521			}
1522		} else {
1523			for (i = 0; i < 64; i++) {
1524				if (i % 4 == 0)
1525					printk("\ndebug atyfb: 0x%02X: ",
1526					       base + i);
1527				printk(" %08X", aty_ld_lcd(i, par));
1528			}
1529		}
1530		printk("\n\n");
1531	}
1532#endif /* CONFIG_FB_ATY_GENERIC_LCD */
1533}
1534#endif /* DEBUG */
1535	return 0;
1536}
1537
1538static int atyfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
1539{
1540	struct atyfb_par *par = (struct atyfb_par *) info->par;
1541	int err;
1542	struct crtc crtc;
1543	union aty_pll pll;
1544	u32 pixclock;
1545
1546	memcpy(&pll, &par->pll, sizeof(pll));
1547
1548	err = aty_var_to_crtc(info, var, &crtc);
1549	if (err)
1550		return err;
1551
1552	pixclock = atyfb_get_pixclock(var, par);
1553
1554	if (pixclock == 0) {
1555		if (!(var->activate & FB_ACTIVATE_TEST))
1556			PRINTKE("Invalid pixclock\n");
1557		return -EINVAL;
1558	} else {
1559		err = par->pll_ops->var_to_pll(info, pixclock,
1560					       var->bits_per_pixel, &pll);
1561		if (err)
1562			return err;
1563	}
1564
1565	if (var->accel_flags & FB_ACCELF_TEXT)
1566		info->var.accel_flags = FB_ACCELF_TEXT;
1567	else
1568		info->var.accel_flags = 0;
1569
1570	aty_crtc_to_var(&crtc, var);
1571	var->pixclock = par->pll_ops->pll_to_var(info, &pll);
1572	return 0;
1573}
1574
1575static void set_off_pitch(struct atyfb_par *par, const struct fb_info *info)
1576{
1577	u32 xoffset = info->var.xoffset;
1578	u32 yoffset = info->var.yoffset;
1579	u32 line_length = info->fix.line_length;
1580	u32 bpp = info->var.bits_per_pixel;
1581
1582	par->crtc.off_pitch =
1583		((yoffset * line_length + xoffset * bpp / 8) / 8) |
1584		((line_length / bpp) << 22);
1585}
1586
1587
1588/*
1589 * Open/Release the frame buffer device
1590 */
1591
1592static int atyfb_open(struct fb_info *info, int user)
1593{
1594	struct atyfb_par *par = (struct atyfb_par *) info->par;
1595
1596	if (user) {
1597		par->open++;
1598#ifdef __sparc__
1599		par->mmaped = 0;
1600#endif
1601	}
1602	return 0;
1603}
1604
1605static irqreturn_t aty_irq(int irq, void *dev_id)
1606{
1607	struct atyfb_par *par = dev_id;
1608	int handled = 0;
1609	u32 int_cntl;
1610
1611	spin_lock(&par->int_lock);
1612
1613	int_cntl = aty_ld_le32(CRTC_INT_CNTL, par);
1614
1615	if (int_cntl & CRTC_VBLANK_INT) {
1616		/* clear interrupt */
1617		aty_st_le32(CRTC_INT_CNTL, (int_cntl & CRTC_INT_EN_MASK) |
1618			    CRTC_VBLANK_INT_AK, par);
1619		par->vblank.count++;
1620		if (par->vblank.pan_display) {
1621			par->vblank.pan_display = 0;
1622			aty_st_le32(CRTC_OFF_PITCH, par->crtc.off_pitch, par);
1623		}
1624		wake_up_interruptible(&par->vblank.wait);
1625		handled = 1;
1626	}
1627
1628	spin_unlock(&par->int_lock);
1629
1630	return IRQ_RETVAL(handled);
1631}
1632
1633static int aty_enable_irq(struct atyfb_par *par, int reenable)
1634{
1635	u32 int_cntl;
1636
1637	if (!test_and_set_bit(0, &par->irq_flags)) {
1638		if (request_irq(par->irq, aty_irq, IRQF_SHARED, "atyfb", par)) {
1639			clear_bit(0, &par->irq_flags);
1640			return -EINVAL;
1641		}
1642		spin_lock_irq(&par->int_lock);
1643		int_cntl = aty_ld_le32(CRTC_INT_CNTL, par) & CRTC_INT_EN_MASK;
1644		/* clear interrupt */
1645		aty_st_le32(CRTC_INT_CNTL, int_cntl | CRTC_VBLANK_INT_AK, par);
1646		/* enable interrupt */
1647		aty_st_le32(CRTC_INT_CNTL, int_cntl | CRTC_VBLANK_INT_EN, par);
1648		spin_unlock_irq(&par->int_lock);
1649	} else if (reenable) {
1650		spin_lock_irq(&par->int_lock);
1651		int_cntl = aty_ld_le32(CRTC_INT_CNTL, par) & CRTC_INT_EN_MASK;
1652		if (!(int_cntl & CRTC_VBLANK_INT_EN)) {
1653			printk("atyfb: someone disabled IRQ [%08x]\n",
1654			       int_cntl);
1655			/* re-enable interrupt */
1656			aty_st_le32(CRTC_INT_CNTL, int_cntl |
1657				    CRTC_VBLANK_INT_EN, par);
1658		}
1659		spin_unlock_irq(&par->int_lock);
1660	}
1661
1662	return 0;
1663}
1664
1665static int aty_disable_irq(struct atyfb_par *par)
1666{
1667	u32 int_cntl;
1668
1669	if (test_and_clear_bit(0, &par->irq_flags)) {
1670		if (par->vblank.pan_display) {
1671			par->vblank.pan_display = 0;
1672			aty_st_le32(CRTC_OFF_PITCH, par->crtc.off_pitch, par);
1673		}
1674		spin_lock_irq(&par->int_lock);
1675		int_cntl = aty_ld_le32(CRTC_INT_CNTL, par) & CRTC_INT_EN_MASK;
1676		/* disable interrupt */
1677		aty_st_le32(CRTC_INT_CNTL, int_cntl & ~CRTC_VBLANK_INT_EN, par);
1678		spin_unlock_irq(&par->int_lock);
1679		free_irq(par->irq, par);
1680	}
1681
1682	return 0;
1683}
1684
1685static int atyfb_release(struct fb_info *info, int user)
1686{
1687	struct atyfb_par *par = (struct atyfb_par *) info->par;
1688#ifdef __sparc__
1689	int was_mmaped;
1690#endif
1691
1692	if (!user)
1693		return 0;
1694
1695	par->open--;
1696	mdelay(1);
1697	wait_for_idle(par);
1698
1699	if (par->open)
1700		return 0;
1701
1702#ifdef __sparc__
1703	was_mmaped = par->mmaped;
1704
1705	par->mmaped = 0;
1706
1707	if (was_mmaped) {
1708		struct fb_var_screeninfo var;
1709
1710		/*
1711		 * Now reset the default display config, we have
1712		 * no idea what the program(s) which mmap'd the
1713		 * chip did to the configuration, nor whether it
1714		 * restored it correctly.
1715		 */
1716		var = default_var;
1717		if (noaccel)
1718			var.accel_flags &= ~FB_ACCELF_TEXT;
1719		else
1720			var.accel_flags |= FB_ACCELF_TEXT;
1721		if (var.yres == var.yres_virtual) {
1722			u32 videoram = (info->fix.smem_len - (PAGE_SIZE << 2));
1723			var.yres_virtual =
1724				((videoram * 8) / var.bits_per_pixel) /
1725				var.xres_virtual;
1726			if (var.yres_virtual < var.yres)
1727				var.yres_virtual = var.yres;
1728		}
1729	}
1730#endif
1731	aty_disable_irq(par);
1732
1733	return 0;
1734}
1735
1736/*
1737 * Pan or Wrap the Display
1738 *
1739 * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
1740 */
1741
1742static int atyfb_pan_display(struct fb_var_screeninfo *var,
1743			     struct fb_info *info)
1744{
1745	struct atyfb_par *par = (struct atyfb_par *) info->par;
1746	u32 xres, yres, xoffset, yoffset;
1747
1748	xres = (((par->crtc.h_tot_disp >> 16) & 0xff) + 1) * 8;
1749	yres = ((par->crtc.v_tot_disp >> 16) & 0x7ff) + 1;
1750	if (par->crtc.gen_cntl & CRTC_DBL_SCAN_EN)
1751		yres >>= 1;
1752	xoffset = (var->xoffset + 7) & ~7;
1753	yoffset = var->yoffset;
1754	if (xoffset + xres > par->crtc.vxres ||
1755	    yoffset + yres > par->crtc.vyres)
1756		return -EINVAL;
1757	info->var.xoffset = xoffset;
1758	info->var.yoffset = yoffset;
1759	if (par->asleep)
1760		return 0;
1761
1762	set_off_pitch(par, info);
1763	if ((var->activate & FB_ACTIVATE_VBL) && !aty_enable_irq(par, 0)) {
1764		par->vblank.pan_display = 1;
1765	} else {
1766		par->vblank.pan_display = 0;
1767		aty_st_le32(CRTC_OFF_PITCH, par->crtc.off_pitch, par);
1768	}
1769
1770	return 0;
1771}
1772
1773static int aty_waitforvblank(struct atyfb_par *par, u32 crtc)
1774{
1775	struct aty_interrupt *vbl;
1776	unsigned int count;
1777	int ret;
1778
1779	switch (crtc) {
1780	case 0:
1781		vbl = &par->vblank;
1782		break;
1783	default:
1784		return -ENODEV;
1785	}
1786
1787	ret = aty_enable_irq(par, 0);
1788	if (ret)
1789		return ret;
1790
1791	count = vbl->count;
1792	ret = wait_event_interruptible_timeout(vbl->wait,
1793					       count != vbl->count, HZ/10);
1794	if (ret < 0)
1795		return ret;
1796	if (ret == 0) {
1797		aty_enable_irq(par, 1);
1798		return -ETIMEDOUT;
1799	}
1800
1801	return 0;
1802}
1803
1804
1805#ifdef DEBUG
1806#define ATYIO_CLKR		0x41545900	/* ATY\00 */
1807#define ATYIO_CLKW		0x41545901	/* ATY\01 */
1808
1809struct atyclk {
1810	u32 ref_clk_per;
1811	u8 pll_ref_div;
1812	u8 mclk_fb_div;
1813	u8 mclk_post_div;	/* 1,2,3,4,8 */
1814	u8 mclk_fb_mult;	/* 2 or 4 */
1815	u8 xclk_post_div;	/* 1,2,3,4,8 */
1816	u8 vclk_fb_div;
1817	u8 vclk_post_div;	/* 1,2,3,4,6,8,12 */
1818	u32 dsp_xclks_per_row;	/* 0-16383 */
1819	u32 dsp_loop_latency;	/* 0-15 */
1820	u32 dsp_precision;	/* 0-7 */
1821	u32 dsp_on;		/* 0-2047 */
1822	u32 dsp_off;		/* 0-2047 */
1823};
1824
1825#define ATYIO_FEATR		0x41545902	/* ATY\02 */
1826#define ATYIO_FEATW		0x41545903	/* ATY\03 */
1827#endif
1828
1829static int atyfb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
1830{
1831	struct atyfb_par *par = (struct atyfb_par *) info->par;
1832#ifdef __sparc__
1833	struct fbtype fbtyp;
1834#endif
1835
1836	switch (cmd) {
1837#ifdef __sparc__
1838	case FBIOGTYPE:
1839		fbtyp.fb_type = FBTYPE_PCI_GENERIC;
1840		fbtyp.fb_width = par->crtc.vxres;
1841		fbtyp.fb_height = par->crtc.vyres;
1842		fbtyp.fb_depth = info->var.bits_per_pixel;
1843		fbtyp.fb_cmsize = info->cmap.len;
1844		fbtyp.fb_size = info->fix.smem_len;
1845		if (copy_to_user((struct fbtype __user *) arg, &fbtyp,
1846				 sizeof(fbtyp)))
1847			return -EFAULT;
1848		break;
1849#endif /* __sparc__ */
1850
1851	case FBIO_WAITFORVSYNC:
1852		{
1853			u32 crtc;
1854
1855			if (get_user(crtc, (__u32 __user *) arg))
1856				return -EFAULT;
1857
1858			return aty_waitforvblank(par, crtc);
1859		}
1860
1861#if defined(DEBUG) && defined(CONFIG_FB_ATY_CT)
1862	case ATYIO_CLKR:
1863		if (M64_HAS(INTEGRATED)) {
1864			struct atyclk clk;
1865			union aty_pll *pll = &par->pll;
1866			u32 dsp_config = pll->ct.dsp_config;
1867			u32 dsp_on_off = pll->ct.dsp_on_off;
1868			clk.ref_clk_per = par->ref_clk_per;
1869			clk.pll_ref_div = pll->ct.pll_ref_div;
1870			clk.mclk_fb_div = pll->ct.mclk_fb_div;
1871			clk.mclk_post_div = pll->ct.mclk_post_div_real;
1872			clk.mclk_fb_mult = pll->ct.mclk_fb_mult;
1873			clk.xclk_post_div = pll->ct.xclk_post_div_real;
1874			clk.vclk_fb_div = pll->ct.vclk_fb_div;
1875			clk.vclk_post_div = pll->ct.vclk_post_div_real;
1876			clk.dsp_xclks_per_row = dsp_config & 0x3fff;
1877			clk.dsp_loop_latency = (dsp_config >> 16) & 0xf;
1878			clk.dsp_precision = (dsp_config >> 20) & 7;
1879			clk.dsp_off = dsp_on_off & 0x7ff;
1880			clk.dsp_on = (dsp_on_off >> 16) & 0x7ff;
1881			if (copy_to_user((struct atyclk __user *) arg, &clk,
1882					 sizeof(clk)))
1883				return -EFAULT;
1884		} else
1885			return -EINVAL;
1886		break;
1887	case ATYIO_CLKW:
1888		if (M64_HAS(INTEGRATED)) {
1889			struct atyclk clk;
1890			union aty_pll *pll = &par->pll;
1891			if (copy_from_user(&clk, (struct atyclk __user *) arg,
1892					   sizeof(clk)))
1893				return -EFAULT;
1894			par->ref_clk_per = clk.ref_clk_per;
1895			pll->ct.pll_ref_div = clk.pll_ref_div;
1896			pll->ct.mclk_fb_div = clk.mclk_fb_div;
1897			pll->ct.mclk_post_div_real = clk.mclk_post_div;
1898			pll->ct.mclk_fb_mult = clk.mclk_fb_mult;
1899			pll->ct.xclk_post_div_real = clk.xclk_post_div;
1900			pll->ct.vclk_fb_div = clk.vclk_fb_div;
1901			pll->ct.vclk_post_div_real = clk.vclk_post_div;
1902			pll->ct.dsp_config = (clk.dsp_xclks_per_row & 0x3fff) |
1903				((clk.dsp_loop_latency & 0xf) << 16) |
1904				((clk.dsp_precision & 7) << 20);
1905			pll->ct.dsp_on_off = (clk.dsp_off & 0x7ff) |
1906				((clk.dsp_on & 0x7ff) << 16);
1907			/*aty_calc_pll_ct(info, &pll->ct);*/
1908			aty_set_pll_ct(info, pll);
1909		} else
1910			return -EINVAL;
1911		break;
1912	case ATYIO_FEATR:
1913		if (get_user(par->features, (u32 __user *) arg))
1914			return -EFAULT;
1915		break;
1916	case ATYIO_FEATW:
1917		if (put_user(par->features, (u32 __user *) arg))
1918			return -EFAULT;
1919		break;
1920#endif /* DEBUG && CONFIG_FB_ATY_CT */
1921	default:
1922		return -EINVAL;
1923	}
1924	return 0;
1925}
1926
1927static int atyfb_sync(struct fb_info *info)
1928{
1929	struct atyfb_par *par = (struct atyfb_par *) info->par;
1930
1931	if (par->blitter_may_be_busy)
1932		wait_for_idle(par);
1933	return 0;
1934}
1935
1936#ifdef __sparc__
1937static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
1938{
1939	struct atyfb_par *par = (struct atyfb_par *) info->par;
1940	unsigned int size, page, map_size = 0;
1941	unsigned long map_offset = 0;
1942	unsigned long off;
1943	int i;
1944
1945	if (!par->mmap_map)
1946		return -ENXIO;
1947
1948	if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
1949		return -EINVAL;
1950
1951	off = vma->vm_pgoff << PAGE_SHIFT;
1952	size = vma->vm_end - vma->vm_start;
1953
1954	/* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */
1955
1956	if (((vma->vm_pgoff == 0) && (size == info->fix.smem_len)) ||
1957	    ((off == info->fix.smem_len) && (size == PAGE_SIZE)))
1958		off += 0x8000000000000000UL;
1959
1960	vma->vm_pgoff = off >> PAGE_SHIFT;	/* propagate off changes */
1961
1962	/* Each page, see which map applies */
1963	for (page = 0; page < size;) {
1964		map_size = 0;
1965		for (i = 0; par->mmap_map[i].size; i++) {
1966			unsigned long start = par->mmap_map[i].voff;
1967			unsigned long end = start + par->mmap_map[i].size;
1968			unsigned long offset = off + page;
1969
1970			if (start > offset)
1971				continue;
1972			if (offset >= end)
1973				continue;
1974
1975			map_size = par->mmap_map[i].size - (offset - start);
1976			map_offset = par->mmap_map[i].poff + (offset - start);
1977			break;
1978		}
1979		if (!map_size) {
1980			page += PAGE_SIZE;
1981			continue;
1982		}
1983		if (page + map_size > size)
1984			map_size = size - page;
1985
1986		pgprot_val(vma->vm_page_prot) &= ~(par->mmap_map[i].prot_mask);
1987		pgprot_val(vma->vm_page_prot) |= par->mmap_map[i].prot_flag;
1988
1989		if (remap_pfn_range(vma, vma->vm_start + page,
1990			map_offset >> PAGE_SHIFT, map_size, vma->vm_page_prot))
1991			return -EAGAIN;
1992
1993		page += map_size;
1994	}
1995
1996	if (!map_size)
1997		return -EINVAL;
1998
1999	if (!par->mmaped)
2000		par->mmaped = 1;
2001	return 0;
2002}
2003#endif /* __sparc__ */
2004
2005
2006
2007#if defined(CONFIG_PM) && defined(CONFIG_PCI)
2008
2009#ifdef CONFIG_PPC_PMAC
2010/* Power management routines. Those are used for PowerBook sleep.
2011 */
2012static int aty_power_mgmt(int sleep, struct atyfb_par *par)
2013{
2014	u32 pm;
2015	int timeout;
2016
2017	pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2018	pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG;
2019	aty_st_lcd(POWER_MANAGEMENT, pm, par);
2020	pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2021
2022	timeout = 2000;
2023	if (sleep) {
2024		/* Sleep */
2025		pm &= ~PWR_MGT_ON;
2026		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2027		pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2028		udelay(10);
2029		pm &= ~(PWR_BLON | AUTO_PWR_UP);
2030		pm |= SUSPEND_NOW;
2031		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2032		pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2033		udelay(10);
2034		pm |= PWR_MGT_ON;
2035		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2036		do {
2037			pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2038			mdelay(1);
2039			if ((--timeout) == 0)
2040				break;
2041		} while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND);
2042	} else {
2043		/* Wakeup */
2044		pm &= ~PWR_MGT_ON;
2045		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2046		pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2047		udelay(10);
2048		pm &= ~SUSPEND_NOW;
2049		pm |= (PWR_BLON | AUTO_PWR_UP);
2050		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2051		pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2052		udelay(10);
2053		pm |= PWR_MGT_ON;
2054		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2055		do {
2056			pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2057			mdelay(1);
2058			if ((--timeout) == 0)
2059				break;
2060		} while ((pm & PWR_MGT_STATUS_MASK) != 0);
2061	}
2062	mdelay(500);
2063
2064	return timeout ? 0 : -EIO;
2065}
2066#endif /* CONFIG_PPC_PMAC */
2067
2068static int atyfb_pci_suspend(struct pci_dev *pdev, pm_message_t state)
2069{
2070	struct fb_info *info = pci_get_drvdata(pdev);
2071	struct atyfb_par *par = (struct atyfb_par *) info->par;
2072
2073	if (state.event == pdev->dev.power.power_state.event)
2074		return 0;
2075
2076	console_lock();
2077
2078	fb_set_suspend(info, 1);
2079
2080	/* Idle & reset engine */
2081	wait_for_idle(par);
2082	aty_reset_engine(par);
2083
2084	/* Blank display and LCD */
2085	atyfb_blank(FB_BLANK_POWERDOWN, info);
2086
2087	par->asleep = 1;
2088	par->lock_blank = 1;
2089
2090	/*
2091	 * Because we may change PCI D state ourselves, we need to
2092	 * first save the config space content so the core can
2093	 * restore it properly on resume.
2094	 */
2095	pci_save_state(pdev);
2096
2097#ifdef CONFIG_PPC_PMAC
2098	/* Set chip to "suspend" mode */
2099	if (machine_is(powermac) && aty_power_mgmt(1, par)) {
2100		par->asleep = 0;
2101		par->lock_blank = 0;
2102		atyfb_blank(FB_BLANK_UNBLANK, info);
2103		fb_set_suspend(info, 0);
2104		console_unlock();
2105		return -EIO;
2106	}
2107#else
2108	pci_set_power_state(pdev, pci_choose_state(pdev, state));
2109#endif
2110
2111	console_unlock();
2112
2113	pdev->dev.power.power_state = state;
2114
2115	return 0;
2116}
2117
2118static void aty_resume_chip(struct fb_info *info)
2119{
2120	struct atyfb_par *par = info->par;
2121
2122	aty_st_le32(MEM_CNTL, par->mem_cntl, par);
2123
2124	if (par->pll_ops->resume_pll)
2125		par->pll_ops->resume_pll(info, &par->pll);
2126
2127	if (par->aux_start)
2128		aty_st_le32(BUS_CNTL,
2129			aty_ld_le32(BUS_CNTL, par) | BUS_APER_REG_DIS, par);
2130}
2131
2132static int atyfb_pci_resume(struct pci_dev *pdev)
2133{
2134	struct fb_info *info = pci_get_drvdata(pdev);
2135	struct atyfb_par *par = (struct atyfb_par *) info->par;
2136
2137	if (pdev->dev.power.power_state.event == PM_EVENT_ON)
2138		return 0;
2139
2140	console_lock();
2141
2142	/*
2143	 * PCI state will have been restored by the core, so
2144	 * we should be in D0 now with our config space fully
2145	 * restored
2146	 */
2147
2148#ifdef CONFIG_PPC_PMAC
2149	if (machine_is(powermac) &&
2150	    pdev->dev.power.power_state.event == PM_EVENT_SUSPEND)
2151		aty_power_mgmt(0, par);
2152#endif
2153
2154	aty_resume_chip(info);
2155
2156	par->asleep = 0;
2157
2158	/* Restore display */
2159	atyfb_set_par(info);
2160
2161	/* Refresh */
2162	fb_set_suspend(info, 0);
2163
2164	/* Unblank */
2165	par->lock_blank = 0;
2166	atyfb_blank(FB_BLANK_UNBLANK, info);
2167
2168	console_unlock();
2169
2170	pdev->dev.power.power_state = PMSG_ON;
2171
2172	return 0;
2173}
2174
2175#endif /*  defined(CONFIG_PM) && defined(CONFIG_PCI) */
2176
2177/* Backlight */
2178#ifdef CONFIG_FB_ATY_BACKLIGHT
2179#define MAX_LEVEL 0xFF
2180
2181static int aty_bl_get_level_brightness(struct atyfb_par *par, int level)
2182{
2183	struct fb_info *info = pci_get_drvdata(par->pdev);
2184	int atylevel;
2185
2186	/* Get and convert the value */
2187	/* No locking of bl_curve since we read a single value */
2188	atylevel = info->bl_curve[level] * FB_BACKLIGHT_MAX / MAX_LEVEL;
2189
2190	if (atylevel < 0)
2191		atylevel = 0;
2192	else if (atylevel > MAX_LEVEL)
2193		atylevel = MAX_LEVEL;
2194
2195	return atylevel;
2196}
2197
2198static int aty_bl_update_status(struct backlight_device *bd)
2199{
2200	struct atyfb_par *par = bl_get_data(bd);
2201	unsigned int reg = aty_ld_lcd(LCD_MISC_CNTL, par);
2202	int level;
2203
2204	if (bd->props.power != FB_BLANK_UNBLANK ||
2205	    bd->props.fb_blank != FB_BLANK_UNBLANK)
2206		level = 0;
2207	else
2208		level = bd->props.brightness;
2209
2210	reg |= (BLMOD_EN | BIASMOD_EN);
2211	if (level > 0) {
2212		reg &= ~BIAS_MOD_LEVEL_MASK;
2213		reg |= (aty_bl_get_level_brightness(par, level) << BIAS_MOD_LEVEL_SHIFT);
2214	} else {
2215		reg &= ~BIAS_MOD_LEVEL_MASK;
2216		reg |= (aty_bl_get_level_brightness(par, 0) << BIAS_MOD_LEVEL_SHIFT);
2217	}
2218	aty_st_lcd(LCD_MISC_CNTL, reg, par);
2219
2220	return 0;
2221}
2222
2223static const struct backlight_ops aty_bl_data = {
2224	.update_status	= aty_bl_update_status,
2225};
2226
2227static void aty_bl_init(struct atyfb_par *par)
2228{
2229	struct backlight_properties props;
2230	struct fb_info *info = pci_get_drvdata(par->pdev);
2231	struct backlight_device *bd;
2232	char name[12];
2233
2234#ifdef CONFIG_PMAC_BACKLIGHT
2235	if (!pmac_has_backlight_type("ati"))
2236		return;
2237#endif
2238
2239	snprintf(name, sizeof(name), "atybl%d", info->node);
2240
2241	memset(&props, 0, sizeof(struct backlight_properties));
2242	props.type = BACKLIGHT_RAW;
2243	props.max_brightness = FB_BACKLIGHT_LEVELS - 1;
2244	bd = backlight_device_register(name, info->dev, par, &aty_bl_data,
2245				       &props);
2246	if (IS_ERR(bd)) {
2247		info->bl_dev = NULL;
2248		printk(KERN_WARNING "aty: Backlight registration failed\n");
2249		goto error;
2250	}
2251
2252	info->bl_dev = bd;
2253	fb_bl_default_curve(info, 0,
2254			    0x3F * FB_BACKLIGHT_MAX / MAX_LEVEL,
2255			    0xFF * FB_BACKLIGHT_MAX / MAX_LEVEL);
2256
2257	bd->props.brightness = bd->props.max_brightness;
2258	bd->props.power = FB_BLANK_UNBLANK;
2259	backlight_update_status(bd);
2260
2261	printk("aty: Backlight initialized (%s)\n", name);
2262
2263	return;
2264
2265error:
2266	return;
2267}
2268
2269#ifdef CONFIG_PCI
2270static void aty_bl_exit(struct backlight_device *bd)
2271{
2272	backlight_device_unregister(bd);
2273	printk("aty: Backlight unloaded\n");
2274}
2275#endif /* CONFIG_PCI */
2276
2277#endif /* CONFIG_FB_ATY_BACKLIGHT */
2278
2279static void aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
2280{
2281	const int ragepro_tbl[] = {
2282		44, 50, 55, 66, 75, 80, 100
2283	};
2284	const int ragexl_tbl[] = {
2285		50, 66, 75, 83, 90, 95, 100, 105,
2286		110, 115, 120, 125, 133, 143, 166
2287	};
2288	const int *refresh_tbl;
2289	int i, size;
2290
2291	if (M64_HAS(XL_MEM)) {
2292		refresh_tbl = ragexl_tbl;
2293		size = ARRAY_SIZE(ragexl_tbl);
2294	} else {
2295		refresh_tbl = ragepro_tbl;
2296		size = ARRAY_SIZE(ragepro_tbl);
2297	}
2298
2299	for (i = 0; i < size; i++) {
2300		if (xclk < refresh_tbl[i])
2301			break;
2302	}
2303	par->mem_refresh_rate = i;
2304}
2305
2306/*
2307 * Initialisation
2308 */
2309
2310static struct fb_info *fb_list = NULL;
2311
2312#if defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD)
2313static int atyfb_get_timings_from_lcd(struct atyfb_par *par,
2314				      struct fb_var_screeninfo *var)
2315{
2316	int ret = -EINVAL;
2317
2318	if (par->lcd_table != 0 && (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2319		*var = default_var;
2320		var->xres = var->xres_virtual = par->lcd_hdisp;
2321		var->right_margin = par->lcd_right_margin;
2322		var->left_margin = par->lcd_hblank_len -
2323			(par->lcd_right_margin + par->lcd_hsync_dly +
2324			 par->lcd_hsync_len);
2325		var->hsync_len = par->lcd_hsync_len + par->lcd_hsync_dly;
2326		var->yres = var->yres_virtual = par->lcd_vdisp;
2327		var->lower_margin = par->lcd_lower_margin;
2328		var->upper_margin = par->lcd_vblank_len -
2329			(par->lcd_lower_margin + par->lcd_vsync_len);
2330		var->vsync_len = par->lcd_vsync_len;
2331		var->pixclock = par->lcd_pixclock;
2332		ret = 0;
2333	}
2334
2335	return ret;
2336}
2337#endif /* defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD) */
2338
2339static int aty_init(struct fb_info *info)
2340{
2341	struct atyfb_par *par = (struct atyfb_par *) info->par;
2342	const char *ramname = NULL, *xtal;
2343	int gtb_memsize, has_var = 0;
2344	struct fb_var_screeninfo var;
2345	int ret;
2346
2347	init_waitqueue_head(&par->vblank.wait);
2348	spin_lock_init(&par->int_lock);
2349
2350#ifdef CONFIG_FB_ATY_GX
2351	if (!M64_HAS(INTEGRATED)) {
2352		u32 stat0;
2353		u8 dac_type, dac_subtype, clk_type;
2354		stat0 = aty_ld_le32(CNFG_STAT0, par);
2355		par->bus_type = (stat0 >> 0) & 0x07;
2356		par->ram_type = (stat0 >> 3) & 0x07;
2357		ramname = aty_gx_ram[par->ram_type];
2358		/* FIXME: clockchip/RAMDAC probing? */
2359		dac_type = (aty_ld_le32(DAC_CNTL, par) >> 16) & 0x07;
2360#ifdef CONFIG_ATARI
2361		clk_type = CLK_ATI18818_1;
2362		dac_type = (stat0 >> 9) & 0x07;
2363		if (dac_type == 0x07)
2364			dac_subtype = DAC_ATT20C408;
2365		else
2366			dac_subtype = (aty_ld_8(SCRATCH_REG1 + 1, par) & 0xF0) | dac_type;
2367#else
2368		dac_type = DAC_IBMRGB514;
2369		dac_subtype = DAC_IBMRGB514;
2370		clk_type = CLK_IBMRGB514;
2371#endif
2372		switch (dac_subtype) {
2373		case DAC_IBMRGB514:
2374			par->dac_ops = &aty_dac_ibm514;
2375			break;
2376#ifdef CONFIG_ATARI
2377		case DAC_ATI68860_B:
2378		case DAC_ATI68860_C:
2379			par->dac_ops = &aty_dac_ati68860b;
2380			break;
2381		case DAC_ATT20C408:
2382		case DAC_ATT21C498:
2383			par->dac_ops = &aty_dac_att21c498;
2384			break;
2385#endif
2386		default:
2387			PRINTKI("aty_init: DAC type not implemented yet!\n");
2388			par->dac_ops = &aty_dac_unsupported;
2389			break;
2390		}
2391		switch (clk_type) {
2392#ifdef CONFIG_ATARI
2393		case CLK_ATI18818_1:
2394			par->pll_ops = &aty_pll_ati18818_1;
2395			break;
2396#else
2397		case CLK_IBMRGB514:
2398			par->pll_ops = &aty_pll_ibm514;
2399			break;
2400#endif
2401#if 0 /* dead code */
2402		case CLK_STG1703:
2403			par->pll_ops = &aty_pll_stg1703;
2404			break;
2405		case CLK_CH8398:
2406			par->pll_ops = &aty_pll_ch8398;
2407			break;
2408		case CLK_ATT20C408:
2409			par->pll_ops = &aty_pll_att20c408;
2410			break;
2411#endif
2412		default:
2413			PRINTKI("aty_init: CLK type not implemented yet!");
2414			par->pll_ops = &aty_pll_unsupported;
2415			break;
2416		}
2417	}
2418#endif /* CONFIG_FB_ATY_GX */
2419#ifdef CONFIG_FB_ATY_CT
2420	if (M64_HAS(INTEGRATED)) {
2421		par->dac_ops = &aty_dac_ct;
2422		par->pll_ops = &aty_pll_ct;
2423		par->bus_type = PCI;
2424		par->ram_type = (aty_ld_le32(CNFG_STAT0, par) & 0x07);
2425		if (M64_HAS(XL_MEM))
2426			ramname = aty_xl_ram[par->ram_type];
2427		else
2428			ramname = aty_ct_ram[par->ram_type];
2429		/* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */
2430		if (par->pll_limits.mclk == 67 && par->ram_type < SDRAM)
2431			par->pll_limits.mclk = 63;
2432		/* Mobility + 32bit memory interface need halved XCLK. */
2433		if (M64_HAS(MOBIL_BUS) && par->ram_type == SDRAM32)
2434			par->pll_limits.xclk = (par->pll_limits.xclk + 1) >> 1;
2435	}
2436#endif
2437#ifdef CONFIG_PPC_PMAC
2438	/*
2439	 * The Apple iBook1 uses non-standard memory frequencies.
2440	 * We detect it and set the frequency manually.
2441	 */
2442	if (of_machine_is_compatible("PowerBook2,1")) {
2443		par->pll_limits.mclk = 70;
2444		par->pll_limits.xclk = 53;
2445	}
2446#endif
2447
2448	/* Allow command line to override clocks. */
2449	if (pll)
2450		par->pll_limits.pll_max = pll;
2451	if (mclk)
2452		par->pll_limits.mclk = mclk;
2453	if (xclk)
2454		par->pll_limits.xclk = xclk;
2455
2456	aty_calc_mem_refresh(par, par->pll_limits.xclk);
2457	par->pll_per = 1000000/par->pll_limits.pll_max;
2458	par->mclk_per = 1000000/par->pll_limits.mclk;
2459	par->xclk_per = 1000000/par->pll_limits.xclk;
2460
2461	par->ref_clk_per = 1000000000000ULL / 14318180;
2462	xtal = "14.31818";
2463
2464#ifdef CONFIG_FB_ATY_CT
2465	if (M64_HAS(GTB_DSP)) {
2466		u8 pll_ref_div = aty_ld_pll_ct(PLL_REF_DIV, par);
2467
2468		if (pll_ref_div) {
2469			int diff1, diff2;
2470			diff1 = 510 * 14 / pll_ref_div - par->pll_limits.pll_max;
2471			diff2 = 510 * 29 / pll_ref_div - par->pll_limits.pll_max;
2472			if (diff1 < 0)
2473				diff1 = -diff1;
2474			if (diff2 < 0)
2475				diff2 = -diff2;
2476			if (diff2 < diff1) {
2477				par->ref_clk_per = 1000000000000ULL / 29498928;
2478				xtal = "29.498928";
2479			}
2480		}
2481	}
2482#endif /* CONFIG_FB_ATY_CT */
2483
2484	/* save previous video mode */
2485	aty_get_crtc(par, &par->saved_crtc);
2486	if (par->pll_ops->get_pll)
2487		par->pll_ops->get_pll(info, &par->saved_pll);
2488
2489	par->mem_cntl = aty_ld_le32(MEM_CNTL, par);
2490	gtb_memsize = M64_HAS(GTB_DSP);
2491	if (gtb_memsize)
2492		/* 0xF used instead of MEM_SIZE_ALIAS */
2493		switch (par->mem_cntl & 0xF) {
2494		case MEM_SIZE_512K:
2495			info->fix.smem_len = 0x80000;
2496			break;
2497		case MEM_SIZE_1M:
2498			info->fix.smem_len = 0x100000;
2499			break;
2500		case MEM_SIZE_2M_GTB:
2501			info->fix.smem_len = 0x200000;
2502			break;
2503		case MEM_SIZE_4M_GTB:
2504			info->fix.smem_len = 0x400000;
2505			break;
2506		case MEM_SIZE_6M_GTB:
2507			info->fix.smem_len = 0x600000;
2508			break;
2509		case MEM_SIZE_8M_GTB:
2510			info->fix.smem_len = 0x800000;
2511			break;
2512		default:
2513			info->fix.smem_len = 0x80000;
2514	} else
2515		switch (par->mem_cntl & MEM_SIZE_ALIAS) {
2516		case MEM_SIZE_512K:
2517			info->fix.smem_len = 0x80000;
2518			break;
2519		case MEM_SIZE_1M:
2520			info->fix.smem_len = 0x100000;
2521			break;
2522		case MEM_SIZE_2M:
2523			info->fix.smem_len = 0x200000;
2524			break;
2525		case MEM_SIZE_4M:
2526			info->fix.smem_len = 0x400000;
2527			break;
2528		case MEM_SIZE_6M:
2529			info->fix.smem_len = 0x600000;
2530			break;
2531		case MEM_SIZE_8M:
2532			info->fix.smem_len = 0x800000;
2533			break;
2534		default:
2535			info->fix.smem_len = 0x80000;
2536		}
2537
2538	if (M64_HAS(MAGIC_VRAM_SIZE)) {
2539		if (aty_ld_le32(CNFG_STAT1, par) & 0x40000000)
2540			info->fix.smem_len += 0x400000;
2541	}
2542
2543	if (vram) {
2544		info->fix.smem_len = vram * 1024;
2545		par->mem_cntl &= ~(gtb_memsize ? 0xF : MEM_SIZE_ALIAS);
2546		if (info->fix.smem_len <= 0x80000)
2547			par->mem_cntl |= MEM_SIZE_512K;
2548		else if (info->fix.smem_len <= 0x100000)
2549			par->mem_cntl |= MEM_SIZE_1M;
2550		else if (info->fix.smem_len <= 0x200000)
2551			par->mem_cntl |= gtb_memsize ? MEM_SIZE_2M_GTB : MEM_SIZE_2M;
2552		else if (info->fix.smem_len <= 0x400000)
2553			par->mem_cntl |= gtb_memsize ? MEM_SIZE_4M_GTB : MEM_SIZE_4M;
2554		else if (info->fix.smem_len <= 0x600000)
2555			par->mem_cntl |= gtb_memsize ? MEM_SIZE_6M_GTB : MEM_SIZE_6M;
2556		else
2557			par->mem_cntl |= gtb_memsize ? MEM_SIZE_8M_GTB : MEM_SIZE_8M;
2558		aty_st_le32(MEM_CNTL, par->mem_cntl, par);
2559	}
2560
2561	/*
2562	 * Reg Block 0 (CT-compatible block) is at mmio_start
2563	 * Reg Block 1 (multimedia extensions) is at mmio_start - 0x400
2564	 */
2565	if (M64_HAS(GX)) {
2566		info->fix.mmio_len = 0x400;
2567		info->fix.accel = FB_ACCEL_ATI_MACH64GX;
2568	} else if (M64_HAS(CT)) {
2569		info->fix.mmio_len = 0x400;
2570		info->fix.accel = FB_ACCEL_ATI_MACH64CT;
2571	} else if (M64_HAS(VT)) {
2572		info->fix.mmio_start -= 0x400;
2573		info->fix.mmio_len = 0x800;
2574		info->fix.accel = FB_ACCEL_ATI_MACH64VT;
2575	} else {/* GT */
2576		info->fix.mmio_start -= 0x400;
2577		info->fix.mmio_len = 0x800;
2578		info->fix.accel = FB_ACCEL_ATI_MACH64GT;
2579	}
2580
2581	PRINTKI("%d%c %s, %s MHz XTAL, %d MHz PLL, %d Mhz MCLK, %d MHz XCLK\n",
2582		info->fix.smem_len == 0x80000 ? 512 : (info->fix.smem_len>>20),
2583		info->fix.smem_len == 0x80000 ? 'K' : 'M', ramname, xtal,
2584		par->pll_limits.pll_max, par->pll_limits.mclk,
2585		par->pll_limits.xclk);
2586
2587#if defined(DEBUG) && defined(CONFIG_FB_ATY_CT)
2588	if (M64_HAS(INTEGRATED)) {
2589		int i;
2590		printk("debug atyfb: BUS_CNTL DAC_CNTL MEM_CNTL "
2591		       "EXT_MEM_CNTL CRTC_GEN_CNTL DSP_CONFIG "
2592		       "DSP_ON_OFF CLOCK_CNTL\n"
2593		       "debug atyfb: %08x %08x %08x "
2594		       "%08x     %08x      %08x   "
2595		       "%08x   %08x\n"
2596		       "debug atyfb: PLL",
2597		       aty_ld_le32(BUS_CNTL, par),
2598		       aty_ld_le32(DAC_CNTL, par),
2599		       aty_ld_le32(MEM_CNTL, par),
2600		       aty_ld_le32(EXT_MEM_CNTL, par),
2601		       aty_ld_le32(CRTC_GEN_CNTL, par),
2602		       aty_ld_le32(DSP_CONFIG, par),
2603		       aty_ld_le32(DSP_ON_OFF, par),
2604		       aty_ld_le32(CLOCK_CNTL, par));
2605		for (i = 0; i < 40; i++)
2606			printk(" %02x", aty_ld_pll_ct(i, par));
2607		printk("\n");
2608	}
2609#endif
2610	if (par->pll_ops->init_pll)
2611		par->pll_ops->init_pll(info, &par->pll);
2612	if (par->pll_ops->resume_pll)
2613		par->pll_ops->resume_pll(info, &par->pll);
2614
2615	aty_fudge_framebuffer_len(info);
2616
2617	/*
2618	 * Disable register access through the linear aperture
2619	 * if the auxiliary aperture is used so we can access
2620	 * the full 8 MB of video RAM on 8 MB boards.
2621	 */
2622	if (par->aux_start)
2623		aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, par) |
2624			    BUS_APER_REG_DIS, par);
2625
2626	if (!nomtrr)
2627		/*
2628		 * Only the ioremap_wc()'d area will get WC here
2629		 * since ioremap_uc() was used on the entire PCI BAR.
2630		 */
2631		par->wc_cookie = arch_phys_wc_add(par->res_start,
2632						  par->res_size);
2633
2634	info->fbops = &atyfb_ops;
2635	info->pseudo_palette = par->pseudo_palette;
2636	info->flags = FBINFO_DEFAULT           |
2637		      FBINFO_HWACCEL_IMAGEBLIT |
2638		      FBINFO_HWACCEL_FILLRECT  |
2639		      FBINFO_HWACCEL_COPYAREA  |
2640		      FBINFO_HWACCEL_YPAN      |
2641		      FBINFO_READS_FAST;
2642
2643#ifdef CONFIG_PMAC_BACKLIGHT
2644	if (M64_HAS(G3_PB_1_1) && of_machine_is_compatible("PowerBook1,1")) {
2645		/*
2646		 * these bits let the 101 powerbook
2647		 * wake up from sleep -- paulus
2648		 */
2649		aty_st_lcd(POWER_MANAGEMENT, aty_ld_lcd(POWER_MANAGEMENT, par) |
2650			   USE_F32KHZ | TRISTATE_MEM_EN, par);
2651	} else
2652#endif
2653	if (M64_HAS(MOBIL_BUS) && backlight) {
2654#ifdef CONFIG_FB_ATY_BACKLIGHT
2655		aty_bl_init(par);
2656#endif
2657	}
2658
2659	memset(&var, 0, sizeof(var));
2660#ifdef CONFIG_PPC
2661	if (machine_is(powermac)) {
2662		/*
2663		 * FIXME: The NVRAM stuff should be put in a Mac-specific file,
2664		 *        as it applies to all Mac video cards
2665		 */
2666		if (mode) {
2667			if (mac_find_mode(&var, info, mode, 8))
2668				has_var = 1;
2669		} else {
2670			if (default_vmode == VMODE_CHOOSE) {
2671				int sense;
2672				if (M64_HAS(G3_PB_1024x768))
2673					/* G3 PowerBook with 1024x768 LCD */
2674					default_vmode = VMODE_1024_768_60;
2675				else if (of_machine_is_compatible("iMac"))
2676					default_vmode = VMODE_1024_768_75;
2677				else if (of_machine_is_compatible("PowerBook2,1"))
2678					/* iBook with 800x600 LCD */
2679					default_vmode = VMODE_800_600_60;
2680				else
2681					default_vmode = VMODE_640_480_67;
2682				sense = read_aty_sense(par);
2683				PRINTKI("monitor sense=%x, mode %d\n",
2684					sense,  mac_map_monitor_sense(sense));
2685			}
2686			if (default_vmode <= 0 || default_vmode > VMODE_MAX)
2687				default_vmode = VMODE_640_480_60;
2688			if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
2689				default_cmode = CMODE_8;
2690			if (!mac_vmode_to_var(default_vmode, default_cmode,
2691					      &var))
2692				has_var = 1;
2693		}
2694	}
2695
2696#endif /* !CONFIG_PPC */
2697
2698#if defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD)
2699	if (!atyfb_get_timings_from_lcd(par, &var))
2700		has_var = 1;
2701#endif
2702
2703	if (mode && fb_find_mode(&var, info, mode, NULL, 0, &defmode, 8))
2704		has_var = 1;
2705
2706	if (!has_var)
2707		var = default_var;
2708
2709	if (noaccel)
2710		var.accel_flags &= ~FB_ACCELF_TEXT;
2711	else
2712		var.accel_flags |= FB_ACCELF_TEXT;
2713
2714	if (comp_sync != -1) {
2715		if (!comp_sync)
2716			var.sync &= ~FB_SYNC_COMP_HIGH_ACT;
2717		else
2718			var.sync |= FB_SYNC_COMP_HIGH_ACT;
2719	}
2720
2721	if (var.yres == var.yres_virtual) {
2722		u32 videoram = (info->fix.smem_len - (PAGE_SIZE << 2));
2723		var.yres_virtual = ((videoram * 8) / var.bits_per_pixel) / var.xres_virtual;
2724		if (var.yres_virtual < var.yres)
2725			var.yres_virtual = var.yres;
2726	}
2727
2728	ret = atyfb_check_var(&var, info);
2729	if (ret) {
2730		PRINTKE("can't set default video mode\n");
2731		goto aty_init_exit;
2732	}
2733
2734#ifdef CONFIG_FB_ATY_CT
2735	if (!noaccel && M64_HAS(INTEGRATED))
2736		aty_init_cursor(info);
2737#endif /* CONFIG_FB_ATY_CT */
2738	info->var = var;
2739
2740	ret = fb_alloc_cmap(&info->cmap, 256, 0);
2741	if (ret < 0)
2742		goto aty_init_exit;
2743
2744	ret = register_framebuffer(info);
2745	if (ret < 0) {
2746		fb_dealloc_cmap(&info->cmap);
2747		goto aty_init_exit;
2748	}
2749
2750	fb_list = info;
2751
2752	PRINTKI("fb%d: %s frame buffer device on %s\n",
2753		info->node, info->fix.id, par->bus_type == ISA ? "ISA" : "PCI");
2754	return 0;
2755
2756aty_init_exit:
2757	/* restore video mode */
2758	aty_set_crtc(par, &par->saved_crtc);
2759	par->pll_ops->set_pll(info, &par->saved_pll);
2760	arch_phys_wc_del(par->wc_cookie);
2761
2762	return ret;
2763}
2764
2765#if defined(CONFIG_ATARI) && !defined(MODULE)
2766static int store_video_par(char *video_str, unsigned char m64_num)
2767{
2768	char *p;
2769	unsigned long vmembase, size, guiregbase;
2770
2771	PRINTKI("store_video_par() '%s' \n", video_str);
2772
2773	if (!(p = strsep(&video_str, ";")) || !*p)
2774		goto mach64_invalid;
2775	vmembase = simple_strtoul(p, NULL, 0);
2776	if (!(p = strsep(&video_str, ";")) || !*p)
2777		goto mach64_invalid;
2778	size = simple_strtoul(p, NULL, 0);
2779	if (!(p = strsep(&video_str, ";")) || !*p)
2780		goto mach64_invalid;
2781	guiregbase = simple_strtoul(p, NULL, 0);
2782
2783	phys_vmembase[m64_num] = vmembase;
2784	phys_size[m64_num] = size;
2785	phys_guiregbase[m64_num] = guiregbase;
2786	PRINTKI("stored them all: $%08lX $%08lX $%08lX \n", vmembase, size,
2787		guiregbase);
2788	return 0;
2789
2790 mach64_invalid:
2791	phys_vmembase[m64_num] = 0;
2792	return -1;
2793}
2794#endif /* CONFIG_ATARI && !MODULE */
2795
2796/*
2797 * Blank the display.
2798 */
2799
2800static int atyfb_blank(int blank, struct fb_info *info)
2801{
2802	struct atyfb_par *par = (struct atyfb_par *) info->par;
2803	u32 gen_cntl;
2804
2805	if (par->lock_blank || par->asleep)
2806		return 0;
2807
2808#ifdef CONFIG_FB_ATY_GENERIC_LCD
2809	if (par->lcd_table && blank > FB_BLANK_NORMAL &&
2810	    (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2811		u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2812		pm &= ~PWR_BLON;
2813		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2814	}
2815#endif
2816
2817	gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par);
2818	gen_cntl &= ~0x400004c;
2819	switch (blank) {
2820	case FB_BLANK_UNBLANK:
2821		break;
2822	case FB_BLANK_NORMAL:
2823		gen_cntl |= 0x4000040;
2824		break;
2825	case FB_BLANK_VSYNC_SUSPEND:
2826		gen_cntl |= 0x4000048;
2827		break;
2828	case FB_BLANK_HSYNC_SUSPEND:
2829		gen_cntl |= 0x4000044;
2830		break;
2831	case FB_BLANK_POWERDOWN:
2832		gen_cntl |= 0x400004c;
2833		break;
2834	}
2835	aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par);
2836
2837#ifdef CONFIG_FB_ATY_GENERIC_LCD
2838	if (par->lcd_table && blank <= FB_BLANK_NORMAL &&
2839	    (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2840		u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2841		pm |= PWR_BLON;
2842		aty_st_lcd(POWER_MANAGEMENT, pm, par);
2843	}
2844#endif
2845
2846	return 0;
2847}
2848
2849static void aty_st_pal(u_int regno, u_int red, u_int green, u_int blue,
2850		       const struct atyfb_par *par)
2851{
2852	aty_st_8(DAC_W_INDEX, regno, par);
2853	aty_st_8(DAC_DATA, red, par);
2854	aty_st_8(DAC_DATA, green, par);
2855	aty_st_8(DAC_DATA, blue, par);
2856}
2857
2858/*
2859 * Set a single color register. The values supplied are already
2860 * rounded down to the hardware's capabilities (according to the
2861 * entries in the var structure). Return != 0 for invalid regno.
2862 * !! 4 & 8 =  PSEUDO, > 8 = DIRECTCOLOR
2863 */
2864
2865static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
2866			   u_int transp, struct fb_info *info)
2867{
2868	struct atyfb_par *par = (struct atyfb_par *) info->par;
2869	int i, depth;
2870	u32 *pal = info->pseudo_palette;
2871
2872	depth = info->var.bits_per_pixel;
2873	if (depth == 16)
2874		depth = (info->var.green.length == 5) ? 15 : 16;
2875
2876	if (par->asleep)
2877		return 0;
2878
2879	if (regno > 255 ||
2880	    (depth == 16 && regno > 63) ||
2881	    (depth == 15 && regno > 31))
2882		return 1;
2883
2884	red >>= 8;
2885	green >>= 8;
2886	blue >>= 8;
2887
2888	par->palette[regno].red = red;
2889	par->palette[regno].green = green;
2890	par->palette[regno].blue = blue;
2891
2892	if (regno < 16) {
2893		switch (depth) {
2894		case 15:
2895			pal[regno] = (regno << 10) | (regno << 5) | regno;
2896			break;
2897		case 16:
2898			pal[regno] = (regno << 11) | (regno << 5) | regno;
2899			break;
2900		case 24:
2901			pal[regno] = (regno << 16) | (regno << 8) | regno;
2902			break;
2903		case 32:
2904			i = (regno << 8) | regno;
2905			pal[regno] = (i << 16) | i;
2906			break;
2907		}
2908	}
2909
2910	i = aty_ld_8(DAC_CNTL, par) & 0xfc;
2911	if (M64_HAS(EXTRA_BRIGHT))
2912		i |= 0x2; /* DAC_CNTL | 0x2 turns off the extra brightness for gt */
2913	aty_st_8(DAC_CNTL, i, par);
2914	aty_st_8(DAC_MASK, 0xff, par);
2915
2916	if (M64_HAS(INTEGRATED)) {
2917		if (depth == 16) {
2918			if (regno < 32)
2919				aty_st_pal(regno << 3, red,
2920					   par->palette[regno << 1].green,
2921					   blue, par);
2922			red = par->palette[regno >> 1].red;
2923			blue = par->palette[regno >> 1].blue;
2924			regno <<= 2;
2925		} else if (depth == 15) {
2926			regno <<= 3;
2927			for (i = 0; i < 8; i++)
2928				aty_st_pal(regno + i, red, green, blue, par);
2929		}
2930	}
2931	aty_st_pal(regno, red, green, blue, par);
2932
2933	return 0;
2934}
2935
2936#ifdef CONFIG_PCI
2937
2938#ifdef __sparc__
2939
2940static int atyfb_setup_sparc(struct pci_dev *pdev, struct fb_info *info,
2941			     unsigned long addr)
2942{
2943	struct atyfb_par *par = info->par;
2944	struct device_node *dp;
2945	u32 mem, chip_id;
2946	int i, j, ret;
2947
2948	/*
2949	 * Map memory-mapped registers.
2950	 */
2951	par->ati_regbase = (void *)addr + 0x7ffc00UL;
2952	info->fix.mmio_start = addr + 0x7ffc00UL;
2953
2954	/*
2955	 * Map in big-endian aperture.
2956	 */
2957	info->screen_base = (char *) (addr + 0x800000UL);
2958	info->fix.smem_start = addr + 0x800000UL;
2959
2960	/*
2961	 * Figure mmap addresses from PCI config space.
2962	 * Split Framebuffer in big- and little-endian halfs.
2963	 */
2964	for (i = 0; i < 6 && pdev->resource[i].start; i++)
2965		/* nothing */ ;
2966	j = i + 4;
2967
2968	par->mmap_map = kcalloc(j, sizeof(*par->mmap_map), GFP_ATOMIC);
2969	if (!par->mmap_map) {
2970		PRINTKE("atyfb_setup_sparc() can't alloc mmap_map\n");
2971		return -ENOMEM;
2972	}
2973
2974	for (i = 0, j = 2; i < 6 && pdev->resource[i].start; i++) {
2975		struct resource *rp = &pdev->resource[i];
2976		int io, breg = PCI_BASE_ADDRESS_0 + (i << 2);
2977		unsigned long base;
2978		u32 size, pbase;
2979
2980		base = rp->start;
2981
2982		io = (rp->flags & IORESOURCE_IO);
2983
2984		size = rp->end - base + 1;
2985
2986		pci_read_config_dword(pdev, breg, &pbase);
2987
2988		if (io)
2989			size &= ~1;
2990
2991		/*
2992		 * Map the framebuffer a second time, this time without
2993		 * the braindead _PAGE_IE setting. This is used by the
2994		 * fixed Xserver, but we need to maintain the old mapping
2995		 * to stay compatible with older ones...
2996		 */
2997		if (base == addr) {
2998			par->mmap_map[j].voff = (pbase + 0x10000000) & PAGE_MASK;
2999			par->mmap_map[j].poff = base & PAGE_MASK;
3000			par->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK;
3001			par->mmap_map[j].prot_mask = _PAGE_CACHE;
3002			par->mmap_map[j].prot_flag = _PAGE_E;
3003			j++;
3004		}
3005
3006		/*
3007		 * Here comes the old framebuffer mapping with _PAGE_IE
3008		 * set for the big endian half of the framebuffer...
3009		 */
3010		if (base == addr) {
3011			par->mmap_map[j].voff = (pbase + 0x800000) & PAGE_MASK;
3012			par->mmap_map[j].poff = (base + 0x800000) & PAGE_MASK;
3013			par->mmap_map[j].size = 0x800000;
3014			par->mmap_map[j].prot_mask = _PAGE_CACHE;
3015			par->mmap_map[j].prot_flag = _PAGE_E | _PAGE_IE;
3016			size -= 0x800000;
3017			j++;
3018		}
3019
3020		par->mmap_map[j].voff = pbase & PAGE_MASK;
3021		par->mmap_map[j].poff = base & PAGE_MASK;
3022		par->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK;
3023		par->mmap_map[j].prot_mask = _PAGE_CACHE;
3024		par->mmap_map[j].prot_flag = _PAGE_E;
3025		j++;
3026	}
3027
3028	ret = correct_chipset(par);
3029	if (ret)
3030		return ret;
3031
3032	if (IS_XL(pdev->device)) {
3033		/*
3034		 * Fix PROMs idea of MEM_CNTL settings...
3035		 */
3036		mem = aty_ld_le32(MEM_CNTL, par);
3037		chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
3038		if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && !((chip_id >> 24) & 1)) {
3039			switch (mem & 0x0f) {
3040			case 3:
3041				mem = (mem & ~(0x0f)) | 2;
3042				break;
3043			case 7:
3044				mem = (mem & ~(0x0f)) | 3;
3045				break;
3046			case 9:
3047				mem = (mem & ~(0x0f)) | 4;
3048				break;
3049			case 11:
3050				mem = (mem & ~(0x0f)) | 5;
3051				break;
3052			default:
3053				break;
3054			}
3055			if ((aty_ld_le32(CNFG_STAT0, par) & 7) >= SDRAM)
3056				mem &= ~(0x00700000);
3057		}
3058		mem &= ~(0xcf80e000);	/* Turn off all undocumented bits. */
3059		aty_st_le32(MEM_CNTL, mem, par);
3060	}
3061
3062	dp = pci_device_to_OF_node(pdev);
3063	if (dp == of_console_device) {
3064		struct fb_var_screeninfo *var = &default_var;
3065		unsigned int N, P, Q, M, T, R;
3066		u32 v_total, h_total;
3067		struct crtc crtc;
3068		u8 pll_regs[16];
3069		u8 clock_cntl;
3070
3071		crtc.vxres = of_getintprop_default(dp, "width", 1024);
3072		crtc.vyres = of_getintprop_default(dp, "height", 768);
3073		var->bits_per_pixel = of_getintprop_default(dp, "depth", 8);
3074		var->xoffset = var->yoffset = 0;
3075		crtc.h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, par);
3076		crtc.h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, par);
3077		crtc.v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, par);
3078		crtc.v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, par);
3079		crtc.gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par);
3080		aty_crtc_to_var(&crtc, var);
3081
3082		h_total = var->xres + var->right_margin + var->hsync_len + var->left_margin;
3083		v_total = var->yres + var->lower_margin + var->vsync_len + var->upper_margin;
3084
3085		/*
3086		 * Read the PLL to figure actual Refresh Rate.
3087		 */
3088		clock_cntl = aty_ld_8(CLOCK_CNTL, par);
3089		/* DPRINTK("CLOCK_CNTL %02x\n", clock_cntl); */
3090		for (i = 0; i < 16; i++)
3091			pll_regs[i] = aty_ld_pll_ct(i, par);
3092
3093		/*
3094		 * PLL Reference Divider M:
3095		 */
3096		M = pll_regs[2];
3097
3098		/*
3099		 * PLL Feedback Divider N (Dependent on CLOCK_CNTL):
3100		 */
3101		N = pll_regs[7 + (clock_cntl & 3)];
3102
3103		/*
3104		 * PLL Post Divider P (Dependent on CLOCK_CNTL):
3105		 */
3106		P = 1 << (pll_regs[6] >> ((clock_cntl & 3) << 1));
3107
3108		/*
3109		 * PLL Divider Q:
3110		 */
3111		Q = N / P;
3112
3113		/*
3114		 * Target Frequency:
3115		 *
3116		 *      T * M
3117		 * Q = -------
3118		 *      2 * R
3119		 *
3120		 * where R is XTALIN (= 14318 or 29498 kHz).
3121		 */
3122		if (IS_XL(pdev->device))
3123			R = 29498;
3124		else
3125			R = 14318;
3126
3127		T = 2 * Q * R / M;
3128
3129		default_var.pixclock = 1000000000 / T;
3130	}
3131
3132	return 0;
3133}
3134
3135#else /* __sparc__ */
3136
3137#ifdef __i386__
3138#ifdef CONFIG_FB_ATY_GENERIC_LCD
3139static void aty_init_lcd(struct atyfb_par *par, u32 bios_base)
3140{
3141	u32 driv_inf_tab, sig;
3142	u16 lcd_ofs;
3143
3144	/*
3145	 * To support an LCD panel, we should know it's dimensions and
3146	 *  it's desired pixel clock.
3147	 * There are two ways to do it:
3148	 *  - Check the startup video mode and calculate the panel
3149	 *    size from it. This is unreliable.
3150	 *  - Read it from the driver information table in the video BIOS.
3151	 */
3152	/* Address of driver information table is at offset 0x78. */
3153	driv_inf_tab = bios_base + *((u16 *)(bios_base+0x78));
3154
3155	/* Check for the driver information table signature. */
3156	sig = *(u32 *)driv_inf_tab;
3157	if ((sig == 0x54504c24) || /* Rage LT pro */
3158	    (sig == 0x544d5224) || /* Rage mobility */
3159	    (sig == 0x54435824) || /* Rage XC */
3160	    (sig == 0x544c5824)) { /* Rage XL */
3161		PRINTKI("BIOS contains driver information table.\n");
3162		lcd_ofs = *(u16 *)(driv_inf_tab + 10);
3163		par->lcd_table = 0;
3164		if (lcd_ofs != 0)
3165			par->lcd_table = bios_base + lcd_ofs;
3166	}
3167
3168	if (par->lcd_table != 0) {
3169		char model[24];
3170		char strbuf[16];
3171		char refresh_rates_buf[100];
3172		int id, tech, f, i, m, default_refresh_rate;
3173		char *txtcolour;
3174		char *txtmonitor;
3175		char *txtdual;
3176		char *txtformat;
3177		u16 width, height, panel_type, refresh_rates;
3178		u16 *lcdmodeptr;
3179		u32 format;
3180		u8 lcd_refresh_rates[16] = { 50, 56, 60, 67, 70, 72, 75, 76, 85,
3181					     90, 100, 120, 140, 150, 160, 200 };
3182		/*
3183		 * The most important information is the panel size at
3184		 * offset 25 and 27, but there's some other nice information
3185		 * which we print to the screen.
3186		 */
3187		id = *(u8 *)par->lcd_table;
3188		strncpy(model, (char *)par->lcd_table+1, 24);
3189		model[23] = 0;
3190
3191		width = par->lcd_width = *(u16 *)(par->lcd_table+25);
3192		height = par->lcd_height = *(u16 *)(par->lcd_table+27);
3193		panel_type = *(u16 *)(par->lcd_table+29);
3194		if (panel_type & 1)
3195			txtcolour = "colour";
3196		else
3197			txtcolour = "monochrome";
3198		if (panel_type & 2)
3199			txtdual = "dual (split) ";
3200		else
3201			txtdual = "";
3202		tech = (panel_type >> 2) & 63;
3203		switch (tech) {
3204		case 0:
3205			txtmonitor = "passive matrix";
3206			break;
3207		case 1:
3208			txtmonitor = "active matrix";
3209			break;
3210		case 2:
3211			txtmonitor = "active addressed STN";
3212			break;
3213		case 3:
3214			txtmonitor = "EL";
3215			break;
3216		case 4:
3217			txtmonitor = "plasma";
3218			break;
3219		default:
3220			txtmonitor = "unknown";
3221		}
3222		format = *(u32 *)(par->lcd_table+57);
3223		if (tech == 0 || tech == 2) {
3224			switch (format & 7) {
3225			case 0:
3226				txtformat = "12 bit interface";
3227				break;
3228			case 1:
3229				txtformat = "16 bit interface";
3230				break;
3231			case 2:
3232				txtformat = "24 bit interface";
3233				break;
3234			default:
3235				txtformat = "unknown format";
3236			}
3237		} else {
3238			switch (format & 7) {
3239			case 0:
3240				txtformat = "8 colours";
3241				break;
3242			case 1:
3243				txtformat = "512 colours";
3244				break;
3245			case 2:
3246				txtformat = "4096 colours";
3247				break;
3248			case 4:
3249				txtformat = "262144 colours (LT mode)";
3250				break;
3251			case 5:
3252				txtformat = "16777216 colours";
3253				break;
3254			case 6:
3255				txtformat = "262144 colours (FDPI-2 mode)";
3256				break;
3257			default:
3258				txtformat = "unknown format";
3259			}
3260		}
3261		PRINTKI("%s%s %s monitor detected: %s\n",
3262			txtdual, txtcolour, txtmonitor, model);
3263		PRINTKI("       id=%d, %dx%d pixels, %s\n",
3264			id, width, height, txtformat);
3265		refresh_rates_buf[0] = 0;
3266		refresh_rates = *(u16 *)(par->lcd_table+62);
3267		m = 1;
3268		f = 0;
3269		for (i = 0; i < 16; i++) {
3270			if (refresh_rates & m) {
3271				if (f == 0) {
3272					sprintf(strbuf, "%d",
3273						lcd_refresh_rates[i]);
3274					f++;
3275				} else {
3276					sprintf(strbuf, ",%d",
3277						lcd_refresh_rates[i]);
3278				}
3279				strcat(refresh_rates_buf, strbuf);
3280			}
3281			m = m << 1;
3282		}
3283		default_refresh_rate = (*(u8 *)(par->lcd_table+61) & 0xf0) >> 4;
3284		PRINTKI("       supports refresh rates [%s], default %d Hz\n",
3285			refresh_rates_buf, lcd_refresh_rates[default_refresh_rate]);
3286		par->lcd_refreshrate = lcd_refresh_rates[default_refresh_rate];
3287		/*
3288		 * We now need to determine the crtc parameters for the
3289		 * LCD monitor. This is tricky, because they are not stored
3290		 * individually in the BIOS. Instead, the BIOS contains a
3291		 * table of display modes that work for this monitor.
3292		 *
3293		 * The idea is that we search for a mode of the same dimensions
3294		 * as the dimensions of the LCD monitor. Say our LCD monitor
3295		 * is 800x600 pixels, we search for a 800x600 monitor.
3296		 * The CRTC parameters we find here are the ones that we need
3297		 * to use to simulate other resolutions on the LCD screen.
3298		 */
3299		lcdmodeptr = (u16 *)(par->lcd_table + 64);
3300		while (*lcdmodeptr != 0) {
3301			u32 modeptr;
3302			u16 mwidth, mheight, lcd_hsync_start, lcd_vsync_start;
3303			modeptr = bios_base + *lcdmodeptr;
3304
3305			mwidth = *((u16 *)(modeptr+0));
3306			mheight = *((u16 *)(modeptr+2));
3307
3308			if (mwidth == width && mheight == height) {
3309				par->lcd_pixclock = 100000000 / *((u16 *)(modeptr+9));
3310				par->lcd_htotal = *((u16 *)(modeptr+17)) & 511;
3311				par->lcd_hdisp = *((u16 *)(modeptr+19)) & 511;
3312				lcd_hsync_start = *((u16 *)(modeptr+21)) & 511;
3313				par->lcd_hsync_dly = (*((u16 *)(modeptr+21)) >> 9) & 7;
3314				par->lcd_hsync_len = *((u8 *)(modeptr+23)) & 63;
3315
3316				par->lcd_vtotal = *((u16 *)(modeptr+24)) & 2047;
3317				par->lcd_vdisp = *((u16 *)(modeptr+26)) & 2047;
3318				lcd_vsync_start = *((u16 *)(modeptr+28)) & 2047;
3319				par->lcd_vsync_len = (*((u16 *)(modeptr+28)) >> 11) & 31;
3320
3321				par->lcd_htotal = (par->lcd_htotal + 1) * 8;
3322				par->lcd_hdisp = (par->lcd_hdisp + 1) * 8;
3323				lcd_hsync_start = (lcd_hsync_start + 1) * 8;
3324				par->lcd_hsync_len = par->lcd_hsync_len * 8;
3325
3326				par->lcd_vtotal++;
3327				par->lcd_vdisp++;
3328				lcd_vsync_start++;
3329
3330				par->lcd_right_margin = lcd_hsync_start - par->lcd_hdisp;
3331				par->lcd_lower_margin = lcd_vsync_start - par->lcd_vdisp;
3332				par->lcd_hblank_len = par->lcd_htotal - par->lcd_hdisp;
3333				par->lcd_vblank_len = par->lcd_vtotal - par->lcd_vdisp;
3334				break;
3335			}
3336
3337			lcdmodeptr++;
3338		}
3339		if (*lcdmodeptr == 0) {
3340			PRINTKE("LCD monitor CRTC parameters not found!!!\n");
3341			/* To do: Switch to CRT if possible. */
3342		} else {
3343			PRINTKI("       LCD CRTC parameters: %d.%d  %d %d %d %d  %d %d %d %d\n",
3344				1000000 / par->lcd_pixclock, 1000000 % par->lcd_pixclock,
3345				par->lcd_hdisp,
3346				par->lcd_hdisp + par->lcd_right_margin,
3347				par->lcd_hdisp + par->lcd_right_margin
3348					+ par->lcd_hsync_dly + par->lcd_hsync_len,
3349				par->lcd_htotal,
3350				par->lcd_vdisp,
3351				par->lcd_vdisp + par->lcd_lower_margin,
3352				par->lcd_vdisp + par->lcd_lower_margin + par->lcd_vsync_len,
3353				par->lcd_vtotal);
3354			PRINTKI("                          : %d %d %d %d %d %d %d %d %d\n",
3355				par->lcd_pixclock,
3356				par->lcd_hblank_len - (par->lcd_right_margin +
3357					par->lcd_hsync_dly + par->lcd_hsync_len),
3358				par->lcd_hdisp,
3359				par->lcd_right_margin,
3360				par->lcd_hsync_len,
3361				par->lcd_vblank_len - (par->lcd_lower_margin + par->lcd_vsync_len),
3362				par->lcd_vdisp,
3363				par->lcd_lower_margin,
3364				par->lcd_vsync_len);
3365		}
3366	}
3367}
3368#endif /* CONFIG_FB_ATY_GENERIC_LCD */
3369
3370static int init_from_bios(struct atyfb_par *par)
3371{
3372	u32 bios_base, rom_addr;
3373	int ret;
3374
3375	rom_addr = 0xc0000 + ((aty_ld_le32(SCRATCH_REG1, par) & 0x7f) << 11);
3376	bios_base = (unsigned long)ioremap(rom_addr, 0x10000);
3377
3378	/* The BIOS starts with 0xaa55. */
3379	if (*((u16 *)bios_base) == 0xaa55) {
3380
3381		u8 *bios_ptr;
3382		u16 rom_table_offset, freq_table_offset;
3383		PLL_BLOCK_MACH64 pll_block;
3384
3385		PRINTKI("Mach64 BIOS is located at %x, mapped at %x.\n", rom_addr, bios_base);
3386
3387		/* check for frequncy table */
3388		bios_ptr = (u8*)bios_base;
3389		rom_table_offset = (u16)(bios_ptr[0x48] | (bios_ptr[0x49] << 8));
3390		freq_table_offset = bios_ptr[rom_table_offset + 16] | (bios_ptr[rom_table_offset + 17] << 8);
3391		memcpy(&pll_block, bios_ptr + freq_table_offset, sizeof(PLL_BLOCK_MACH64));
3392
3393		PRINTKI("BIOS frequency table:\n");
3394		PRINTKI("PCLK_min_freq %d, PCLK_max_freq %d, ref_freq %d, ref_divider %d\n",
3395			pll_block.PCLK_min_freq, pll_block.PCLK_max_freq,
3396			pll_block.ref_freq, pll_block.ref_divider);
3397		PRINTKI("MCLK_pwd %d, MCLK_max_freq %d, XCLK_max_freq %d, SCLK_freq %d\n",
3398			pll_block.MCLK_pwd, pll_block.MCLK_max_freq,
3399			pll_block.XCLK_max_freq, pll_block.SCLK_freq);
3400
3401		par->pll_limits.pll_min = pll_block.PCLK_min_freq/100;
3402		par->pll_limits.pll_max = pll_block.PCLK_max_freq/100;
3403		par->pll_limits.ref_clk = pll_block.ref_freq/100;
3404		par->pll_limits.ref_div = pll_block.ref_divider;
3405		par->pll_limits.sclk = pll_block.SCLK_freq/100;
3406		par->pll_limits.mclk = pll_block.MCLK_max_freq/100;
3407		par->pll_limits.mclk_pm = pll_block.MCLK_pwd/100;
3408		par->pll_limits.xclk = pll_block.XCLK_max_freq/100;
3409#ifdef CONFIG_FB_ATY_GENERIC_LCD
3410		aty_init_lcd(par, bios_base);
3411#endif
3412		ret = 0;
3413	} else {
3414		PRINTKE("no BIOS frequency table found, use parameters\n");
3415		ret = -ENXIO;
3416	}
3417	iounmap((void __iomem *)bios_base);
3418
3419	return ret;
3420}
3421#endif /* __i386__ */
3422
3423static int atyfb_setup_generic(struct pci_dev *pdev, struct fb_info *info,
3424			       unsigned long addr)
3425{
3426	struct atyfb_par *par = info->par;
3427	u16 tmp;
3428	unsigned long raddr;
3429	struct resource *rrp;
3430	int ret = 0;
3431
3432	raddr = addr + 0x7ff000UL;
3433	rrp = &pdev->resource[2];
3434	if ((rrp->flags & IORESOURCE_MEM) &&
3435	    request_mem_region(rrp->start, resource_size(rrp), "atyfb")) {
3436		par->aux_start = rrp->start;
3437		par->aux_size = resource_size(rrp);
3438		raddr = rrp->start;
3439		PRINTKI("using auxiliary register aperture\n");
3440	}
3441
3442	info->fix.mmio_start = raddr;
3443	/*
3444	 * By using strong UC we force the MTRR to never have an
3445	 * effect on the MMIO region on both non-PAT and PAT systems.
3446	 */
3447	par->ati_regbase = ioremap_uc(info->fix.mmio_start, 0x1000);
3448	if (par->ati_regbase == NULL)
3449		return -ENOMEM;
3450
3451	info->fix.mmio_start += par->aux_start ? 0x400 : 0xc00;
3452	par->ati_regbase += par->aux_start ? 0x400 : 0xc00;
3453
3454	/*
3455	 * Enable memory-space accesses using config-space
3456	 * command register.
3457	 */
3458	pci_read_config_word(pdev, PCI_COMMAND, &tmp);
3459	if (!(tmp & PCI_COMMAND_MEMORY)) {
3460		tmp |= PCI_COMMAND_MEMORY;
3461		pci_write_config_word(pdev, PCI_COMMAND, tmp);
3462	}
3463#ifdef __BIG_ENDIAN
3464	/* Use the big-endian aperture */
3465	addr += 0x800000;
3466#endif
3467
3468	/* Map in frame buffer */
3469	info->fix.smem_start = addr;
3470
3471	/*
3472	 * The framebuffer is not always 8 MiB, that's just the size of the
3473	 * PCI BAR. We temporarily abuse smem_len here to store the size
3474	 * of the BAR. aty_init() will later correct it to match the actual
3475	 * framebuffer size.
3476	 *
3477	 * On devices that don't have the auxiliary register aperture, the
3478	 * registers are housed at the top end of the framebuffer PCI BAR.
3479	 * aty_fudge_framebuffer_len() is used to reduce smem_len to not
3480	 * overlap with the registers.
3481	 */
3482	info->fix.smem_len = 0x800000;
3483
3484	aty_fudge_framebuffer_len(info);
3485
3486	info->screen_base = ioremap_wc(info->fix.smem_start,
3487				       info->fix.smem_len);
3488	if (info->screen_base == NULL) {
3489		ret = -ENOMEM;
3490		goto atyfb_setup_generic_fail;
3491	}
3492
3493	ret = correct_chipset(par);
3494	if (ret)
3495		goto atyfb_setup_generic_fail;
3496#ifdef __i386__
3497	ret = init_from_bios(par);
3498	if (ret)
3499		goto atyfb_setup_generic_fail;
3500#endif
3501	if (!(aty_ld_le32(CRTC_GEN_CNTL, par) & CRTC_EXT_DISP_EN))
3502		par->clk_wr_offset = (inb(R_GENMO) & 0x0CU) >> 2;
3503	else
3504		par->clk_wr_offset = aty_ld_8(CLOCK_CNTL, par) & 0x03U;
3505
3506	/* according to ATI, we should use clock 3 for acelerated mode */
3507	par->clk_wr_offset = 3;
3508
3509	return 0;
3510
3511atyfb_setup_generic_fail:
3512	iounmap(par->ati_regbase);
3513	par->ati_regbase = NULL;
3514	if (info->screen_base) {
3515		iounmap(info->screen_base);
3516		info->screen_base = NULL;
3517	}
3518	return ret;
3519}
3520
3521#endif /* !__sparc__ */
3522
3523static int atyfb_pci_probe(struct pci_dev *pdev,
3524			   const struct pci_device_id *ent)
3525{
3526	unsigned long addr, res_start, res_size;
3527	struct fb_info *info;
3528	struct resource *rp;
3529	struct atyfb_par *par;
3530	int rc = -ENOMEM;
3531
3532	/* Enable device in PCI config */
3533	if (pci_enable_device(pdev)) {
3534		PRINTKE("Cannot enable PCI device\n");
3535		return -ENXIO;
3536	}
3537
3538	/* Find which resource to use */
3539	rp = &pdev->resource[0];
3540	if (rp->flags & IORESOURCE_IO)
3541		rp = &pdev->resource[1];
3542	addr = rp->start;
3543	if (!addr)
3544		return -ENXIO;
3545
3546	/* Reserve space */
3547	res_start = rp->start;
3548	res_size = resource_size(rp);
3549	if (!request_mem_region(res_start, res_size, "atyfb"))
3550		return -EBUSY;
3551
3552	/* Allocate framebuffer */
3553	info = framebuffer_alloc(sizeof(struct atyfb_par), &pdev->dev);
3554	if (!info) {
3555		PRINTKE("atyfb_pci_probe() can't alloc fb_info\n");
3556		return -ENOMEM;
3557	}
3558	par = info->par;
3559	par->bus_type = PCI;
3560	info->fix = atyfb_fix;
3561	info->device = &pdev->dev;
3562	par->pci_id = pdev->device;
3563	par->res_start = res_start;
3564	par->res_size = res_size;
3565	par->irq = pdev->irq;
3566	par->pdev = pdev;
3567
3568	/* Setup "info" structure */
3569#ifdef __sparc__
3570	rc = atyfb_setup_sparc(pdev, info, addr);
3571#else
3572	rc = atyfb_setup_generic(pdev, info, addr);
3573#endif
3574	if (rc)
3575		goto err_release_mem;
3576
3577	pci_set_drvdata(pdev, info);
3578
3579	/* Init chip & register framebuffer */
3580	rc = aty_init(info);
3581	if (rc)
3582		goto err_release_io;
3583
3584#ifdef __sparc__
3585	/*
3586	 * Add /dev/fb mmap values.
3587	 */
3588	par->mmap_map[0].voff = 0x8000000000000000UL;
3589	par->mmap_map[0].poff = (unsigned long) info->screen_base & PAGE_MASK;
3590	par->mmap_map[0].size = info->fix.smem_len;
3591	par->mmap_map[0].prot_mask = _PAGE_CACHE;
3592	par->mmap_map[0].prot_flag = _PAGE_E;
3593	par->mmap_map[1].voff = par->mmap_map[0].voff + info->fix.smem_len;
3594	par->mmap_map[1].poff = (long)par->ati_regbase & PAGE_MASK;
3595	par->mmap_map[1].size = PAGE_SIZE;
3596	par->mmap_map[1].prot_mask = _PAGE_CACHE;
3597	par->mmap_map[1].prot_flag = _PAGE_E;
3598#endif /* __sparc__ */
3599
3600	mutex_lock(&reboot_lock);
3601	if (!reboot_info)
3602		reboot_info = info;
3603	mutex_unlock(&reboot_lock);
3604
3605	return 0;
3606
3607err_release_io:
3608#ifdef __sparc__
3609	kfree(par->mmap_map);
3610#else
3611	if (par->ati_regbase)
3612		iounmap(par->ati_regbase);
3613	if (info->screen_base)
3614		iounmap(info->screen_base);
3615#endif
3616err_release_mem:
3617	if (par->aux_start)
3618		release_mem_region(par->aux_start, par->aux_size);
3619
3620	release_mem_region(par->res_start, par->res_size);
3621	framebuffer_release(info);
3622
3623	return rc;
3624}
3625
3626#endif /* CONFIG_PCI */
3627
3628#ifdef CONFIG_ATARI
3629
3630static int __init atyfb_atari_probe(void)
3631{
3632	struct atyfb_par *par;
3633	struct fb_info *info;
3634	int m64_num;
3635	u32 clock_r;
3636	int num_found = 0;
3637
3638	for (m64_num = 0; m64_num < mach64_count; m64_num++) {
3639		if (!phys_vmembase[m64_num] || !phys_size[m64_num] ||
3640		    !phys_guiregbase[m64_num]) {
3641			PRINTKI("phys_*[%d] parameters not set => "
3642				"returning early. \n", m64_num);
3643			continue;
3644		}
3645
3646		info = framebuffer_alloc(sizeof(struct atyfb_par), NULL);
3647		if (!info) {
3648			PRINTKE("atyfb_atari_probe() can't alloc fb_info\n");
3649			return -ENOMEM;
3650		}
3651		par = info->par;
3652
3653		info->fix = atyfb_fix;
3654
3655		par->irq = (unsigned int) -1; /* something invalid */
3656
3657		/*
3658		 * Map the video memory (physical address given)
3659		 * to somewhere in the kernel address space.
3660		 */
3661		info->screen_base = ioremap_wc(phys_vmembase[m64_num],
3662					       phys_size[m64_num]);
3663		info->fix.smem_start = (unsigned long)info->screen_base; /* Fake! */
3664		par->ati_regbase = ioremap(phys_guiregbase[m64_num], 0x10000) +
3665						0xFC00ul;
3666		info->fix.mmio_start = (unsigned long)par->ati_regbase; /* Fake! */
3667
3668		aty_st_le32(CLOCK_CNTL, 0x12345678, par);
3669		clock_r = aty_ld_le32(CLOCK_CNTL, par);
3670
3671		switch (clock_r & 0x003F) {
3672		case 0x12:
3673			par->clk_wr_offset = 3; /*  */
3674			break;
3675		case 0x34:
3676			par->clk_wr_offset = 2; /* Medusa ST-IO ISA Adapter etc. */
3677			break;
3678		case 0x16:
3679			par->clk_wr_offset = 1; /*  */
3680			break;
3681		case 0x38:
3682			par->clk_wr_offset = 0; /* Panther 1 ISA Adapter (Gerald) */
3683			break;
3684		}
3685
3686		/* Fake pci_id for correct_chipset() */
3687		switch (aty_ld_le32(CNFG_CHIP_ID, par) & CFG_CHIP_TYPE) {
3688		case 0x00d7:
3689			par->pci_id = PCI_CHIP_MACH64GX;
3690			break;
3691		case 0x0057:
3692			par->pci_id = PCI_CHIP_MACH64CX;
3693			break;
3694		default:
3695			break;
3696		}
3697
3698		if (correct_chipset(par) || aty_init(info)) {
3699			iounmap(info->screen_base);
3700			iounmap(par->ati_regbase);
3701			framebuffer_release(info);
3702		} else {
3703			num_found++;
3704		}
3705	}
3706
3707	return num_found ? 0 : -ENXIO;
3708}
3709
3710#endif /* CONFIG_ATARI */
3711
3712#ifdef CONFIG_PCI
3713
3714static void atyfb_remove(struct fb_info *info)
3715{
3716	struct atyfb_par *par = (struct atyfb_par *) info->par;
3717
3718	/* restore video mode */
3719	aty_set_crtc(par, &par->saved_crtc);
3720	par->pll_ops->set_pll(info, &par->saved_pll);
3721
3722	unregister_framebuffer(info);
3723
3724#ifdef CONFIG_FB_ATY_BACKLIGHT
3725	if (M64_HAS(MOBIL_BUS))
3726		aty_bl_exit(info->bl_dev);
3727#endif
3728	arch_phys_wc_del(par->wc_cookie);
3729
3730#ifndef __sparc__
3731	if (par->ati_regbase)
3732		iounmap(par->ati_regbase);
3733	if (info->screen_base)
3734		iounmap(info->screen_base);
3735#ifdef __BIG_ENDIAN
3736	if (info->sprite.addr)
3737		iounmap(info->sprite.addr);
3738#endif
3739#endif
3740#ifdef __sparc__
3741	kfree(par->mmap_map);
3742#endif
3743	if (par->aux_start)
3744		release_mem_region(par->aux_start, par->aux_size);
3745
3746	if (par->res_start)
3747		release_mem_region(par->res_start, par->res_size);
3748
3749	framebuffer_release(info);
3750}
3751
3752
3753static void atyfb_pci_remove(struct pci_dev *pdev)
3754{
3755	struct fb_info *info = pci_get_drvdata(pdev);
3756
3757	mutex_lock(&reboot_lock);
3758	if (reboot_info == info)
3759		reboot_info = NULL;
3760	mutex_unlock(&reboot_lock);
3761
3762	atyfb_remove(info);
3763}
3764
3765static struct pci_device_id atyfb_pci_tbl[] = {
3766#ifdef CONFIG_FB_ATY_GX
3767	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GX) },
3768	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64CX) },
3769#endif /* CONFIG_FB_ATY_GX */
3770
3771#ifdef CONFIG_FB_ATY_CT
3772	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64CT) },
3773	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64ET) },
3774
3775	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LT) },
3776
3777	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VT) },
3778	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GT) },
3779
3780	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VU) },
3781	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GU) },
3782
3783	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LG) },
3784
3785	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VV) },
3786
3787	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GV) },
3788	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GW) },
3789	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GY) },
3790	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GZ) },
3791
3792	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GB) },
3793	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GD) },
3794	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GI) },
3795	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GP) },
3796	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GQ) },
3797
3798	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LB) },
3799	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LD) },
3800	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LI) },
3801	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LP) },
3802	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LQ) },
3803
3804	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GM) },
3805	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GN) },
3806	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GO) },
3807	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GL) },
3808	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GR) },
3809	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GS) },
3810
3811	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LM) },
3812	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LN) },
3813	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LR) },
3814	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LS) },
3815#endif /* CONFIG_FB_ATY_CT */
3816	{ }
3817};
3818
3819MODULE_DEVICE_TABLE(pci, atyfb_pci_tbl);
3820
3821static struct pci_driver atyfb_driver = {
3822	.name		= "atyfb",
3823	.id_table	= atyfb_pci_tbl,
3824	.probe		= atyfb_pci_probe,
3825	.remove		= atyfb_pci_remove,
3826#ifdef CONFIG_PM
3827	.suspend	= atyfb_pci_suspend,
3828	.resume		= atyfb_pci_resume,
3829#endif /* CONFIG_PM */
3830};
3831
3832#endif /* CONFIG_PCI */
3833
3834#ifndef MODULE
3835static int __init atyfb_setup(char *options)
3836{
3837	char *this_opt;
3838
3839	if (!options || !*options)
3840		return 0;
3841
3842	while ((this_opt = strsep(&options, ",")) != NULL) {
3843		if (!strncmp(this_opt, "noaccel", 7)) {
3844			noaccel = 1;
3845		} else if (!strncmp(this_opt, "nomtrr", 6)) {
3846			nomtrr = 1;
3847		} else if (!strncmp(this_opt, "vram:", 5))
3848			vram = simple_strtoul(this_opt + 5, NULL, 0);
3849		else if (!strncmp(this_opt, "pll:", 4))
3850			pll = simple_strtoul(this_opt + 4, NULL, 0);
3851		else if (!strncmp(this_opt, "mclk:", 5))
3852			mclk = simple_strtoul(this_opt + 5, NULL, 0);
3853		else if (!strncmp(this_opt, "xclk:", 5))
3854			xclk = simple_strtoul(this_opt+5, NULL, 0);
3855		else if (!strncmp(this_opt, "comp_sync:", 10))
3856			comp_sync = simple_strtoul(this_opt+10, NULL, 0);
3857		else if (!strncmp(this_opt, "backlight:", 10))
3858			backlight = simple_strtoul(this_opt+10, NULL, 0);
3859#ifdef CONFIG_PPC
3860		else if (!strncmp(this_opt, "vmode:", 6)) {
3861			unsigned int vmode =
3862			    simple_strtoul(this_opt + 6, NULL, 0);
3863			if (vmode > 0 && vmode <= VMODE_MAX)
3864				default_vmode = vmode;
3865		} else if (!strncmp(this_opt, "cmode:", 6)) {
3866			unsigned int cmode =
3867			    simple_strtoul(this_opt + 6, NULL, 0);
3868			switch (cmode) {
3869			case 0:
3870			case 8:
3871				default_cmode = CMODE_8;
3872				break;
3873			case 15:
3874			case 16:
3875				default_cmode = CMODE_16;
3876				break;
3877			case 24:
3878			case 32:
3879				default_cmode = CMODE_32;
3880				break;
3881			}
3882		}
3883#endif
3884#ifdef CONFIG_ATARI
3885		/*
3886		 * Why do we need this silly Mach64 argument?
3887		 * We are already here because of mach64= so its redundant.
3888		 */
3889		else if (MACH_IS_ATARI
3890			 && (!strncmp(this_opt, "Mach64:", 7))) {
3891			static unsigned char m64_num;
3892			static char mach64_str[80];
3893			strlcpy(mach64_str, this_opt + 7, sizeof(mach64_str));
3894			if (!store_video_par(mach64_str, m64_num)) {
3895				m64_num++;
3896				mach64_count = m64_num;
3897			}
3898		}
3899#endif
3900		else
3901			mode = this_opt;
3902	}
3903	return 0;
3904}
3905#endif  /*  MODULE  */
3906
3907static int atyfb_reboot_notify(struct notifier_block *nb,
3908			       unsigned long code, void *unused)
3909{
3910	struct atyfb_par *par;
3911
3912	if (code != SYS_RESTART)
3913		return NOTIFY_DONE;
3914
3915	mutex_lock(&reboot_lock);
3916
3917	if (!reboot_info)
3918		goto out;
3919
3920	if (!lock_fb_info(reboot_info))
3921		goto out;
3922
3923	par = reboot_info->par;
3924
3925	/*
3926	 * HP OmniBook 500's BIOS doesn't like the state of the
3927	 * hardware after atyfb has been used. Restore the hardware
3928	 * to the original state to allow successful reboots.
3929	 */
3930	aty_set_crtc(par, &par->saved_crtc);
3931	par->pll_ops->set_pll(reboot_info, &par->saved_pll);
3932
3933	unlock_fb_info(reboot_info);
3934 out:
3935	mutex_unlock(&reboot_lock);
3936
3937	return NOTIFY_DONE;
3938}
3939
3940static struct notifier_block atyfb_reboot_notifier = {
3941	.notifier_call = atyfb_reboot_notify,
3942};
3943
3944static const struct dmi_system_id atyfb_reboot_ids[] __initconst = {
3945	{
3946		.ident = "HP OmniBook 500",
3947		.matches = {
3948			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
3949			DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"),
3950			DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 500 FA"),
3951		},
3952	},
3953
3954	{ }
3955};
3956static bool registered_notifier = false;
3957
3958static int __init atyfb_init(void)
3959{
3960	int err1 = 1, err2 = 1;
3961#ifndef MODULE
3962	char *option = NULL;
3963
3964	if (fb_get_options("atyfb", &option))
3965		return -ENODEV;
3966	atyfb_setup(option);
3967#endif
3968
3969#ifdef CONFIG_PCI
3970	err1 = pci_register_driver(&atyfb_driver);
3971#endif
3972#ifdef CONFIG_ATARI
3973	err2 = atyfb_atari_probe();
3974#endif
3975
3976	if (err1 && err2)
3977		return -ENODEV;
3978
3979	if (dmi_check_system(atyfb_reboot_ids)) {
3980		register_reboot_notifier(&atyfb_reboot_notifier);
3981		registered_notifier = true;
3982	}
3983
3984	return 0;
3985}
3986
3987static void __exit atyfb_exit(void)
3988{
3989	if (registered_notifier)
3990		unregister_reboot_notifier(&atyfb_reboot_notifier);
3991
3992#ifdef CONFIG_PCI
3993	pci_unregister_driver(&atyfb_driver);
3994#endif
3995}
3996
3997module_init(atyfb_init);
3998module_exit(atyfb_exit);
3999
4000MODULE_DESCRIPTION("FBDev driver for ATI Mach64 cards");
4001MODULE_LICENSE("GPL");
4002module_param(noaccel, bool, 0);
4003MODULE_PARM_DESC(noaccel, "bool: disable acceleration");
4004module_param(vram, int, 0);
4005MODULE_PARM_DESC(vram, "int: override size of video ram");
4006module_param(pll, int, 0);
4007MODULE_PARM_DESC(pll, "int: override video clock");
4008module_param(mclk, int, 0);
4009MODULE_PARM_DESC(mclk, "int: override memory clock");
4010module_param(xclk, int, 0);
4011MODULE_PARM_DESC(xclk, "int: override accelerated engine clock");
4012module_param(comp_sync, int, 0);
4013MODULE_PARM_DESC(comp_sync, "Set composite sync signal to low (0) or high (1)");
4014module_param(mode, charp, 0);
4015MODULE_PARM_DESC(mode, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
4016module_param(nomtrr, bool, 0);
4017MODULE_PARM_DESC(nomtrr, "bool: disable use of MTRR registers");
4018