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 63dbeda5b2SSimon Glass int rtc_read32(struct udevice *dev, unsigned int reg, u32 *valuep) 64dbeda5b2SSimon Glass { 65dbeda5b2SSimon Glass u32 value = 0; 66dbeda5b2SSimon Glass int ret; 67dbeda5b2SSimon Glass int i; 68dbeda5b2SSimon Glass 69dbeda5b2SSimon Glass for (i = 0; i < sizeof(value); i++) { 70dbeda5b2SSimon Glass ret = rtc_read8(dev, reg + i); 71*9a4eb597SSimon Glass if (ret < 0) 72dbeda5b2SSimon Glass return ret; 73dbeda5b2SSimon Glass value |= ret << (i << 3); 74dbeda5b2SSimon Glass } 75dbeda5b2SSimon Glass 76dbeda5b2SSimon Glass *valuep = value; 77dbeda5b2SSimon Glass return 0; 78dbeda5b2SSimon Glass } 79dbeda5b2SSimon Glass 80dbeda5b2SSimon Glass int rtc_write32(struct udevice *dev, unsigned int reg, u32 value) 81dbeda5b2SSimon Glass { 82dbeda5b2SSimon Glass int i, ret; 83dbeda5b2SSimon Glass 84dbeda5b2SSimon Glass for (i = 0; i < sizeof(value); i++) { 85dbeda5b2SSimon Glass ret = rtc_write8(dev, reg + i, (value >> (i << 3)) & 0xff); 86dbeda5b2SSimon Glass if (ret) 87dbeda5b2SSimon Glass return ret; 88dbeda5b2SSimon Glass } 89dbeda5b2SSimon Glass 90dbeda5b2SSimon Glass return 0; 91dbeda5b2SSimon Glass } 92dbeda5b2SSimon Glass 93dbeda5b2SSimon Glass UCLASS_DRIVER(rtc) = { 94dbeda5b2SSimon Glass .name = "rtc", 95dbeda5b2SSimon Glass .id = UCLASS_RTC, 96dbeda5b2SSimon Glass }; 97