[U-Boot] [PATCH 3/4] ZOOM2 Add power reset button

Tom Rix
2009-06-10T12:53:51Z

The power reset button is on the top right side of the main board.
Press and hold for about to 8 seconds to completely reset the board.

Some of the beta boards have a hardware problem that prevents
using this feature. If is difficult to further characterize the
boards that fail. So disable resetting for all beta boards.

Signed-off-by: Tom Rix <Tom.Rix@windriver.com>
---
board/omap3/zoom2/zoom2.c | 13 +++++++++++++
drivers/i2c/twl4030_i2c.c | 22 ++++++++++++++++++++++
include/configs/omap3_zoom2.h | 1 +
include/twl4030.h | 10 ++++++++++
4 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/board/omap3/zoom2/zoom2.c b/board/omap3/zoom2/zoom2.c
index 08fdafb..d5da920 100644
--- a/board/omap3/zoom2/zoom2.c
+++ b/board/omap3/zoom2/zoom2.c
@@ -32,6 +32,7 @@
#ifdef CONFIG_STATUS_LED
#include <status_led.h>
#endif
+#include <twl4030.h>
#include <asm/io.h>
#include <asm/arch/gpio.h>
#include <asm/arch/mem.h>
@@ -141,6 +142,18 @@ int board_init (void)
/* boot param addr */
gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);

+ /*
+ * Board Reset
+ * The board is reset by holding the the large button
+ * on the top right side of the main board for
+ * eight seconds.
+ *
+ * There are reported problems of some beta boards
+ * continously resetting. For those boards, disable resetting.
+ */
+ if (ZOOM2_REVISION_PRODUCTION <= zoom2_get_revision())
+ twl4030_power_reset_init();
+
#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
status_led_set (STATUS_LED_BOOT, STATUS_LED_ON);
#endif
diff --git a/drivers/i2c/twl4030_i2c.c b/drivers/i2c/twl4030_i2c.c
index 774f813..549f974 100644
--- a/drivers/i2c/twl4030_i2c.c
+++ b/drivers/i2c/twl4030_i2c.c
@@ -35,3 +35,25 @@ static inline int twl4030_i2c_read_u8(u8 chip_no, u8 *val, u8 reg)
return i2c_read(chip_no, reg, 1, val, 1);
}

+/*
+ * Power Reset
+ */
+void twl4030_power_reset_init(void)
+{
+#ifdef CONFIG_OMAP3_ZOOM2
+ u8 val = 0;
+ if (twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, &val,
+ TWL4030_PM_MASTER_P1_SW_EVENTS)) {
+ printf("Error:TWL4030: failed to read the power register\n");
+ printf("Could not initialize hardware reset\n");
+ } else {
+ val |= TWL4030_PM_MASTER_SW_EVENTS_STOPON_PWRON;
+ if (twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, val,
+ TWL4030_PM_MASTER_P1_SW_EVENTS)) {
+ printf("Error:TWL4030: failed to write the power register\n");
+ printf("Could not initialize hardware reset\n");
+ }
+ }
+#endif
+}
+
diff --git a/include/configs/omap3_zoom2.h b/include/configs/omap3_zoom2.h
index c2ad5bf..e69c5f1 100644
--- a/include/configs/omap3_zoom2.h
+++ b/include/configs/omap3_zoom2.h
@@ -145,6 +145,7 @@
#define CONFIG_SYS_I2C_BUS 0
#define CONFIG_SYS_I2C_BUS_SELECT 1
#define CONFIG_DRIVER_OMAP34XX_I2C 1
+#define CONFIG_DRIVER_TWL4030_I2C 1

/*
* Board NAND Info.
diff --git a/include/twl4030.h b/include/twl4030.h
index d17fea5..bb07036 100644
--- a/include/twl4030.h
+++ b/include/twl4030.h
@@ -218,4 +218,14 @@
#define TWL4030_USB_PHY_CLK_CTRL_STS (0xFF)
#define TWL4030_USB_PHY_DPLL_CLK (1 << 0)

+#ifdef CONFIG_DRIVER_TWL4030_I2C
+
+/* Power Reset, use to initialize system wide resetting */
+void twl4030_power_reset_init(void);
+
+#else
+/* stubs */
+#define twl4030_power_reset_init()
+
+#endif /* CONFIG_DRIVER_TWL4030_I2C */
#endif /* TWL4030_H */
--
1.6.0.5