Merge branch 'kvm-updates/2.6.39' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[pandora-kernel.git] / drivers / video / via / lcd.c
index 3425c39..64bc7e7 100644 (file)
 
 /* CLE266 Software Power Sequence */
 /* {Mask}, {Data}, {Delay} */
-int PowerSequenceOn[3][3] = { {0x10, 0x08, 0x06}, {0x10, 0x08, 0x06},
-       {0x19, 0x1FE, 0x01} };
-int PowerSequenceOff[3][3] = { {0x06, 0x08, 0x10}, {0x00, 0x00, 0x00},
-       {0xD2, 0x19, 0x01} };
+static const int PowerSequenceOn[3][3] = {
+       {0x10, 0x08, 0x06}, {0x10, 0x08, 0x06}, {0x19, 0x1FE, 0x01}
+};
+static const int PowerSequenceOff[3][3] = {
+       {0x06, 0x08, 0x10}, {0x00, 0x00, 0x00}, {0xD2, 0x19, 0x01}
+};
 
 static struct _lcd_scaling_factor lcd_scaling_factor = {
        /* LCD Horizontal Scaling Factor Register */
@@ -95,8 +97,6 @@ void __devinit viafb_init_lcd_size(void)
        DEBUG_MSG(KERN_INFO "viafb_init_lcd_size()\n");
 
        fp_id_to_vindex(viafb_lcd_panel_id);
-       viaparinfo->lvds_setting_info2->lcd_panel_id =
-               viaparinfo->lvds_setting_info->lcd_panel_id;
        viaparinfo->lvds_setting_info2->lcd_panel_hres =
                viaparinfo->lvds_setting_info->lcd_panel_hres;
        viaparinfo->lvds_setting_info2->lcd_panel_vres =
@@ -203,176 +203,132 @@ static void __devinit fp_id_to_vindex(int panel_id)
        case 0x0:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 640;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 480;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID0_640X480;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x1:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID1_800X600;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x2:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x3:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x4:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 1024;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID4_1280X1024;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x5:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 1050;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID5_1400X1050;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x6:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 1200;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID6_1600X1200;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x8:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 480;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_IDA_800X480;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x9:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0xA:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0xB:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID2_1024X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0xC:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0xD:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 1024;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID4_1280X1024;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0xE:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1400;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 1050;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID5_1400X1050;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0xF:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1600;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 1200;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID6_1600X1200;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0x10:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1366;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID7_1366X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0x11:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1024;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID8_1024X600;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x12:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x13:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 800;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID9_1280X800;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
        case 0x14:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1360;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_IDB_1360X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0x15:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1280;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 768;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID3_1280X768;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 1;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        case 0x16:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 480;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 640;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_IDC_480X640;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
                break;
@@ -380,16 +336,12 @@ static void __devinit fp_id_to_vindex(int panel_id)
                /* OLPC XO-1.5 panel */
                viaparinfo->lvds_setting_info->lcd_panel_hres = 1200;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 900;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_IDD_1200X900;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 0;
                break;
        default:
                viaparinfo->lvds_setting_info->lcd_panel_hres = 800;
                viaparinfo->lvds_setting_info->lcd_panel_vres = 600;
-               viaparinfo->lvds_setting_info->lcd_panel_id =
-                       LCD_PANEL_ID1_800X600;
                viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;
                viaparinfo->lvds_setting_info->LCDDithering = 1;
        }
@@ -610,7 +562,7 @@ void viafb_lcd_set_mode(struct crt_mode_table *mode_crt_table,
        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;
+       u32 pll_D_N, clock;
        struct display_timing mode_crt_reg, panel_crt_reg;
        struct crt_mode_table *panel_crt_table = NULL;
        struct VideoModeTable *vmode_tbl = viafb_get_mode(panel_hres,
@@ -625,7 +577,9 @@ void viafb_lcd_set_mode(struct crt_mode_table *mode_crt_table,
        DEBUG_MSG(KERN_INFO "bellow viafb_lcd_set_mode!!\n");
        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;
+       clock = panel_crt_reg.hor_total * panel_crt_reg.ver_total
+               * panel_crt_table->refresh_rate;
+       plvds_setting_info->vclk = clock;
        if (set_iga == IGA1) {
                /* IGA1 doesn't have LCD scaling, so set it as centering. */
                viafb_load_crtc_timing(lcd_centering_timging
@@ -660,7 +614,7 @@ void viafb_lcd_set_mode(struct crt_mode_table *mode_crt_table,
 
        fill_lcd_format();
 
-       pll_D_N = viafb_get_clk_value(panel_crt_table[0].clk);
+       pll_D_N = viafb_get_clk_value(clock);
        DEBUG_MSG(KERN_INFO "PLL=0x%x", pll_D_N);
        viafb_set_vclock(pll_D_N, set_iga);
        lcd_patch_skew(plvds_setting_info, plvds_chip_info);
@@ -1064,34 +1018,33 @@ static struct display_timing lcd_centering_timging(struct display_timing
 
 bool viafb_lcd_get_mobile_state(bool *mobile)
 {
-       unsigned char *romptr, *tableptr;
+       unsigned char __iomem *romptr, *tableptr, *biosptr;
        u8 core_base;
-       unsigned char *biosptr;
        /* Rom address */
-       u32 romaddr = 0x000C0000;
-       u16 start_pattern = 0;
+       const u32 romaddr = 0x000C0000;
+       u16 start_pattern;
 
        biosptr = ioremap(romaddr, 0x10000);
+       start_pattern = readw(biosptr);
 
-       memcpy(&start_pattern, biosptr, 2);
        /* Compare pattern */
        if (start_pattern == 0xAA55) {
                /* Get the start of Table */
                /* 0x1B means BIOS offset position */
                romptr = biosptr + 0x1B;
-               tableptr = biosptr + *((u16 *) romptr);
+               tableptr = biosptr + readw(romptr);
 
                /* Get the start of biosver structure */
                /* 18 means BIOS version position. */
                romptr = tableptr + 18;
-               romptr = biosptr + *((u16 *) romptr);
+               romptr = biosptr + readw(romptr);
 
                /* The offset should be 44, but the
                   actual image is less three char. */
                /* pRom += 44; */
                romptr += 41;
 
-               core_base = *romptr++;
+               core_base = readb(romptr);
 
                if (core_base & 0x8)
                        *mobile = false;