xref: /openbmc/u-boot/drivers/rtc/mx27rtc.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
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