18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/m68k/sun3x/time.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Sun3x-specific time handling 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/types.h> 98c2ecf20Sopenharmony_ci#include <linux/kd.h> 108c2ecf20Sopenharmony_ci#include <linux/init.h> 118c2ecf20Sopenharmony_ci#include <linux/sched.h> 128c2ecf20Sopenharmony_ci#include <linux/kernel_stat.h> 138c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 148c2ecf20Sopenharmony_ci#include <linux/rtc.h> 158c2ecf20Sopenharmony_ci#include <linux/bcd.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <asm/irq.h> 188c2ecf20Sopenharmony_ci#include <asm/io.h> 198c2ecf20Sopenharmony_ci#include <asm/machdep.h> 208c2ecf20Sopenharmony_ci#include <asm/traps.h> 218c2ecf20Sopenharmony_ci#include <asm/sun3x.h> 228c2ecf20Sopenharmony_ci#include <asm/sun3ints.h> 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#include "time.h" 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define M_CONTROL 0xf8 278c2ecf20Sopenharmony_ci#define M_SEC 0xf9 288c2ecf20Sopenharmony_ci#define M_MIN 0xfa 298c2ecf20Sopenharmony_ci#define M_HOUR 0xfb 308c2ecf20Sopenharmony_ci#define M_DAY 0xfc 318c2ecf20Sopenharmony_ci#define M_DATE 0xfd 328c2ecf20Sopenharmony_ci#define M_MONTH 0xfe 338c2ecf20Sopenharmony_ci#define M_YEAR 0xff 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#define C_WRITE 0x80 368c2ecf20Sopenharmony_ci#define C_READ 0x40 378c2ecf20Sopenharmony_ci#define C_SIGN 0x20 388c2ecf20Sopenharmony_ci#define C_CALIB 0x1f 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ciint sun3x_hwclk(int set, struct rtc_time *t) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci volatile struct mostek_dt *h = 438c2ecf20Sopenharmony_ci (struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL); 448c2ecf20Sopenharmony_ci unsigned long flags; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci local_irq_save(flags); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci if(set) { 498c2ecf20Sopenharmony_ci h->csr |= C_WRITE; 508c2ecf20Sopenharmony_ci h->sec = bin2bcd(t->tm_sec); 518c2ecf20Sopenharmony_ci h->min = bin2bcd(t->tm_min); 528c2ecf20Sopenharmony_ci h->hour = bin2bcd(t->tm_hour); 538c2ecf20Sopenharmony_ci h->wday = bin2bcd(t->tm_wday); 548c2ecf20Sopenharmony_ci h->mday = bin2bcd(t->tm_mday); 558c2ecf20Sopenharmony_ci h->month = bin2bcd(t->tm_mon + 1); 568c2ecf20Sopenharmony_ci h->year = bin2bcd(t->tm_year % 100); 578c2ecf20Sopenharmony_ci h->csr &= ~C_WRITE; 588c2ecf20Sopenharmony_ci } else { 598c2ecf20Sopenharmony_ci h->csr |= C_READ; 608c2ecf20Sopenharmony_ci t->tm_sec = bcd2bin(h->sec); 618c2ecf20Sopenharmony_ci t->tm_min = bcd2bin(h->min); 628c2ecf20Sopenharmony_ci t->tm_hour = bcd2bin(h->hour); 638c2ecf20Sopenharmony_ci t->tm_wday = bcd2bin(h->wday); 648c2ecf20Sopenharmony_ci t->tm_mday = bcd2bin(h->mday); 658c2ecf20Sopenharmony_ci t->tm_mon = bcd2bin(h->month) - 1; 668c2ecf20Sopenharmony_ci t->tm_year = bcd2bin(h->year); 678c2ecf20Sopenharmony_ci h->csr &= ~C_READ; 688c2ecf20Sopenharmony_ci if (t->tm_year < 70) 698c2ecf20Sopenharmony_ci t->tm_year += 100; 708c2ecf20Sopenharmony_ci } 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci local_irq_restore(flags); 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci return 0; 758c2ecf20Sopenharmony_ci} 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#if 0 788c2ecf20Sopenharmony_cistatic irqreturn_t sun3x_timer_tick(int irq, void *dev_id) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci irq_handler_t timer_routine = dev_id; 818c2ecf20Sopenharmony_ci unsigned long flags; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci local_irq_save(flags); 848c2ecf20Sopenharmony_ci /* Clear the pending interrupt - pulse the enable line low */ 858c2ecf20Sopenharmony_ci disable_irq(5); 868c2ecf20Sopenharmony_ci enable_irq(5); 878c2ecf20Sopenharmony_ci timer_routine(0, NULL); 888c2ecf20Sopenharmony_ci local_irq_restore(flags); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci return IRQ_HANDLED; 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci#endif 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_civoid __init sun3x_sched_init(irq_handler_t vector) 958c2ecf20Sopenharmony_ci{ 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci sun3_disable_interrupts(); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci /* Pulse enable low to get the clock started */ 1018c2ecf20Sopenharmony_ci sun3_disable_irq(5); 1028c2ecf20Sopenharmony_ci sun3_enable_irq(5); 1038c2ecf20Sopenharmony_ci sun3_enable_interrupts(); 1048c2ecf20Sopenharmony_ci} 105