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