uboot/drivers/rtc/mxsrtc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Freescale i.MX28 RTC Driver
   4 *
   5 * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
   6 * on behalf of DENX Software Engineering GmbH
   7 */
   8
   9#include <common.h>
  10#include <rtc.h>
  11#include <asm/io.h>
  12#include <asm/arch/imx-regs.h>
  13#include <asm/arch/sys_proto.h>
  14
  15#define MXS_RTC_MAX_TIMEOUT     1000000
  16
  17/* Set time in seconds since 1970-01-01 */
  18int mxs_rtc_set_time(uint32_t secs)
  19{
  20        struct mxs_rtc_regs *rtc_regs = (struct mxs_rtc_regs *)MXS_RTC_BASE;
  21        int ret;
  22
  23        writel(secs, &rtc_regs->hw_rtc_seconds);
  24
  25        /*
  26         * The 0x80 here means seconds were copied to analog. This information
  27         * is taken from the linux kernel driver for the STMP37xx RTC since
  28         * documentation doesn't mention it.
  29         */
  30        ret = mxs_wait_mask_clr(&rtc_regs->hw_rtc_stat_reg,
  31                0x80 << RTC_STAT_STALE_REGS_OFFSET, MXS_RTC_MAX_TIMEOUT);
  32
  33        if (ret)
  34                printf("MXS RTC: Timeout waiting for update\n");
  35
  36        return ret;
  37}
  38
  39int rtc_get(struct rtc_time *time)
  40{
  41        struct mxs_rtc_regs *rtc_regs = (struct mxs_rtc_regs *)MXS_RTC_BASE;
  42        uint32_t secs;
  43
  44        secs = readl(&rtc_regs->hw_rtc_seconds);
  45        rtc_to_tm(secs, time);
  46
  47        return 0;
  48}
  49
  50int rtc_set(struct rtc_time *time)
  51{
  52        uint32_t secs;
  53
  54        secs = rtc_mktime(time);
  55
  56        return mxs_rtc_set_time(secs);
  57}
  58
  59void rtc_reset(void)
  60{
  61        struct mxs_rtc_regs *rtc_regs = (struct mxs_rtc_regs *)MXS_RTC_BASE;
  62        int ret;
  63
  64        /* Set time to 1970-01-01 */
  65        mxs_rtc_set_time(0);
  66
  67        /* Reset the RTC block */
  68        ret = mxs_reset_block(&rtc_regs->hw_rtc_ctrl_reg);
  69        if (ret)
  70                printf("MXS RTC: Block reset timeout\n");
  71}
  72