Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier...
[cascardo/linux.git] / drivers / video / via / dvi.c
index 67b3693..abe59b8 100644 (file)
 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);
+static void dvi_get_panel_size_from_DDCv1(struct tmds_chip_information
+       *tmds_chip, struct tmds_setting_information *tmds_setting);
+static void dvi_get_panel_size_from_DDCv2(struct tmds_chip_information
+       *tmds_chip, struct tmds_setting_information *tmds_setting);
 static int viafb_dvi_query_EDID(void);
 
 static int check_tmds_chip(int device_id_subaddr, int device_id)
@@ -38,23 +37,24 @@ static int check_tmds_chip(int device_id_subaddr, int device_id)
                return FAIL;
 }
 
-void viafb_init_dvi_size(void)
+void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
+       struct tmds_setting_information *tmds_setting)
 {
        DEBUG_MSG(KERN_INFO "viafb_init_dvi_size()\n");
-       DEBUG_MSG(KERN_INFO
-               "viaparinfo->tmds_setting_info->get_dvi_size_method %d\n",
-                 viaparinfo->tmds_setting_info->get_dvi_size_method);
 
-       switch (viaparinfo->tmds_setting_info->get_dvi_size_method) {
-       case GET_DVI_SIZE_BY_SYSTEM_BIOS:
+       viafb_dvi_sense();
+       switch (viafb_dvi_query_EDID()) {
+       case 1:
+               dvi_get_panel_size_from_DDCv1(tmds_chip, tmds_setting);
                break;
-       case GET_DVI_SZIE_BY_HW_STRAPPING:
+       case 2:
+               dvi_get_panel_size_from_DDCv2(tmds_chip, tmds_setting);
                break;
-       case GET_DVI_SIZE_BY_VGA_BIOS:
        default:
-               dvi_get_panel_info();
+               printk(KERN_WARNING "viafb_init_dvi_size: DVI panel size undetected!\n");
                break;
        }
+
        return;
 }
 
@@ -189,42 +189,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 +204,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);
 }
@@ -350,25 +316,18 @@ static int viafb_dvi_query_EDID(void)
                return false;
 }
 
-/*
- *
- * int dvi_get_panel_size_from_DDCv1(void)
- *
- *     - Get Panel Size Using EDID1 Table
- *
- * Return Type:    int
- *
- */
-static int dvi_get_panel_size_from_DDCv1(void)
+/* Get Panel Size Using EDID1 Table */
+static void dvi_get_panel_size_from_DDCv1(struct tmds_chip_information
+       *tmds_chip, struct tmds_setting_information *tmds_setting)
 {
-       int i, max_h = 0, max_v = 0, tmp, restore;
+       int i, max_h = 0, tmp, restore;
        unsigned char rData;
        unsigned char EDID_DATA[18];
 
        DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv1 \n");
 
-       restore = viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr;
-       viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = 0xA0;
+       restore = tmds_chip->tmds_chip_slave_addr;
+       tmds_chip->tmds_chip_slave_addr = 0xA0;
 
        rData = tmds_register_read(0x23);
        if (rData & 0x3C)
@@ -414,8 +373,8 @@ static int dvi_get_panel_size_from_DDCv1(void)
                                /* The first two byte must be zero. */
                                if (EDID_DATA[3] == 0xFD) {
                                        /* To get max pixel clock. */
-                                       viaparinfo->tmds_setting_info->
-                                       max_pixel_clock = EDID_DATA[9] * 10;
+                                       tmds_setting->max_pixel_clock =
+                                               EDID_DATA[9] * 10;
                                }
                        }
                        break;
@@ -425,154 +384,88 @@ static int dvi_get_panel_size_from_DDCv1(void)
                }
        }
 
+       tmds_setting->max_hres = max_h;
        switch (max_h) {
        case 640:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_640X480;
+               tmds_setting->max_vres = 480;
                break;
        case 800:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_800X600;
+               tmds_setting->max_vres = 600;
                break;
        case 1024:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1024X768;
+               tmds_setting->max_vres = 768;
                break;
        case 1280:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1280X1024;
+               tmds_setting->max_vres = 1024;
                break;
        case 1400:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1400X1050;
+               tmds_setting->max_vres = 1050;
                break;
        case 1440:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1440X1050;
+               tmds_setting->max_vres = 1050;
                break;
        case 1600:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1600X1200;
+               tmds_setting->max_vres = 1200;
                break;
        case 1920:
-               if (max_v == 1200) {
-                       viaparinfo->tmds_setting_info->dvi_panel_size =
-                               VIA_RES_1920X1200;
-               } else {
-                       viaparinfo->tmds_setting_info->dvi_panel_size =
-                               VIA_RES_1920X1080;
-               }
-
+               tmds_setting->max_vres = 1080;
                break;
        default:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1024X768;
-               DEBUG_MSG(KERN_INFO "Unknown panel size max resolution = %d !\
-                                        set default panel size.\n", max_h);
+               DEBUG_MSG(KERN_INFO "Unknown panel size max resolution = %d ! "
+                                        "set default panel size.\n", max_h);
                break;
        }
 
        DEBUG_MSG(KERN_INFO "DVI max pixelclock = %d\n",
-                 viaparinfo->tmds_setting_info->max_pixel_clock);
-       viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = restore;
-       return viaparinfo->tmds_setting_info->dvi_panel_size;
+               tmds_setting->max_pixel_clock);
+       tmds_chip->tmds_chip_slave_addr = restore;
 }
 
-/*
- *
- * int dvi_get_panel_size_from_DDCv2(void)
- *
- *     - Get Panel Size Using EDID2 Table
- *
- * Return Type:    int
- *
- */
-static int dvi_get_panel_size_from_DDCv2(void)
+/* Get Panel Size Using EDID2 Table */
+static void dvi_get_panel_size_from_DDCv2(struct tmds_chip_information
+       *tmds_chip, struct tmds_setting_information *tmds_setting)
 {
-       int HSize = 0, restore;
+       int restore;
        unsigned char R_Buffer[2];
 
        DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv2 \n");
 
-       restore = viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr;
-       viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = 0xA2;
+       restore = tmds_chip->tmds_chip_slave_addr;
+       tmds_chip->tmds_chip_slave_addr = 0xA2;
 
        /* Horizontal: 0x76, 0x77 */
        tmds_register_read_bytes(0x76, R_Buffer, 2);
-       HSize = R_Buffer[0];
-       HSize += R_Buffer[1] << 8;
+       tmds_setting->max_hres = R_Buffer[0] + (R_Buffer[1] << 8);
 
-       switch (HSize) {
+       switch (tmds_setting->max_hres) {
        case 640:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_640X480;
+               tmds_setting->max_vres = 480;
                break;
        case 800:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_800X600;
+               tmds_setting->max_vres = 600;
                break;
        case 1024:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1024X768;
+               tmds_setting->max_vres = 768;
                break;
        case 1280:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1280X1024;
+               tmds_setting->max_vres = 1024;
                break;
        case 1400:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1400X1050;
+               tmds_setting->max_vres = 1050;
                break;
        case 1440:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1440X1050;
+               tmds_setting->max_vres = 1050;
                break;
        case 1600:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1600X1200;
-               break;
-       default:
-               viaparinfo->tmds_setting_info->dvi_panel_size =
-                       VIA_RES_1024X768;
-               DEBUG_MSG(KERN_INFO "Unknown panel size max resolution = %d!\
-                                       set default panel size.\n", HSize);
-               break;
-       }
-
-       viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = restore;
-       return viaparinfo->tmds_setting_info->dvi_panel_size;
-}
-
-/*
- *
- * unsigned char dvi_get_panel_info(void)
- *
- *     - Get Panel Size
- *
- * Return Type:    unsigned char
- */
-static unsigned char dvi_get_panel_info(void)
-{
-       unsigned char dvipanelsize;
-       DEBUG_MSG(KERN_INFO "dvi_get_panel_info! \n");
-
-       viafb_dvi_sense();
-       switch (viafb_dvi_query_EDID()) {
-       case 1:
-               dvi_get_panel_size_from_DDCv1();
-               break;
-       case 2:
-               dvi_get_panel_size_from_DDCv2();
+               tmds_setting->max_vres = 1200;
                break;
        default:
+               DEBUG_MSG(KERN_INFO "Unknown panel size max resolution = %d! "
+                       "set default panel size.\n", tmds_setting->max_hres);
                break;
        }
 
-       DEBUG_MSG(KERN_INFO "dvi panel size is %2d \n",
-                 viaparinfo->tmds_setting_info->dvi_panel_size);
-       dvipanelsize = (unsigned char)(viaparinfo->
-               tmds_setting_info->dvi_panel_size);
-       return dvipanelsize;
+       tmds_chip->tmds_chip_slave_addr = restore;
 }
 
 /* If Disable DVI, turn off pad */