]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/video/offb.c
offb: Add palette hack for qemu "standard vga" framebuffer
[mv-sheeva.git] / drivers / video / offb.c
index 915acaecdbe18963d7e1c2e5ff19bf9d1dd935e2..da7cf7936b241d5e3cebb6a04f4b36920078e3e1 100644 (file)
 /* Supported palette hacks */
 enum {
        cmap_unknown,
-       cmap_m64,               /* ATI Mach64 */
+       cmap_simple,            /* ATI Mach64 */
        cmap_r128,              /* ATI Rage128 */
        cmap_M3A,               /* ATI Rage Mobility M3 Head A */
        cmap_M3B,               /* ATI Rage Mobility M3 Head B */
        cmap_radeon,            /* ATI Radeon */
        cmap_gxt2000,           /* IBM GXT2000 */
        cmap_avivo,             /* ATI R5xx */
+       cmap_qemu,              /* qemu vga */
 };
 
 struct offb_par {
@@ -138,7 +139,7 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
                return 0;
 
        switch (par->cmap_type) {
-       case cmap_m64:
+       case cmap_simple:
                writeb(regno, par->cmap_adr);
                writeb(red, par->cmap_data);
                writeb(green, par->cmap_data);
@@ -208,7 +209,7 @@ static int offb_blank(int blank, struct fb_info *info)
        if (blank)
                for (i = 0; i < 256; i++) {
                        switch (par->cmap_type) {
-                       case cmap_m64:
+                       case cmap_simple:
                                writeb(i, par->cmap_adr);
                                for (j = 0; j < 3; j++)
                                        writeb(0, par->cmap_data);
@@ -350,7 +351,7 @@ static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp
                par->cmap_adr =
                        ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
                par->cmap_data = par->cmap_adr + 1;
-               par->cmap_type = cmap_m64;
+               par->cmap_type = cmap_simple;
        } else if (dp && (of_device_is_compatible(dp, "pci1014,b7") ||
                          of_device_is_compatible(dp, "pci1014,21c"))) {
                par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000);
@@ -371,6 +372,16 @@ static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp
                                par->cmap_type = cmap_avivo;
                }
                of_node_put(pciparent);
+       } else if (dp && of_device_is_compatible(dp, "qemu,std-vga")) {
+               const u32 io_of_addr[3] = { 0x01000000, 0x0, 0x0 };
+               u64 io_addr = of_translate_address(dp, io_of_addr);
+               if (io_addr != OF_BAD_ADDR) {
+                       par->cmap_adr = ioremap(io_addr + 0x3c8, 2);
+                       if (par->cmap_adr) {
+                               par->cmap_type = cmap_simple;
+                               par->cmap_data = par->cmap_adr + 1;
+                       }
+               }
        }
        info->fix.visual = (par->cmap_type != cmap_unknown) ?
                FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_STATIC_PSEUDOCOLOR;