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