xref: /OK3568_Linux_fs/kernel/arch/m68k/sun3x/time.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  linux/arch/m68k/sun3x/time.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Sun3x-specific time handling
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/types.h>
9*4882a593Smuzhiyun #include <linux/kd.h>
10*4882a593Smuzhiyun #include <linux/init.h>
11*4882a593Smuzhiyun #include <linux/sched.h>
12*4882a593Smuzhiyun #include <linux/kernel_stat.h>
13*4882a593Smuzhiyun #include <linux/interrupt.h>
14*4882a593Smuzhiyun #include <linux/rtc.h>
15*4882a593Smuzhiyun #include <linux/bcd.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <asm/irq.h>
18*4882a593Smuzhiyun #include <asm/io.h>
19*4882a593Smuzhiyun #include <asm/machdep.h>
20*4882a593Smuzhiyun #include <asm/traps.h>
21*4882a593Smuzhiyun #include <asm/sun3x.h>
22*4882a593Smuzhiyun #include <asm/sun3ints.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include "time.h"
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define M_CONTROL 0xf8
27*4882a593Smuzhiyun #define M_SEC     0xf9
28*4882a593Smuzhiyun #define M_MIN     0xfa
29*4882a593Smuzhiyun #define M_HOUR    0xfb
30*4882a593Smuzhiyun #define M_DAY     0xfc
31*4882a593Smuzhiyun #define M_DATE    0xfd
32*4882a593Smuzhiyun #define M_MONTH   0xfe
33*4882a593Smuzhiyun #define M_YEAR    0xff
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define C_WRITE   0x80
36*4882a593Smuzhiyun #define C_READ    0x40
37*4882a593Smuzhiyun #define C_SIGN    0x20
38*4882a593Smuzhiyun #define C_CALIB   0x1f
39*4882a593Smuzhiyun 
sun3x_hwclk(int set,struct rtc_time * t)40*4882a593Smuzhiyun int sun3x_hwclk(int set, struct rtc_time *t)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun 	volatile struct mostek_dt *h =
43*4882a593Smuzhiyun 		(struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL);
44*4882a593Smuzhiyun 	unsigned long flags;
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	local_irq_save(flags);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	if(set) {
49*4882a593Smuzhiyun 		h->csr |= C_WRITE;
50*4882a593Smuzhiyun 		h->sec = bin2bcd(t->tm_sec);
51*4882a593Smuzhiyun 		h->min = bin2bcd(t->tm_min);
52*4882a593Smuzhiyun 		h->hour = bin2bcd(t->tm_hour);
53*4882a593Smuzhiyun 		h->wday = bin2bcd(t->tm_wday);
54*4882a593Smuzhiyun 		h->mday = bin2bcd(t->tm_mday);
55*4882a593Smuzhiyun 		h->month = bin2bcd(t->tm_mon + 1);
56*4882a593Smuzhiyun 		h->year = bin2bcd(t->tm_year % 100);
57*4882a593Smuzhiyun 		h->csr &= ~C_WRITE;
58*4882a593Smuzhiyun 	} else {
59*4882a593Smuzhiyun 		h->csr |= C_READ;
60*4882a593Smuzhiyun 		t->tm_sec = bcd2bin(h->sec);
61*4882a593Smuzhiyun 		t->tm_min = bcd2bin(h->min);
62*4882a593Smuzhiyun 		t->tm_hour = bcd2bin(h->hour);
63*4882a593Smuzhiyun 		t->tm_wday = bcd2bin(h->wday);
64*4882a593Smuzhiyun 		t->tm_mday = bcd2bin(h->mday);
65*4882a593Smuzhiyun 		t->tm_mon = bcd2bin(h->month) - 1;
66*4882a593Smuzhiyun 		t->tm_year = bcd2bin(h->year);
67*4882a593Smuzhiyun 		h->csr &= ~C_READ;
68*4882a593Smuzhiyun 		if (t->tm_year < 70)
69*4882a593Smuzhiyun 			t->tm_year += 100;
70*4882a593Smuzhiyun 	}
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	local_irq_restore(flags);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	return 0;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #if 0
78*4882a593Smuzhiyun static irqreturn_t sun3x_timer_tick(int irq, void *dev_id)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun 	irq_handler_t timer_routine = dev_id;
81*4882a593Smuzhiyun 	unsigned long flags;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	local_irq_save(flags);
84*4882a593Smuzhiyun 	/* Clear the pending interrupt - pulse the enable line low */
85*4882a593Smuzhiyun 	disable_irq(5);
86*4882a593Smuzhiyun 	enable_irq(5);
87*4882a593Smuzhiyun 	timer_routine(0, NULL);
88*4882a593Smuzhiyun 	local_irq_restore(flags);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	return IRQ_HANDLED;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun #endif
93*4882a593Smuzhiyun 
sun3x_sched_init(irq_handler_t vector)94*4882a593Smuzhiyun void __init sun3x_sched_init(irq_handler_t vector)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	sun3_disable_interrupts();
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     /* Pulse enable low to get the clock started */
101*4882a593Smuzhiyun 	sun3_disable_irq(5);
102*4882a593Smuzhiyun 	sun3_enable_irq(5);
103*4882a593Smuzhiyun 	sun3_enable_interrupts();
104*4882a593Smuzhiyun }
105