gerenderter Paste-Inhaltdiff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig
index 9352489..fc1d2fd 100644
--- a/arch/arm/mach-msm/Kconfig
+++ b/arch/arm/mach-msm/Kconfig
@@ -3,6 +3,7 @@ if ARCH_MSM
comment "MSM7200 Board Type"
depends on ARCH_MSM
+
config MACH_HALIBUT
depends on ARCH_MSM
default y
@@ -10,6 +11,13 @@ config MACH_HALIBUT
help
Support for the Qualcomm SURF7200A eval board.
+config MACH_HTCKAISER
+ depends on ARCH_MSM
+ default y
+ bool "HTC Kaiser phone aka HTC TyTN II"
+ help
+ Support for HTC Kaiser phone.
+
config MSM_SMD
depends on ARCH_MSM
default y
@@ -51,4 +59,9 @@ config MSM_HW3D
Provides access to registers and interrupts needed by
the userspace 3D library.
+config KAISER_LCD
+ tristate "HTC Kaiser VSFB LCD support"
+ depends on MACH_HTCKAISER && LCD_CLASS_DEVICE
+ help
+ This driver provides support for HTC Kaiser LCD display.
endif
diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile
index 26c1df4..11d786d 100644
--- a/arch/arm/mach-msm/Makefile
+++ b/arch/arm/mach-msm/Makefile
@@ -3,9 +3,13 @@ obj-y += common.o
obj-y += gpio.o generic_gpio.o
obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o keypad-halibut.o
+obj-$(CONFIG_MACH_HTCKAISER) += board-htckaiser.o
obj-$(CONFIG_MSM_SMD) += smd.o
obj-$(CONFIG_MSM_SMD_TTY) += smd_tty.o
obj-$(CONFIG_MSM_SMD_RPC_ROUTER) += smd_rpcrouter.o
obj-$(CONFIG_MSM_SMD_QMI) += smd_qmi.o
obj-$(CONFIG_MSM_HW3D) += hw3d.o
+
+obj-$(CONFIG_HTCKAISER_LCD) += htckaiser_lcd.o
+
diff --git a/arch/arm/mach-msm/board-htckaiser.c b/arch/arm/mach-msm/board-htckaiser.c
new file mode 100644
index 0000000..b33250a
--- /dev/null
+++ b/arch/arm/mach-msm/board-htckaiser.c
@@ -0,0 +1,140 @@
+/* linux/arch/arm/mach-msm/board-halibut.c
+**
+** Copyright (C) 2007 Google, Inc.
+** Author: Brian Swetland <swetland@android.com>
+**
+** This software is licensed under the terms of the GNU General Public
+** License version 2, as published by the Free Software Foundation, and
+** may be copied, distributed, and modified under those terms.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+*/
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/input.h>
+
+#include <asm/hardware.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/flash.h>
+
+#include <asm/arch/board.h>
+
+#include <asm/io.h>
+#include <asm/delay.h>
+
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+
+#define DECLARE_MSM_IOMAP
+#include <asm/arch/msm_iomap.h>
+
+void msm_init_irq(void);
+void msm_init_gpio(void);
+void msm_pmrr_config(void);
+
+/*extern struct platform_device halibut_keypad_device;
+**
+**static struct resource smc91x_resources[] = {
+** [0] = {
+** .start = 0x9C004300,
+** .end = 0x9C004400,
+** .flags = IORESOURCE_MEM,
+** },
+** [1] = {
+** .start = MSM_GPIO_TO_INT(49),
+** .end = MSM_GPIO_TO_INT(49),
+** .flags = IORESOURCE_IRQ,
+** },
+**};
+**
+**static struct platform_device smc91x_device = {
+** .name = "smc91x",
+** .id = 0,
+** .num_resources = ARRAY_SIZE(smc91x_resources),
+** .resource = smc91x_resources,
+**};
+*/
+
+/* LCD stolen from htchermes.c from hh.org tree */
+
+static struct platform_device htckaiser_lcd = {
+ .name = "vsfb",
+ .id = -1,
+ .dev = {
+ .platform_data = NULL,
+ },
+};
+
+static void mddi0_panel_power(int on)
+{
+ printk("mddi0_panel_power(%d)\n", on);
+}
+
+static struct msm_mddi_platform_data msm_mddi0_pdata = {
+ .panel_power = mddi0_panel_power,
+ .has_vsync_irq = 0,
+};
+
+static struct platform_device msm_mddi0_device = {
+ .name = "msm_mddi",
+ .id = 0,
+ .dev = { .platform_data = &msm_mddi0_pdata },
+};
+
+static struct platform_device msm_serial0_device = {
+ .name = "msm_serial",
+ .id = 0,
+};
+
+/*static struct platform_device *devices[] __initdata = {
+** &msm_serial0_device,
+** &halibut_keypad_device,
+** &msm_mddi0_device,
+** &smc91x_device,
+**};
+*/
+
+extern struct sys_timer msm_timer;
+
+static void __init halibut_init_irq(void)
+{
+ printk("halibut_init_irq()\n");
+ msm_init_irq();
+}
+
+/*static void __init halibut_init(void)
+**{
+** printk("halibut_init()\n");
+** msm_init_gpio();
+** platform_add_devices(devices, ARRAY_SIZE(devices));
+** msm_add_devices();
+**}
+*/
+static void __init halibut_map_io(void)
+{
+ printk("halibut_init_map_io()\n");
+ msm_pmrr_config();
+ iotable_init(msm_io_desc, ARRAY_SIZE(msm_io_desc));
+}
+
+MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
+/* Maintainer: Brian Swetland <swetland@android.com> */
+
+/* this is broken... can we just opt out of specifying something here? */
+ .phys_io = 0x80000000,
+ .io_pg_offst = ((0x80000000) >> 18) & 0xfffc,
+
+ .boot_params = 0x10000100,
+ .map_io = halibut_map_io,
+ .init_irq = halibut_init_irq,
+/* .init_machine = halibut_init,*/
+ .timer = &msm_timer,
+MACHINE_END
diff --git a/arch/arm/mach-msm/htckaiser_lcd.c b/arch/arm/mach-msm/htckaiser_lcd.c
new file mode 100644
index 0000000..e75ceb6
--- /dev/null
+++ b/arch/arm/mach-msm/htckaiser_lcd.c
@@ -0,0 +1,69 @@
+/*
+ * htckaiser_lcd.c
+ *
+ * Based on the code
+ * (c) 2006 Ian Molton <spyro@f2s.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License.
+ *
+ */
+
+#include <linux/vsfb.h>
+#include <linux/platform_device.h>
+#include <linux/fb.h>
+#include <asm/mach-types.h>
+
+static struct fb_var_screeninfo htckaiser_vsfb_var = {
+ .xres = 240,
+ .yres = 320,
+ .xres_virtual = 240,
+ .yres_virtual = 320,
+ .bits_per_pixel = 16,
+ .red = { 11, 5, 0 },
+ .green = { 5, 6, 0 },
+ .blue = { 0, 5, 0 },
+ .activate = FB_ACTIVATE_NOW,
+ .height = -1,
+ .width = -1,
+ .vmode = FB_VMODE_NONINTERLACED,
+};
+
+static struct fb_fix_screeninfo htckaiser_vsfb_fix = {
+ .id = "vsfb",
+ .smem_start = 0x10000000,
+ .smem_len = 240*320*2,
+ .type = FB_TYPE_PACKED_PIXELS,
+ .visual = FB_VISUAL_TRUECOLOR,
+ .line_length = 240*2,
+ .accel = FB_ACCEL_NONE,
+};
+
+static struct vsfb_deviceinfo htckaiser_vsfb_deviceinfo = {
+ .fix = &htckaiser_vsfb_fix,
+ .var = &htckaiser_vsfb_var,
+};
+
+static struct platform_device htckaiser_vsfb_device = {
+ .name = "vsfb",
+ .id = -1,
+ .dev = {
+ .platform_data = &htckaiser_vsfb_deviceinfo,
+ },
+};
+
+static int htckaiser_lcd_init (void) {
+
+ if (!machine_is_htckaiser ())
+ return -ENODEV;
+
+ platform_device_register(&htckaiser_vsfb_device);
+
+ return 0;
+}
+
+module_init (htckaiser_lcd_init);
+
+MODULE_DESCRIPTION("HTC Kaiser LCD driver");
+MODULE_LICENSE("GPL");
+
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index eeee342..de6343a 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -1867,8 +1867,26 @@ config FB_VIRTUAL
module will be called vfb. In order to load it, you must use
the vfb_enable=1 option.
+ If unsure, say N.
+
+
+
+
+config FB_VSFB
+ tristate "Very Simple FrameBuffer (vsfb) driver"
+ depends on FB
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+ select FB_CFB_IMAGEBLIT
+ ---help---
+ This is a very simple framebuffer device intended for either
+ testing devices for which no proper video driver exists or for
+ use on very simple framebuffers that have been set up by 'bios like'
+ bootloaders that reserve a block of linear memory for a framebuffer.
+
If unsure, say N.
+
if VT
source "drivers/video/console/Kconfig"
endif
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index 6118b2b..9db0758 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -123,6 +123,7 @@ obj-$(CONFIG_FB_OF) += offb.o
# the test framebuffer is last
obj-$(CONFIG_FB_VIRTUAL) += vfb.o
+obj-$(CONFIG_FB_VSFB) += vsfb.o
#video output switch sysfs driver
obj-$(CONFIG_VIDEO_OUTPUT_CONTROL) += output.o
diff --git a/drivers/video/vsfb.c b/drivers/video/vsfb.c
new file mode 100644
index 0000000..61dcf1a
--- /dev/null
+++ b/drivers/video/vsfb.c
@@ -0,0 +1,117 @@
+/*
+ * linux/drivers/video/vsfb.c
+ *
+ * Copyright (C) 2003 Ian Molton
+ *
+ * Based on acornfb by Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Frame buffer code for Simple platforms
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/ctype.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/fb.h>
+#include <linux/vsfb.h>
+#include <linux/ioport.h>
+#include <linux/platform_device.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+#include <asm/uaccess.h>
+
+static struct fb_info fb_info;
+static u32 colreg[17];
+
+
+static int
+vsfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+ u_int trans, struct fb_info *info)
+{
+ if (regno > 16)
+ return 1;
+
+ ((u32 *)(info->pseudo_palette))[regno] = (red & 0xf800) | ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
+
+ return 0;
+}
+
+static struct fb_ops vsfb_ops = {
+ .owner = THIS_MODULE,
+ .fb_setcolreg = vsfb_setcolreg,
+ .fb_fillrect = cfb_fillrect,
+ .fb_copyarea = cfb_copyarea,
+ .fb_imageblit = cfb_imageblit,
+};
+
+static int vsfb_probe(struct platform_device *pdev) {
+ struct vsfb_deviceinfo *vsfb;
+
+ vsfb = pdev->dev.platform_data;
+ if(!vsfb)
+ return -ENODEV;
+
+ memcpy (&fb_info.fix, vsfb->fix, sizeof(struct fb_fix_screeninfo));
+ memcpy (&fb_info.var, vsfb->var, sizeof(struct fb_var_screeninfo));
+
+ fb_info.fbops = &vsfb_ops;
+ fb_info.flags = FBINFO_FLAG_DEFAULT;
+ fb_info.pseudo_palette = colreg;
+ fb_alloc_cmap(&fb_info.cmap, 16, 0);
+
+ /* Try to grab our phys memory space... */
+ if (!(request_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len, "vsfb"))){
+ return -ENOMEM;
+ }
+
+ /* Try to map this so we can access it */
+ fb_info.screen_base = ioremap(fb_info.fix.smem_start, fb_info.fix.smem_len);
+ if (!fb_info.screen_base) {
+ release_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len);
+ return -EIO;
+ }
+
+ printk(KERN_INFO "vsfb: framebuffer at 0x%lx, mapped to 0x%p, size %dk\n", fb_info.fix.smem_start, fb_info.screen_base, fb_info.fix.smem_len/1024);
+
+ if (register_framebuffer(&fb_info) < 0){
+ iounmap(fb_info.screen_base);
+ release_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len);
+
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+struct platform_driver vsfb_driver = {
+ .driver = {
+ .name = "vsfb",
+ },
+ .probe = vsfb_probe,
+};
+
+static int __init vsfb_init(void)
+{
+ return platform_driver_register (&vsfb_driver);
+ return 0;
+}
+
+module_init(vsfb_init);
+
+MODULE_AUTHOR("Ian Molton <spyro <at> f2s.com>");
+MODULE_DESCRIPTION("Very Simple framebuffer driver");
+MODULE_LICENSE("GPL");
diff --git a/include/config/fb/vsfb.h b/include/config/fb/vsfb.h
new file mode 100644
index 0000000..e69de29
diff --git a/include/linux/vsfb.h b/include/linux/vsfb.h
new file mode 100644
index 0000000..070fa50
--- /dev/null
+++ b/include/linux/vsfb.h
@@ -0,0 +1,23 @@
+/*
+ * vsfb.h
+ *
+ * (c) 2006 Ian Molton <spyro <at> f2s.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef _VSFB_H_INCLUDED
+#define _VSFB_H_INCLUDED
+
+#include <linux/fb.h>
+
+struct vsfb_deviceinfo
+{
+ struct fb_var_screeninfo *var;
+ struct fb_fix_screeninfo *fix;
+};
+
+#endif