// SPDX-License-Identifier: GPL-2.0
/*
 * linux/arch/sh/boards/sh03/rtc.c -- CTP/PCI-SH03 on-chip RTC support
 *
 *  Copyright (C) 2004  Saito.K & Jeanne(ksaito@interface.co.jp)
 *
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/time.h>
#include <linux/bcd.h>
#include <linux/rtc.h>
#include <linux/spinlock.h>
#include <linux/io.h>
#include <linux/rtc.h>
#include <linux/platform_device.h>

#define RTC_BASE	0xb0000000
#define RTC_SEC1	(RTC_BASE + 0)
#define RTC_SEC10	(RTC_BASE + 1)
#define RTC_MIN1	(RTC_BASE + 2)
#define RTC_MIN10	(RTC_BASE + 3)
#define RTC_HOU1	(RTC_BASE + 4)
#define RTC_HOU10	(RTC_BASE + 5)
#define RTC_WEE1	(RTC_BASE + 6)
#define RTC_DAY1	(RTC_BASE + 7)
#define RTC_DAY10	(RTC_BASE + 8)
#define RTC_MON1	(RTC_BASE + 9)
#define RTC_MON10	(RTC_BASE + 10)
#define RTC_YEA1	(RTC_BASE + 11)
#define RTC_YEA10	(RTC_BASE + 12)
#define RTC_YEA100	(RTC_BASE + 13)
#define RTC_YEA1000	(RTC_BASE + 14)
#define RTC_CTL		(RTC_BASE + 15)
#define RTC_BUSY	1
#define RTC_STOP	2

static DEFINE_SPINLOCK(sh03_rtc_lock);

static int sh03_rtc_gettimeofday(struct device *dev, struct rtc_time *tm)
{
	unsigned int year, mon, day, hour, min, sec;

	spin_lock(&sh03_rtc_lock);
 again:
	do {
		sec  = (__raw_readb(RTC_SEC1) & 0xf) + (__raw_readb(RTC_SEC10) & 0x7) * 10;
		min  = (__raw_readb(RTC_MIN1) & 0xf) + (__raw_readb(RTC_MIN10) & 0xf) * 10;
		hour = (__raw_readb(RTC_HOU1) & 0xf) + (__raw_readb(RTC_HOU10) & 0xf) * 10;
		day  = (__raw_readb(RTC_DAY1) & 0xf) + (__raw_readb(RTC_DAY10) & 0xf) * 10;
		mon  = (__raw_readb(RTC_MON1) & 0xf) + (__raw_readb(RTC_MON10) & 0xf) * 10;
		year = (__raw_readb(RTC_YEA1) & 0xf) + (__raw_readb(RTC_YEA10) & 0xf) * 10
		     + (__raw_readb(RTC_YEA100 ) & 0xf) * 100
		     + (__raw_readb(RTC_YEA1000) & 0xf) * 1000;
	} while (sec != (__raw_readb(RTC_SEC1) & 0xf) + (__raw_readb(RTC_SEC10) & 0x7) * 10);
	if (year == 0 || mon < 1 || mon > 12 || day > 31 || day < 1 ||
	    hour > 23 || min > 59 || sec > 59) {
		printk(KERN_ERR
		       "SH-03 RTC: invalid value, resetting to 1 Jan 2000\n");
		printk("year=%d, mon=%d, day=%d, hour=%d, min=%d, sec=%d\n",
		       year, mon, day, hour, min, sec);

		__raw_writeb(0, RTC_SEC1); __raw_writeb(0, RTC_SEC10);
		__raw_writeb(0, RTC_MIN1); __raw_writeb(0, RTC_MIN10);
		__raw_writeb(0, RTC_HOU1); __raw_writeb(0, RTC_HOU10);
		__raw_writeb(6, RTC_WEE1);
		__raw_writeb(1, RTC_DAY1); __raw_writeb(0, RTC_DAY10);
		__raw_writeb(1, RTC_MON1); __raw_writeb(0, RTC_MON10);
		__raw_writeb(0, RTC_YEA1); __raw_writeb(0, RTC_YEA10);
		__raw_writeb(0, RTC_YEA100);
		__raw_writeb(2, RTC_YEA1000);
		__raw_writeb(0, RTC_CTL);
		goto again;
	}

	spin_unlock(&sh03_rtc_lock);

	tm->tm_sec  = sec;
	tm->tm_min  = min;
	tm->tm_hour = hour;
	tm->tm_mday = day;
	tm->tm_mon  = mon;
	tm->tm_year = year - 1900;

	return 0;
}

static int set_rtc_mmss(struct rtc_time *tm)
{
	int retval = 0;
	int real_seconds, real_minutes, cmos_minutes;
	int i;

	/* gets recalled with irq locally disabled */
	spin_lock(&sh03_rtc_lock);
	for (i = 0 ; i < 1000000 ; i++)	/* may take up to 1 second... */
		if (!(__raw_readb(RTC_CTL) & RTC_BUSY))
			break;
	cmos_minutes = (__raw_readb(RTC_MIN1) & 0xf) + (__raw_readb(RTC_MIN10) & 0xf) * 10;
	real_seconds = tm->tm_sec;
	real_minutes = tm->tm_min;
	if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
		real_minutes += 30;		/* correct for half hour time zone */
	real_minutes %= 60;

	if (abs(real_minutes - cmos_minutes) < 30) {
		__raw_writeb(real_seconds % 10, RTC_SEC1);
		__raw_writeb(real_seconds / 10, RTC_SEC10);
		__raw_writeb(real_minutes % 10, RTC_MIN1);
		__raw_writeb(real_minutes / 10, RTC_MIN10);
	} else {
		printk_once(KERN_NOTICE
		       "set_rtc_mmss: can't update from %d to %d\n",
		       cmos_minutes, real_minutes);
		retval = -EINVAL;
	}
	spin_unlock(&sh03_rtc_lock);

	return retval;
}

int sh03_rtc_settimeofday(struct device *dev, struct rtc_time *tm)
{
	return set_rtc_mmss(tm);
}

static const struct rtc_class_ops rtc_generic_ops = {
	.read_time = sh03_rtc_gettimeofday,
	.set_time = sh03_rtc_settimeofday,
};

static int __init sh03_time_init(void)
{
	struct platform_device *pdev;

	pdev = platform_device_register_data(NULL, "rtc-generic", -1,
					     &rtc_generic_ops,
					     sizeof(rtc_generic_ops));

	return PTR_ERR_OR_ZERO(pdev);
}
arch_initcall(sh03_time_init);
