board: gateworks: venice: enable GSC supervisor for new board models

The Gateworks System Controller (GSC) has a voltage supervisor which is
disabled by default. On older boards we want to maintian this but on
newer boards we wish to enable the voltage supervisor.

The Gateworks System Controller (GSC) can disable the board primary
power supply by driving a pin to a FET high. On older board models
the leakage of the GSC may exceed the leakage of the FET causing this
signal slowly rise when the GSC battery is low and the board is in a
powered down state resulting in the board being kept in a disabled
state.

Newer boards have a hardware fix to avoid this leakage and thus should
enable the voltage supervisor.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
This commit is contained in:
Tim Harvey 2024-06-19 14:12:58 -07:00 committed by Fabio Estevam
parent 54fd3c16bd
commit ef0b5b61f4

View file

@ -118,13 +118,29 @@ static int dm_i2c_clrsetbits(struct udevice *dev, uint reg, uint clr, uint set)
return dm_i2c_write(dev, reg, &val, 1);
}
static int power_init_board(void)
static int power_init_board(struct udevice *gsc)
{
const char *model = eeprom_get_model();
struct udevice *bus;
struct udevice *dev;
int ret;
/* Enable GSC voltage supervisor for new board models */
if ((!strncmp(model, "GW7100", 6) && model[10] > 'D') ||
(!strncmp(model, "GW7101", 6) && model[10] > 'D') ||
(!strncmp(model, "GW7200", 6) && model[10] > 'E') ||
(!strncmp(model, "GW7201", 6) && model[10] > 'E') ||
(!strncmp(model, "GW7300", 6) && model[10] > 'E') ||
(!strncmp(model, "GW7301", 6) && model[10] > 'E') ||
(!strncmp(model, "GW740", 5) && model[7] > 'B')) {
u8 ver;
if (!dm_i2c_read(gsc, 14, &ver, 1) && ver > 62) {
printf("GSC : enabling voltage supervisor\n");
dm_i2c_clrsetbits(gsc, 25, 0, BIT(1));
}
}
if ((!strncmp(model, "GW71", 4)) ||
(!strncmp(model, "GW72", 4)) ||
(!strncmp(model, "GW73", 4)) ||
@ -297,7 +313,7 @@ void board_init_f(ulong dummy)
dram_sz = venice_eeprom_init(0);
/* PMIC */
power_init_board();
power_init_board(dev);
/* DDR initialization */
spl_dram_init(dram_sz);