[patch 4/6] jbt6k74: Add QVGA support

Stefan Schmidt stefan at openmoko.org
Thu Oct 18 14:05:44 CEST 2007


Add register init and extend state machine to support QVGA on the LCM.

Signed-off-by: Stefan Schmidt <stefan at openmoko.org>

Index: linux-2.6.22.5/drivers/spi/jbt6k74.c
===================================================================
--- linux-2.6.22.5.orig/drivers/spi/jbt6k74.c	2007-10-18 14:55:44.000000000 +0800
+++ linux-2.6.22.5/drivers/spi/jbt6k74.c	2007-10-18 15:06:40.000000000 +0800
@@ -1,7 +1,8 @@
 /* Linux kernel driver for the tpo JBT6K74-AS LCM ASIC
  *
  * Copyright (C) 2006-2007 by OpenMoko, Inc.
- * Author: Harald Welte <laforge at openmoko.org>
+ * Author: Harald Welte <laforge at openmoko.org>,
+ *		   Stefan Schmidt <stefan at openmoko.org>
  * All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
@@ -69,6 +70,7 @@
 	JBT_REG_GAMMA1_INCLINATION	= 0xc9,
 	JBT_REG_GAMMA1_BLUE_OFFSET	= 0xca,
 
+	/* VGA */
 	JBT_REG_BLANK_CONTROL		= 0xcf,
 	JBT_REG_BLANK_TH_TV		= 0xd0,
 	JBT_REG_CKV_ON_OFF		= 0xd1,
@@ -77,6 +79,15 @@
 	JBT_REG_ASW_TIMING_1		= 0xd4,
 	JBT_REG_ASW_TIMING_2		= 0xd5,
 
+	/* QVGA */
+	JBT_REG_BLANK_CONTROL_QVGA	= 0xd6,
+	JBT_REG_BLANK_TH_TV_QVGA	= 0xd7,
+	JBT_REG_CKV_ON_OFF_QVGA		= 0xd8,
+	JBT_REG_CKV_1_2_QVGA		= 0xd9,
+	JBT_REG_OEV_TIMING_QVGA		= 0xde,
+	JBT_REG_ASW_TIMING_1_QVGA	= 0xdf,
+	JBT_REG_ASW_TIMING_2_QVGA	= 0xe0,
+
 	JBT_REG_HCLOCK_VGA		= 0xec,
 	JBT_REG_HCLOCK_QVGA		= 0xed,
 
@@ -86,12 +97,14 @@
 	JBT_STATE_DEEP_STANDBY,
 	JBT_STATE_SLEEP,
 	JBT_STATE_NORMAL,
+	JBT_STATE_QVGA_NORMAL,
 };
 
 static const char *jbt_state_names[] = {
 	[JBT_STATE_DEEP_STANDBY]	= "deep-standby",
 	[JBT_STATE_SLEEP]		= "sleep",
 	[JBT_STATE_NORMAL]		= "normal",
+	[JBT_STATE_QVGA_NORMAL]		= "qvga-normal",
 };
 
 #if 1
@@ -155,7 +168,7 @@
 	return rc;
 }
 
-static int jbt_init_regs(struct jbt_info *jbt)
+static int jbt_init_regs(struct jbt_info *jbt, int qvga)
 {
 	int rc;
 
@@ -191,17 +204,33 @@
 	rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_BLUE_OFFSET, 0x00);
 	rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_BLUE_OFFSET, 0x00);
 
-	rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_VGA, 0x1f0);
-	rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL, 0x02);
-	rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);
-	rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);
-
-	rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF, 0x01);
-	rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2, 0x0000);
-
-	rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING, 0x0d0e);
-	rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1, 0x11a4);
-	rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2, 0x0e);
+	if (!qvga) {
+		DEBUGP("entering VGA mode\n");
+		rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_VGA, 0x1f0);
+		rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL, 0x02);
+		rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);
+		rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);
+
+		rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF, 0x01);
+		rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2, 0x0000);
+
+		rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING, 0x0d0e);
+		rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1, 0x11a4);
+		rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2, 0x0e);
+	}
+	else {
+		DEBUGP("entering QVGA mode\n");
+		rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);
+		rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL_QVGA, 0x02);
+		rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV_QVGA, 0x0804);
+
+		rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF_QVGA, 0x01);
+		rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2_QVGA, 0x0008);
+
+		rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING_QVGA, 0x050a);
+		rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1_QVGA, 0x0a19);
+		rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2_QVGA, 0x0a);
+	}
 
 #if 0
 	rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);
@@ -252,7 +281,32 @@
 	rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
 
 	/* initialize register set */
-	rc |= jbt_init_regs(jbt);
+	rc |= jbt_init_regs(jbt, 0);
+	return rc;
+}
+
+static int sleep_to_qvga_normal(struct jbt_info *jbt)
+{
+	int rc;
+	DEBUGP("entering\n");
+
+	/* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */
+	rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x81);
+
+	/* Quad mode on */
+	rc |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x22);
+
+	/* AVDD on, XVDD on */
+	rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x16);
+
+	/* Output control */
+	rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xfff9);
+
+	/* Sleep mode off */
+	rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
+
+	/* initialize register set for qvga*/
+	rc |= jbt_init_regs(jbt, 1);
 	return rc;
 }
 
@@ -296,6 +350,12 @@
 			/* then transition into normal */
 			rc |= sleep_to_normal(jbt);
 			break;
+		case JBT_STATE_QVGA_NORMAL:
+			/* first transition into sleep */
+			rc = standby_to_sleep(jbt);
+			/* then transition into normal */
+			rc |= sleep_to_qvga_normal(jbt);
+			break;
 		}
 		break;
 	case JBT_STATE_SLEEP:
@@ -309,6 +369,9 @@
 		case JBT_STATE_NORMAL:
 			rc = sleep_to_normal(jbt);
 			break;
+		case JBT_STATE_QVGA_NORMAL:
+			rc = sleep_to_qvga_normal(jbt);
+			break;
 		}
 		break;
 	case JBT_STATE_NORMAL:
@@ -325,6 +388,42 @@
 		case JBT_STATE_SLEEP:
 			rc = normal_to_sleep(jbt);
 			break;
+		case JBT_STATE_QVGA_NORMAL:
+			/* first transition into sleep */
+			rc = normal_to_sleep(jbt);
+			/* second transition into deep standby */
+			rc |= sleep_to_standby(jbt);
+			/* third transition into sleep */
+			rc |= standby_to_sleep(jbt);
+			/* fourth transition into normal */
+			rc |= sleep_to_qvga_normal(jbt);
+			break;
+		}
+		break;
+	case JBT_STATE_QVGA_NORMAL:
+		switch (new_state) {
+		case JBT_STATE_QVGA_NORMAL:
+			rc = 0;
+			break;
+		case JBT_STATE_DEEP_STANDBY:
+			/* first transition into sleep */
+			rc = normal_to_sleep(jbt);
+			/* then transition into deep standby */
+			rc |= sleep_to_standby(jbt);
+			break;
+		case JBT_STATE_SLEEP:
+			rc = normal_to_sleep(jbt);
+			break;
+		case JBT_STATE_NORMAL:
+			/* first transition into sleep */
+			rc = normal_to_sleep(jbt);
+			/* second transition into deep standby */
+			rc |= sleep_to_standby(jbt);
+			/* third transition into sleep */
+			rc |= standby_to_sleep(jbt);
+			/* fourth transition into normal */
+			rc |= sleep_to_normal(jbt);
+			break;
 		}
 		break;
 	}
@@ -367,7 +466,7 @@
 			     strlen(jbt_state_names[i]))) {
 			DEBUGP("Switch to state: %i\n", i);
 			jbt6k74_enter_state(jbt, i);
-			if (i == JBT_STATE_NORMAL)
+			if ((i == JBT_STATE_NORMAL)|(i == JBT_STATE_QVGA_NORMAL))
 				/* Enable display again after deep-standby */
 				jbt6k74_display_onoff(jbt, 1);
 			return count;

-- 



More information about the neo1973-hardware mailing list