diff options
author | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2014-03-16 12:48:09 +0100 |
---|---|---|
committer | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2014-03-16 12:48:09 +0100 |
commit | ccd521c4681a5850bbec1feec140eeaec33936b0 (patch) | |
tree | d3bea22f4cb875c1a15955f0b6a5ea8c72b925e4 /board | |
parent | 0c54b63eb82b048449c05372ecd0e707d6ee32fa (diff) |
colibri_t20: disable PMIC sleep mode on low supply voltageColibri_T30_LinuxImageV2.1Beta3_20140318Colibri_T20_LinuxImageV2.1Beta3_20140318Apalis_T30_LinuxImageV2.1Beta3_20140318
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.
Diffstat (limited to 'board')
-rw-r--r-- | board/toradex/common/board.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/board/toradex/common/board.c b/board/toradex/common/board.c index ea70dbdc117..a48c0efb7e0 100644 --- a/board/toradex/common/board.c +++ b/board/toradex/common/board.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2012 + * (C) Copyright 2012-2014 * Toradex, Inc. * * See file CREDITS for list of people who contributed to this @@ -341,6 +341,30 @@ static TrdxBootDevice board_get_current_bootdev(void) return boot_device; } +/* Disable PMIC sleep mode on low supply voltage for Colibri T20 */ +static void board_disable_pmic_sleep(void) { +#ifdef CONFIG_TEGRA2 + uchar reg, data_buffer[1]; + int i; + + i2c_set_bus_num(DVC_I2C_BUS_NUMBER); /* PMU is on bus 0 */ + + reg = PMU_SUPPLYENE; + for (i = 0; i < MAX_I2C_RETRY; ++i) { + if (!i2c_read(PMU_I2C_ADDRESS, reg, 1, data_buffer, 1)) + break; + udelay(100); + } + data_buffer[0] &= ~PMU_SUPPLYENE_SYSINEN; + data_buffer[0] |= PMU_SUPPLYENE_EXITSLREQ; + for (i = 0; i < MAX_I2C_RETRY; ++i) { + if (!i2c_write(PMU_I2C_ADDRESS, reg, 1, data_buffer, 1)) + break; + udelay(100); + } +#endif +} + /* * Routine: board_init * Description: Early hardware init. @@ -373,6 +397,9 @@ int board_init(void) i2c_init_board(); #endif + /* Disable PMIC sleep mode on low supply voltage */ + board_disable_pmic_sleep(); + #ifdef CONFIG_TEGRA_CLOCK_SCALING pmu_set_nominal(); arch_full_speed(); |