lkml.org 
[lkml]   [2010]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2] viafb: split global index up
    Date
    viafb: split global index up

    This is the first step to remove an artificial global index that was
    used in two ways:
    1. As a pseudo index in the mode table. Pseudo as you had to search
    through the table to find the referenced entry.
    This was replaced by using a pointer to the entry.

    2. As a shortcut to compare a combination of horizontal and vertical
    resolution at the same time.
    This was replaced by a "(hres<<16) | vres" which is good enough
    for now and the near future. If vres or hres become greater than
    2^16 this might indeed cause problems but this solution allows
    to split this indexing mess up without the requirement to do even
    more code changes.

    This is a big change that will allow more clean ups. It should be a
    bit faster but that is probably not relevant for normal operation.
    No regressions expected but as this is a relatively big step heavy
    testing is appreciated.

    Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
    ---
    v2: - fix variable name typo (missing 1) which would break SAMM
    ---
    drivers/video/via/dvi.c | 56 +++-----------
    drivers/video/via/dvi.h | 4 +-
    drivers/video/via/hw.c | 151 ++++++-----------------------------
    drivers/video/via/hw.h | 12 ++-
    drivers/video/via/lcd.c | 148 ++++++++++++++++------------------
    drivers/video/via/viafbdev.c | 49 +++---------
    drivers/video/via/viafbdev.h | 3 -
    drivers/video/via/viamode.c | 180 ++++++++++++++++++++++--------------------
    drivers/video/via/viamode.h | 8 +-
    9 files changed, 225 insertions(+), 386 deletions(-)

    diff --git a/drivers/video/via/dvi.c b/drivers/video/via/dvi.c
    index 67b3693..92f7593 100644
    --- a/drivers/video/via/dvi.c
    +++ b/drivers/video/via/dvi.c
    @@ -23,8 +23,6 @@
    static void tmds_register_write(int index, u8 data);
    static int tmds_register_read(int index);
    static int tmds_register_read_bytes(int index, u8 *buff, int buff_len);
    -static int check_reduce_blanking_mode(int mode_index,
    - int refresh_rate);
    static int dvi_get_panel_size_from_DDCv1(void);
    static int dvi_get_panel_size_from_DDCv2(void);
    static unsigned char dvi_get_panel_info(void);
    @@ -189,42 +187,14 @@ static int tmds_register_read_bytes(int index, u8 *buff, int buff_len)
    return 0;
    }

    -static int check_reduce_blanking_mode(int mode_index,
    - int refresh_rate)
    -{
    - if (refresh_rate != 60)
    - return false;
    -
    - switch (mode_index) {
    - /* Following modes have reduce blanking mode. */
    - case VIA_RES_1360X768:
    - case VIA_RES_1400X1050:
    - case VIA_RES_1440X900:
    - case VIA_RES_1600X900:
    - case VIA_RES_1680X1050:
    - case VIA_RES_1920X1080:
    - case VIA_RES_1920X1200:
    - break;
    -
    - default:
    - DEBUG_MSG(KERN_INFO
    - "This dvi mode %d have no reduce blanking mode!\n",
    - mode_index);
    - return false;
    - }
    -
    - return true;
    -}
    -
    /* DVI Set Mode */
    -void viafb_dvi_set_mode(int video_index, int mode_bpp, int set_iga)
    +void viafb_dvi_set_mode(struct VideoModeTable *mode, int mode_bpp,
    + int set_iga)
    {
    - struct VideoModeTable *videoMode = NULL;
    + struct VideoModeTable *rb_mode;
    struct crt_mode_table *pDviTiming;
    unsigned long desirePixelClock, maxPixelClock;
    - int status = 0;
    - videoMode = viafb_get_modetbl_pointer(video_index);
    - pDviTiming = videoMode->crtc;
    + pDviTiming = mode->crtc;
    desirePixelClock = pDviTiming->clk / 1000000;
    maxPixelClock = (unsigned long)viaparinfo->
    tmds_setting_info->max_pixel_clock;
    @@ -232,20 +202,14 @@ void viafb_dvi_set_mode(int video_index, int mode_bpp, int set_iga)
    DEBUG_MSG(KERN_INFO "\nDVI_set_mode!!\n");

    if ((maxPixelClock != 0) && (desirePixelClock > maxPixelClock)) {
    - /*Check if reduce-blanking mode is exist */
    - status =
    - check_reduce_blanking_mode(video_index,
    - pDviTiming->refresh_rate);
    - if (status) {
    - video_index += 100; /*Use reduce-blanking mode */
    - videoMode = viafb_get_modetbl_pointer(video_index);
    - pDviTiming = videoMode->crtc;
    - DEBUG_MSG(KERN_INFO
    - "DVI use reduce blanking mode %d!!\n",
    - video_index);
    + rb_mode = viafb_get_rb_mode(mode->crtc[0].crtc.hor_addr,
    + mode->crtc[0].crtc.ver_addr);
    + if (rb_mode) {
    + mode = rb_mode;
    + pDviTiming = rb_mode->crtc;
    }
    }
    - viafb_fill_crtc_timing(pDviTiming, video_index, mode_bpp / 8, set_iga);
    + viafb_fill_crtc_timing(pDviTiming, mode, mode_bpp / 8, set_iga);
    viafb_set_output_path(DEVICE_DVI, set_iga,
    viaparinfo->chip_info->tmds_chip_info.output_interface);
    }
    diff --git a/drivers/video/via/dvi.h b/drivers/video/via/dvi.h
    index e1ec37f..5ca2ffc 100644
    --- a/drivers/video/via/dvi.h
    +++ b/drivers/video/via/dvi.h
    @@ -53,12 +53,12 @@
    #define DEV_CONNECT_DVI 0x01
    #define DEV_CONNECT_HDMI 0x02

    -struct VideoModeTable *viafb_get_cea_mode_tbl_pointer(int Index);
    int viafb_dvi_sense(void);
    void viafb_dvi_disable(void);
    void viafb_dvi_enable(void);
    int viafb_tmds_trasmitter_identify(void);
    void viafb_init_dvi_size(void);
    -void viafb_dvi_set_mode(int video_index, int mode_bpp, int set_iga);
    +void viafb_dvi_set_mode(struct VideoModeTable *videoMode, int mode_bpp,
    + int set_iga);

    #endif /* __DVI_H__ */
    diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c
    index 3e083ff..726fbd1 100644
    --- a/drivers/video/via/hw.c
    +++ b/drivers/video/via/hw.c
    @@ -524,7 +524,6 @@ static void dvi_patch_skew_dvp1(void);
    static void dvi_patch_skew_dvp_low(void);
    static void set_dvi_output_path(int set_iga, int output_interface);
    static void set_lcd_output_path(int set_iga, int output_interface);
    -static int search_mode_setting(int ModeInfoIndex);
    static void load_fix_bit_crtc_reg(void);
    static void init_gfx_chip_info(struct pci_dev *pdev,
    const struct pci_device_id *pdi);
    @@ -987,49 +986,6 @@ static void set_lcd_output_path(int set_iga, int output_interface)
    }
    }

    -/* Search Mode Index */
    -static int search_mode_setting(int ModeInfoIndex)
    -{
    - int i = 0;
    -
    - while ((i < NUM_TOTAL_MODETABLE) &&
    - (ModeInfoIndex != CLE266Modes[i].ModeIndex))
    - i++;
    - if (i >= NUM_TOTAL_MODETABLE)
    - i = 0;
    - return i;
    -
    -}
    -
    -struct VideoModeTable *viafb_get_modetbl_pointer(int Index)
    -{
    - struct VideoModeTable *TmpTbl = NULL;
    - TmpTbl = &CLE266Modes[search_mode_setting(Index)];
    - return TmpTbl;
    -}
    -
    -struct VideoModeTable *viafb_get_cea_mode_tbl_pointer(int Index)
    -{
    - struct VideoModeTable *TmpTbl = NULL;
    - int i = 0;
    - while ((i < NUM_TOTAL_CEA_MODES) &&
    - (Index != CEA_HDMI_Modes[i].ModeIndex))
    - i++;
    - if ((i < NUM_TOTAL_CEA_MODES))
    - TmpTbl = &CEA_HDMI_Modes[i];
    - else {
    - /*Still use general timing if don't find CEA timing */
    - i = 0;
    - while ((i < NUM_TOTAL_MODETABLE) &&
    - (Index != CLE266Modes[i].ModeIndex))
    - i++;
    - if (i >= NUM_TOTAL_MODETABLE)
    - i = 0;
    - TmpTbl = &CLE266Modes[i];
    - }
    - return TmpTbl;
    -}
    -
    static void load_fix_bit_crtc_reg(void)
    {
    /* always set to 1 */
    @@ -1835,17 +1791,14 @@ void viafb_set_color_depth(int bpp_byte, int set_iga)
    }

    void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,
    - int mode_index, int bpp_byte, int set_iga)
    + struct VideoModeTable *video_mode, int bpp_byte, int set_iga)
    {
    - struct VideoModeTable *video_mode;
    struct display_timing crt_reg;
    int i;
    int index = 0;
    int h_addr, v_addr;
    u32 pll_D_N;

    - video_mode = &CLE266Modes[search_mode_setting(mode_index)];
    -
    for (i = 0; i < video_mode->mode_array; i++) {
    index = i;

    @@ -1858,8 +1811,10 @@ void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,

    /* Mode 640x480 has border, but LCD/DFP didn't have border. */
    /* So we would delete border. */
    - if ((viafb_LCD_ON | viafb_DVI_ON) && (mode_index == VIA_RES_640X480)
    - && (viaparinfo->crt_setting_info->refresh_rate == 60)) {
    + if ((viafb_LCD_ON | viafb_DVI_ON)
    + && video_mode->crtc[0].crtc.hor_addr == 640
    + && video_mode->crtc[0].crtc.ver_addr == 480
    + && viaparinfo->crt_setting_info->refresh_rate == 60) {
    /* The border is 8 pixels. */
    crt_reg.hor_blank_start = crt_reg.hor_blank_start - 8;

    @@ -2195,28 +2150,19 @@ static void set_display_channel(void)
    }
    }

    -int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp,
    - int vmode_index1, int hor_res1, int ver_res1, int video_bpp1)
    +int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
    + struct VideoModeTable *vmode_tbl1, int video_bpp1)
    {
    int i, j;
    int port;
    u8 value, index, mask;
    - struct VideoModeTable *vmode_tbl;
    struct crt_mode_table *crt_timing;
    - struct VideoModeTable *vmode_tbl1 = NULL;
    struct crt_mode_table *crt_timing1 = NULL;

    - DEBUG_MSG(KERN_INFO "Set Mode!!\n");
    - DEBUG_MSG(KERN_INFO
    - "vmode_index=%d hor_res=%d ver_res=%d video_bpp=%d\n",
    - vmode_index, hor_res, ver_res, video_bpp);
    -
    device_screen_off();
    - vmode_tbl = &CLE266Modes[search_mode_setting(vmode_index)];
    crt_timing = vmode_tbl->crtc;

    if (viafb_SAMM_ON == 1) {
    - vmode_tbl1 = &CLE266Modes[search_mode_setting(vmode_index1)];
    crt_timing1 = vmode_tbl1->crtc;
    }

    @@ -2272,7 +2218,7 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp,
    viafb_set_iga_path();

    /* Write CRTC */
    - viafb_fill_crtc_timing(crt_timing, vmode_index, video_bpp / 8, IGA1);
    + viafb_fill_crtc_timing(crt_timing, vmode_tbl, video_bpp / 8, IGA1);

    /* Write Graphic Controller */
    for (i = 0; i < StdGR; i++) {
    @@ -2292,59 +2238,16 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp,

    /* Update Patch Register */

    - if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
    - || (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K400)) {
    - for (i = 0; i < NUM_TOTAL_PATCH_MODE; i++) {
    - if (res_patch_table[i].mode_index == vmode_index) {
    - for (j = 0;
    - j < res_patch_table[i].table_length; j++) {
    - index =
    - res_patch_table[i].
    - io_reg_table[j].index;
    - port =
    - res_patch_table[i].
    - io_reg_table[j].port;
    - value =
    - res_patch_table[i].
    - io_reg_table[j].value;
    - mask =
    - res_patch_table[i].
    - io_reg_table[j].mask;
    - viafb_write_reg_mask(index, port, value,
    - mask);
    - }
    - }
    - }
    - }
    -
    - if (viafb_SAMM_ON == 1) {
    - if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)
    - || (viaparinfo->chip_info->gfx_chip_name ==
    - UNICHROME_K400)) {
    - for (i = 0; i < NUM_TOTAL_PATCH_MODE; i++) {
    - if (res_patch_table[i].mode_index ==
    - vmode_index1) {
    - for (j = 0;
    - j <
    - res_patch_table[i].
    - table_length; j++) {
    - index =
    - res_patch_table[i].
    - io_reg_table[j].index;
    - port =
    - res_patch_table[i].
    - io_reg_table[j].port;
    - value =
    - res_patch_table[i].
    - io_reg_table[j].value;
    - mask =
    - res_patch_table[i].
    - io_reg_table[j].mask;
    - viafb_write_reg_mask(index,
    - port, value, mask);
    - }
    - }
    - }
    + if ((viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266
    + || viaparinfo->chip_info->gfx_chip_name == UNICHROME_K400)
    + && vmode_tbl->crtc[0].crtc.hor_addr == 1024
    + && vmode_tbl->crtc[0].crtc.ver_addr == 768) {
    + for (j = 0; j < res_patch_table[0].table_length; j++) {
    + index = res_patch_table[0].io_reg_table[j].index;
    + port = res_patch_table[0].io_reg_table[j].port;
    + value = res_patch_table[0].io_reg_table[j].value;
    + mask = res_patch_table[0].io_reg_table[j].mask;
    + viafb_write_reg_mask(index, port, value, mask);
    }
    }

    @@ -2359,11 +2262,11 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp,
    if (viafb_CRT_ON) {
    if (viafb_SAMM_ON && (viaparinfo->crt_setting_info->iga_path ==
    IGA2)) {
    - viafb_fill_crtc_timing(crt_timing1, vmode_index1,
    + viafb_fill_crtc_timing(crt_timing1, vmode_tbl1,
    video_bpp1 / 8,
    viaparinfo->crt_setting_info->iga_path);
    } else {
    - viafb_fill_crtc_timing(crt_timing, vmode_index,
    + viafb_fill_crtc_timing(crt_timing, vmode_tbl,
    video_bpp / 8,
    viaparinfo->crt_setting_info->iga_path);
    }
    @@ -2373,7 +2276,7 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp,
    /* Patch if set_hres is not 8 alignment (1366) to viafb_setmode
    to 8 alignment (1368),there is several pixels (2 pixels)
    on right side of screen. */
    - if (hor_res % 8) {
    + if (vmode_tbl->crtc[0].crtc.hor_addr % 8) {
    viafb_unlock_crt();
    viafb_write_reg(CR02, VIACR,
    viafb_read_reg(VIACR, CR02) - 1);
    @@ -2384,14 +2287,14 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp,
    if (viafb_DVI_ON) {
    if (viafb_SAMM_ON &&
    (viaparinfo->tmds_setting_info->iga_path == IGA2)) {
    - viafb_dvi_set_mode(viafb_get_mode_index
    + viafb_dvi_set_mode(viafb_get_mode
    (viaparinfo->tmds_setting_info->h_active,
    viaparinfo->tmds_setting_info->
    v_active),
    video_bpp1, viaparinfo->
    tmds_setting_info->iga_path);
    } else {
    - viafb_dvi_set_mode(viafb_get_mode_index
    + viafb_dvi_set_mode(viafb_get_mode
    (viaparinfo->tmds_setting_info->h_active,
    viaparinfo->
    tmds_setting_info->v_active),
    @@ -2445,8 +2348,8 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp,

    /* If set mode normally, save resolution information for hot-plug . */
    if (!viafb_hotplug) {
    - viafb_hotplug_Xres = hor_res;
    - viafb_hotplug_Yres = ver_res;
    + viafb_hotplug_Xres = vmode_tbl->crtc[0].crtc.hor_addr;
    + viafb_hotplug_Yres = vmode_tbl->crtc[0].crtc.ver_addr;
    viafb_hotplug_bpp = video_bpp;
    viafb_hotplug_refresh = viafb_refresh;

    @@ -2706,13 +2609,11 @@ void viafb_set_dpa_gfx(int output_interface, struct GFX_DPA_SETTING\

    /*According var's xres, yres fill var's other timing information*/
    void viafb_fill_var_timing_info(struct fb_var_screeninfo *var, int refresh,
    - int mode_index)
    + struct VideoModeTable *vmode_tbl)
    {
    - struct VideoModeTable *vmode_tbl = NULL;
    struct crt_mode_table *crt_timing = NULL;
    struct display_timing crt_reg;
    int i = 0, index = 0;
    - vmode_tbl = &CLE266Modes[search_mode_setting(mode_index)];
    crt_timing = vmode_tbl->crtc;
    for (i = 0; i < vmode_tbl->mode_array; i++) {
    index = i;
    diff --git a/drivers/video/via/hw.h b/drivers/video/via/hw.h
    index b874d95..789c58a 100644
    --- a/drivers/video/via/hw.h
    +++ b/drivers/video/via/hw.h
    @@ -22,6 +22,7 @@
    #ifndef __HW_H__
    #define __HW_H__

    +#include "viamode.h"
    #include "global.h"

    /***************************************************
    @@ -874,8 +875,9 @@ extern int viafb_hotplug;
    void viafb_write_reg_mask(u8 index, int io_port, u8 data, u8 mask);
    void viafb_set_output_path(int device, int set_iga,
    int output_interface);
    +
    void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,
    - int mode_index, int bpp_byte, int set_iga);
    + struct VideoModeTable *video_mode, int bpp_byte, int set_iga);

    void viafb_set_vclock(u32 CLK, int set_iga);
    void viafb_load_reg(int timing_value, int viafb_load_reg_num,
    @@ -891,16 +893,16 @@ void viafb_lock_crt(void);
    void viafb_unlock_crt(void);
    void viafb_load_fetch_count_reg(int h_addr, int bpp_byte, int set_iga);
    void viafb_write_regx(struct io_reg RegTable[], int ItemNum);
    -struct VideoModeTable *viafb_get_modetbl_pointer(int Index);
    u32 viafb_get_clk_value(int clk);
    void viafb_load_FIFO_reg(int set_iga, int hor_active, int ver_active);
    void viafb_set_color_depth(int bpp_byte, int set_iga);
    void viafb_set_dpa_gfx(int output_interface, struct GFX_DPA_SETTING\
    *p_gfx_dpa_setting);

    -int viafb_setmode(int vmode_index, int hor_res, int ver_res,
    - int video_bpp, int vmode_index1, int hor_res1,
    - int ver_res1, int video_bpp1);
    +int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
    + struct VideoModeTable *vmode_tbl1, int video_bpp1);
    +void viafb_fill_var_timing_info(struct fb_var_screeninfo *var, int refresh,
    + struct VideoModeTable *vmode_tbl);
    void viafb_init_chip_info(struct pci_dev *pdev,
    const struct pci_device_id *pdi);
    void viafb_init_dac(int set_iga);
    diff --git a/drivers/video/via/lcd.c b/drivers/video/via/lcd.c
    index 09353e2..e0ab605 100644
    --- a/drivers/video/via/lcd.c
    +++ b/drivers/video/via/lcd.c
    @@ -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} } },
    @@ -576,22 +578,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;

    - vmode_index = viafb_get_mode_index(set_hres, set_vres);
    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;
    @@ -600,18 +601,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;
    @@ -620,22 +621,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;
    @@ -645,23 +646,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;
    @@ -670,29 +671,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;
    @@ -701,28 +702,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;
    @@ -754,48 +755,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;

    - vmode_index = viafb_get_mode_index(set_hres, set_vres);
    -
    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;
    @@ -824,10 +823,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;
    -
    - vmode_index = viafb_get_mode_index(set_hres, set_vres);
    -
    viafb_unlock_crt();

    /* Patch for simultaneous & Expansion */
    @@ -949,29 +944,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 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 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;
    diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
    index 156a900..98e3bd1 100644
    --- a/drivers/video/via/viafbdev.c
    +++ b/drivers/video/via/viafbdev.c
    @@ -97,7 +97,8 @@ static int viafb_release(struct fb_info *info, int user)
    static int viafb_check_var(struct fb_var_screeninfo *var,
    struct fb_info *info)
    {
    - int vmode_index, htotal, vtotal;
    + int htotal, vtotal;
    + struct VideoModeTable *vmode_entry;
    struct viafb_par *ppar = info->par;
    u32 long_refresh;

    @@ -107,8 +108,8 @@ static int viafb_check_var(struct fb_var_screeninfo *var,
    if (var->vmode & FB_VMODE_INTERLACED || var->vmode & FB_VMODE_DOUBLE)
    return -EINVAL;

    - vmode_index = viafb_get_mode_index(var->xres, var->yres);
    - if (vmode_index == VIA_RES_INVALID) {
    + vmode_entry = viafb_get_mode(var->xres, var->yres);
    + if (!vmode_entry) {
    DEBUG_MSG(KERN_INFO
    "viafb: Mode %dx%dx%d not supported!!\n",
    var->xres, var->yres, var->bits_per_pixel);
    @@ -142,7 +143,7 @@ static int viafb_check_var(struct fb_var_screeninfo *var,
    viafb_refresh = viafb_get_refresh(var->xres, var->yres, long_refresh);

    /* Adjust var according to our driver's own table */
    - viafb_fill_var_timing_info(var, viafb_refresh, vmode_index);
    + viafb_fill_var_timing_info(var, viafb_refresh, vmode_entry);
    if (info->var.accel_flags & FB_ACCELF_TEXT &&
    !ppar->shared->engine_mmio)
    info->var.accel_flags = 0;
    @@ -153,39 +154,34 @@ static int viafb_check_var(struct fb_var_screeninfo *var,
    static int viafb_set_par(struct fb_info *info)
    {
    struct viafb_par *viapar = info->par;
    - int vmode_index;
    - int vmode_index1 = 0;
    + struct VideoModeTable *vmode_entry, *vmode_entry1 = NULL;
    DEBUG_MSG(KERN_INFO "viafb_set_par!\n");

    viapar->depth = fb_get_color_depth(&info->var, &info->fix);
    viafb_update_device_setting(info->var.xres, info->var.yres,
    info->var.bits_per_pixel, viafb_refresh, 0);

    - vmode_index = viafb_get_mode_index(info->var.xres, info->var.yres);
    -
    + vmode_entry = viafb_get_mode(info->var.xres, info->var.yres);
    if (viafb_SAMM_ON == 1) {
    DEBUG_MSG(KERN_INFO
    "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n",
    viafb_second_xres, viafb_second_yres, viafb_bpp1);
    - vmode_index1 = viafb_get_mode_index(viafb_second_xres,
    + vmode_entry1 = viafb_get_mode(viafb_second_xres,
    viafb_second_yres);
    - DEBUG_MSG(KERN_INFO "->viafb_SAMM_ON: index=%d\n",
    - vmode_index1);

    viafb_update_device_setting(viafb_second_xres,
    viafb_second_yres, viafb_bpp1, viafb_refresh1, 1);
    }

    - if (vmode_index != VIA_RES_INVALID) {
    + if (vmode_entry) {
    viafb_update_fix(info);
    viafb_bpp = info->var.bits_per_pixel;
    if (info->var.accel_flags & FB_ACCELF_TEXT)
    info->flags &= ~FBINFO_HWACCEL_DISABLED;
    else
    info->flags |= FBINFO_HWACCEL_DISABLED;
    - viafb_setmode(vmode_index, info->var.xres, info->var.yres,
    - info->var.bits_per_pixel, vmode_index1,
    - viafb_second_xres, viafb_second_yres, viafb_bpp1);
    + viafb_setmode(vmode_entry, info->var.bits_per_pixel,
    + vmode_entry1, viafb_bpp1);
    }

    return 0;
    @@ -1016,23 +1012,6 @@ static int viafb_sync(struct fb_info *info)
    return 0;
    }

    -int viafb_get_mode_index(int hres, int vres)
    -{
    - u32 i;
    - DEBUG_MSG(KERN_INFO "viafb_get_mode_index!\n");
    -
    - for (i = 0; i < NUM_TOTAL_MODETABLE; i++)
    - if (CLE266Modes[i].mode_array &&
    - CLE266Modes[i].crtc[0].crtc.hor_addr == hres &&
    - CLE266Modes[i].crtc[0].crtc.ver_addr == vres)
    - break;
    -
    - if (i == NUM_TOTAL_MODETABLE)
    - return VIA_RES_INVALID;
    -
    - return CLE266Modes[i].ModeIndex;
    -}
    -
    static void check_available_device_to_enable(int device_id)
    {
    int device_num = 0;
    @@ -1848,7 +1827,7 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
    const struct pci_device_id *ent)
    {
    u32 default_xres, default_yres;
    - int vmode_index;
    + struct VideoModeTable *vmode_entry;
    u32 viafb_par_length;

    DEBUG_MSG(KERN_INFO "VIAFB PCI Probe!!\n");
    @@ -1927,9 +1906,7 @@ static int __devinit via_pci_probe(struct pci_dev *pdev,
    }

    parse_mode(viafb_mode, &default_xres, &default_yres);
    - vmode_index = viafb_get_mode_index(default_xres, default_yres);
    - DEBUG_MSG(KERN_INFO "0->index=%d\n", vmode_index);
    -
    + vmode_entry = viafb_get_mode(default_xres, default_yres);
    if (viafb_SAMM_ON == 1) {
    parse_mode(viafb_mode1, &viafb_second_xres,
    &viafb_second_yres);
    diff --git a/drivers/video/via/viafbdev.h b/drivers/video/via/viafbdev.h
    index 0c94d24..85aa20e 100644
    --- a/drivers/video/via/viafbdev.h
    +++ b/drivers/video/via/viafbdev.h
    @@ -96,9 +96,6 @@ extern int viafb_memsize;
    extern int strict_strtoul(const char *cp, unsigned int base,
    unsigned long *res);

    -void viafb_fill_var_timing_info(struct fb_var_screeninfo *var, int refresh,
    - int mode_index);
    -int viafb_get_mode_index(int hres, int vres);
    u8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information
    *plvds_setting_info, struct lvds_chip_information
    *plvds_chip_info, u8 index);
    diff --git a/drivers/video/via/viamode.c b/drivers/video/via/viamode.c
    index b74f8a6..af50e24 100644
    --- a/drivers/video/via/viamode.c
    +++ b/drivers/video/via/viamode.c
    @@ -412,7 +412,7 @@ struct io_reg PM1024x768[] = { {VIASR, 0x16, 0xBF, 0x0C},
    };

    struct patch_table res_patch_table[] = {
    - {VIA_RES_1024X768, ARRAY_SIZE(PM1024x768), PM1024x768}
    + {ARRAY_SIZE(PM1024x768), PM1024x768}
    };

    /* struct VPITTable {
    @@ -879,169 +879,151 @@ struct crt_mode_table CRTM2048x1536[] = {
    {2800, 2048, 2048, 752, 2200, 224, 1592, 1536, 1536, 56, 1539, 4} }
    };

    -/* Video Mode Table */
    -/* struct VideoModeTable {*/
    -/* int ModeIndex;*/
    -/* struct crt_mode_table *crtc;*/
    -/* int mode_array;*/
    -/* };*/
    -struct VideoModeTable CLE266Modes[] = {
    +struct VideoModeTable viafb_modes[] = {
    /* Display : 480x640 (GTF) */
    - {VIA_RES_480X640, CRTM480x640, ARRAY_SIZE(CRTM480x640)},
    + {CRTM480x640, ARRAY_SIZE(CRTM480x640)},

    /* Display : 640x480 */
    - {VIA_RES_640X480, CRTM640x480, ARRAY_SIZE(CRTM640x480)},
    + {CRTM640x480, ARRAY_SIZE(CRTM640x480)},

    /* Display : 720x480 (GTF) */
    - {VIA_RES_720X480, CRTM720x480, ARRAY_SIZE(CRTM720x480)},
    + {CRTM720x480, ARRAY_SIZE(CRTM720x480)},

    /* Display : 720x576 (GTF) */
    - {VIA_RES_720X576, CRTM720x576, ARRAY_SIZE(CRTM720x576)},
    + {CRTM720x576, ARRAY_SIZE(CRTM720x576)},

    /* Display : 800x600 */
    - {VIA_RES_800X600, CRTM800x600, ARRAY_SIZE(CRTM800x600)},
    + {CRTM800x600, ARRAY_SIZE(CRTM800x600)},

    /* Display : 800x480 (CVT) */
    - {VIA_RES_800X480, CRTM800x480, ARRAY_SIZE(CRTM800x480)},
    + {CRTM800x480, ARRAY_SIZE(CRTM800x480)},

    /* Display : 848x480 (CVT) */
    - {VIA_RES_848X480, CRTM848x480, ARRAY_SIZE(CRTM848x480)},
    + {CRTM848x480, ARRAY_SIZE(CRTM848x480)},

    /* Display : 852x480 (GTF) */
    - {VIA_RES_856X480, CRTM852x480, ARRAY_SIZE(CRTM852x480)},
    + {CRTM852x480, ARRAY_SIZE(CRTM852x480)},

    /* Display : 1024x512 (GTF) */
    - {VIA_RES_1024X512, CRTM1024x512, ARRAY_SIZE(CRTM1024x512)},
    + {CRTM1024x512, ARRAY_SIZE(CRTM1024x512)},

    /* Display : 1024x600 */
    - {VIA_RES_1024X600, CRTM1024x600, ARRAY_SIZE(CRTM1024x600)},
    -
    - /* Display : 1024x576 (GTF) */
    - /*{ VIA_RES_1024X576, CRTM1024x576, ARRAY_SIZE(CRTM1024x576)}, */
    + {CRTM1024x600, ARRAY_SIZE(CRTM1024x600)},

    /* Display : 1024x768 */
    - {VIA_RES_1024X768, CRTM1024x768, ARRAY_SIZE(CRTM1024x768)},
    + {CRTM1024x768, ARRAY_SIZE(CRTM1024x768)},

    /* Display : 1152x864 */
    - {VIA_RES_1152X864, CRTM1152x864, ARRAY_SIZE(CRTM1152x864)},
    + {CRTM1152x864, ARRAY_SIZE(CRTM1152x864)},

    /* Display : 1280x768 (GTF) */
    - {VIA_RES_1280X768, CRTM1280x768, ARRAY_SIZE(CRTM1280x768)},
    + {CRTM1280x768, ARRAY_SIZE(CRTM1280x768)},

    /* Display : 960x600 (CVT) */
    - {VIA_RES_960X600, CRTM960x600, ARRAY_SIZE(CRTM960x600)},
    + {CRTM960x600, ARRAY_SIZE(CRTM960x600)},

    /* Display : 1000x600 (GTF) */
    - {VIA_RES_1000X600, CRTM1000x600, ARRAY_SIZE(CRTM1000x600)},
    + {CRTM1000x600, ARRAY_SIZE(CRTM1000x600)},

    /* Display : 1024x576 (GTF) */
    - {VIA_RES_1024X576, CRTM1024x576, ARRAY_SIZE(CRTM1024x576)},
    + {CRTM1024x576, ARRAY_SIZE(CRTM1024x576)},

    /* Display : 1088x612 (GTF) */
    - {VIA_RES_1088X612, CRTM1088x612, ARRAY_SIZE(CRTM1088x612)},
    + {CRTM1088x612, ARRAY_SIZE(CRTM1088x612)},

    /* Display : 1152x720 (CVT) */
    - {VIA_RES_1152X720, CRTM1152x720, ARRAY_SIZE(CRTM1152x720)},
    + {CRTM1152x720, ARRAY_SIZE(CRTM1152x720)},

    /* Display : 1200x720 (GTF) */
    - {VIA_RES_1200X720, CRTM1200x720, ARRAY_SIZE(CRTM1200x720)},
    + {CRTM1200x720, ARRAY_SIZE(CRTM1200x720)},

    /* Display : 1280x600 (GTF) */
    - {VIA_RES_1280X600, CRTM1280x600, ARRAY_SIZE(CRTM1280x600)},
    + {CRTM1280x600, ARRAY_SIZE(CRTM1280x600)},

    /* Display : 1280x800 (CVT) */
    - {VIA_RES_1280X800, CRTM1280x800, ARRAY_SIZE(CRTM1280x800)},
    -
    - /* Display : 1280x800 (GTF) */
    - /*{ M1280x800, CRTM1280x800, ARRAY_SIZE(CRTM1280x800)}, */
    + {CRTM1280x800, ARRAY_SIZE(CRTM1280x800)},

    /* Display : 1280x960 */
    - {VIA_RES_1280X960, CRTM1280x960, ARRAY_SIZE(CRTM1280x960)},
    + {CRTM1280x960, ARRAY_SIZE(CRTM1280x960)},

    /* Display : 1280x1024 */
    - {VIA_RES_1280X1024, CRTM1280x1024, ARRAY_SIZE(CRTM1280x1024)},
    + {CRTM1280x1024, ARRAY_SIZE(CRTM1280x1024)},

    /* Display : 1360x768 (CVT) */
    - {VIA_RES_1360X768, CRTM1360x768, ARRAY_SIZE(CRTM1360x768)},
    -
    - /* Display : 1360x768 (CVT Reduce Blanking) */
    - {VIA_RES_1360X768_RB, CRTM1360x768_RB,
    - ARRAY_SIZE(CRTM1360x768_RB)},
    + {CRTM1360x768, ARRAY_SIZE(CRTM1360x768)},

    /* Display : 1366x768 */
    - {VIA_RES_1366X768, CRTM1366x768, ARRAY_SIZE(CRTM1366x768)},
    + {CRTM1366x768, ARRAY_SIZE(CRTM1366x768)},

    /* Display : 1368x768 (GTF) */
    - /*{ M1368x768,CRTM1368x768,ARRAY_SIZE(CRTM1368x768)}, */
    - /* Display : 1368x768 (GTF) */
    - {VIA_RES_1368X768, CRTM1368x768, ARRAY_SIZE(CRTM1368x768)},
    + {CRTM1368x768, ARRAY_SIZE(CRTM1368x768)},

    /* Display : 1440x900 (CVT) */
    - {VIA_RES_1440X900, CRTM1440x900, ARRAY_SIZE(CRTM1440x900)},
    -
    - /* Display : 1440x900 (CVT Reduce Blanking) */
    - {VIA_RES_1440X900_RB, CRTM1440x900_RB,
    - ARRAY_SIZE(CRTM1440x900_RB)},
    + {CRTM1440x900, ARRAY_SIZE(CRTM1440x900)},

    /* Display : 1440x1050 (GTF) */
    - {VIA_RES_1440X1050, CRTM1440x1050, ARRAY_SIZE(CRTM1440x1050)},
    -
    - /* Display : 1400x1050 (CVT Reduce Blanking) */
    - {VIA_RES_1400X1050_RB, CRTM1400x1050_RB,
    - ARRAY_SIZE(CRTM1400x1050_RB)},
    + {CRTM1440x1050, ARRAY_SIZE(CRTM1440x1050)},

    /* Display : 1600x900 (CVT) */
    - {VIA_RES_1600X900, CRTM1600x900, ARRAY_SIZE(CRTM1600x900)},
    -
    - /* Display : 1600x900 (CVT Reduce Blanking) */
    - {VIA_RES_1600X900_RB, CRTM1600x900_RB,
    - ARRAY_SIZE(CRTM1600x900_RB)},
    + {CRTM1600x900, ARRAY_SIZE(CRTM1600x900)},

    /* Display : 1600x1024 (GTF) */
    - {VIA_RES_1600X1024, CRTM1600x1024, ARRAY_SIZE(CRTM1600x1024)},
    + {CRTM1600x1024, ARRAY_SIZE(CRTM1600x1024)},

    /* Display : 1600x1200 */
    - {VIA_RES_1600X1200, CRTM1600x1200, ARRAY_SIZE(CRTM1600x1200)},
    + {CRTM1600x1200, ARRAY_SIZE(CRTM1600x1200)},

    /* Display : 1680x1050 (CVT) */
    - {VIA_RES_1680X1050, CRTM1680x1050, ARRAY_SIZE(CRTM1680x1050)},
    -
    - /* Display : 1680x1050 (CVT Reduce Blanking) */
    - {VIA_RES_1680X1050_RB, CRTM1680x1050_RB,
    - ARRAY_SIZE(CRTM1680x1050_RB)},
    + {CRTM1680x1050, ARRAY_SIZE(CRTM1680x1050)},

    /* Display : 1792x1344 (DMT) */
    - {VIA_RES_1792X1344, CRTM1792x1344, ARRAY_SIZE(CRTM1792x1344)},
    + {CRTM1792x1344, ARRAY_SIZE(CRTM1792x1344)},

    /* Display : 1856x1392 (DMT) */
    - {VIA_RES_1856X1392, CRTM1856x1392, ARRAY_SIZE(CRTM1856x1392)},
    + {CRTM1856x1392, ARRAY_SIZE(CRTM1856x1392)},

    /* Display : 1920x1440 */
    - {VIA_RES_1920X1440, CRTM1920x1440, ARRAY_SIZE(CRTM1920x1440)},
    + {CRTM1920x1440, ARRAY_SIZE(CRTM1920x1440)},

    /* Display : 2048x1536 */
    - {VIA_RES_2048X1536, CRTM2048x1536, ARRAY_SIZE(CRTM2048x1536)},
    + {CRTM2048x1536, ARRAY_SIZE(CRTM2048x1536)},

    /* Display : 1280x720 */
    - {VIA_RES_1280X720, CRTM1280x720, ARRAY_SIZE(CRTM1280x720)},
    + {CRTM1280x720, ARRAY_SIZE(CRTM1280x720)},

    /* Display : 1920x1080 (CVT) */
    - {VIA_RES_1920X1080, CRTM1920x1080, ARRAY_SIZE(CRTM1920x1080)},
    -
    - /* Display : 1920x1080 (CVT Reduce Blanking) */
    - {VIA_RES_1920X1080_RB, CRTM1920x1080_RB,
    - ARRAY_SIZE(CRTM1920x1080_RB)},
    + {CRTM1920x1080, ARRAY_SIZE(CRTM1920x1080)},

    /* Display : 1920x1200 (CVT) */
    - {VIA_RES_1920X1200, CRTM1920x1200, ARRAY_SIZE(CRTM1920x1200)},
    -
    - /* Display : 1920x1200 (CVT Reduce Blanking) */
    - {VIA_RES_1920X1200_RB, CRTM1920x1200_RB,
    - ARRAY_SIZE(CRTM1920x1200_RB)},
    + {CRTM1920x1200, ARRAY_SIZE(CRTM1920x1200)},

    /* Display : 1400x1050 (CVT) */
    - {VIA_RES_1400X1050, CRTM1400x1050, ARRAY_SIZE(CRTM1400x1050)}
    + {CRTM1400x1050, ARRAY_SIZE(CRTM1400x1050)}
    };
    +
    +struct VideoModeTable viafb_rb_modes[] = {
    + /* Display : 1360x768 (CVT Reduce Blanking) */
    + {CRTM1360x768_RB, ARRAY_SIZE(CRTM1360x768_RB)},
    +
    + /* Display : 1440x900 (CVT Reduce Blanking) */
    + {CRTM1440x900_RB, ARRAY_SIZE(CRTM1440x900_RB)},
    +
    + /* Display : 1400x1050 (CVT Reduce Blanking) */
    + {CRTM1400x1050_RB, ARRAY_SIZE(CRTM1400x1050_RB)},
    +
    + /* Display : 1600x900 (CVT Reduce Blanking) */
    + {CRTM1600x900_RB, ARRAY_SIZE(CRTM1600x900_RB)},
    +
    + /* Display : 1680x1050 (CVT Reduce Blanking) */
    + {CRTM1680x1050_RB, ARRAY_SIZE(CRTM1680x1050_RB)},
    +
    + /* Display : 1920x1080 (CVT Reduce Blanking) */
    + {CRTM1920x1080_RB, ARRAY_SIZE(CRTM1920x1080_RB)},
    +
    + /* Display : 1920x1200 (CVT Reduce Blanking) */
    + {CRTM1920x1200_RB, ARRAY_SIZE(CRTM1920x1200_RB)}
    +};
    +
    struct crt_mode_table CEAM1280x720[] = {
    {REFRESH_60, CLK_74_270M, M1280X720_CEA_R60_HSP,
    M1280X720_CEA_R60_VSP,
    @@ -1056,8 +1038,8 @@ struct crt_mode_table CEAM1920x1080[] = {
    };
    struct VideoModeTable CEA_HDMI_Modes[] = {
    /* Display : 1280x720 */
    - {VIA_RES_1280X720, CEAM1280x720, ARRAY_SIZE(CEAM1280x720)},
    - {VIA_RES_1920X1080, CEAM1920x1080, ARRAY_SIZE(CEAM1920x1080)}
    + {CEAM1280x720, ARRAY_SIZE(CEAM1280x720)},
    + {CEAM1920x1080, ARRAY_SIZE(CEAM1920x1080)}
    };

    int NUM_TOTAL_RES_MAP_REFRESH = ARRAY_SIZE(res_map_refresh_tbl);
    @@ -1069,4 +1051,28 @@ int NUM_TOTAL_CX700_ModeXregs = ARRAY_SIZE(CX700_ModeXregs);
    int NUM_TOTAL_VX855_ModeXregs = ARRAY_SIZE(VX855_ModeXregs);
    int NUM_TOTAL_CLE266_ModeXregs = ARRAY_SIZE(CLE266_ModeXregs);
    int NUM_TOTAL_PATCH_MODE = ARRAY_SIZE(res_patch_table);
    -int NUM_TOTAL_MODETABLE = ARRAY_SIZE(CLE266Modes);
    +
    +
    +struct VideoModeTable *viafb_get_mode(int hres, int vres)
    +{
    + u32 i;
    + for (i = 0; i < ARRAY_SIZE(viafb_modes); i++)
    + if (viafb_modes[i].mode_array &&
    + viafb_modes[i].crtc[0].crtc.hor_addr == hres &&
    + viafb_modes[i].crtc[0].crtc.ver_addr == vres)
    + return &viafb_modes[i];
    +
    + return NULL;
    +}
    +
    +struct VideoModeTable *viafb_get_rb_mode(int hres, int vres)
    +{
    + u32 i;
    + for (i = 0; i < ARRAY_SIZE(viafb_rb_modes); i++)
    + if (viafb_rb_modes[i].mode_array &&
    + viafb_rb_modes[i].crtc[0].crtc.hor_addr == hres &&
    + viafb_rb_modes[i].crtc[0].crtc.ver_addr == vres)
    + return &viafb_rb_modes[i];
    +
    + return NULL;
    +}
    diff --git a/drivers/video/via/viamode.h b/drivers/video/via/viamode.h
    index a9d6554..5b1ced8 100644
    --- a/drivers/video/via/viamode.h
    +++ b/drivers/video/via/viamode.h
    @@ -32,13 +32,11 @@ struct VPITTable {
    };

    struct VideoModeTable {
    - int ModeIndex;
    struct crt_mode_table *crtc;
    int mode_array;
    };

    struct patch_table {
    - int mode_index;
    int table_length;
    struct io_reg *io_reg_table;
    };
    @@ -59,13 +57,11 @@ extern int NUM_TOTAL_CX700_ModeXregs;
    extern int NUM_TOTAL_VX855_ModeXregs;
    extern int NUM_TOTAL_CLE266_ModeXregs;
    extern int NUM_TOTAL_PATCH_MODE;
    -extern int NUM_TOTAL_MODETABLE;

    /********************/
    /* Mode Table */
    /********************/

    -extern struct VideoModeTable CLE266Modes[];
    extern struct crt_mode_table CEAM1280x720[];
    extern struct crt_mode_table CEAM1920x1080[];
    extern struct VideoModeTable CEA_HDMI_Modes[];
    @@ -81,4 +77,8 @@ extern struct io_reg CLE266_ModeXregs[];
    extern struct io_reg PM1024x768[];
    extern struct patch_table res_patch_table[];
    extern struct VPITTable VPIT;
    +
    +struct VideoModeTable *viafb_get_mode(int hres, int vres);
    +struct VideoModeTable *viafb_get_rb_mode(int hres, int vres);
    +
    #endif /* __VIAMODE_H__ */
    --
    1.6.3.2


    \
     
     \ /
      Last update: 2010-02-03 23:23    [W:0.090 / U:90.328 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site