[PATCH 13/13] qi-gta02-no-inidcators-if-battery-low.patch

Andy Green andy at openmoko.com
Mon Dec 1 02:16:53 CET 2008


This patch turns on the SYS and BAT monitoring filters, and checks if the battery
meets the BAT OK threshold.  If it doesn't, which is the case if the battery is
not present, it disables the "indicator" (eg, LED, vibrator) stuff and holds the
CPU at 200MHz during the boot into Linux.

This allows the GTA02 A6 here to boot with no battery up to the point it is
going to bring up backlight, and this with 100mA limit on USB at PMU.  Enabling
the threshold filters for battery and SYS seems to have been critical in
getting any stability with this.

Signed-off-by: Andy Green <andy at openmoko.com>
---

 src/cpu/s3c2442/gta02.c |   77 ++++++++++++++++++++++++++---------------------
 1 files changed, 43 insertions(+), 34 deletions(-)

diff --git a/src/cpu/s3c2442/gta02.c b/src/cpu/s3c2442/gta02.c
index 583f22e..4ef9d55 100644
--- a/src/cpu/s3c2442/gta02.c
+++ b/src/cpu/s3c2442/gta02.c
@@ -35,6 +35,8 @@
 #define PCF50633_I2C_ADS 0x73
 #define BOOST_TO_400MHZ 1
 
+static int battery_condition_reasonable = 0;
+
 const struct pcf50633_init pcf50633_init[] = {
 
 	{ PCF50633_REG_OOCWAKE,		0xd3 }, /* wake from ONKEY,EXTON!,RTC,USB,ADP */
@@ -43,8 +45,8 @@ const struct pcf50633_init pcf50633_init[] = {
 	{ PCF50633_REG_OOCMODE,		0x55 },
 	{ PCF50633_REG_OOCCTL,		0x47 },
 
-	{ PCF50633_REG_SVMCTL,		0x08 },	/* 3.10V SYS voltage thresh. */
-	{ PCF50633_REG_BVMCTL,		0x02 },	/* 2.80V BAT voltage thresh. */
+	{ PCF50633_REG_SVMCTL,		0x18 },	/* 3.10V SYS vth, 62ms filter */
+	{ PCF50633_REG_BVMCTL,		0x12 },	/* 2.80V BAT vth, 62ms filter */
 
 	{ PCF50633_REG_AUTOENA,		0x01 },	/* always on */
 
@@ -95,11 +97,9 @@ static const struct board_variant board_variants[] = {
 
 void port_init_gta02(void)
 {
-#if BOOST_TO_400MHZ
 	unsigned int * MPLLCON = (unsigned int *)0x4c000004;
 	unsigned int * UPLLCON = (unsigned int *)0x4c000008;
 	unsigned int * CLKDIVN = (unsigned int *)0x4c000014;
-#endif
 	int n;
 
 	//CAUTION:Follow the configuration order for setting the ports.
@@ -229,31 +229,36 @@ void port_init_gta02(void)
 		i2c_write_sync(&bb_s3c24xx, PCF50633_I2C_ADS,
 			       pcf50633_init[n].index, pcf50633_init[n].value);
 
-#if BOOST_TO_400MHZ
-	/* change CPU clocking to 400MHz 1:4:8 */
-
-	/* clock divide 1:4:8 - do it first */
-	*CLKDIVN = 5;
-	/* configure UPLL */
-	*UPLLCON = ((88 << 12) + (4 << 4) + 2);
-	/* Magic delay: Page 7-19, seven nops between UPLL and MPLL */
-	asm __volatile__ (
-		"nop\n"\
-		"nop\n"\
-		"nop\n"\
-		"nop\n"\
-		"nop\n"\
-		"nop\n"\
-		"nop\n"\
-	);
-	/* configure MPLL */
-	*MPLLCON = ((42 << 12) + (1 << 4) + 0);
-
-	/* get debug UART working at 115kbps */
-	serial_init_115200_s3c24xx(GTA02_DEBUG_UART, 50 /* 50MHz PCLK */);
-#else
-	serial_init_115200_s3c24xx(GTA02_DEBUG_UART, 33 /* 33MHz PCLK */);
-#endif
+	/* what does the battery monitoring unit say about the battery? */
+
+	battery_condition_reasonable = !(i2c_read_sync(&bb_s3c24xx,
+				    PCF50633_I2C_ADS, PCF50633_REG_BVMCTL) & 1);
+
+	if (battery_condition_reasonable) {
+		/* change CPU clocking to 400MHz 1:4:8 */
+
+		/* clock divide 1:4:8 - do it first */
+		*CLKDIVN = 5;
+		/* configure UPLL */
+		*UPLLCON = ((88 << 12) + (4 << 4) + 2);
+		/* Magic delay: Page 7-19, seven nops between UPLL and MPLL */
+		asm __volatile__ (
+			"nop\n"\
+			"nop\n"\
+			"nop\n"\
+			"nop\n"\
+			"nop\n"\
+			"nop\n"\
+			"nop\n"\
+		);
+		/* configure MPLL */
+		*MPLLCON = ((42 << 12) + (1 << 4) + 0);
+
+		/* get debug UART working at 115kbps */
+		serial_init_115200_s3c24xx(GTA02_DEBUG_UART, 50 /* 50MHz */);
+	} else {
+		serial_init_115200_s3c24xx(GTA02_DEBUG_UART, 33 /* 33MHz */);
+	}
 
 	/* we're going to use Glamo for SD Card access, so we need to init the
 	 * evil beast
@@ -399,6 +404,7 @@ static u8 get_ui_keys_gta02(void)
 
 static void set_ui_indication_gta02(enum ui_indication ui_indication)
 {
+
 	switch (ui_indication) {
 		case UI_IND_UPDATE_ONLY:
 			break;
@@ -406,7 +412,8 @@ static void set_ui_indication_gta02(enum ui_indication ui_indication)
 		case UI_IND_MOUNT_PART:
 		case UI_IND_KERNEL_PULL_OK:
 		case UI_IND_INITRAMFS_PULL_OK:
-			rGPBDAT |= 4;
+			if (battery_condition_reasonable)
+				rGPBDAT |= 4;
 			break;
 
 		case UI_IND_KERNEL_PULL_FAIL:
@@ -414,10 +421,12 @@ static void set_ui_indication_gta02(enum ui_indication ui_indication)
 		case UI_IND_INITRAMFS_PULL_FAIL:
 		case UI_IND_MOUNT_FAIL:
 			rGPBDAT &= ~4;
-			rGPBDAT |= 8;
-			udelay(2000000);
-			rGPBDAT &= ~8;
-			udelay(200000);
+			if (battery_condition_reasonable) {
+				rGPBDAT |= 8;
+				udelay(2000000);
+				rGPBDAT &= ~8;
+				udelay(200000);
+			}
 			break;
 
 		case UI_IND_KERNEL_START:




More information about the openmoko-kernel mailing list