1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * (C) Copyright 2015 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
5 */
6
7 #include <common.h>
8 #include <dm.h>
9 #include <errno.h>
10 #include <rtc.h>
11
dm_rtc_get(struct udevice * dev,struct rtc_time * time)12 int dm_rtc_get(struct udevice *dev, struct rtc_time *time)
13 {
14 struct rtc_ops *ops = rtc_get_ops(dev);
15
16 assert(ops);
17 if (!ops->get)
18 return -ENOSYS;
19 return ops->get(dev, time);
20 }
21
dm_rtc_set(struct udevice * dev,struct rtc_time * time)22 int dm_rtc_set(struct udevice *dev, struct rtc_time *time)
23 {
24 struct rtc_ops *ops = rtc_get_ops(dev);
25
26 assert(ops);
27 if (!ops->set)
28 return -ENOSYS;
29 return ops->set(dev, time);
30 }
31
dm_rtc_reset(struct udevice * dev)32 int dm_rtc_reset(struct udevice *dev)
33 {
34 struct rtc_ops *ops = rtc_get_ops(dev);
35
36 assert(ops);
37 if (!ops->reset)
38 return -ENOSYS;
39 return ops->reset(dev);
40 }
41
rtc_read8(struct udevice * dev,unsigned int reg)42 int rtc_read8(struct udevice *dev, unsigned int reg)
43 {
44 struct rtc_ops *ops = rtc_get_ops(dev);
45
46 assert(ops);
47 if (!ops->read8)
48 return -ENOSYS;
49 return ops->read8(dev, reg);
50 }
51
rtc_write8(struct udevice * dev,unsigned int reg,int val)52 int rtc_write8(struct udevice *dev, unsigned int reg, int val)
53 {
54 struct rtc_ops *ops = rtc_get_ops(dev);
55
56 assert(ops);
57 if (!ops->write8)
58 return -ENOSYS;
59 return ops->write8(dev, reg, val);
60 }
61
rtc_read16(struct udevice * dev,unsigned int reg,u16 * valuep)62 int rtc_read16(struct udevice *dev, unsigned int reg, u16 *valuep)
63 {
64 u16 value = 0;
65 int ret;
66 int i;
67
68 for (i = 0; i < sizeof(value); i++) {
69 ret = rtc_read8(dev, reg + i);
70 if (ret < 0)
71 return ret;
72 value |= ret << (i << 3);
73 }
74
75 *valuep = value;
76 return 0;
77 }
78
rtc_write16(struct udevice * dev,unsigned int reg,u16 value)79 int rtc_write16(struct udevice *dev, unsigned int reg, u16 value)
80 {
81 int i, ret;
82
83 for (i = 0; i < sizeof(value); i++) {
84 ret = rtc_write8(dev, reg + i, (value >> (i << 3)) & 0xff);
85 if (ret)
86 return ret;
87 }
88
89 return 0;
90 }
91
rtc_read32(struct udevice * dev,unsigned int reg,u32 * valuep)92 int rtc_read32(struct udevice *dev, unsigned int reg, u32 *valuep)
93 {
94 u32 value = 0;
95 int ret;
96 int i;
97
98 for (i = 0; i < sizeof(value); i++) {
99 ret = rtc_read8(dev, reg + i);
100 if (ret < 0)
101 return ret;
102 value |= ret << (i << 3);
103 }
104
105 *valuep = value;
106 return 0;
107 }
108
rtc_write32(struct udevice * dev,unsigned int reg,u32 value)109 int rtc_write32(struct udevice *dev, unsigned int reg, u32 value)
110 {
111 int i, ret;
112
113 for (i = 0; i < sizeof(value); i++) {
114 ret = rtc_write8(dev, reg + i, (value >> (i << 3)) & 0xff);
115 if (ret)
116 return ret;
117 }
118
119 return 0;
120 }
121
122 UCLASS_DRIVER(rtc) = {
123 .name = "rtc",
124 .id = UCLASS_RTC,
125 .post_bind = dm_scan_fdt_dev,
126 };
127