xref: /openbmc/linux/arch/m68k/sun3x/time.c (revision f9a01539)
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 
sun3x_hwclk(int set,struct rtc_time * t)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);
55b65769fcSFinn Thain 		h->month = bin2bcd(t->tm_mon + 1);
56b65769fcSFinn Thain 		h->year = bin2bcd(t->tm_year % 100);
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);
65b65769fcSFinn Thain 		t->tm_mon = bcd2bin(h->month) - 1;
665b1d5f95SAdrian Bunk 		t->tm_year = bcd2bin(h->year);
671da177e4SLinus Torvalds 		h->csr &= ~C_READ;
68b65769fcSFinn Thain 		if (t->tm_year < 70)
69b65769fcSFinn Thain 			t->tm_year += 100;
701da177e4SLinus Torvalds 	}
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	local_irq_restore(flags);
731da177e4SLinus Torvalds 
741da177e4SLinus Torvalds 	return 0;
751da177e4SLinus Torvalds }
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds #if 0
781efdd4bdSFinn Thain static irqreturn_t sun3x_timer_tick(int irq, void *dev_id)
791da177e4SLinus Torvalds {
801efdd4bdSFinn Thain 	unsigned long flags;
811da177e4SLinus Torvalds 
821efdd4bdSFinn Thain 	local_irq_save(flags);
831da177e4SLinus Torvalds 	/* Clear the pending interrupt - pulse the enable line low */
841da177e4SLinus Torvalds 	disable_irq(5);
851da177e4SLinus Torvalds 	enable_irq(5);
864a1c287aSArnd Bergmann 	legacy_timer_tick(1);
871efdd4bdSFinn Thain 	local_irq_restore(flags);
881da177e4SLinus Torvalds 
891efdd4bdSFinn Thain 	return IRQ_HANDLED;
901da177e4SLinus Torvalds }
911da177e4SLinus Torvalds #endif
921da177e4SLinus Torvalds 
sun3x_sched_init(void)93*f9a01539SArnd Bergmann void __init sun3x_sched_init(void)
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