cpuidle: fix HP nx6125 regression
[pandora-kernel.git] / arch / i386 / boot / video-vesa.c
index e6aa9eb..1921907 100644 (file)
@@ -29,7 +29,7 @@ static void vesa_store_mode_params_graphics(void);
 static int vesa_probe(void)
 {
 #if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID)
-       u16 ax;
+       u16 ax, cx, di;
        u16 mode;
        addr_t mode_ptr;
        struct mode_info *mi;
@@ -39,9 +39,11 @@ static int vesa_probe(void)
 
        vginfo.signature = VBE2_MAGIC;
 
-       /* Optimistically assume a VESA BIOS is register-clean... */
        ax = 0x4f00;
-       asm("int $0x10" : "+a" (ax), "=m" (vginfo) : "D" (&vginfo));
+       di = (size_t)&vginfo;
+       asm(INT10
+           : "+a" (ax), "+D" (di), "=m" (vginfo)
+           : : "ebx", "ecx", "edx", "esi");
 
        if (ax != 0x004f ||
            vginfo.signature != VESA_MAGIC ||
@@ -64,9 +66,11 @@ static int vesa_probe(void)
                memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
 
                ax = 0x4f01;
-               asm("int $0x10"
-                   : "+a" (ax), "=m" (vminfo)
-                   : "c" (mode), "D" (&vminfo));
+               cx = mode;
+               di = (size_t)&vminfo;
+               asm(INT10
+                   : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
+                   : : "ebx", "edx", "esi");
 
                if (ax != 0x004f)
                        continue;
@@ -102,16 +106,18 @@ static int vesa_probe(void)
 
 static int vesa_set_mode(struct mode_info *mode)
 {
-       u16 ax;
+       u16 ax, bx, cx, di;
        int is_graphic;
        u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA;
 
        memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
 
        ax = 0x4f01;
-       asm("int $0x10"
-           : "+a" (ax), "=m" (vminfo)
-           : "c" (vesa_mode), "D" (&vminfo));
+       cx = vesa_mode;
+       di = (size_t)&vminfo;
+       asm(INT10
+           : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
+           : : "ebx", "edx", "esi");
 
        if (ax != 0x004f)
                return -1;
@@ -129,9 +135,11 @@ static int vesa_set_mode(struct mode_info *mode)
 
 
        ax = 0x4f02;
-       asm volatile("int $0x10"
-                    : "+a" (ax)
-                    : "b" (vesa_mode), "D" (0));
+       bx = vesa_mode;
+       di = 0;
+       asm volatile(INT10
+                    : "+a" (ax), "+b" (bx), "+D" (di)
+                    : : "ecx", "edx", "esi");
 
        if (ax != 0x004f)
                return -1;
@@ -268,7 +276,7 @@ void vesa_store_edid(void)
        dx = 0;                 /* EDID block number */
        di =(size_t) &boot_params.edid_info; /* (ES:)Pointer to block */
        asm(INT10
-           : "+a" (ax), "+b" (bx), "+d" (dx)
+           : "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info)
            : "c" (cx), "D" (di)
            : "esi");
 #endif /* CONFIG_FIRMWARE_EDID */