uboot/drivers/rtc/rtc-uclass.c
<<
>>
Prefs
   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
  13int 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
  23int 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
  33int 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
  43int 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
  53int 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
  63int 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
  80int 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
  93int 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
 110int 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
 123UCLASS_DRIVER(rtc) = {
 124        .name           = "rtc",
 125        .id             = UCLASS_RTC,
 126};
 127