r3590 - branches/src/target/kernel/2.6.24.x/patches

laforge at sita.openmoko.org laforge at sita.openmoko.org
Thu Dec 6 08:01:24 CET 2007


Author: laforge
Date: 2007-12-06 08:00:19 +0100 (Thu, 06 Dec 2007)
New Revision: 3590

Modified:
   branches/src/target/kernel/2.6.24.x/patches/smedia-glamo.patch
Log:
GLAMO: Move modeline setting to a function of itself.  Call this function on
initialization and set_par.  (Chia-I Wu <olv at openmoko.com>)


Modified: branches/src/target/kernel/2.6.24.x/patches/smedia-glamo.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/smedia-glamo.patch	2007-12-06 06:53:10 UTC (rev 3589)
+++ branches/src/target/kernel/2.6.24.x/patches/smedia-glamo.patch	2007-12-06 07:00:19 UTC (rev 3590)
@@ -1614,7 +1614,7 @@
 ===================================================================
 --- /dev/null
 +++ linux-2.6/drivers/video/glamo/glamo-fb.c
-@@ -0,0 +1,624 @@
+@@ -0,0 +1,653 @@
 +/* Smedia Glamo 336x/337x driver
 + *
 + * (C) 2007 by OpenMoko, Inc.
@@ -1714,25 +1714,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,
@@ -1822,24 +1809,65 @@
 +	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);
++
++	/* 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;
++	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;
 +}
 +
@@ -1982,6 +2010,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)
@@ -1998,7 +2028,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))
@@ -2023,6 +2052,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;
@@ -2119,33 +2160,21 @@
 +	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.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.left_margin =
-+	fbinfo->var.right_margin =
-+	fbinfo->var.hsync_len = 8;
-+#endif
-+
-+	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;
-+
 +	memset(fbinfo->screen_base, 0, mach_info->xres.max *
 +				       mach_info->yres.max *
 +				       mach_info->bpp.max / 8);
 +
 +	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) {





More information about the commitlog mailing list