|
@@ -91,6 +91,15 @@ extern boot_infos_t *boot_infos;
|
|
|
#define AVIVO_DC_LUTB_WHITE_OFFSET_GREEN 0x6cd4
|
|
|
#define AVIVO_DC_LUTB_WHITE_OFFSET_RED 0x6cd8
|
|
|
|
|
|
+#define FB_RIGHT_POS(p, bpp) (fb_be_math(p) ? 0 : (32 - (bpp)))
|
|
|
+
|
|
|
+static inline u32 offb_cmap_byteswap(struct fb_info *info, u32 value)
|
|
|
+{
|
|
|
+ u32 bpp = info->var.bits_per_pixel;
|
|
|
+
|
|
|
+ return cpu_to_be32(value) >> FB_RIGHT_POS(info, bpp);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Set a single color register. The values supplied are already
|
|
|
* rounded down to the hardware's capabilities (according to the
|
|
@@ -120,7 +129,7 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
|
|
|
mask <<= info->var.transp.offset;
|
|
|
value |= mask;
|
|
|
}
|
|
|
- pal[regno] = value;
|
|
|
+ pal[regno] = offb_cmap_byteswap(info, value);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -301,7 +310,7 @@ static struct fb_ops offb_ops = {
|
|
|
static void __iomem *offb_map_reg(struct device_node *np, int index,
|
|
|
unsigned long offset, unsigned long size)
|
|
|
{
|
|
|
- const u32 *addrp;
|
|
|
+ const __be32 *addrp;
|
|
|
u64 asize, taddr;
|
|
|
unsigned int flags;
|
|
|
|
|
@@ -369,7 +378,11 @@ static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp
|
|
|
}
|
|
|
of_node_put(pciparent);
|
|
|
} else if (dp && of_device_is_compatible(dp, "qemu,std-vga")) {
|
|
|
- const u32 io_of_addr[3] = { 0x01000000, 0x0, 0x0 };
|
|
|
+#ifdef __BIG_ENDIAN
|
|
|
+ const __be32 io_of_addr[3] = { 0x01000000, 0x0, 0x0 };
|
|
|
+#else
|
|
|
+ const __be32 io_of_addr[3] = { 0x00000001, 0x0, 0x0 };
|
|
|
+#endif
|
|
|
u64 io_addr = of_translate_address(dp, io_of_addr);
|
|
|
if (io_addr != OF_BAD_ADDR) {
|
|
|
par->cmap_adr = ioremap(io_addr + 0x3c8, 2);
|
|
@@ -535,7 +548,7 @@ static void __init offb_init_nodriver(struct device_node *dp, int no_real_node)
|
|
|
unsigned int flags, rsize, addr_prop = 0;
|
|
|
unsigned long max_size = 0;
|
|
|
u64 rstart, address = OF_BAD_ADDR;
|
|
|
- const u32 *pp, *addrp, *up;
|
|
|
+ const __be32 *pp, *addrp, *up;
|
|
|
u64 asize;
|
|
|
int foreign_endian = 0;
|
|
|
|
|
@@ -551,25 +564,25 @@ static void __init offb_init_nodriver(struct device_node *dp, int no_real_node)
|
|
|
if (pp == NULL)
|
|
|
pp = of_get_property(dp, "depth", &len);
|
|
|
if (pp && len == sizeof(u32))
|
|
|
- depth = *pp;
|
|
|
+ depth = be32_to_cpup(pp);
|
|
|
|
|
|
pp = of_get_property(dp, "linux,bootx-width", &len);
|
|
|
if (pp == NULL)
|
|
|
pp = of_get_property(dp, "width", &len);
|
|
|
if (pp && len == sizeof(u32))
|
|
|
- width = *pp;
|
|
|
+ width = be32_to_cpup(pp);
|
|
|
|
|
|
pp = of_get_property(dp, "linux,bootx-height", &len);
|
|
|
if (pp == NULL)
|
|
|
pp = of_get_property(dp, "height", &len);
|
|
|
if (pp && len == sizeof(u32))
|
|
|
- height = *pp;
|
|
|
+ height = be32_to_cpup(pp);
|
|
|
|
|
|
pp = of_get_property(dp, "linux,bootx-linebytes", &len);
|
|
|
if (pp == NULL)
|
|
|
pp = of_get_property(dp, "linebytes", &len);
|
|
|
if (pp && len == sizeof(u32) && (*pp != 0xffffffffu))
|
|
|
- pitch = *pp;
|
|
|
+ pitch = be32_to_cpup(pp);
|
|
|
else
|
|
|
pitch = width * ((depth + 7) / 8);
|
|
|
|