/*
 * Freescale i.MX27 RTC Driver
 *
 * Copyright (C) 2012 Philippe Reynes <tremyfr@yahoo.fr>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <rtc.h>
#include <asm/io.h>
#include <asm/arch/imx-regs.h>

#define HOUR_SHIFT 8
#define HOUR_MASK  0x1f
#define MIN_SHIFT  0
#define MIN_MASK   0x3f

int rtc_get(struct rtc_time *time)
{
	struct rtc_regs *rtc_regs = (struct rtc_regs *)IMX_RTC_BASE;
	uint32_t day, hour, min, sec;

	day  = readl(&rtc_regs->dayr);
	hour = readl(&rtc_regs->hourmin);
	sec  = readl(&rtc_regs->seconds);

	min  = (hour >> MIN_SHIFT) & MIN_MASK;
	hour = (hour >> HOUR_SHIFT) & HOUR_MASK;

	sec += min * 60 + hour * 3600 + day * 24 * 3600;

	to_tm(sec, time);

	return 0;
}

int rtc_set(struct rtc_time *time)
{
	struct rtc_regs *rtc_regs = (struct rtc_regs *)IMX_RTC_BASE;
	uint32_t day, hour, min, sec;

	sec = mktime(time->tm_year, time->tm_mon, time->tm_mday,
		time->tm_hour, time->tm_min, time->tm_sec);

	day  = sec / (24 * 3600);
	sec  = sec % (24 * 3600);
	hour = sec / 3600;
	sec  = sec % 3600;
	min  = sec / 60;
	sec  = sec % 60;

	hour  = (hour & HOUR_MASK) << HOUR_SHIFT;
	hour |= (min & MIN_MASK) << MIN_SHIFT;

	writel(day, &rtc_regs->dayr);
	writel(hour, &rtc_regs->hourmin);
	writel(sec, &rtc_regs->seconds);

	return 0;
}

void rtc_reset(void)
{
	struct rtc_regs *rtc_regs = (struct rtc_regs *)IMX_RTC_BASE;

	writel(0, &rtc_regs->dayr);
	writel(0, &rtc_regs->hourmin);
	writel(0, &rtc_regs->seconds);
}
