xref: /openbmc/u-boot/drivers/rtc/sandbox_rtc.c (revision 5871416640a5ef93ccdfaf391dc6321c5fc2f50a)
1*58714166SSimon Glass /*
2*58714166SSimon Glass  * (C) Copyright 2015 Google, Inc
3*58714166SSimon Glass  * Written by Simon Glass <sjg@chromium.org>
4*58714166SSimon Glass  *
5*58714166SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
6*58714166SSimon Glass  */
7*58714166SSimon Glass 
8*58714166SSimon Glass #include <common.h>
9*58714166SSimon Glass #include <dm.h>
10*58714166SSimon Glass #include <i2c.h>
11*58714166SSimon Glass #include <rtc.h>
12*58714166SSimon Glass #include <asm/rtc.h>
13*58714166SSimon Glass 
14*58714166SSimon Glass #define REG_COUNT 0x80
15*58714166SSimon Glass 
16*58714166SSimon Glass static int sandbox_rtc_get(struct udevice *dev, struct rtc_time *time)
17*58714166SSimon Glass {
18*58714166SSimon Glass 	time->tm_sec = dm_i2c_reg_read(dev, REG_SEC);
19*58714166SSimon Glass 	if (time->tm_sec < 0)
20*58714166SSimon Glass 		return time->tm_sec;
21*58714166SSimon Glass 	time->tm_min = dm_i2c_reg_read(dev, REG_MIN);
22*58714166SSimon Glass 	if (time->tm_min < 0)
23*58714166SSimon Glass 		return time->tm_min;
24*58714166SSimon Glass 	time->tm_hour = dm_i2c_reg_read(dev, REG_HOUR);
25*58714166SSimon Glass 	if (time->tm_hour < 0)
26*58714166SSimon Glass 		return time->tm_hour;
27*58714166SSimon Glass 	time->tm_mday = dm_i2c_reg_read(dev, REG_MDAY);
28*58714166SSimon Glass 	if (time->tm_mday < 0)
29*58714166SSimon Glass 		return time->tm_mday;
30*58714166SSimon Glass 	time->tm_mon = dm_i2c_reg_read(dev, REG_MON);
31*58714166SSimon Glass 	if (time->tm_mon < 0)
32*58714166SSimon Glass 		return time->tm_mon;
33*58714166SSimon Glass 	time->tm_year = dm_i2c_reg_read(dev, REG_YEAR);
34*58714166SSimon Glass 	if (time->tm_year < 0)
35*58714166SSimon Glass 		return time->tm_year;
36*58714166SSimon Glass 	time->tm_year += 1900;
37*58714166SSimon Glass 	time->tm_wday = dm_i2c_reg_read(dev, REG_WDAY);
38*58714166SSimon Glass 	if (time->tm_wday < 0)
39*58714166SSimon Glass 		return time->tm_wday;
40*58714166SSimon Glass 
41*58714166SSimon Glass 	return 0;
42*58714166SSimon Glass }
43*58714166SSimon Glass 
44*58714166SSimon Glass static int sandbox_rtc_set(struct udevice *dev, const struct rtc_time *time)
45*58714166SSimon Glass {
46*58714166SSimon Glass 	int ret;
47*58714166SSimon Glass 
48*58714166SSimon Glass 	ret = dm_i2c_reg_write(dev, REG_SEC, time->tm_sec);
49*58714166SSimon Glass 	if (ret < 0)
50*58714166SSimon Glass 		return ret;
51*58714166SSimon Glass 	ret = dm_i2c_reg_write(dev, REG_MIN, time->tm_min);
52*58714166SSimon Glass 	if (ret < 0)
53*58714166SSimon Glass 		return ret;
54*58714166SSimon Glass 	ret = dm_i2c_reg_write(dev, REG_HOUR, time->tm_hour);
55*58714166SSimon Glass 	if (ret < 0)
56*58714166SSimon Glass 		return ret;
57*58714166SSimon Glass 	ret = dm_i2c_reg_write(dev, REG_MDAY, time->tm_mday);
58*58714166SSimon Glass 	if (ret < 0)
59*58714166SSimon Glass 		return ret;
60*58714166SSimon Glass 	ret = dm_i2c_reg_write(dev, REG_MON, time->tm_mon);
61*58714166SSimon Glass 	if (ret < 0)
62*58714166SSimon Glass 		return ret;
63*58714166SSimon Glass 	ret = dm_i2c_reg_write(dev, REG_YEAR, time->tm_year - 1900);
64*58714166SSimon Glass 	if (ret < 0)
65*58714166SSimon Glass 		return ret;
66*58714166SSimon Glass 	ret = dm_i2c_reg_write(dev, REG_WDAY, time->tm_wday);
67*58714166SSimon Glass 	if (ret < 0)
68*58714166SSimon Glass 		return ret;
69*58714166SSimon Glass 
70*58714166SSimon Glass 	return 0;
71*58714166SSimon Glass }
72*58714166SSimon Glass 
73*58714166SSimon Glass static int sandbox_rtc_reset(struct udevice *dev)
74*58714166SSimon Glass {
75*58714166SSimon Glass 	return dm_i2c_reg_write(dev, REG_RESET, 0);
76*58714166SSimon Glass }
77*58714166SSimon Glass 
78*58714166SSimon Glass static int sandbox_rtc_read8(struct udevice *dev, unsigned int reg)
79*58714166SSimon Glass {
80*58714166SSimon Glass 	return dm_i2c_reg_read(dev, reg);
81*58714166SSimon Glass }
82*58714166SSimon Glass 
83*58714166SSimon Glass static int sandbox_rtc_write8(struct udevice *dev, unsigned int reg, int val)
84*58714166SSimon Glass {
85*58714166SSimon Glass 	return dm_i2c_reg_write(dev, reg, val);
86*58714166SSimon Glass }
87*58714166SSimon Glass 
88*58714166SSimon Glass static const struct rtc_ops sandbox_rtc_ops = {
89*58714166SSimon Glass 	.get = sandbox_rtc_get,
90*58714166SSimon Glass 	.set = sandbox_rtc_set,
91*58714166SSimon Glass 	.reset = sandbox_rtc_reset,
92*58714166SSimon Glass 	.read8 = sandbox_rtc_read8,
93*58714166SSimon Glass 	.write8 = sandbox_rtc_write8,
94*58714166SSimon Glass };
95*58714166SSimon Glass 
96*58714166SSimon Glass static const struct udevice_id sandbox_rtc_ids[] = {
97*58714166SSimon Glass 	{ .compatible = "sandbox-rtc" },
98*58714166SSimon Glass 	{ }
99*58714166SSimon Glass };
100*58714166SSimon Glass 
101*58714166SSimon Glass U_BOOT_DRIVER(rtc_sandbox) = {
102*58714166SSimon Glass 	.name	= "rtc-sandbox",
103*58714166SSimon Glass 	.id	= UCLASS_RTC,
104*58714166SSimon Glass 	.of_match = sandbox_rtc_ids,
105*58714166SSimon Glass 	.ops	= &sandbox_rtc_ops,
106*58714166SSimon Glass };
107