178befb69Strem /*
278befb69Strem * Freescale i.MX27 RTC Driver
378befb69Strem *
478befb69Strem * Copyright (C) 2012 Philippe Reynes <tremyfr@yahoo.fr>
578befb69Strem *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
778befb69Strem */
878befb69Strem
978befb69Strem #include <common.h>
1078befb69Strem #include <rtc.h>
1178befb69Strem #include <asm/io.h>
1278befb69Strem #include <asm/arch/imx-regs.h>
1378befb69Strem
1478befb69Strem #define HOUR_SHIFT 8
1578befb69Strem #define HOUR_MASK 0x1f
1678befb69Strem #define MIN_SHIFT 0
1778befb69Strem #define MIN_MASK 0x3f
1878befb69Strem
rtc_get(struct rtc_time * time)1978befb69Strem int rtc_get(struct rtc_time *time)
2078befb69Strem {
2178befb69Strem struct rtc_regs *rtc_regs = (struct rtc_regs *)IMX_RTC_BASE;
2278befb69Strem uint32_t day, hour, min, sec;
2378befb69Strem
2478befb69Strem day = readl(&rtc_regs->dayr);
2578befb69Strem hour = readl(&rtc_regs->hourmin);
2678befb69Strem sec = readl(&rtc_regs->seconds);
2778befb69Strem
2878befb69Strem min = (hour >> MIN_SHIFT) & MIN_MASK;
2978befb69Strem hour = (hour >> HOUR_SHIFT) & HOUR_MASK;
3078befb69Strem
3178befb69Strem sec += min * 60 + hour * 3600 + day * 24 * 3600;
3278befb69Strem
339f9276c3SSimon Glass rtc_to_tm(sec, time);
3478befb69Strem
3578befb69Strem return 0;
3678befb69Strem }
3778befb69Strem
rtc_set(struct rtc_time * time)3878befb69Strem int rtc_set(struct rtc_time *time)
3978befb69Strem {
4078befb69Strem struct rtc_regs *rtc_regs = (struct rtc_regs *)IMX_RTC_BASE;
4178befb69Strem uint32_t day, hour, min, sec;
4278befb69Strem
43*71420983SSimon Glass sec = rtc_mktime(time);
4478befb69Strem
4578befb69Strem day = sec / (24 * 3600);
4678befb69Strem sec = sec % (24 * 3600);
4778befb69Strem hour = sec / 3600;
4878befb69Strem sec = sec % 3600;
4978befb69Strem min = sec / 60;
5078befb69Strem sec = sec % 60;
5178befb69Strem
5278befb69Strem hour = (hour & HOUR_MASK) << HOUR_SHIFT;
5378befb69Strem hour |= (min & MIN_MASK) << MIN_SHIFT;
5478befb69Strem
5578befb69Strem writel(day, &rtc_regs->dayr);
5678befb69Strem writel(hour, &rtc_regs->hourmin);
5778befb69Strem writel(sec, &rtc_regs->seconds);
5878befb69Strem
5978befb69Strem return 0;
6078befb69Strem }
6178befb69Strem
rtc_reset(void)6278befb69Strem void rtc_reset(void)
6378befb69Strem {
6478befb69Strem struct rtc_regs *rtc_regs = (struct rtc_regs *)IMX_RTC_BASE;
6578befb69Strem
6678befb69Strem writel(0, &rtc_regs->dayr);
6778befb69Strem writel(0, &rtc_regs->hourmin);
6878befb69Strem writel(0, &rtc_regs->seconds);
6978befb69Strem }
70