xref: /kernel/linux/linux-6.6/arch/m68k/sun3x/time.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/m68k/sun3x/time.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Sun3x-specific time handling
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/types.h>
962306a36Sopenharmony_ci#include <linux/kd.h>
1062306a36Sopenharmony_ci#include <linux/init.h>
1162306a36Sopenharmony_ci#include <linux/sched.h>
1262306a36Sopenharmony_ci#include <linux/kernel_stat.h>
1362306a36Sopenharmony_ci#include <linux/interrupt.h>
1462306a36Sopenharmony_ci#include <linux/rtc.h>
1562306a36Sopenharmony_ci#include <linux/bcd.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <asm/irq.h>
1862306a36Sopenharmony_ci#include <asm/io.h>
1962306a36Sopenharmony_ci#include <asm/machdep.h>
2062306a36Sopenharmony_ci#include <asm/traps.h>
2162306a36Sopenharmony_ci#include <asm/sun3x.h>
2262306a36Sopenharmony_ci#include <asm/sun3ints.h>
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include "time.h"
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define M_CONTROL 0xf8
2762306a36Sopenharmony_ci#define M_SEC     0xf9
2862306a36Sopenharmony_ci#define M_MIN     0xfa
2962306a36Sopenharmony_ci#define M_HOUR    0xfb
3062306a36Sopenharmony_ci#define M_DAY     0xfc
3162306a36Sopenharmony_ci#define M_DATE    0xfd
3262306a36Sopenharmony_ci#define M_MONTH   0xfe
3362306a36Sopenharmony_ci#define M_YEAR    0xff
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define C_WRITE   0x80
3662306a36Sopenharmony_ci#define C_READ    0x40
3762306a36Sopenharmony_ci#define C_SIGN    0x20
3862306a36Sopenharmony_ci#define C_CALIB   0x1f
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciint sun3x_hwclk(int set, struct rtc_time *t)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	volatile struct mostek_dt *h =
4362306a36Sopenharmony_ci		(struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL);
4462306a36Sopenharmony_ci	unsigned long flags;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	local_irq_save(flags);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	if(set) {
4962306a36Sopenharmony_ci		h->csr |= C_WRITE;
5062306a36Sopenharmony_ci		h->sec = bin2bcd(t->tm_sec);
5162306a36Sopenharmony_ci		h->min = bin2bcd(t->tm_min);
5262306a36Sopenharmony_ci		h->hour = bin2bcd(t->tm_hour);
5362306a36Sopenharmony_ci		h->wday = bin2bcd(t->tm_wday);
5462306a36Sopenharmony_ci		h->mday = bin2bcd(t->tm_mday);
5562306a36Sopenharmony_ci		h->month = bin2bcd(t->tm_mon + 1);
5662306a36Sopenharmony_ci		h->year = bin2bcd(t->tm_year % 100);
5762306a36Sopenharmony_ci		h->csr &= ~C_WRITE;
5862306a36Sopenharmony_ci	} else {
5962306a36Sopenharmony_ci		h->csr |= C_READ;
6062306a36Sopenharmony_ci		t->tm_sec = bcd2bin(h->sec);
6162306a36Sopenharmony_ci		t->tm_min = bcd2bin(h->min);
6262306a36Sopenharmony_ci		t->tm_hour = bcd2bin(h->hour);
6362306a36Sopenharmony_ci		t->tm_wday = bcd2bin(h->wday);
6462306a36Sopenharmony_ci		t->tm_mday = bcd2bin(h->mday);
6562306a36Sopenharmony_ci		t->tm_mon = bcd2bin(h->month) - 1;
6662306a36Sopenharmony_ci		t->tm_year = bcd2bin(h->year);
6762306a36Sopenharmony_ci		h->csr &= ~C_READ;
6862306a36Sopenharmony_ci		if (t->tm_year < 70)
6962306a36Sopenharmony_ci			t->tm_year += 100;
7062306a36Sopenharmony_ci	}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	local_irq_restore(flags);
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	return 0;
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#if 0
7862306a36Sopenharmony_cistatic irqreturn_t sun3x_timer_tick(int irq, void *dev_id)
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	unsigned long flags;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	local_irq_save(flags);
8362306a36Sopenharmony_ci	/* Clear the pending interrupt - pulse the enable line low */
8462306a36Sopenharmony_ci	disable_irq(5);
8562306a36Sopenharmony_ci	enable_irq(5);
8662306a36Sopenharmony_ci	legacy_timer_tick(1);
8762306a36Sopenharmony_ci	local_irq_restore(flags);
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	return IRQ_HANDLED;
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci#endif
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_civoid __init sun3x_sched_init(void)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	sun3_disable_interrupts();
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci    /* Pulse enable low to get the clock started */
10062306a36Sopenharmony_ci	sun3_disable_irq(5);
10162306a36Sopenharmony_ci	sun3_enable_irq(5);
10262306a36Sopenharmony_ci	sun3_enable_interrupts();
10362306a36Sopenharmony_ci}
104