r3236 - trunk/src/target/kernel/patches

laforge at sita.openmoko.org laforge at sita.openmoko.org
Mon Oct 22 10:55:36 CEST 2007


Author: laforge
Date: 2007-10-22 10:55:35 +0200 (Mon, 22 Oct 2007)
New Revision: 3236

Modified:
   trunk/src/target/kernel/patches/gta01-jbt6k74.patch
Log:
Add register init and extend state machine to support QVGA on the LCM. (Stefan Schmidt)


Modified: trunk/src/target/kernel/patches/gta01-jbt6k74.patch
===================================================================
--- trunk/src/target/kernel/patches/gta01-jbt6k74.patch	2007-10-22 08:54:23 UTC (rev 3235)
+++ trunk/src/target/kernel/patches/gta01-jbt6k74.patch	2007-10-22 08:55:35 UTC (rev 3236)
@@ -29,11 +29,12 @@
 ===================================================================
 --- /dev/null
 +++ linux-2.6.22.5-moko/drivers/spi/jbt6k74.c
-@@ -0,0 +1,548 @@
+@@ -0,0 +1,653 @@
 +/* 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
@@ -101,6 +102,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,
@@ -109,6 +111,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,
 +
@@ -118,12 +129,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
@@ -187,7 +200,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;
 +
@@ -223,18 +236,34 @@
 +	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);
++	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_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);
++		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);
 +	rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);
@@ -284,10 +313,35 @@
 +	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;
++}
++
 +static int normal_to_sleep(struct jbt_info *jbt)
 +{
 +	int rc;
@@ -328,6 +382,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:
@@ -341,6 +401,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:
@@ -357,8 +420,44 @@
 +		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;
 +	}
 +	if (rc == 0)
 +		jbt->state = new_state;
@@ -399,9 +498,15 @@
 +			     strlen(jbt_state_names[i]))) {
 +			DEBUGP("Switch to state: %i\n", i);
 +			jbt6k74_enter_state(jbt, i);
-+			if (i == JBT_STATE_NORMAL)
++			switch (i) {
++			case JBT_STATE_NORMAL:
++			case JBT_STATE_QVGA_NORMAL:
 +				/* Enable display again after deep-standby */
 +				jbt6k74_display_onoff(jbt, 1);
++				break;
++			default:
++				break;
++			}
 +			return count;
 +		}
 +	}





More information about the commitlog mailing list