80 lines
1.9 KiB
C
80 lines
1.9 KiB
C
/*
|
|
* BCM4760 'flipflop' - Retains 1-bit across a watchdog reset.
|
|
*
|
|
* Copyright (C) 2010 TomTom International B.V.
|
|
* Author: Martin Jackson <martin.jackson@tomtom.com>
|
|
*
|
|
************************************************************************
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
************************************************************************
|
|
*/
|
|
|
|
/* #define DEBUG */
|
|
|
|
#include <common.h>
|
|
#include <flipflop.h>
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
static int get_bootlimit(void)
|
|
{
|
|
char *s;
|
|
|
|
#ifdef CONFIG_BOOTCOUNT_LIMIT
|
|
if ((s=getenv("bootlimit")) != NULL) {
|
|
int n = simple_strtoul(s, NULL, 10);
|
|
debug("bootlimit = %d\n", n);
|
|
return n;
|
|
}
|
|
#endif
|
|
debug("bootlimit hardcoded to 1\n");
|
|
return 1;
|
|
}
|
|
|
|
void bootcount_store(ulong count)
|
|
{
|
|
debug("Storing bootcount [%lu]\n", count);
|
|
gd->tomtom.bootcount = count;
|
|
if (count <= get_bootlimit())
|
|
flipflop_set(1);
|
|
else
|
|
flipflop_set(0);
|
|
}
|
|
|
|
ulong bootcount_load(void)
|
|
{
|
|
ulong r = gd->tomtom.bootcount;
|
|
char *s;
|
|
|
|
#ifdef __NON_LEGACY
|
|
if ((s=getenv("sysboot_mode")) != NULL &&
|
|
strcmp(s, "watchdog") == 0)
|
|
#else
|
|
if (gd->tomtom.sysboot_mode == SYSBOOT_MODE_WATCHDOG &&
|
|
gd->tomtom.bootcount == 0)
|
|
#endif
|
|
{
|
|
debug("sysboot_mode is watchdog\n");
|
|
if (flipflop_get()) {
|
|
r += get_bootlimit();
|
|
}
|
|
} else {
|
|
debug("sysboot_mode is cold\n");
|
|
}
|
|
|
|
debug("Returning bootcount %lu\n", r);
|
|
return r;
|
|
}
|