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 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 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 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 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 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 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 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 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 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