fb: Fix pseudo palette for non 32bit color depth.

SVN-Revision: 21614
owl
Lars-Peter Clausen 2010-05-29 00:06:19 +00:00
parent 3107304b89
commit fecadfa91c
1 changed files with 32 additions and 20 deletions

View File

@ -1,4 +1,4 @@
From 4b85f4f65855e49dec6271cf35efdcee26534210 Mon Sep 17 00:00:00 2001 From bde0c6e017734b3164f5e3517d8e9373433b0cee Mon Sep 17 00:00:00 2001
From: Lars-Peter Clausen <lars@metafoo.de> From: Lars-Peter Clausen <lars@metafoo.de>
Date: Sat, 24 Apr 2010 12:13:58 +0200 Date: Sat, 24 Apr 2010 12:13:58 +0200
Subject: [PATCH] Add jz4740 framebuffer driver Subject: [PATCH] Add jz4740 framebuffer driver
@ -6,9 +6,9 @@ Subject: [PATCH] Add jz4740 framebuffer driver
--- ---
drivers/video/Kconfig | 9 + drivers/video/Kconfig | 9 +
drivers/video/Makefile | 1 + drivers/video/Makefile | 1 +
drivers/video/jz4740_fb.c | 810 +++++++++++++++++++++++++++++++++++++++++++++ drivers/video/jz4740_fb.c | 822 +++++++++++++++++++++++++++++++++++++++++++++
include/linux/jz4740_fb.h | 58 ++++ include/linux/jz4740_fb.h | 58 ++++
4 files changed, 878 insertions(+), 0 deletions(-) 4 files changed, 890 insertions(+), 0 deletions(-)
create mode 100644 drivers/video/jz4740_fb.c create mode 100644 drivers/video/jz4740_fb.c
create mode 100644 include/linux/jz4740_fb.h create mode 100644 include/linux/jz4740_fb.h
@ -46,13 +46,13 @@ index ddc2af2..f56a9ca 100644
obj-$(CONFIG_FB_UVESA) += uvesafb.o obj-$(CONFIG_FB_UVESA) += uvesafb.o
diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c
new file mode 100644 new file mode 100644
index 0000000..53f3adb index 0000000..8bb0cb4
--- /dev/null --- /dev/null
+++ b/drivers/video/jz4740_fb.c +++ b/drivers/video/jz4740_fb.c
@@ -0,0 +1,810 @@ @@ -0,0 +1,822 @@
+/* +/*
+ * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de> + * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de>
+ * JZ4720/JZ4740 SoC LCD framebuffer driver + * JZ4740 SoC LCD framebuffer driver
+ * + *
+ * This program is free software; you can redistribute it and/or modify it + * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the + * under the terms of the GNU General Public License as published by the
@ -185,7 +185,7 @@ index 0000000..53f3adb
+ unsigned is_enabled:1; + unsigned is_enabled:1;
+ struct mutex lock; + struct mutex lock;
+ +
+ uint32_t pseudo_palette[256]; + uint32_t pseudo_palette[16];
+}; +};
+ +
+static struct fb_fix_screeninfo jzfb_fix __devinitdata = { +static struct fb_fix_screeninfo jzfb_fix __devinitdata = {
@ -258,7 +258,7 @@ index 0000000..53f3adb
+ num = 16; + num = 16;
+ break; + break;
+ case JZ_LCD_TYPE_GENERIC_18_BIT: + case JZ_LCD_TYPE_GENERIC_18_BIT:
+ num = 19; + num = 18;
+ break; + break;
+ case JZ_LCD_TYPE_8BIT_SERIAL: + case JZ_LCD_TYPE_8BIT_SERIAL:
+ num = 8; + num = 8;
@ -273,10 +273,24 @@ index 0000000..53f3adb
+static int jzfb_setcolreg(unsigned regno, unsigned red, unsigned green, +static int jzfb_setcolreg(unsigned regno, unsigned red, unsigned green,
+ unsigned blue, unsigned transp, struct fb_info *fb) + unsigned blue, unsigned transp, struct fb_info *fb)
+{ +{
+ if (regno >= fb->cmap.len) + uint32_t color;
+
+ if (regno >= 16)
+ return -EINVAL; + return -EINVAL;
+ +
+ ((uint32_t *)fb->pseudo_palette)[regno] = red << 16 | green << 8 | blue; +#define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
+ red = CNVT_TOHW(red, fb->var.red.length);
+ green = CNVT_TOHW(green, fb->var.green.length);
+ blue = CNVT_TOHW(blue, fb->var.blue.length);
+ transp = CNVT_TOHW(transp, fb->var.transp.length);
+#undef CNVT_TOHW
+
+ color = (red << fb->var.red.offset) |
+ (green << fb->var.green.offset) |
+ (blue << fb->var.blue.offset) |
+ (transp << fb->var.transp.offset);
+
+ ((uint32_t*)(fb->pseudo_palette))[regno] = color;
+ +
+ return 0; + return 0;
+} +}
@ -336,7 +350,7 @@ index 0000000..53f3adb
+ case 16: + case 16:
+ var->red.offset = 11; + var->red.offset = 11;
+ var->red.length = 5; + var->red.length = 5;
+ var->green.offset = 6; + var->green.offset = 5;
+ var->green.length = 6; + var->green.length = 6;
+ var->blue.offset = 0; + var->blue.offset = 0;
+ var->blue.length = 5; + var->blue.length = 5;
@ -836,7 +850,6 @@ index 0000000..53f3adb
+static struct platform_driver jzfb_driver = { +static struct platform_driver jzfb_driver = {
+ .probe = jzfb_probe, + .probe = jzfb_probe,
+ .remove = __devexit_p(jzfb_remove), + .remove = __devexit_p(jzfb_remove),
+
+ .driver = { + .driver = {
+ .name = "jz4740-fb", + .name = "jz4740-fb",
+ .pm = JZFB_PM_OPS, + .pm = JZFB_PM_OPS,
@ -859,7 +872,6 @@ index 0000000..53f3adb
+MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); +MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
+MODULE_DESCRIPTION("JZ4720/JZ4740 SoC LCD framebuffer driver"); +MODULE_DESCRIPTION("JZ4720/JZ4740 SoC LCD framebuffer driver");
+MODULE_ALIAS("platform:jz4740-fb"); +MODULE_ALIAS("platform:jz4740-fb");
+MODULE_ALIAS("platform:jz4720-fb");
diff --git a/include/linux/jz4740_fb.h b/include/linux/jz4740_fb.h diff --git a/include/linux/jz4740_fb.h b/include/linux/jz4740_fb.h
new file mode 100644 new file mode 100644
index 0000000..ab4c963 index 0000000..ab4c963