viafb: video address setting revisited
[safe/jmp/linux-2.6] / drivers / video / via / lcd.c
index 6c7290a..3a83e5b 100644 (file)
@@ -22,6 +22,8 @@
 #include "global.h"
 #include "lcdtbl.h"
 
+#define viafb_compact_res(x, y) (((x)<<16)|(y))
+
 static struct iga2_shadow_crtc_timing iga2_shadow_crtc_reg = {
        /* IGA2 Shadow Horizontal Total */
        {IGA2_SHADOW_HOR_TOTAL_REG_NUM, {{CR6D, 0, 7}, {CR71, 3, 3} } },
@@ -59,7 +61,7 @@ static struct _lcd_scaling_factor lcd_scaling_factor_CLE = {
 
 static int check_lvds_chip(int device_id_subaddr, int device_id);
 static bool lvds_identify_integratedlvds(void);
-static int fp_id_to_vindex(int panel_id);
+static void fp_id_to_vindex(int panel_id);
 static int lvds_register_read(int index);
 static void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
                      int panel_vres);
@@ -125,33 +127,24 @@ void viafb_init_lcd_size(void)
                break;
        case GET_LCD_SIZE_BY_VGA_BIOS:
                DEBUG_MSG(KERN_INFO "Get LCD Size method by VGA BIOS !!\n");
-               viaparinfo->lvds_setting_info->lcd_panel_size =
-                   fp_id_to_vindex(viafb_lcd_panel_id);
+               fp_id_to_vindex(viafb_lcd_panel_id);
                DEBUG_MSG(KERN_INFO "LCD Panel_ID = %d\n",
                          viaparinfo->lvds_setting_info->lcd_panel_id);
-               DEBUG_MSG(KERN_INFO "LCD Panel Size = %d\n",
-                         viaparinfo->lvds_setting_info->lcd_panel_size);
                break;
        case GET_LCD_SIZE_BY_USER_SETTING:
                DEBUG_MSG(KERN_INFO "Get LCD Size method by user setting !!\n");
-               viaparinfo->lvds_setting_info->lcd_panel_size =
-                   fp_id_to_vindex(viafb_lcd_panel_id);
+               fp_id_to_vindex(viafb_lcd_panel_id);
                DEBUG_MSG(KERN_INFO "LCD Panel_ID = %d\n",
                          viaparinfo->lvds_setting_info->lcd_panel_id);
-               DEBUG_MSG(KERN_INFO "LCD Panel Size = %d\n",
-                         viaparinfo->lvds_setting_info->lcd_panel_size);
                break;
        default:
                DEBUG_MSG(KERN_INFO "viafb_init_lcd_size fail\n");
                viaparinfo->lvds_setting_info->lcd_panel_id =
                        LCD_PANEL_ID1_800X600;
-               viaparinfo->lvds_setting_info->lcd_panel_size =
-                   fp_id_to_vindex(LCD_PANEL_ID1_800X600);
+               fp_id_to_vindex(LCD_PANEL_ID1_800X600);
        }
        viaparinfo->lvds_setting_info2->lcd_panel_id =
                viaparinfo->lvds_setting_info->lcd_panel_id;
-       viaparinfo->lvds_setting_info2->lcd_panel_size =
-               viaparinfo->lvds_setting_info->lcd_panel_size;
        viaparinfo->lvds_setting_info2->lcd_panel_hres =
                viaparinfo->lvds_setting_info->lcd_panel_hres;
        viaparinfo->lvds_setting_info2->lcd_panel_vres =
@@ -207,13 +200,13 @@ static bool lvds_identify_integratedlvds(void)
 
 int viafb_lvds_trasmitter_identify(void)
 {
-       viaparinfo->i2c_stuff.i2c_port = I2CPORTINDEX;
+       viaparinfo->shared->i2c_stuff.i2c_port = I2CPORTINDEX;
        if (viafb_lvds_identify_vt1636()) {
                viaparinfo->chip_info->lvds_chip_info.i2c_port = I2CPORTINDEX;
                DEBUG_MSG(KERN_INFO
                          "Found VIA VT1636 LVDS on port i2c 0x31 \n");
        } else {
-               viaparinfo->i2c_stuff.i2c_port = GPIOPORTINDEX;
+               viaparinfo->shared->i2c_stuff.i2c_port = GPIOPORTINDEX;
                if (viafb_lvds_identify_vt1636()) {
                        viaparinfo->chip_info->lvds_chip_info.i2c_port =
                                GPIOPORTINDEX;
@@ -248,7 +241,7 @@ int viafb_lvds_trasmitter_identify(void)
        return FAIL;
 }
 
-static int fp_id_to_vindex(int panel_id)
+static void fp_id_to_vindex(int panel_id)
 {
        DEBUG_MSG(KERN_INFO "fp_get_panel_id()\n");
 
@@ -264,7 +257,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID0_640X480;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_640X480;
                break;
        case 0x1:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
@@ -273,7 +265,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID1_800X600;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_800X600;
                break;
        case 0x2:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
@@ -282,7 +273,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1024X768;
                break;
        case 0x3:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
@@ -291,7 +281,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1280X768;
                break;
        case 0x4:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
@@ -300,7 +289,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID4_1280X1024;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1280X1024;
                break;
        case 0x5:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
@@ -309,7 +297,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID5_1400X1050;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1400X1050;
                break;
        case 0x6:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
@@ -318,7 +305,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID6_1600X1200;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1600X1200;
                break;
        case 0x8:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
@@ -327,7 +313,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_IDA_800X480;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_800X480;
                break;
        case 0x9:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
@@ -336,7 +321,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1024X768;
                break;
        case 0xA:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
@@ -345,7 +329,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1024X768;
                break;
        case 0xB:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
@@ -354,7 +337,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1024X768;
                break;
        case 0xC:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
@@ -363,7 +345,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1280X768;
                break;
        case 0xD:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
@@ -372,7 +353,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID4_1280X1024;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1280X1024;
                break;
        case 0xE:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
@@ -381,7 +361,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID5_1400X1050;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1400X1050;
                break;
        case 0xF:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
@@ -390,7 +369,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID6_1600X1200;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1600X1200;
                break;
        case 0x10:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1366;
@@ -399,7 +377,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID7_1366X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1368X768;
                break;
        case 0x11:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
@@ -408,7 +385,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID8_1024X600;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1024X600;
                break;
        case 0x12:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
@@ -417,7 +393,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1280X768;
                break;
        case 0x13:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
@@ -426,7 +401,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID9_1280X800;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_1280X800;
                break;
        case 0x14:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1360;
@@ -435,7 +409,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_IDB_1360X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1360X768;
                break;
        case 0x15:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
@@ -444,7 +417,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
-               return VIA_RES_1280X768;
                break;
        case 0x16:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 480;
@@ -453,7 +425,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_IDC_480X640;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_480X640;
                break;
        default:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
@@ -462,7 +433,6 @@ static int fp_id_to_vindex(int panel_id)
                        LCD_PANEL_ID1_800X600;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
-               return VIA_RES_800X600;
        }
 }
 
@@ -470,7 +440,7 @@ static int lvds_register_read(int index)
 {
        u8 data;
 
-       viaparinfo->i2c_stuff.i2c_port = GPIOPORTINDEX;
+       viaparinfo->shared->i2c_stuff.i2c_port = GPIOPORTINDEX;
        viafb_i2c_readbyte((u8) viaparinfo->chip_info->
            lvds_chip_info.lvds_chip_slave_addr,
                        (u8) index, &data);
@@ -576,25 +546,21 @@ static void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
 static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,
        int panel_id)
 {
-       int vmode_index;
+       u32 compact_mode = viafb_compact_res(set_hres, set_vres);
        int reg_num = 0;
        struct io_reg *lcd_patch_reg = NULL;
 
-       if (viaparinfo->lvds_setting_info->iga_path == IGA2)
-               vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);
-       else
-               vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);
        switch (panel_id) {
                /* LCD 800x600 */
        case LCD_PANEL_ID1_800X600:
-               switch (vmode_index) {
-               case VIA_RES_640X400:
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 400):
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_K400_LCD_RES_6X4_8X6;
                        lcd_patch_reg = K400_LCD_RES_6X4_8X6;
                        break;
-               case VIA_RES_720X480:
-               case VIA_RES_720X576:
+               case viafb_compact_res(720, 480):
+               case viafb_compact_res(720, 576):
                        reg_num = NUM_TOTAL_K400_LCD_RES_7X4_8X6;
                        lcd_patch_reg = K400_LCD_RES_7X4_8X6;
                        break;
@@ -603,18 +569,18 @@ static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,
 
                /* LCD 1024x768 */
        case LCD_PANEL_ID2_1024X768:
-               switch (vmode_index) {
-               case VIA_RES_640X400:
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 400):
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_K400_LCD_RES_6X4_10X7;
                        lcd_patch_reg = K400_LCD_RES_6X4_10X7;
                        break;
-               case VIA_RES_720X480:
-               case VIA_RES_720X576:
+               case viafb_compact_res(720, 480):
+               case viafb_compact_res(720, 576):
                        reg_num = NUM_TOTAL_K400_LCD_RES_7X4_10X7;
                        lcd_patch_reg = K400_LCD_RES_7X4_10X7;
                        break;
-               case VIA_RES_800X600:
+               case viafb_compact_res(800, 600):
                        reg_num = NUM_TOTAL_K400_LCD_RES_8X6_10X7;
                        lcd_patch_reg = K400_LCD_RES_8X6_10X7;
                        break;
@@ -623,22 +589,22 @@ static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,
 
                /* LCD 1280x1024 */
        case LCD_PANEL_ID4_1280X1024:
-               switch (vmode_index) {
-               case VIA_RES_640X400:
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 400):
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_K400_LCD_RES_6X4_12X10;
                        lcd_patch_reg = K400_LCD_RES_6X4_12X10;
                        break;
-               case VIA_RES_720X480:
-               case VIA_RES_720X576:
+               case viafb_compact_res(720, 480):
+               case viafb_compact_res(720, 576):
                        reg_num = NUM_TOTAL_K400_LCD_RES_7X4_12X10;
                        lcd_patch_reg = K400_LCD_RES_7X4_12X10;
                        break;
-               case VIA_RES_800X600:
+               case viafb_compact_res(800, 600):
                        reg_num = NUM_TOTAL_K400_LCD_RES_8X6_12X10;
                        lcd_patch_reg = K400_LCD_RES_8X6_12X10;
                        break;
-               case VIA_RES_1024X768:
+               case viafb_compact_res(1024, 768):
                        reg_num = NUM_TOTAL_K400_LCD_RES_10X7_12X10;
                        lcd_patch_reg = K400_LCD_RES_10X7_12X10;
                        break;
@@ -648,23 +614,23 @@ static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,
 
                /* LCD 1400x1050 */
        case LCD_PANEL_ID5_1400X1050:
-               switch (vmode_index) {
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_K400_LCD_RES_6X4_14X10;
                        lcd_patch_reg = K400_LCD_RES_6X4_14X10;
                        break;
-               case VIA_RES_800X600:
+               case viafb_compact_res(800, 600):
                        reg_num = NUM_TOTAL_K400_LCD_RES_8X6_14X10;
                        lcd_patch_reg = K400_LCD_RES_8X6_14X10;
                        break;
-               case VIA_RES_1024X768:
+               case viafb_compact_res(1024, 768):
                        reg_num = NUM_TOTAL_K400_LCD_RES_10X7_14X10;
                        lcd_patch_reg = K400_LCD_RES_10X7_14X10;
                        break;
-               case VIA_RES_1280X768:
-               case VIA_RES_1280X800:
-               case VIA_RES_1280X960:
-               case VIA_RES_1280X1024:
+               case viafb_compact_res(1280, 768):
+               case viafb_compact_res(1280, 800):
+               case viafb_compact_res(1280, 960):
+               case viafb_compact_res(1280, 1024):
                        reg_num = NUM_TOTAL_K400_LCD_RES_12X10_14X10;
                        lcd_patch_reg = K400_LCD_RES_12X10_14X10;
                        break;
@@ -673,29 +639,29 @@ static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,
 
                /* LCD 1600x1200 */
        case LCD_PANEL_ID6_1600X1200:
-               switch (vmode_index) {
-               case VIA_RES_640X400:
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 400):
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_K400_LCD_RES_6X4_16X12;
                        lcd_patch_reg = K400_LCD_RES_6X4_16X12;
                        break;
-               case VIA_RES_720X480:
-               case VIA_RES_720X576:
+               case viafb_compact_res(720, 480):
+               case viafb_compact_res(720, 576):
                        reg_num = NUM_TOTAL_K400_LCD_RES_7X4_16X12;
                        lcd_patch_reg = K400_LCD_RES_7X4_16X12;
                        break;
-               case VIA_RES_800X600:
+               case viafb_compact_res(800, 600):
                        reg_num = NUM_TOTAL_K400_LCD_RES_8X6_16X12;
                        lcd_patch_reg = K400_LCD_RES_8X6_16X12;
                        break;
-               case VIA_RES_1024X768:
+               case viafb_compact_res(1024, 768):
                        reg_num = NUM_TOTAL_K400_LCD_RES_10X7_16X12;
                        lcd_patch_reg = K400_LCD_RES_10X7_16X12;
                        break;
-               case VIA_RES_1280X768:
-               case VIA_RES_1280X800:
-               case VIA_RES_1280X960:
-               case VIA_RES_1280X1024:
+               case viafb_compact_res(1280, 768):
+               case viafb_compact_res(1280, 800):
+               case viafb_compact_res(1280, 960):
+               case viafb_compact_res(1280, 1024):
                        reg_num = NUM_TOTAL_K400_LCD_RES_12X10_16X12;
                        lcd_patch_reg = K400_LCD_RES_12X10_16X12;
                        break;
@@ -704,28 +670,28 @@ static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,
 
                /* LCD 1366x768 */
        case LCD_PANEL_ID7_1366X768:
-               switch (vmode_index) {
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_K400_LCD_RES_6X4_1366X7;
                        lcd_patch_reg = K400_LCD_RES_6X4_1366X7;
                        break;
-               case VIA_RES_720X480:
-               case VIA_RES_720X576:
+               case viafb_compact_res(720, 480):
+               case viafb_compact_res(720, 576):
                        reg_num = NUM_TOTAL_K400_LCD_RES_7X4_1366X7;
                        lcd_patch_reg = K400_LCD_RES_7X4_1366X7;
                        break;
-               case VIA_RES_800X600:
+               case viafb_compact_res(800, 600):
                        reg_num = NUM_TOTAL_K400_LCD_RES_8X6_1366X7;
                        lcd_patch_reg = K400_LCD_RES_8X6_1366X7;
                        break;
-               case VIA_RES_1024X768:
+               case viafb_compact_res(1024, 768):
                        reg_num = NUM_TOTAL_K400_LCD_RES_10X7_1366X7;
                        lcd_patch_reg = K400_LCD_RES_10X7_1366X7;
                        break;
-               case VIA_RES_1280X768:
-               case VIA_RES_1280X800:
-               case VIA_RES_1280X960:
-               case VIA_RES_1280X1024:
+               case viafb_compact_res(1280, 768):
+               case viafb_compact_res(1280, 800):
+               case viafb_compact_res(1280, 960):
+               case viafb_compact_res(1280, 1024):
                        reg_num = NUM_TOTAL_K400_LCD_RES_12X10_1366X7;
                        lcd_patch_reg = K400_LCD_RES_12X10_1366X7;
                        break;
@@ -757,51 +723,46 @@ static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,
 static void load_lcd_p880_patch_tbl(int set_hres, int set_vres,
        int panel_id)
 {
-       int vmode_index;
+       u32 compact_mode = viafb_compact_res(set_hres, set_vres);
        int reg_num = 0;
        struct io_reg *lcd_patch_reg = NULL;
 
-       if (viaparinfo->lvds_setting_info->iga_path == IGA2)
-               vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);
-       else
-               vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);
-
        switch (panel_id) {
        case LCD_PANEL_ID5_1400X1050:
-               switch (vmode_index) {
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_P880_LCD_RES_6X4_14X10;
                        lcd_patch_reg = P880_LCD_RES_6X4_14X10;
                        break;
-               case VIA_RES_800X600:
+               case viafb_compact_res(800, 600):
                        reg_num = NUM_TOTAL_P880_LCD_RES_8X6_14X10;
                        lcd_patch_reg = P880_LCD_RES_8X6_14X10;
                        break;
                }
                break;
        case LCD_PANEL_ID6_1600X1200:
-               switch (vmode_index) {
-               case VIA_RES_640X400:
-               case VIA_RES_640X480:
+               switch (compact_mode) {
+               case viafb_compact_res(640, 400):
+               case viafb_compact_res(640, 480):
                        reg_num = NUM_TOTAL_P880_LCD_RES_6X4_16X12;
                        lcd_patch_reg = P880_LCD_RES_6X4_16X12;
                        break;
-               case VIA_RES_720X480:
-               case VIA_RES_720X576:
+               case viafb_compact_res(720, 480):
+               case viafb_compact_res(720, 576):
                        reg_num = NUM_TOTAL_P880_LCD_RES_7X4_16X12;
                        lcd_patch_reg = P880_LCD_RES_7X4_16X12;
                        break;
-               case VIA_RES_800X600:
+               case viafb_compact_res(800, 600):
                        reg_num = NUM_TOTAL_P880_LCD_RES_8X6_16X12;
                        lcd_patch_reg = P880_LCD_RES_8X6_16X12;
                        break;
-               case VIA_RES_1024X768:
+               case viafb_compact_res(1024, 768):
                        reg_num = NUM_TOTAL_P880_LCD_RES_10X7_16X12;
                        lcd_patch_reg = P880_LCD_RES_10X7_16X12;
                        break;
-               case VIA_RES_1280X768:
-               case VIA_RES_1280X960:
-               case VIA_RES_1280X1024:
+               case viafb_compact_res(1280, 768):
+               case viafb_compact_res(1280, 960):
+               case viafb_compact_res(1280, 1024):
                        reg_num = NUM_TOTAL_P880_LCD_RES_12X10_16X12;
                        lcd_patch_reg = P880_LCD_RES_12X10_16X12;
                        break;
@@ -830,13 +791,6 @@ static void load_lcd_p880_patch_tbl(int set_hres, int set_vres,
 static void load_lcd_patch_regs(int set_hres, int set_vres,
        int panel_id, int set_iga)
 {
-       int vmode_index;
-
-       if (viaparinfo->lvds_setting_info->iga_path == IGA2)
-               vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);
-       else
-               vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);
-
        viafb_unlock_crt();
 
        /* Patch for simultaneous & Expansion */
@@ -958,32 +912,26 @@ void viafb_lcd_set_mode(struct crt_mode_table *mode_crt_table,
                  struct lvds_setting_information *plvds_setting_info,
                  struct lvds_chip_information *plvds_chip_info)
 {
-       int video_index = plvds_setting_info->lcd_panel_size;
        int set_iga = plvds_setting_info->iga_path;
        int mode_bpp = plvds_setting_info->bpp;
-       int viafb_load_reg_num = 0;
-       int reg_value = 0;
-       int set_hres, set_vres;
-       int panel_hres, panel_vres;
+       int set_hres = plvds_setting_info->h_active;
+       int set_vres = plvds_setting_info->v_active;
+       int panel_hres = plvds_setting_info->lcd_panel_hres;
+       int panel_vres = plvds_setting_info->lcd_panel_vres;
        u32 pll_D_N;
        int offset;
-       struct io_register *reg = NULL;
        struct display_timing mode_crt_reg, panel_crt_reg;
        struct crt_mode_table *panel_crt_table = NULL;
-       struct VideoModeTable *vmode_tbl = NULL;
+       struct VideoModeTable *vmode_tbl = viafb_get_mode(panel_hres,
+               panel_vres);
 
        DEBUG_MSG(KERN_INFO "viafb_lcd_set_mode!!\n");
        /* Get mode table */
        mode_crt_reg = mode_crt_table->crtc;
        /* Get panel table Pointer */
-       vmode_tbl = viafb_get_modetbl_pointer(video_index);
        panel_crt_table = vmode_tbl->crtc;
        panel_crt_reg = panel_crt_table->crtc;
        DEBUG_MSG(KERN_INFO "bellow viafb_lcd_set_mode!!\n");
-       set_hres = plvds_setting_info->h_active;
-       set_vres = plvds_setting_info->v_active;
-       panel_hres = plvds_setting_info->lcd_panel_hres;
-       panel_vres = plvds_setting_info->lcd_panel_vres;
        if (VT1636_LVDS == plvds_chip_info->lvds_chip_name)
                viafb_init_lvds_vt1636(plvds_setting_info, plvds_chip_info);
        plvds_setting_info->vclk = panel_crt_table->clk;
@@ -1047,16 +995,11 @@ void viafb_lcd_set_mode(struct crt_mode_table *mode_crt_table,
                }
 
                /* Offset for simultaneous */
-               reg_value = offset;
-               viafb_load_reg_num = offset_reg.iga2_offset_reg.reg_num;
-               reg = offset_reg.iga2_offset_reg.reg;
-               viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);
+               viafb_set_secondary_pitch(offset << 3);
                DEBUG_MSG(KERN_INFO "viafb_load_reg!!\n");
                viafb_load_fetch_count_reg(set_hres, 4, IGA2);
                /* Fetch count for simultaneous */
        } else {                /* SAMM */
-               /* Offset for IGA2 only */
-               viafb_load_offset_reg(set_hres, mode_bpp / 8, set_iga);
                /* Fetch count for IGA2 only */
                viafb_load_fetch_count_reg(set_hres, mode_bpp / 8, set_iga);
 
@@ -1151,45 +1094,33 @@ static void integrated_lvds_enable(struct lvds_setting_information
                            *plvds_setting_info,
                            struct lvds_chip_information *plvds_chip_info)
 {
-       bool turn_on_first_powersequence = false;
-       bool turn_on_second_powersequence = false;
-
        DEBUG_MSG(KERN_INFO "integrated_lvds_enable, out_interface:%d\n",
                  plvds_chip_info->output_interface);
        if (plvds_setting_info->lcd_mode == LCD_SPWG)
                viafb_write_reg_mask(CRD2, VIACR, 0x00, BIT0 + BIT1);
-        else
+       else
                viafb_write_reg_mask(CRD2, VIACR, 0x03, BIT0 + BIT1);
-       if (INTERFACE_LVDS0LVDS1 == plvds_chip_info->output_interface)
-               turn_on_first_powersequence = true;
-       if (INTERFACE_LVDS0 == plvds_chip_info->output_interface)
-               turn_on_first_powersequence = true;
-       if (INTERFACE_LVDS1 == plvds_chip_info->output_interface)
-               turn_on_second_powersequence = true;
-
-       if (turn_on_second_powersequence) {
-               /* Use second power sequence control: */
 
-               /* Use hardware control power sequence. */
-               viafb_write_reg_mask(CRD3, VIACR, 0, BIT0);
-
-               /* Turn on back light. */
-               viafb_write_reg_mask(CRD3, VIACR, 0, BIT6 + BIT7);
-
-               /* Turn on hardware power sequence. */
-               viafb_write_reg_mask(CRD4, VIACR, 0x02, BIT1);
-       }
-       if (turn_on_first_powersequence) {
+       switch (plvds_chip_info->output_interface) {
+       case INTERFACE_LVDS0LVDS1:
+       case INTERFACE_LVDS0:
                /* Use first power sequence control: */
-
                /* Use hardware control power sequence. */
                viafb_write_reg_mask(CR91, VIACR, 0, BIT0);
-
                /* Turn on back light. */
                viafb_write_reg_mask(CR91, VIACR, 0, BIT6 + BIT7);
-
                /* Turn on hardware power sequence. */
                viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3);
+               break;
+       case INTERFACE_LVDS1:
+               /* Use second power sequence control: */
+               /* Use hardware control power sequence. */
+               viafb_write_reg_mask(CRD3, VIACR, 0, BIT0);
+               /* Turn on back light. */
+               viafb_write_reg_mask(CRD3, VIACR, 0, BIT6 + BIT7);
+               /* Turn on hardware power sequence. */
+               viafb_write_reg_mask(CRD4, VIACR, 0x02, BIT1);
+               break;
        }
 
        /* Turn DFP High/Low pad on. */