diff mbox

[U-Boot,07/13] colibri_t20: disable PMIC sleep mode on low supply voltage

Message ID a3e8b97c5a71e01ce93ee44bcbfbd502e59fc612.1436170106.git.marcel.ziswiler@toradex.com
State Superseded
Delegated to: Tom Warren
Headers show

Commit Message

Marcel Ziswiler July 6, 2015, 8:20 a.m. UTC
From: Marcel Ziswiler <marcel.ziswiler@toradex.com>

The Colibri T20's PMIC enters a sleep mode on low supply voltage < 3.0V
±2.5% (2.92...3.08V). Rising the main supply voltage again does not
bring it back to regular operation. Not even a full reset does bring
the module back. A full power cycle was required to reboot the system.
A long positive pulse on the PMICs resume pin also reboots the system
but this pin is only accessible as a test point on the module.

This patch configures the PMIC through I2C to not enter this sleep mode
plus force it to normal state upon sleep request exit should this ever
happen.

Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
---
 board/toradex/colibri_t20/colibri_t20.c | 35 +++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

Comments

Simon Glass July 6, 2015, 4:38 p.m. UTC | #1
On 6 July 2015 at 02:20, Marcel Ziswiler <marcel@ziswiler.com> wrote:
> From: Marcel Ziswiler <marcel.ziswiler@toradex.com>
>
> The Colibri T20's PMIC enters a sleep mode on low supply voltage < 3.0V
> ±2.5% (2.92...3.08V). Rising the main supply voltage again does not
> bring it back to regular operation. Not even a full reset does bring
> the module back. A full power cycle was required to reboot the system.
> A long positive pulse on the PMICs resume pin also reboots the system
> but this pin is only accessible as a test point on the module.
>
> This patch configures the PMIC through I2C to not enter this sleep mode
> plus force it to normal state upon sleep request exit should this ever
> happen.
>
> Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> ---
>  board/toradex/colibri_t20/colibri_t20.c | 35 +++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

You could write a pmic driver for this if you like.
diff mbox

Patch

diff --git a/board/toradex/colibri_t20/colibri_t20.c b/board/toradex/colibri_t20/colibri_t20.c
index 81d344c..42b293d 100644
--- a/board/toradex/colibri_t20/colibri_t20.c
+++ b/board/toradex/colibri_t20/colibri_t20.c
@@ -13,9 +13,44 @@ 
 #include <asm/arch-tegra/tegra.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
+#include <i2c.h>
+
+#define PMU_I2C_ADDRESS		0x34
+#define MAX_I2C_RETRY		3
+#define PMU_SUPPLYENE		0x14
+#define PMU_SUPPLYENE_SYSINEN	(1<<5)
+#define PMU_SUPPLYENE_EXITSLREQ	(1<<1)
 
 int arch_misc_init(void)
 {
+	/* Disable PMIC sleep mode on low supply voltage */
+	struct udevice *dev;
+	u8 addr, data[1];
+	int err;
+
+	err = i2c_get_chip_for_busnum(0, PMU_I2C_ADDRESS, 1, &dev);
+	if (err) {
+		debug("%s: Cannot find PMIC I2C chip\n", __func__);
+		return err;
+	}
+
+	addr = PMU_SUPPLYENE;
+
+	err = dm_i2c_read(dev, addr, data, 1);
+	if (err) {
+		debug("failed to get PMU_SUPPLYENE\n");
+		return err;
+	}
+
+	data[0] &= ~PMU_SUPPLYENE_SYSINEN;
+	data[0] |= PMU_SUPPLYENE_EXITSLREQ;
+
+	err = dm_i2c_write(dev, addr, data, 1);
+	if (err) {
+		debug("failed to set PMU_SUPPLYENE\n");
+		return err;
+	}
+
 	if (readl(NV_PA_BASE_SRAM + NVBOOTINFOTABLE_BOOTTYPE) ==
 	    NVBOOTTYPE_RECOVERY)
 		printf("USB recovery mode\n");