1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * linux/arch/m68k/sun3x/time.c 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Sun3x-specific time handling 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds #include <linux/types.h> 91da177e4SLinus Torvalds #include <linux/kd.h> 101da177e4SLinus Torvalds #include <linux/init.h> 111da177e4SLinus Torvalds #include <linux/sched.h> 121da177e4SLinus Torvalds #include <linux/kernel_stat.h> 131da177e4SLinus Torvalds #include <linux/interrupt.h> 141da177e4SLinus Torvalds #include <linux/rtc.h> 151da177e4SLinus Torvalds #include <linux/bcd.h> 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds #include <asm/irq.h> 181da177e4SLinus Torvalds #include <asm/io.h> 19084b3600SArnd Bergmann #include <asm/machdep.h> 201da177e4SLinus Torvalds #include <asm/traps.h> 211da177e4SLinus Torvalds #include <asm/sun3x.h> 221da177e4SLinus Torvalds #include <asm/sun3ints.h> 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds #include "time.h" 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds #define M_CONTROL 0xf8 271da177e4SLinus Torvalds #define M_SEC 0xf9 281da177e4SLinus Torvalds #define M_MIN 0xfa 291da177e4SLinus Torvalds #define M_HOUR 0xfb 301da177e4SLinus Torvalds #define M_DAY 0xfc 311da177e4SLinus Torvalds #define M_DATE 0xfd 321da177e4SLinus Torvalds #define M_MONTH 0xfe 331da177e4SLinus Torvalds #define M_YEAR 0xff 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds #define C_WRITE 0x80 361da177e4SLinus Torvalds #define C_READ 0x40 371da177e4SLinus Torvalds #define C_SIGN 0x20 381da177e4SLinus Torvalds #define C_CALIB 0x1f 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds int sun3x_hwclk(int set, struct rtc_time *t) 411da177e4SLinus Torvalds { 421da177e4SLinus Torvalds volatile struct mostek_dt *h = 431da177e4SLinus Torvalds (struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL); 441da177e4SLinus Torvalds unsigned long flags; 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds local_irq_save(flags); 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds if(set) { 491da177e4SLinus Torvalds h->csr |= C_WRITE; 505b1d5f95SAdrian Bunk h->sec = bin2bcd(t->tm_sec); 515b1d5f95SAdrian Bunk h->min = bin2bcd(t->tm_min); 525b1d5f95SAdrian Bunk h->hour = bin2bcd(t->tm_hour); 535b1d5f95SAdrian Bunk h->wday = bin2bcd(t->tm_wday); 545b1d5f95SAdrian Bunk h->mday = bin2bcd(t->tm_mday); 555b1d5f95SAdrian Bunk h->month = bin2bcd(t->tm_mon); 565b1d5f95SAdrian Bunk h->year = bin2bcd(t->tm_year); 571da177e4SLinus Torvalds h->csr &= ~C_WRITE; 581da177e4SLinus Torvalds } else { 591da177e4SLinus Torvalds h->csr |= C_READ; 605b1d5f95SAdrian Bunk t->tm_sec = bcd2bin(h->sec); 615b1d5f95SAdrian Bunk t->tm_min = bcd2bin(h->min); 625b1d5f95SAdrian Bunk t->tm_hour = bcd2bin(h->hour); 635b1d5f95SAdrian Bunk t->tm_wday = bcd2bin(h->wday); 645b1d5f95SAdrian Bunk t->tm_mday = bcd2bin(h->mday); 655b1d5f95SAdrian Bunk t->tm_mon = bcd2bin(h->month); 665b1d5f95SAdrian Bunk t->tm_year = bcd2bin(h->year); 671da177e4SLinus Torvalds h->csr &= ~C_READ; 681da177e4SLinus Torvalds } 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds local_irq_restore(flags); 711da177e4SLinus Torvalds 721da177e4SLinus Torvalds return 0; 731da177e4SLinus Torvalds } 741da177e4SLinus Torvalds /* Not much we can do here */ 75c8d5ba18SStephen Warren u32 sun3x_gettimeoffset(void) 761da177e4SLinus Torvalds { 771da177e4SLinus Torvalds return 0L; 781da177e4SLinus Torvalds } 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds #if 0 811da177e4SLinus Torvalds static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs) 821da177e4SLinus Torvalds { 831da177e4SLinus Torvalds void (*vector)(int, void *, struct pt_regs *) = dev_id; 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds /* Clear the pending interrupt - pulse the enable line low */ 861da177e4SLinus Torvalds disable_irq(5); 871da177e4SLinus Torvalds enable_irq(5); 881da177e4SLinus Torvalds 891da177e4SLinus Torvalds vector(irq, NULL, regs); 901da177e4SLinus Torvalds } 911da177e4SLinus Torvalds #endif 921da177e4SLinus Torvalds 9340220c1aSDavid Howells void __init sun3x_sched_init(irq_handler_t vector) 941da177e4SLinus Torvalds { 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds sun3_disable_interrupts(); 971da177e4SLinus Torvalds 981da177e4SLinus Torvalds 991da177e4SLinus Torvalds /* Pulse enable low to get the clock started */ 1001da177e4SLinus Torvalds sun3_disable_irq(5); 1011da177e4SLinus Torvalds sun3_enable_irq(5); 1021da177e4SLinus Torvalds sun3_enable_interrupts(); 1031da177e4SLinus Torvalds } 104