blob: 1cd943630a28107af9d834eecec24a203718dc3b [file] [log] [blame]
Stefan Roese0044c422012-08-16 17:55:41 +00001/*
2 * (C) Copyright 2011
3 * Heiko Schocher, DENX Software Engineering, hs@denx.de.
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 */
19
20#include <bootcount.h>
21#include <asm/arch/da850_lowlevel.h>
22#include <asm/arch/davinci_misc.h>
23
24void bootcount_store(ulong a)
25{
26 struct davinci_rtc *reg =
27 (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR;
28
29 /*
30 * write RTC kick register to enable write
31 * for RTC Scratch registers. Scratch0 and 1 are
32 * used for bootcount values.
33 */
34 writel(RTC_KICK0R_WE, &reg->kick0r);
35 writel(RTC_KICK1R_WE, &reg->kick1r);
36 raw_bootcount_store(&reg->scratch0, a);
37 raw_bootcount_store(&reg->scratch1, BOOTCOUNT_MAGIC);
38}
39
40ulong bootcount_load(void)
41{
42 struct davinci_rtc *reg =
43 (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR;
44
45 if (raw_bootcount_load(&reg->scratch1) != BOOTCOUNT_MAGIC)
46 return 0;
47 else
48 return raw_bootcount_load(&reg->scratch0);
49}