1*9e50c406SHeiko Schocher /* 2*9e50c406SHeiko Schocher * (C) Copyright 2013 3*9e50c406SHeiko Schocher * Heiko Schocher, DENX Software Engineering, hs@denx.de. 4*9e50c406SHeiko Schocher * 5*9e50c406SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+ 6*9e50c406SHeiko Schocher */ 7*9e50c406SHeiko Schocher 8*9e50c406SHeiko Schocher #include <bootcount.h> 9*9e50c406SHeiko Schocher #include <linux/compiler.h> 10*9e50c406SHeiko Schocher #include <i2c.h> 11*9e50c406SHeiko Schocher 12*9e50c406SHeiko Schocher #define BC_MAGIC 0xbc 13*9e50c406SHeiko Schocher 14*9e50c406SHeiko Schocher void bootcount_store(ulong a) 15*9e50c406SHeiko Schocher { 16*9e50c406SHeiko Schocher unsigned char buf[3]; 17*9e50c406SHeiko Schocher int ret; 18*9e50c406SHeiko Schocher 19*9e50c406SHeiko Schocher buf[0] = BC_MAGIC; 20*9e50c406SHeiko Schocher buf[1] = (a & 0xff); 21*9e50c406SHeiko Schocher ret = i2c_write(CONFIG_SYS_I2C_RTC_ADDR, CONFIG_SYS_BOOTCOUNT_ADDR, 22*9e50c406SHeiko Schocher CONFIG_BOOTCOUNT_ALEN, buf, 2); 23*9e50c406SHeiko Schocher if (ret != 0) 24*9e50c406SHeiko Schocher puts("Error writing bootcount\n"); 25*9e50c406SHeiko Schocher } 26*9e50c406SHeiko Schocher 27*9e50c406SHeiko Schocher ulong bootcount_load(void) 28*9e50c406SHeiko Schocher { 29*9e50c406SHeiko Schocher unsigned char buf[3]; 30*9e50c406SHeiko Schocher int ret; 31*9e50c406SHeiko Schocher 32*9e50c406SHeiko Schocher ret = i2c_read(CONFIG_SYS_I2C_RTC_ADDR, CONFIG_SYS_BOOTCOUNT_ADDR, 33*9e50c406SHeiko Schocher CONFIG_BOOTCOUNT_ALEN, buf, 2); 34*9e50c406SHeiko Schocher if (ret != 0) { 35*9e50c406SHeiko Schocher puts("Error loading bootcount\n"); 36*9e50c406SHeiko Schocher return 0; 37*9e50c406SHeiko Schocher } 38*9e50c406SHeiko Schocher if (buf[0] == BC_MAGIC) 39*9e50c406SHeiko Schocher return buf[1]; 40*9e50c406SHeiko Schocher 41*9e50c406SHeiko Schocher bootcount_store(0); 42*9e50c406SHeiko Schocher 43*9e50c406SHeiko Schocher return 0; 44*9e50c406SHeiko Schocher } 45