--- w100-r6.patch	2004-12-22 20:59:37.000000000 +0000
+++ w100-r7.patch	2004-12-26 23:40:56.000000000 +0000
@@ -37,7 +37,7 @@
  obj-$(CONFIG_FB_VESA)             += vesafb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
 --- /dev/null
 +++ linux-2.6.10-rc3/drivers/video/w100fb.c
-@@ -0,0 +1,1870 @@
+@@ -0,0 +1,1910 @@
 +/*
 + * linux/drivers/video/w100fb.c
 + *
@@ -45,7 +45,7 @@
 + *
 + * Copyright (C) 2002, ATI Corp.
 + *
-+ * Rewritten for 2.6 by Richard Purdie <rpurdie@rpsys.net>
++ * Heavily rewritten for 2.6 by Richard Purdie <rpurdie@rpsys.net>
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -117,6 +117,7 @@
 +#define MAX_PALETTES      16
 +
 +/* for resolution change */
++#define LCD_MODE_UNKNOWN (-1)
 +#define LCD_MODE_480    0
 +#define LCD_MODE_320    1
 +#define LCD_MODE_240    2
@@ -154,7 +155,7 @@
 +static void(*w100fb_ssp_send)(uint8_t adrs, uint8_t data);
 +
 +static int isRemapped = 0;
-+int w100fb_lcdMode = LCD_MODE_640;	
++int w100fb_lcdMode = LCD_MODE_UNKNOWN;	
 +static int w100fb_rotation_flag = 0;
 +int fastsysclk_mode = 75;
 +static int fb_blank_normal = 0;
@@ -355,7 +356,6 @@
 +	}
 +}
 +
-+
 +/*
 + * Set up the display for the fb subsystem
 + */
@@ -365,24 +365,40 @@
 +	int isInitTG = 0;
 +	struct fb_var_screeninfo *var = &info->var;
 +
++	if (var->activate & FB_ACTIVATE_NOW)
++		printk("Activate FB Now\n");
++
 +	/* Set the hardware to 565 */
 +	temp32 = readl(remapped_regs + mmDISP_DEBUG2);
 +	temp32 &= 0xff7fffff;
 +	temp32 |= 0x00800000;
 +	writel(temp32, remapped_regs + mmDISP_DEBUG2);
 +
-+	if (var->xres == 320 && var->yres == 240) {
-+		w100fb_changeres(LCD_MODE_LANDSCAPE, LCD_SHARP_QVGA);
-+		w100fb_lcdMode = LCD_MODE_320;
-+	} else if (var->xres == 240 && var->yres == 320) {
-+		w100fb_changeres(LCD_MODE_PORTRAIT, LCD_SHARP_QVGA);
-+		w100fb_lcdMode = LCD_MODE_240;
-+	} else if (var->xres == 640 && var->yres == 480) {
-+		w100fb_changeres(LCD_MODE_LANDSCAPE, LCD_SHARP_VGA);
++	if (w100fb_lcdMode == LCD_MODE_UNKNOWN) {
++		w100_init_sharp_lcd(LCD_SHARP_VGA);
++		w100_init_vga_rotation(w100fb_rotation_flag ? 270 : 90);
 +		w100fb_lcdMode = LCD_MODE_640;
-+	} else if (var->xres == 480 && var->yres == 640) {
-+		w100fb_changeres(LCD_MODE_PORTRAIT, LCD_SHARP_VGA);
-+		w100fb_lcdMode = LCD_MODE_480;
++		isInitTG = 1;
++	} else if (var->xres == 320 && var->yres == 240) {
++		if (w100fb_lcdMode != LCD_MODE_320) {
++			w100fb_changeres(LCD_MODE_LANDSCAPE, LCD_SHARP_QVGA);
++			w100fb_lcdMode = LCD_MODE_320;
++		}
++	} else if (var->xres == 240 && var->yres == 320) {
++		if (w100fb_lcdMode != LCD_MODE_240) {
++			w100fb_changeres(LCD_MODE_PORTRAIT, LCD_SHARP_QVGA);
++			w100fb_lcdMode = LCD_MODE_240;
++		}
++	} else if (var->xres == 640 && var->yres == 480) {
++		if (w100fb_lcdMode != LCD_MODE_640) {
++			w100fb_changeres(LCD_MODE_LANDSCAPE, LCD_SHARP_VGA);
++			w100fb_lcdMode = LCD_MODE_640;
++		}
++	} else if (var->xres == 480 && var->yres == 640) {
++		if (w100fb_lcdMode != LCD_MODE_480) {
++			w100fb_changeres(LCD_MODE_PORTRAIT, LCD_SHARP_VGA);
++			w100fb_lcdMode = LCD_MODE_480;
++		}
 +	} else printk("W100FB: Resolution error!\n");
 +
 +	/* Do the rest of the display initialization */
@@ -419,7 +435,8 @@
 +		} else if ((var->xres > 240) || (var->yres > 320)) {
 +			var->xres = 480;
 +			var->yres = 640;
-+		} else {
++		}
++		else {
 +			var->xres = 240;
 +			var->yres = 320;
 +		}	
@@ -429,7 +446,8 @@
 +		} else if ((var->xres > 320) || (var->yres > 240)) {
 +			var->xres = 640;
 +			var->yres = 480;
-+		} else {
++		}
++		else {
 +			var->xres = 320;
 +			var->yres = 240;
 +		}	
@@ -472,6 +490,8 @@
 +	current_par.xres = info->var.xres;
 +	current_par.yres = info->var.yres;
 +
++	/*printk(KERN_INFO "W100: xres: %d yres: %d bbp: %d mode: %d\n", info->var.xres,info->var.yres,info->var.bits_per_pixel,w100fb_lcdMode);*/
++
 +	info->fix.visual = FB_VISUAL_TRUECOLOR;
 +
 +	info->fix.ypanstep = 0;
@@ -490,10 +510,11 @@
 +	} else if (w100fb_lcdMode == LCD_MODE_240) {
 +		info->fix.line_length = (240 * BITS_PER_PIXEL) / 8;
 +		info->fix.smem_len = 0x60000;
-+	} else if (w100fb_lcdMode == LCD_MODE_640) {
++	} else if (w100fb_lcdMode == LCD_MODE_UNKNOWN || w100fb_lcdMode == LCD_MODE_640) {
 +		info->fix.line_length = (640 * BITS_PER_PIXEL) / 8;
 +		info->fix.smem_len = 0x200000;
 +	}
++	/*printk(KERN_INFO "W100: xres: %d yres: %d bbp: %d mode: %d\n", info->var.xres,info->var.yres,info->var.bits_per_pixel,w100fb_lcdMode); */
 +
 +	return 0;
 +}
@@ -581,6 +602,7 @@
 +static void w100fb_clear_buffer(void)
 +{
 +	int i;
++	printk("clearing buffer\n");
 +	for (i = 0; i < 640; i++) {
 +		if (gSaveImagePtr[i] != NULL) {
 +			kfree(gSaveImagePtr[i]);
@@ -623,13 +645,13 @@
 +	struct w100fb_mach_info *inf;
 +	inf = dev->platform_data;
 +	
-+	w100fb_ssp_send = inf->w100fb_ssp_send;
-+
 +	current_par.dev=dev;
++
++	w100fb_ssp_send = inf->w100fb_ssp_send;
 +	current_par.phadadj = inf->phadadj;
 +	current_par.comadj = inf->comadj;
 +	
-+	w100fb_lcdMode = LCD_MODE_640;
++	w100fb_lcdMode = LCD_MODE_UNKNOWN;
 +
 +	w100_hw_init();
 +	w100_PwmSetup();
@@ -731,6 +753,7 @@
 +		remapped_fbuf = ioremap_nocache(W100FB_FB_BASE, REMAPPED_FB_LEN);
 +
 +		isRemapped = 1;
++		
 +	}
 +
 +	w100_soft_reset();
@@ -794,9 +817,13 @@
 +	mc_ext_mem_loc.f.mc_ext_mem_top = MEM_EXT_TOP_VALUE >> 8;
 +	writel((uint32_t) (mc_ext_mem_loc.val), remapped_regs + mmMC_EXT_MEM_LOCATION);
 +
-+	if ((w100fb_lcdMode == LCD_MODE_480) || (w100fb_lcdMode == LCD_MODE_640)) 
++	if (w100fb_lcdMode == LCD_MODE_UNKNOWN) {
++		w100_InitExtMem(LCD_SHARP_VGA);
++	} else if ((w100fb_lcdMode == LCD_MODE_480) || (w100fb_lcdMode == LCD_MODE_640)) {
 +		w100_InitExtMem(LCD_SHARP_VGA);
-+	else w100_InitExtMem(LCD_SHARP_QVGA);
++	} else {
++		w100_InitExtMem(LCD_SHARP_QVGA);
++	}
 +
 +	wrap_start_dir.val = defWRAP_START_DIR;
 +	wrap_start_dir.f.start_addr = WRAP_BUF_BASE_VALUE >> 1;
@@ -1305,6 +1332,11 @@
 +
 +static void w100_init_vga_rotation(uint16_t deg)
 +{
++	/* for resolution change and rotation */
++	/* GRAPHIC_CTRL */
++	/* GRAPHIC_OFFSET */
++	/* GRAPHIC_PITCH */
++
 +	switch(deg) {
 +	case 0:
 +		gPowerState.pclk_cntl.f.pclk_src_sel = 0x1;
@@ -1367,6 +1399,11 @@
 +
 +static void w100_init_qvga_rotation(uint16_t deg)
 +{
++	/* for resolution change and rotation */
++	/* GRAPHIC_CTRL */
++	/* GRAPHIC_OFFSET */
++	/* GRAPHIC_PITCH */
++
 +	switch(deg) {
 +	case 0:
 +		writel(0x00d41c06, remapped_regs + mmGRAPHIC_CTRL);
@@ -1507,6 +1544,7 @@
 +
 +	/* disable vline irq */
 +	tmp = readl(remapped_regs + mmGEN_INT_CNTL);
++
 +	tmp &= ~0x00000002;
 +	writel(tmp, remapped_regs + mmGEN_INT_CNTL);
 +
@@ -1767,18 +1805,20 @@
 +
 +static void lcdtg_resume(void)
 +{
-+	if (w100fb_lcdMode == LCD_MODE_480 || w100fb_lcdMode == LCD_MODE_640)
++	if (w100fb_lcdMode == LCD_MODE_480 || w100fb_lcdMode == LCD_MODE_640) {
 +		lcdtg_hw_init(LCD_SHARP_VGA);
-+	else 
++	} else {
 +		lcdtg_hw_init(LCD_SHARP_QVGA);
++	}
 +}
 +
 +static void lcdtg_suspend(void)
 +{
 +	int i;
 +
-+	for (i = 0; i < (current_par.xres * current_par.yres); i++) 
++	for (i = 0; i < (current_par.xres * current_par.yres); i++) {
 +		writew(0xffff, remapped_fbuf + (2*i));
++	}
 +
 +	/* 60Hz x 2 frame = 16.7msec x 2 = 33.4 msec */
 +	mdelay(34);

