xref: /rk3399_rockchip-uboot/drivers/rtc/mx27rtc.c (revision 02ffb580e6ab7aaa7f6703ed35f489e97439cb65)
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