r4276 - trunk/src/target/u-boot/patches
werner at sita.openmoko.org
werner at sita.openmoko.org
Mon Mar 31 19:21:01 CEST 2008
Author: werner
Date: 2008-03-31 19:20:54 +0200 (Mon, 31 Mar 2008)
New Revision: 4276
Added:
trunk/src/target/u-boot/patches/gpb-shadow.patch
trunk/src/target/u-boot/patches/wait-for-power.patch
Removed:
trunk/src/target/u-boot/patches/nor-default-env.patch
trunk/src/target/u-boot/patches/wait-for-power-DONTUSE.patch
Modified:
trunk/src/target/u-boot/patches/series
Log:
Change startup behaviour such that the LCM backlight serves as an indicator
that POWER can be released. Also flash the red LED briefly when powering up.
Doing this sensibly required adding a work-around for the GTA02v5 LED bug,
which is in gpb-shadow.patch
series, nor-default-env.patch:
- we have a better way to accomplish what nor-default-env.patch was intended to
do. Removed it.
series, wait-for-power-DONTUSE.patch:
- renamed wait-for-power-DONTUSE.patch to wait-for-power.patch and activated it
in "series"
- board/neo1973/gta02/gta02.c (wait_for_power): removed minimum battery voltage
condition
- board/neo1973/gta02/gta02.c (board_late_init): activate the red LED for 20ms,
while the vibrator is running (note: this only has a visible effect on
GTA02v6 and above)
series, gpb-shadow.patch:
- board/neo1973/gta02/gta02.c (neo1973_vibrator, neo1973_led): shadow the LED
state to work around GTA02v5 bug
Added: trunk/src/target/u-boot/patches/gpb-shadow.patch
===================================================================
--- trunk/src/target/u-boot/patches/gpb-shadow.patch 2008-03-31 17:04:58 UTC (rev 4275)
+++ trunk/src/target/u-boot/patches/gpb-shadow.patch 2008-03-31 17:20:54 UTC (rev 4276)
@@ -0,0 +1,43 @@
+GTA02v5 pulls the GPBn lines controlling the LEDs down too strongly.
+Thus bit operations on GPB always contain a 0 in these bits. With
+the addition of a shadow register, this problem is avoided.
+
+- Werner
+
+Index: u-boot/board/neo1973/gta02/gta02.c
+===================================================================
+--- u-boot.orig/board/neo1973/gta02/gta02.c
++++ u-boot/board/neo1973/gta02/gta02.c
+@@ -67,6 +67,7 @@
+ extern unsigned char booted_from_nand;
+ extern unsigned char booted_from_nor;
+ extern int nobootdelay;
++static uint16_t gpb_shadow = 0; /* to work around GTA02v5 LED bug */
+
+ static inline void delay (unsigned long loops)
+ {
+@@ -388,6 +389,7 @@
+ #else
+ gpio->GPBDAT &= ~(1 << 3); /* GPB3 */
+ #endif
++ gpio->GPBDAT |= gpb_shadow;
+ }
+
+ void neo1973_gsm(int on)
+@@ -507,8 +509,12 @@
+ if (led > 2)
+ return;
+
+- if (on)
+- gpio->GPBDAT |= (1 << led);
+- else
+- gpio->GPBDAT &= ~(1 << led);
++ if (on) {
++ gpb_shadow |= (1 << led);
++ gpio->GPBDAT |= gpb_shadow;
++ }
++ else {
++ gpb_shadow &= ~(1 << led);
++ gpio->GPBDAT = (gpio->GPBDAT | gpb_shadow) & ~(1 << led);
++ }
+ }
Deleted: trunk/src/target/u-boot/patches/nor-default-env.patch
===================================================================
--- trunk/src/target/u-boot/patches/nor-default-env.patch 2008-03-31 17:04:58 UTC (rev 4275)
+++ trunk/src/target/u-boot/patches/nor-default-env.patch 2008-03-31 17:20:54 UTC (rev 4276)
@@ -1,91 +0,0 @@
-This patch makes u-boot use the default environment is booting from NOR. That
-way, we can be sure no contamination occurs from a possibly severely upset
-NAND.
-
-nor-default-env.patch:
-- cpu/arm920t/start.S, common/env_common.c (env_relocate): new configuration
- option CFG_DEFAULT_ENV_IF_NOR to use the default environment (and not try to
- load it from NAND) if booting from NOR
-- cpu/arm920t/start.S (booted_from_nor): set this flag if booting from NOR
-- include/configs/neo1973_gta02.h: set CFG_DEFAULT_ENV_IF_NOR
-
-Signed-off-by: Werner Almesberger <werner at openmoko.org>
-
-Index: u-boot/common/env_common.c
-===================================================================
---- u-boot.orig/common/env_common.c
-+++ u-boot/common/env_common.c
-@@ -34,6 +34,10 @@
- extern char *preboot_override;
- #endif
-
-+#ifdef CFG_DEFAULT_ENV_IF_NOR
-+extern unsigned char booted_from_nor;
-+#endif
-+
- DECLARE_GLOBAL_DATA_PTR;
-
- #ifdef CONFIG_AMIGAONEG3SE
-@@ -257,6 +261,13 @@
- gd->env_valid = 0;
- #endif
-
-+#ifdef CFG_DEFAULT_ENV_IF_NOR
-+ if (booted_from_nor && gd->env_valid) {
-+ puts("NOR boot, using default environment\n\n");
-+ gd->env_valid = 0;
-+ }
-+#endif
-+
- if (gd->env_valid == 0)
- default_env();
- else {
-Index: u-boot/cpu/arm920t/start.S
-===================================================================
---- u-boot.orig/cpu/arm920t/start.S
-+++ u-boot/cpu/arm920t/start.S
-@@ -99,6 +99,16 @@
- .word booted_from_nand
- #endif /* CONFIG_S3C2410_NAND_BOOT */
-
-+#ifdef CFG_DEFAULT_ENV_IF_NOR
-+.globl booted_from_nor
-+booted_from_nor:
-+ .word 0
-+_booted_from_nor:
-+ .word booted_from_nor
-+_end_if_0:
-+ .word __bss_start-_start
-+#endif /* CFG_DEFAULT_ENV_IF_NOR */
-+
- _TEXT_BASE:
- .word TEXT_BASE
-
-@@ -382,6 +392,15 @@
- stmia r1!, {r3-r10} /* copy to target address [r1] */
- cmp r0, r2 /* until source end address [r2] */
- ble copy_loop
-+
-+#ifdef CFG_DEFAULT_ENV_IF_NOR
-+ ldr r0, _end_if_0 /* are we booting from NOR ? */
-+ cmp r0, r2
-+ ldreq r0, _booted_from_nor /* remember that we've booted from */
-+ moveq r1, #1 /* NOR */
-+ streqb r1, [r0]
-+#endif /* CFG_DEFAULT_ENV_IF_NOR */
-+
- mov r0, #0 /* flush v3/v4 cache */
- mcr p15, 0, r0, c7, c7, 0
- ldr pc, _done_relocate /* jump to relocated code */
-Index: u-boot/include/configs/neo1973_gta02.h
-===================================================================
---- u-boot.orig/include/configs/neo1973_gta02.h
-+++ u-boot/include/configs/neo1973_gta02.h
-@@ -206,6 +206,7 @@
- */
-
- #define CFG_ENV_IS_IN_NAND 1
-+#define CFG_DEFAULT_ENV_IF_NOR
- #define CFG_ENV_SIZE 0x40000 /* 128k Total Size of Environment Sector */
- #define CFG_ENV_OFFSET_OOB 1 /* Location of ENV stored in block 0 OOB */
- #define CFG_PREBOOT_OVERRIDE 1 /* allow preboot from memory */
Modified: trunk/src/target/u-boot/patches/series
===================================================================
--- trunk/src/target/u-boot/patches/series 2008-03-31 17:04:58 UTC (rev 4275)
+++ trunk/src/target/u-boot/patches/series 2008-03-31 17:20:54 UTC (rev 4276)
@@ -87,17 +87,15 @@
uboot-nand_write_yaffs.patch
uboot-neo1973_defaultconsole_usbtty.patch
-# keep this here until we have time to bubble it into the stack
-##nor-default-env.patch
-
# let's see what upstream thinks about this
loadenv.patch
# fix and improve power management
dont-smoke.patch
-# Experimental. Not intended for general use.
-###wait-for-power-DONTUSE.patch
+# Experimental.
+gpb-shadow.patch
+wait-for-power.patch
# Experimental. Please test.
remap-vec.patch
Deleted: trunk/src/target/u-boot/patches/wait-for-power-DONTUSE.patch
===================================================================
--- trunk/src/target/u-boot/patches/wait-for-power-DONTUSE.patch 2008-03-31 17:04:58 UTC (rev 4275)
+++ trunk/src/target/u-boot/patches/wait-for-power-DONTUSE.patch 2008-03-31 17:20:54 UTC (rev 4276)
@@ -1,258 +0,0 @@
-This patch tries to make the system stay in a mode where total power
-consumption is below 100mA until we have determined that it's safe to
-draw more power.
-
-This is work in progress. Don't use it.
-
-It makes the following changes:
-- keeps the system from booting unless we have either good battery power,
- 500mA from USB, or the wall charger supplying power
-- flashes the red (AUX) LED during this
-- defers initialization of the video subsystem until we're about to
- display something
-- leaves the LED boost converter turned off until we actually need it
-
-Known issues:
-- still burns way too much power, see
- http://people.openmoko.org/werner/wait-for-power-try1/usb-batt.html
-
-Index: u-boot/board/neo1973/gta02/gta02.c
-===================================================================
---- u-boot.orig/board/neo1973/gta02/gta02.c
-+++ u-boot/board/neo1973/gta02/gta02.c
-@@ -45,6 +45,9 @@
- /* That many seconds the power key needs to be pressed to power up */
- #define POWER_KEY_SECONDS 2
-
-+/* If the battery voltage is below this, we can't provide stable power */
-+#define SAVE_POWER_MILLIVOLT 3600
-+
- #if defined(CONFIG_ARCH_GTA02_v1)
- //#define M_MDIV 0x7f /* Fout = 405.00MHz */
- #define M_MDIV 0x7d /* Fout = 399.00MHz */
-@@ -63,6 +66,8 @@
- #define U_M_SDIV 2
- #endif
-
-+extern void smedia3362_lcm_reset(int);
-+
- unsigned int neo1973_wakeup_cause;
- extern unsigned char booted_from_nand;
- extern unsigned char booted_from_nor;
-@@ -229,6 +234,39 @@
- return 0;
- }
-
-+static void poll_charger(void)
-+{
-+ if (pcf50633_read_charger_type() == 1000)
-+ pcf50633_usb_maxcurrent(1000);
-+}
-+
-+static void wait_for_power(void)
-+{
-+ int seconds = 0;
-+
-+ while (1) {
-+ /* battery is present -> try to boot */
-+ if (!(pcf50633_reg_read(PCF50633_REG_BVMCTL) & 1) &&
-+ pcf50633_read_battvolt() >= SAVE_POWER_MILLIVOLT)
-+ break;
-+
-+ poll_charger();
-+
-+ /* we have plenty of external power -> try to boot */
-+ if (pcf50633_usb_last_maxcurrent >= 500)
-+ break;
-+
-+ if (neo1973_new_second())
-+ seconds++;
-+
-+ /* blink the AUX LED */
-+ neo1973_led(GTA02_LED_AUX_RED, !seconds || (seconds & 1));
-+ }
-+
-+ /* switch off the AUX LED */
-+ neo1973_led(GTA02_LED_AUX_RED, 0);
-+}
-+
- int board_late_init(void)
- {
- S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
-@@ -236,6 +274,7 @@
- char buf[32];
- int menu_vote = 0; /* <= 0: no, > 0: yes */
- int seconds = 0;
-+ int enter_bootmenu;
-
- /* Initialize the Power Management Unit with a safe register set */
- pcf50633_init();
-@@ -244,8 +283,7 @@
- int1 = pcf50633_reg_read(PCF50633_REG_INT1);
- int2 = pcf50633_reg_read(PCF50633_REG_INT2);
-
-- /* switch on one of the power led's */
-- neo1973_led(GTA02_LED_PWR_ORANGE, 1);
-+ wait_for_power();
-
- /* issue a short pulse with the vibrator */
- neo1973_vibrator(1);
-@@ -311,9 +349,15 @@
- neo1973_poweroff();
-
- continue_boot:
-+ enter_bootmenu = menu_vote > 0 || booted_from_nor;
-+ smedia3362_lcm_reset(1);
-+ if (!enter_bootmenu && getenv("splashimage"))
-+ run_command(getenv("splashimage"), 0);
- jbt6k74_init();
- jbt6k74_enter_state(JBT_STATE_NORMAL);
- jbt6k74_display_onoff(1);
-+ /* switch on the backlight */
-+ neo1973_backlight(1);
-
- #if 0
- {
-@@ -324,7 +368,7 @@
- }
- #endif
-
-- if (menu_vote > 0 || booted_from_nor) {
-+ if (enter_bootmenu) {
- extern struct bootmenu_setup bootmenu_setup;
-
- if (booted_from_nand)
-Index: u-boot/board/neo1973/gta02/pcf50633.c
-===================================================================
---- u-boot.orig/board/neo1973/gta02/pcf50633.c
-+++ u-boot/board/neo1973/gta02/pcf50633.c
-@@ -58,7 +58,7 @@
- [PCF50633_REG_MEMLDOENA] = 0x00,
-
- [PCF50633_REG_LEDOUT] = 0x2f, /* full backlight power */
-- [PCF50633_REG_LEDENA] = 0x02, /* enabled if GPIO1 = HIGH */
-+ [PCF50633_REG_LEDENA] = 0x00, /* disabled */
- [PCF50633_REG_LEDCTL] = 0x05, /* ovp enabled, ocp 500mA */
- [PCF50633_REG_LEDDIM] = 0x20, /* dimming curve */
-
-Index: u-boot/drivers/misc/pcf50633.c
-===================================================================
---- u-boot.orig/drivers/misc/pcf50633.c
-+++ u-boot/drivers/misc/pcf50633.c
-@@ -111,18 +111,13 @@
- return 0;
- }
-
--/* figure out our charger situation */
--int pcf50633_read_charger_type(void)
-+static u_int16_t pcf50633_adc_read(u_int8_t channel, u_int8_t avg)
- {
- u_int16_t ret;
-
-- /* kill ratiometric, but enable ACCSW biasing */
-- pcf50633_reg_write(PCF50633_REG_ADCC2, 0x00);
-- pcf50633_reg_write(PCF50633_REG_ADCC3, 0x01);
--
- /* start ADC conversion of selected channel */
-- pcf50633_reg_write(PCF50633_REG_ADCC1, PCF50633_ADCC1_MUX_ADCIN1 |
-- PCF50633_ADCC1_AVERAGE_16 |
-+ pcf50633_reg_write(PCF50633_REG_ADCC1, channel |
-+ avg |
- PCF50633_ADCC1_ADCSTART |
- PCF50633_ADCC1_RES_10BIT);
-
-@@ -135,18 +130,41 @@
- (pcf50633_reg_read(PCF50633_REG_ADCS3) &
- PCF50633_ADCS3_ADCDAT1L_MASK);
-
-+ return ret;
-+}
-+
-+/* figure out our charger situation */
-+int pcf50633_read_charger_type(void)
-+{
-+ u_int16_t ret;
-+
-+ if ((pcf50633_reg_read(PCF50633_REG_MBCS1) & 0x3) != 0x3)
-+ return 0; /* no power, just battery */
-+
-+ /* kill ratiometric, but enable ACCSW biasing */
-+ pcf50633_reg_write(PCF50633_REG_ADCC2, 0x00);
-+ pcf50633_reg_write(PCF50633_REG_ADCC3, 0x01);
-+
-+ ret = pcf50633_adc_read(PCF50633_ADCC1_MUX_ADCIN1,
-+ PCF50633_ADCC1_AVERAGE_16);
-+
- /* well it is nearest to the 1A resistor */
- if (ret < ((ADC_NOMINAL_RES_1A + ADC_NOMINAL_RES_NC_R_USB) / 2))
- return 1000;
-
-- /* ok all we know is there is no resistor, it can be USB pwr or none */
-- if ((pcf50633_reg_read(PCF50633_REG_MBCS1) & 0x3) == 0x3)
-- return 100; /* USB power then */
-+ /* there is no resistor, so it must be USB pwr */
-+ return 100; /* USB power then */
-
-- return 0; /* nope, no power, just battery */
- }
-
-+u_int16_t pcf50633_read_battvolt(void)
-+{
-+ u_int16_t ret;
-+
-+ ret = pcf50633_adc_read(PCF50633_ADCC1_MUX_BATSNS_RES, 0);
-
-+ return (ret * 6000) / 1024;
-+}
-
- /* initialize PCF50633 register set */
- void pcf50633_init(void)
-@@ -175,10 +193,13 @@
- }
- }
-
-+int pcf50633_usb_last_maxcurrent = -1;
-+
- void pcf50633_usb_maxcurrent(unsigned int ma)
- {
- u_int8_t val;
-
-+ pcf50633_usb_last_maxcurrent = ma;
- if (ma < 100)
- val = PCF50633_MBCC7_USB_SUSPEND;
- else if (ma < 500)
-Index: u-boot/drivers/video/smedia3362.c
-===================================================================
---- u-boot.orig/drivers/video/smedia3362.c
-+++ u-boot/drivers/video/smedia3362.c
-@@ -223,7 +223,7 @@
- pGD->frameAdrs = CONFIG_GLAMO_BASE + 0x00800000;
- pGD->memSize = 0x200000; /* 480x640x16bit = 614400 bytes */
-
--#ifdef CONFIG_GTA02_REVISION
-+#ifdef CONFIG_GTA02_REVISION_do_this_in_board_late_init
- /* bring up the LCM */
- smedia3362_lcm_reset(1);
- if (getenv("splashimage"))
-Index: u-boot/include/pcf50633.h
-===================================================================
---- u-boot.orig/include/pcf50633.h
-+++ u-boot/include/pcf50633.h
-@@ -387,6 +387,8 @@
- /* this is to be provided by the board implementation */
- extern const u_int8_t pcf50633_initial_regs[__NUM_PCF50633_REGS];
-
-+extern int pcf50633_usb_last_maxcurrent; /* mA or -1 if unknown */
-+
- void pcf50633_reg_write(u_int8_t reg, u_int8_t val);
-
- u_int8_t pcf50633_reg_read(u_int8_t reg);
-@@ -399,5 +401,8 @@
-
- const char *pcf50633_charger_state(void);
-
-+int pcf50633_read_charger_type(void);
-+u_int16_t pcf50633_read_battvolt(void);
-+
- #endif /* _PCF50633_H */
-
Copied: trunk/src/target/u-boot/patches/wait-for-power.patch (from rev 4229, trunk/src/target/u-boot/patches/wait-for-power-DONTUSE.patch)
===================================================================
--- trunk/src/target/u-boot/patches/wait-for-power-DONTUSE.patch 2008-03-20 01:04:37 UTC (rev 4229)
+++ trunk/src/target/u-boot/patches/wait-for-power.patch 2008-03-31 17:20:54 UTC (rev 4276)
@@ -0,0 +1,267 @@
+This patch tries to make the system stay in a mode where total power
+consumption is below 100mA until we have determined that it's safe to
+draw more power.
+
+This is work in progress. Don't use it.
+
+It makes the following changes:
+- keeps the system from booting unless we have either good battery power,
+ 500mA from USB, or the wall charger supplying power
+- flashes the red (AUX) LED during this
+- defers initialization of the video subsystem until we're about to
+ display something
+- leaves the LED boost converter turned off until we actually need it
+
+Known issues:
+- still burns way too much power, see
+ http://people.openmoko.org/werner/wait-for-power-try1/usb-batt.html
+
+Index: u-boot/board/neo1973/gta02/gta02.c
+===================================================================
+--- u-boot.orig/board/neo1973/gta02/gta02.c
++++ u-boot/board/neo1973/gta02/gta02.c
+@@ -45,6 +45,9 @@
+ /* That many seconds the power key needs to be pressed to power up */
+ #define POWER_KEY_SECONDS 2
+
++/* If the battery voltage is below this, we can't provide stable power */
++#define SAVE_POWER_MILLIVOLT 3600
++
+ #if defined(CONFIG_ARCH_GTA02_v1)
+ //#define M_MDIV 0x7f /* Fout = 405.00MHz */
+ #define M_MDIV 0x7d /* Fout = 399.00MHz */
+@@ -63,6 +66,8 @@
+ #define U_M_SDIV 2
+ #endif
+
++extern void smedia3362_lcm_reset(int);
++
+ unsigned int neo1973_wakeup_cause;
+ extern unsigned char booted_from_nand;
+ extern unsigned char booted_from_nor;
+@@ -229,6 +234,42 @@
+ return 0;
+ }
+
++static void poll_charger(void)
++{
++ if (pcf50633_read_charger_type() == 1000)
++ pcf50633_usb_maxcurrent(1000);
++}
++
++static void wait_for_power(void)
++{
++ int seconds = 0;
++
++ while (1) {
++ /* battery is present -> try to boot */
++ if (!(pcf50633_reg_read(PCF50633_REG_BVMCTL) & 1))
++ break;
++/*
++ * Consider adding this later to the above condition:
++ pcf50633_read_battvolt() >= SAVE_POWER_MILLIVOLT)
++ */
++
++ poll_charger();
++
++ /* we have plenty of external power -> try to boot */
++ if (pcf50633_usb_last_maxcurrent >= 500)
++ break;
++
++ if (neo1973_new_second())
++ seconds++;
++
++ /* blink the AUX LED */
++ neo1973_led(GTA02_LED_AUX_RED, !seconds || (seconds & 1));
++ }
++
++ /* switch off the AUX LED */
++ neo1973_led(GTA02_LED_AUX_RED, 0);
++}
++
+ int board_late_init(void)
+ {
+ S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
+@@ -236,6 +277,7 @@
+ char buf[32];
+ int menu_vote = 0; /* <= 0: no, > 0: yes */
+ int seconds = 0;
++ int enter_bootmenu;
+
+ /* Initialize the Power Management Unit with a safe register set */
+ pcf50633_init();
+@@ -244,12 +286,13 @@
+ int1 = pcf50633_reg_read(PCF50633_REG_INT1);
+ int2 = pcf50633_reg_read(PCF50633_REG_INT2);
+
+- /* switch on one of the power led's */
+- neo1973_led(GTA02_LED_PWR_ORANGE, 1);
++ wait_for_power();
+
+ /* issue a short pulse with the vibrator */
++ neo1973_led(GTA02_LED_AUX_RED, 1);
+ neo1973_vibrator(1);
+ udelay(20000);
++ neo1973_led(GTA02_LED_AUX_RED, 0);
+ neo1973_vibrator(0);
+
+ #if defined(CONFIG_ARCH_GTA02_v1)
+@@ -311,9 +354,15 @@
+ neo1973_poweroff();
+
+ continue_boot:
++ enter_bootmenu = menu_vote > 0 || booted_from_nor;
++ smedia3362_lcm_reset(1);
++ if (!enter_bootmenu && getenv("splashimage"))
++ run_command(getenv("splashimage"), 0);
+ jbt6k74_init();
+ jbt6k74_enter_state(JBT_STATE_NORMAL);
+ jbt6k74_display_onoff(1);
++ /* switch on the backlight */
++ neo1973_backlight(1);
+
+ #if 0
+ {
+@@ -324,7 +373,7 @@
+ }
+ #endif
+
+- if (menu_vote > 0 || booted_from_nor) {
++ if (enter_bootmenu) {
+ extern struct bootmenu_setup bootmenu_setup;
+
+ if (booted_from_nand)
+Index: u-boot/board/neo1973/gta02/pcf50633.c
+===================================================================
+--- u-boot.orig/board/neo1973/gta02/pcf50633.c
++++ u-boot/board/neo1973/gta02/pcf50633.c
+@@ -58,7 +58,7 @@
+ [PCF50633_REG_MEMLDOENA] = 0x00,
+
+ [PCF50633_REG_LEDOUT] = 0x2f, /* full backlight power */
+- [PCF50633_REG_LEDENA] = 0x02, /* enabled if GPIO1 = HIGH */
++ [PCF50633_REG_LEDENA] = 0x00, /* disabled */
+ [PCF50633_REG_LEDCTL] = 0x05, /* ovp enabled, ocp 500mA */
+ [PCF50633_REG_LEDDIM] = 0x20, /* dimming curve */
+
+Index: u-boot/drivers/misc/pcf50633.c
+===================================================================
+--- u-boot.orig/drivers/misc/pcf50633.c
++++ u-boot/drivers/misc/pcf50633.c
+@@ -111,18 +111,13 @@
+ return 0;
+ }
+
+-/* figure out our charger situation */
+-int pcf50633_read_charger_type(void)
++static u_int16_t pcf50633_adc_read(u_int8_t channel, u_int8_t avg)
+ {
+ u_int16_t ret;
+
+- /* kill ratiometric, but enable ACCSW biasing */
+- pcf50633_reg_write(PCF50633_REG_ADCC2, 0x00);
+- pcf50633_reg_write(PCF50633_REG_ADCC3, 0x01);
+-
+ /* start ADC conversion of selected channel */
+- pcf50633_reg_write(PCF50633_REG_ADCC1, PCF50633_ADCC1_MUX_ADCIN1 |
+- PCF50633_ADCC1_AVERAGE_16 |
++ pcf50633_reg_write(PCF50633_REG_ADCC1, channel |
++ avg |
+ PCF50633_ADCC1_ADCSTART |
+ PCF50633_ADCC1_RES_10BIT);
+
+@@ -135,18 +130,41 @@
+ (pcf50633_reg_read(PCF50633_REG_ADCS3) &
+ PCF50633_ADCS3_ADCDAT1L_MASK);
+
++ return ret;
++}
++
++/* figure out our charger situation */
++int pcf50633_read_charger_type(void)
++{
++ u_int16_t ret;
++
++ if ((pcf50633_reg_read(PCF50633_REG_MBCS1) & 0x3) != 0x3)
++ return 0; /* no power, just battery */
++
++ /* kill ratiometric, but enable ACCSW biasing */
++ pcf50633_reg_write(PCF50633_REG_ADCC2, 0x00);
++ pcf50633_reg_write(PCF50633_REG_ADCC3, 0x01);
++
++ ret = pcf50633_adc_read(PCF50633_ADCC1_MUX_ADCIN1,
++ PCF50633_ADCC1_AVERAGE_16);
++
+ /* well it is nearest to the 1A resistor */
+ if (ret < ((ADC_NOMINAL_RES_1A + ADC_NOMINAL_RES_NC_R_USB) / 2))
+ return 1000;
+
+- /* ok all we know is there is no resistor, it can be USB pwr or none */
+- if ((pcf50633_reg_read(PCF50633_REG_MBCS1) & 0x3) == 0x3)
+- return 100; /* USB power then */
++ /* there is no resistor, so it must be USB pwr */
++ return 100; /* USB power then */
+
+- return 0; /* nope, no power, just battery */
+ }
+
++u_int16_t pcf50633_read_battvolt(void)
++{
++ u_int16_t ret;
++
++ ret = pcf50633_adc_read(PCF50633_ADCC1_MUX_BATSNS_RES, 0);
+
++ return (ret * 6000) / 1024;
++}
+
+ /* initialize PCF50633 register set */
+ void pcf50633_init(void)
+@@ -175,10 +193,13 @@
+ }
+ }
+
++int pcf50633_usb_last_maxcurrent = -1;
++
+ void pcf50633_usb_maxcurrent(unsigned int ma)
+ {
+ u_int8_t val;
+
++ pcf50633_usb_last_maxcurrent = ma;
+ if (ma < 100)
+ val = PCF50633_MBCC7_USB_SUSPEND;
+ else if (ma < 500)
+Index: u-boot/drivers/video/smedia3362.c
+===================================================================
+--- u-boot.orig/drivers/video/smedia3362.c
++++ u-boot/drivers/video/smedia3362.c
+@@ -223,7 +223,7 @@
+ pGD->frameAdrs = CONFIG_GLAMO_BASE + 0x00800000;
+ pGD->memSize = 0x200000; /* 480x640x16bit = 614400 bytes */
+
+-#ifdef CONFIG_GTA02_REVISION
++#ifdef CONFIG_GTA02_REVISION_do_this_in_board_late_init
+ /* bring up the LCM */
+ smedia3362_lcm_reset(1);
+ if (getenv("splashimage"))
+Index: u-boot/include/pcf50633.h
+===================================================================
+--- u-boot.orig/include/pcf50633.h
++++ u-boot/include/pcf50633.h
+@@ -387,6 +387,8 @@
+ /* this is to be provided by the board implementation */
+ extern const u_int8_t pcf50633_initial_regs[__NUM_PCF50633_REGS];
+
++extern int pcf50633_usb_last_maxcurrent; /* mA or -1 if unknown */
++
+ void pcf50633_reg_write(u_int8_t reg, u_int8_t val);
+
+ u_int8_t pcf50633_reg_read(u_int8_t reg);
+@@ -399,5 +401,8 @@
+
+ const char *pcf50633_charger_state(void);
+
++int pcf50633_read_charger_type(void);
++u_int16_t pcf50633_read_battvolt(void);
++
+ #endif /* _PCF50633_H */
+
More information about the commitlog
mailing list