r3777 - trunk/src/target/kernel/patches

werner at sita.openmoko.org werner at sita.openmoko.org
Sun Jan 6 02:02:32 CET 2008


Author: werner
Date: 2008-01-06 02:02:26 +0100 (Sun, 06 Jan 2008)
New Revision: 3777

Added:
   trunk/src/target/kernel/patches/fbset-gta02-core.patch
   trunk/src/target/kernel/patches/fbset-smedia-glamo.patch
Modified:
   trunk/src/target/kernel/patches/series
Log:
These are the fbset support patches olv submitted a month ago:
http://lists.openmoko.org/pipermail/openmoko-kernel/2007-December/000322.html

The patches are commented out in "series", since they're still untested
| This patchset adds fbset support to glamofb.  This means, it can now
| switch between VGA and QVGA at runtime like GTA01 does.
|
| Stefan has wrote up a howto for GTA01:
|
| http://lists.openmoko.org/pipermail/neo1973-hardware/2007-October/000267.html
|
| It is almost the same for GTA02.  The only difference is that the LCM is
| controlled by:
|
| /sys/devices/platform/glamo3362.0/glamo-spi-gpio.0/spi2.0/state

fbset-gta02-core.patch:
- arch/arm/mach-s3c2440/mach-gta02.c (gta02_glamo_pdata): initialize fields for
  timing data

fbset-smedia-glamo.patch:
- include/linux/glamofb.h (struct glamofb_platform_data): add fields for timing
  data
- drivers/video/glamo/glamo-fb.c: move modeline setting to a function of
  itself. Call this function on initialization and set_par.
- drivers/video/glamo/glamo-fb.c (glamofb_cmd_mode): glamo fails to return to
  display mode if we switch to and back from cmd mode too quickly. Add a
  certain amount of delay after entering cmd mode.
- drivers/video/glamo/glamo-core.c (glamo_engine_reset, glamo_pll_rate,
  glamo_engine_reclock), drivers/video/glamo/glamo-core.h
  (glamo_engine_reclock), drivers/video/glamo/glamo-fb.c
  (glamofb_activate_var): adjust DCLK ratio to match the desired pixclock.

series: added fbset-gta02-core.patch and fbset-smedia-glamo.patch



Added: trunk/src/target/kernel/patches/fbset-gta02-core.patch
===================================================================
--- trunk/src/target/kernel/patches/fbset-gta02-core.patch	2008-01-05 20:16:09 UTC (rev 3776)
+++ trunk/src/target/kernel/patches/fbset-gta02-core.patch	2008-01-06 01:02:26 UTC (rev 3777)
@@ -0,0 +1,28 @@
+- arch/arm/mach-s3c2440/mach-gta02.c (gta02_glamo_pdata): initialize fields for
+  timing data
+
+Signed-off-by: Chia-I Wu <olv at openmoko.com>
+Acked-by: Werner Almesberger <werner at openmoko.org>
+
+Index: linux-2.6.22.5/arch/arm/mach-s3c2440/mach-gta02.c
+===================================================================
+--- linux-2.6.22.5.orig/arch/arm/mach-s3c2440/mach-gta02.c
++++ linux-2.6.22.5/arch/arm/mach-s3c2440/mach-gta02.c
+@@ -514,8 +514,15 @@
+ /* Smedia Glamo 3362 */
+ 
+ static struct glamofb_platform_data gta02_glamo_pdata = {
+-	.width		= 480,
+-	.height		= 640,
++	.width		= 43,
++	.height		= 58,
++	.pixclock	= 50 * 1000, /* 50 ns */
++	.left_margin	= 8,
++	.right_margin	= 104,
++	.upper_margin	= 2,
++	.lower_margin	= 16,
++	.hsync_len	= 8,
++	.vsync_len	= 2,
+ 	.xres		= {
+ 		.min	= 240,
+ 		.max	= 480,

Added: trunk/src/target/kernel/patches/fbset-smedia-glamo.patch
===================================================================
--- trunk/src/target/kernel/patches/fbset-smedia-glamo.patch	2008-01-05 20:16:09 UTC (rev 3776)
+++ trunk/src/target/kernel/patches/fbset-smedia-glamo.patch	2008-01-06 01:02:26 UTC (rev 3777)
@@ -0,0 +1,339 @@
+- include/linux/glamofb.h (struct glamofb_platform_data): add fields for timing
+  data
+- drivers/video/glamo/glamo-fb.c: move modeline setting to a function of 
+  itself. Call this function on initialization and set_par.
+- drivers/video/glamo/glamo-fb.c (glamofb_cmd_mode): glamo fails to return to 
+  display mode if we switch to and back from cmd mode too quickly. Add a 
+  certain amount of delay after entering cmd mode.
+- drivers/video/glamo/glamo-core.c (glamo_engine_reset, glamo_pll_rate, 
+  glamo_engine_reclock), drivers/video/glamo/glamo-core.h 
+  (glamo_engine_reclock), drivers/video/glamo/glamo-fb.c 
+  (glamofb_activate_var): adjust DCLK ratio to match the desired pixclock.
+
+Signed-off-by: Chia-I Wu <olv at openmoko.com>
+Acked-by: Werner Almesberger <werner at openmoko.org>
+
+Index: linux-2.6.22.5/include/linux/glamofb.h
+===================================================================
+--- linux-2.6.22.5.orig/include/linux/glamofb.h
++++ linux-2.6.22.5/include/linux/glamofb.h
+@@ -13,6 +13,10 @@
+ 
+ struct glamofb_platform_data {
+ 	int width, height;
++	int pixclock;
++	int left_margin, right_margin;
++	int upper_margin, lower_margin;
++	int hsync_len, vsync_len;
+ 
+ 	struct glamofb_val xres;
+ 	struct glamofb_val yres;
+Index: linux-2.6.22.5/drivers/video/glamo/glamo-fb.c
+===================================================================
+--- linux-2.6.22.5.orig/drivers/video/glamo/glamo-fb.c
++++ linux-2.6.22.5/drivers/video/glamo/glamo-fb.c
+@@ -99,25 +99,12 @@
+ 	{ GLAMO_REG_LCD_MODE3, 0x0b40 },
+ 	  /* src data rgb565, res, 18bit rgb666
+ 	   * 000 01 011 0100 0000 */
+-	{ GLAMO_REG_LCD_WIDTH, 480 },
+-	{ GLAMO_REG_LCD_HEIGHT, 640 },
+ 	{ GLAMO_REG_LCD_POLARITY, 0x440c },
+ 	  /* DE high active, no cpu/lcd if, cs0 force low, a0 low active,
+ 	   * np cpu if, 9bit serial data, sclk rising edge latch data
+ 	   * 01 00 0 100 0 000 01 0 0 */
+ 	{ GLAMO_REG_LCD_A_BASE1, 0x0000 }, /* display A base address 15:0 */
+ 	{ GLAMO_REG_LCD_A_BASE2, 0x0000 }, /* display A base address 22:16 */
+-	{ GLAMO_REG_LCD_PITCH, 480*2 },
+-	{ GLAMO_REG_LCD_HORIZ_TOTAL, 480 + 8 + 8 + 104 }, /* 600 */
+-	{ GLAMO_REG_LCD_HORIZ_RETR_START, 0 },
+-	{ GLAMO_REG_LCD_HORIZ_RETR_END, 8 },
+-	{ GLAMO_REG_LCD_HORIZ_DISP_START, 8 + 104 },
+-	{ GLAMO_REG_LCD_HORIZ_DISP_END, 8 + 104 + 480 },
+-	{ GLAMO_REG_LCD_VERT_TOTAL, 640 + 2 + 2 + 16 }, /* 660 */
+-	{ GLAMO_REG_LCD_VERT_RETR_START, 0 },
+-	{ GLAMO_REG_LCD_VERT_RETR_END, 2 },
+-	{ GLAMO_REG_LCD_VERT_DISP_START, 2 + 2 },
+-	{ GLAMO_REG_LCD_VERT_DISP_END, 2 + 2 + 640 },
+ };
+ 
+ static int glamofb_run_script(struct glamofb_handle *glamo,
+@@ -207,24 +194,69 @@
+ 	return 0;
+ }
+ 
++static void glamofb_activate_var(struct glamofb_handle *glamo,
++				struct fb_var_screeninfo *var)
++{
++	int sync, bp, disp, fp, total;
++
++	glamofb_cmd_mode(glamo, 1);
++
++	if (var->pixclock)
++		glamo_engine_reclock(glamo->mach_info->glamo,
++				     GLAMO_ENGINE_LCD,
++				     var->pixclock);
++
++	/* XXX highest bits of the following two regs have other meanings */
++	reg_write(glamo, GLAMO_REG_LCD_WIDTH, var->xres);
++	reg_write(glamo, GLAMO_REG_LCD_HEIGHT, var->yres);
++	reg_write(glamo, GLAMO_REG_LCD_PITCH,
++			(var->xres * var->bits_per_pixel) / 8);
++
++	sync = 0;
++	bp = sync + var->hsync_len;
++	disp = bp + var->left_margin;
++	fp = disp + var->xres;
++	total = fp + var->right_margin;
++
++	reg_write(glamo, GLAMO_REG_LCD_HORIZ_TOTAL, total);
++	reg_write(glamo, GLAMO_REG_LCD_HORIZ_RETR_START, sync);
++	reg_write(glamo, GLAMO_REG_LCD_HORIZ_RETR_END, bp);
++	reg_write(glamo, GLAMO_REG_LCD_HORIZ_DISP_START, disp);
++	reg_write(glamo, GLAMO_REG_LCD_HORIZ_DISP_END, fp);
++
++	sync = 0;
++	bp = sync + var->vsync_len;
++	disp = bp + var->upper_margin;
++	fp = disp + var->yres;
++	total = fp + var->lower_margin;
++
++	reg_write(glamo, GLAMO_REG_LCD_VERT_TOTAL, total);
++	reg_write(glamo, GLAMO_REG_LCD_VERT_RETR_START, sync);
++	reg_write(glamo, GLAMO_REG_LCD_VERT_RETR_END, bp);
++	reg_write(glamo, GLAMO_REG_LCD_VERT_DISP_START, disp);
++	reg_write(glamo, GLAMO_REG_LCD_VERT_DISP_END, fp);
++
++	glamofb_cmd_mode(glamo, 0);
++}
++
+ static int glamofb_set_par(struct fb_info *info)
+ {
+ 	struct glamofb_handle *glamo = info->par;
+ 	struct fb_var_screeninfo *var = &info->var;
+ 
+-	/* FIXME */
+-
+ 	switch (var->bits_per_pixel) {
+ 	case 16:
+-		glamo->fb->fix.visual = FB_VISUAL_TRUECOLOR;
++		info->fix.visual = FB_VISUAL_TRUECOLOR;
+ 		break;
+ 	default:
+ 		printk("Smedia driver doens't support != 16bpp\n");
+ 		return -EINVAL;
+ 	}
+ 
+-	glamo->fb->fix.line_length = (var->width * var->bits_per_pixel) / 8;
+-	glamo->fb->fix.smem_len = info->fix.line_length * var->yres_virtual;
++	info->fix.line_length = (var->xres * var->bits_per_pixel) / 8;
++	info->fix.smem_len = info->fix.line_length * var->yres_virtual;
++
++	glamofb_activate_var(glamo, var);
+ 
+ 	return 0;
+ }
+@@ -368,6 +400,8 @@
+ 		while (!reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12))
+ 			yield();
+ 		dev_dbg(gfb->dev, "idle!\n");
++
++		msleep(90);
+ 	} else {
+ 		/* RGB interface needs vsync/hsync */
+ 		if (reg_read(gfb, GLAMO_REG_LCD_MODE3) & GLAMO_LCD_MODE3_RGB)
+@@ -384,7 +418,6 @@
+ 
+ int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val)
+ {
+-
+ 	dev_dbg(gfb->dev, "%s: waiting for cmdq empty\n",
+ 		__FUNCTION__);
+ 	while (!glamofb_cmdq_empty(gfb))
+@@ -409,6 +442,18 @@
+ 	.fb_imageblit	= cfb_imageblit,
+ };
+ 
++static int glamofb_init_regs(struct glamofb_handle *glamo)
++{
++	struct fb_info *info = glamo->fb;
++	struct fb_var_screeninfo *var = &info->var;
++
++	glamofb_check_var(&info->var, info);
++	glamofb_run_script(glamo, glamo_regs, ARRAY_SIZE(glamo_regs));
++	glamofb_set_par(info);
++
++	return 0;
++}
++
+ static int __init glamofb_probe(struct platform_device *pdev)
+ {
+ 	int rc = -EIO;
+@@ -504,24 +549,14 @@
+ 	fbinfo->var.yres_virtual = mach_info->yres.defval;
+ 	fbinfo->var.bits_per_pixel = mach_info->bpp.defval;
+ 
+-#if 0
+-	fbinfo->var.upper_margin =
+-	fbinfo->var.lower_margin =
+-	fbinfo->var.vsync_len = 2;
+-
+-	fbinfo->var.left_margin =
+-	fbinfo->var.right_margin =
+-	fbinfo->var.hsync_len = 8;
+-#endif
++	fbinfo->var.pixclock = mach_info->pixclock;
++	fbinfo->var.left_margin = mach_info->left_margin;
++	fbinfo->var.right_margin = mach_info->right_margin;
++	fbinfo->var.upper_margin = mach_info->upper_margin;
++	fbinfo->var.lower_margin = mach_info->lower_margin;
++	fbinfo->var.hsync_len = mach_info->hsync_len;
++	fbinfo->var.vsync_len = mach_info->vsync_len;
+ 
+-	fbinfo->var.red.offset = 11;
+-	fbinfo->var.green.offset = 5;
+-	fbinfo->var.blue.offset = 0;
+-	fbinfo->var.transp.offset = 0;
+-	fbinfo->var.red.length = 5;
+-	fbinfo->var.green.length = 6;
+-	fbinfo->var.blue.length = 5;
+-	fbinfo->var.transp.length = 0;
+ 	fbinfo->fix.smem_len = mach_info->xres.max *
+ 			       mach_info->yres.max *
+ 			       mach_info->bpp.max / 8;
+@@ -530,8 +565,7 @@
+ 
+ 	glamo_engine_enable(mach_info->glamo, GLAMO_ENGINE_LCD);
+ 	glamo_engine_reset(mach_info->glamo, GLAMO_ENGINE_LCD);
+-	glamofb_run_script(glamofb, glamo_regs, ARRAY_SIZE(glamo_regs));
+-	glamofb_cmd_mode(glamofb, 0);
++	glamofb_init_regs(glamofb);
+ 
+ 	rc = register_framebuffer(fbinfo);
+ 	if (rc < 0) {
+Index: linux-2.6.22.5/drivers/video/glamo/glamo-core.c
+===================================================================
+--- linux-2.6.22.5.orig/drivers/video/glamo/glamo-core.c
++++ linux-2.6.22.5/drivers/video/glamo/glamo-core.c
+@@ -488,9 +488,85 @@
+ 	spin_lock(&glamo->lock);
+ 	__reg_clear_bit(glamo, rst->reg, rst->val);
+ 	spin_unlock(&glamo->lock);
++
++	msleep(1);
+ }
+ EXPORT_SYMBOL_GPL(glamo_engine_reset);
+ 
++enum glamo_pll {
++	GLAMO_PLL1,
++	GLAMO_PLL2,
++};
++
++static int glamo_pll_rate(struct glamo_core *glamo,
++			  enum glamo_pll pll)
++{
++	u_int16_t reg;
++	unsigned int div = 512;
++	/* FIXME: move osci into platform_data */
++	unsigned int osci = 32768;
++
++	if (osci == 32768)
++		div = 1;
++
++	switch (pll) {
++	case GLAMO_PLL1:
++		reg = __reg_read(glamo, GLAMO_REG_PLL_GEN1);
++		break;
++	case GLAMO_PLL2:
++		reg = __reg_read(glamo, GLAMO_REG_PLL_GEN3);
++		break;
++	default:
++		return -EINVAL;
++	}
++	return (osci/div)*reg;
++}
++
++int glamo_engine_reclock(struct glamo_core *glamo,
++			 enum glamo_engine engine,
++			 int ps)
++{
++	int pll, khz;
++	u_int16_t reg, mask, val = 0;
++
++	if (!ps)
++		return 0;
++
++	switch (engine) {
++	case GLAMO_ENGINE_LCD:
++		pll = GLAMO_PLL1;
++		reg = GLAMO_REG_CLOCK_GEN7;
++		mask = 0xff;
++		break;
++	default:
++		dev_warn(&glamo->pdev->dev,
++			 "reclock of engine 0x%x not supported\n", engine);
++		return -EINVAL;
++		break;
++	}
++
++	pll = glamo_pll_rate(glamo, pll);
++	khz = 1000000000UL / ps;
++
++	if (khz)
++		val = (pll / khz) / 1000;
++
++	dev_dbg(&glamo->pdev->dev,
++			"PLL %d, kHZ %d, div %d\n", pll, khz, val);
++
++	if (val) {
++		val--;
++
++		reg_set_bit_mask(glamo, reg, mask, val);
++		msleep(5); /* wait some time to stabilize */
++
++		return 0;
++	} else {
++		return -EINVAL;
++	}
++}
++EXPORT_SYMBOL_GPL(glamo_engine_reclock);
++
+ /***********************************************************************
+  * script support
+  ***********************************************************************/
+@@ -643,35 +719,6 @@
+ };
+ #endif
+ 
+-enum glamo_pll {
+-	GLAMO_PLL1,
+-	GLAMO_PLL2,
+-};
+-
+-static int glamo_pll_rate(struct glamo_core *glamo,
+-				   enum glamo_pll pll)
+-{
+-	u_int16_t reg;
+-	unsigned int div = 512;
+-	/* FIXME: move osci into platform_data */
+-	unsigned int osci = 32768;
+-
+-	if (osci == 32768)
+-		div = 1;
+-
+-	switch (pll) {
+-	case GLAMO_PLL1:
+-		reg = __reg_read(glamo, GLAMO_REG_PLL_GEN1);
+-		break;
+-	case GLAMO_PLL2:
+-		reg = __reg_read(glamo, GLAMO_REG_PLL_GEN3);
+-		break;
+-	default:
+-		return -EINVAL;
+-	}
+-	return (osci/div)*reg;
+-}
+-
+ enum glamo_power {
+ 	GLAMO_POWER_ON,
+ 	GLAMO_POWER_STANDBY,

Modified: trunk/src/target/kernel/patches/series
===================================================================
--- trunk/src/target/kernel/patches/series	2008-01-05 20:16:09 UTC (rev 3776)
+++ trunk/src/target/kernel/patches/series	2008-01-06 01:02:26 UTC (rev 3777)
@@ -45,9 +45,13 @@
 hxd8-tsl256x.patch
 pcf50633.patch
 smedia-glamo.patch
+# test, then merge
+#fbset-smedia-glamo.patch
 s3c24xx-nand-largepage.patch
 s3c2442b-cpuid.patch
 gta02-core.patch
+# test, then merge
+#fbset-gta02-core.patch
 # merge into gta02-core as soon as compatibility issues are resolved
 gta02-nor.patch
 lis302dl.patch





More information about the commitlog mailing list