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*4882a593Smuzhiyunint 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*4882a593Smuzhiyunvoid __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