Message ID | a3e8b97c5a71e01ce93ee44bcbfbd502e59fc612.1436170106.git.marcel.ziswiler@toradex.com |
---|---|
State | Superseded |
Delegated to: | Tom Warren |
Headers | show |
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 --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");