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