11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * arch/m68k/mvme16x/config.c 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright (C) 1995 Richard Hirst [richard@sleepie.demon.co.uk] 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Based on: 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * linux/amiga/config.c 91da177e4SLinus Torvalds * 101da177e4SLinus Torvalds * Copyright (C) 1993 Hamish Macdonald 111da177e4SLinus Torvalds * 121da177e4SLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 131da177e4SLinus Torvalds * License. See the file README.legal in the main directory of this archive 141da177e4SLinus Torvalds * for more details. 151da177e4SLinus Torvalds */ 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds #include <linux/types.h> 181da177e4SLinus Torvalds #include <linux/kernel.h> 191da177e4SLinus Torvalds #include <linux/mm.h> 20813dcf7aSAlexey Dobriyan #include <linux/seq_file.h> 211da177e4SLinus Torvalds #include <linux/tty.h> 221da177e4SLinus Torvalds #include <linux/console.h> 231da177e4SLinus Torvalds #include <linux/linkage.h> 241da177e4SLinus Torvalds #include <linux/init.h> 251da177e4SLinus Torvalds #include <linux/major.h> 261da177e4SLinus Torvalds #include <linux/genhd.h> 271da177e4SLinus Torvalds #include <linux/rtc.h> 281da177e4SLinus Torvalds #include <linux/interrupt.h> 29612e484fSAdrian Bunk #include <linux/module.h> 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds #include <asm/bootinfo.h> 324c3c522bSGeert Uytterhoeven #include <asm/bootinfo-vme.h> 33abe48101SGeert Uytterhoeven #include <asm/byteorder.h> 341da177e4SLinus Torvalds #include <asm/pgtable.h> 351da177e4SLinus Torvalds #include <asm/setup.h> 361da177e4SLinus Torvalds #include <asm/irq.h> 371da177e4SLinus Torvalds #include <asm/traps.h> 381da177e4SLinus Torvalds #include <asm/rtc.h> 391da177e4SLinus Torvalds #include <asm/machdep.h> 401da177e4SLinus Torvalds #include <asm/mvme16xhw.h> 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds extern t_bdid mvme_bdid; 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds static MK48T08ptr_t volatile rtc = (MK48T08ptr_t)MVME_RTC_BASE; 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds static void mvme16x_get_model(char *model); 4740220c1aSDavid Howells extern void mvme16x_sched_init(irq_handler_t handler); 48c8d5ba18SStephen Warren extern u32 mvme16x_gettimeoffset(void); 491da177e4SLinus Torvalds extern int mvme16x_hwclk (int, struct rtc_time *); 501da177e4SLinus Torvalds extern int mvme16x_set_clock_mmss (unsigned long); 511da177e4SLinus Torvalds extern void mvme16x_reset (void); 521da177e4SLinus Torvalds 531da177e4SLinus Torvalds int bcd2int (unsigned char b); 541da177e4SLinus Torvalds 55e53f276bSTorben Hohn /* Save tick handler routine pointer, will point to xtime_update() in 56e53f276bSTorben Hohn * kernel/time/timekeeping.c, called via mvme16x_process_int() */ 571da177e4SLinus Torvalds 5840220c1aSDavid Howells static irq_handler_t tick_handler; 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds unsigned short mvme16x_config; 62612e484fSAdrian Bunk EXPORT_SYMBOL(mvme16x_config); 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds 65a4df02a2SGeert Uytterhoeven int __init mvme16x_parse_bootinfo(const struct bi_record *bi) 661da177e4SLinus Torvalds { 67abe48101SGeert Uytterhoeven uint16_t tag = be16_to_cpu(bi->tag); 68abe48101SGeert Uytterhoeven if (tag == BI_VME_TYPE || tag == BI_VME_BRDINFO) 691da177e4SLinus Torvalds return 0; 701da177e4SLinus Torvalds else 711da177e4SLinus Torvalds return 1; 721da177e4SLinus Torvalds } 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds void mvme16x_reset(void) 751da177e4SLinus Torvalds { 761da177e4SLinus Torvalds printk ("\r\n\nCalled mvme16x_reset\r\n" 771da177e4SLinus Torvalds "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"); 781da177e4SLinus Torvalds /* The string of returns is to delay the reset until the whole 791da177e4SLinus Torvalds * message is output. Assert reset bit in GCSR */ 801da177e4SLinus Torvalds *(volatile char *)0xfff40107 = 0x80; 811da177e4SLinus Torvalds } 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds static void mvme16x_get_model(char *model) 841da177e4SLinus Torvalds { 851da177e4SLinus Torvalds p_bdid p = &mvme_bdid; 861da177e4SLinus Torvalds char suf[4]; 871da177e4SLinus Torvalds 881da177e4SLinus Torvalds suf[1] = p->brdsuffix[0]; 891da177e4SLinus Torvalds suf[2] = p->brdsuffix[1]; 901da177e4SLinus Torvalds suf[3] = '\0'; 911da177e4SLinus Torvalds suf[0] = suf[1] ? '-' : '\0'; 921da177e4SLinus Torvalds 93abe48101SGeert Uytterhoeven sprintf(model, "Motorola MVME%x%s", be16_to_cpu(p->brdno), suf); 941da177e4SLinus Torvalds } 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds 97813dcf7aSAlexey Dobriyan static void mvme16x_get_hardware_list(struct seq_file *m) 981da177e4SLinus Torvalds { 99abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); 1001da177e4SLinus Torvalds 101abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x0172) 1021da177e4SLinus Torvalds { 1031da177e4SLinus Torvalds unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; 1041da177e4SLinus Torvalds 105813dcf7aSAlexey Dobriyan seq_printf (m, "VMEchip2 %spresent\n", 1061da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_VMECHIP2 ? "NOT " : ""); 107813dcf7aSAlexey Dobriyan seq_printf (m, "SCSI interface %spresent\n", 1081da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_SCSICHIP ? "NOT " : ""); 109813dcf7aSAlexey Dobriyan seq_printf (m, "Ethernet i/f %spresent\n", 1101da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_ETHERNET ? "NOT " : ""); 1111da177e4SLinus Torvalds } 1121da177e4SLinus Torvalds } 1131da177e4SLinus Torvalds 114200a3d35SRoman Zippel /* 115200a3d35SRoman Zippel * This function is called during kernel startup to initialize 116200a3d35SRoman Zippel * the mvme16x IRQ handling routines. Should probably ensure 117200a3d35SRoman Zippel * that the base vectors for the VMEChip2 and PCCChip2 are valid. 118200a3d35SRoman Zippel */ 119200a3d35SRoman Zippel 12066a3f820SAl Viro static void __init mvme16x_init_IRQ (void) 121200a3d35SRoman Zippel { 122f30a6484SGeert Uytterhoeven m68k_setup_user_interrupt(VEC_USER, 192); 123200a3d35SRoman Zippel } 1241da177e4SLinus Torvalds 1251da177e4SLinus Torvalds #define pcc2chip ((volatile u_char *)0xfff42000) 1261da177e4SLinus Torvalds #define PccSCCMICR 0x1d 1271da177e4SLinus Torvalds #define PccSCCTICR 0x1e 1281da177e4SLinus Torvalds #define PccSCCRICR 0x1f 129f9994894SKars de Jong #define PccTPIACKR 0x25 130f9994894SKars de Jong 131f9994894SKars de Jong #ifdef CONFIG_EARLY_PRINTK 132f9994894SKars de Jong 133f9994894SKars de Jong /**** cd2401 registers ****/ 134f9994894SKars de Jong #define CD2401_ADDR (0xfff45000) 135f9994894SKars de Jong 136f9994894SKars de Jong #define CyGFRCR (0x81) 137f9994894SKars de Jong #define CyCCR (0x13) 138f9994894SKars de Jong #define CyCLR_CHAN (0x40) 139f9994894SKars de Jong #define CyINIT_CHAN (0x20) 140f9994894SKars de Jong #define CyCHIP_RESET (0x10) 141f9994894SKars de Jong #define CyENB_XMTR (0x08) 142f9994894SKars de Jong #define CyDIS_XMTR (0x04) 143f9994894SKars de Jong #define CyENB_RCVR (0x02) 144f9994894SKars de Jong #define CyDIS_RCVR (0x01) 145f9994894SKars de Jong #define CyCAR (0xee) 146f9994894SKars de Jong #define CyIER (0x11) 147f9994894SKars de Jong #define CyMdmCh (0x80) 148f9994894SKars de Jong #define CyRxExc (0x20) 149f9994894SKars de Jong #define CyRxData (0x08) 150f9994894SKars de Jong #define CyTxMpty (0x02) 151f9994894SKars de Jong #define CyTxRdy (0x01) 152f9994894SKars de Jong #define CyLICR (0x26) 153f9994894SKars de Jong #define CyRISR (0x89) 154f9994894SKars de Jong #define CyTIMEOUT (0x80) 155f9994894SKars de Jong #define CySPECHAR (0x70) 156f9994894SKars de Jong #define CyOVERRUN (0x08) 157f9994894SKars de Jong #define CyPARITY (0x04) 158f9994894SKars de Jong #define CyFRAME (0x02) 159f9994894SKars de Jong #define CyBREAK (0x01) 160f9994894SKars de Jong #define CyREOIR (0x84) 161f9994894SKars de Jong #define CyTEOIR (0x85) 162f9994894SKars de Jong #define CyMEOIR (0x86) 163f9994894SKars de Jong #define CyNOTRANS (0x08) 164f9994894SKars de Jong #define CyRFOC (0x30) 165f9994894SKars de Jong #define CyRDR (0xf8) 166f9994894SKars de Jong #define CyTDR (0xf8) 167f9994894SKars de Jong #define CyMISR (0x8b) 168f9994894SKars de Jong #define CyRISR (0x89) 169f9994894SKars de Jong #define CyTISR (0x8a) 170f9994894SKars de Jong #define CyMSVR1 (0xde) 171f9994894SKars de Jong #define CyMSVR2 (0xdf) 172f9994894SKars de Jong #define CyDSR (0x80) 173f9994894SKars de Jong #define CyDCD (0x40) 174f9994894SKars de Jong #define CyCTS (0x20) 175f9994894SKars de Jong #define CyDTR (0x02) 176f9994894SKars de Jong #define CyRTS (0x01) 177f9994894SKars de Jong #define CyRTPRL (0x25) 178f9994894SKars de Jong #define CyRTPRH (0x24) 179f9994894SKars de Jong #define CyCOR1 (0x10) 180f9994894SKars de Jong #define CyPARITY_NONE (0x00) 181f9994894SKars de Jong #define CyPARITY_E (0x40) 182f9994894SKars de Jong #define CyPARITY_O (0xC0) 183f9994894SKars de Jong #define Cy_5_BITS (0x04) 184f9994894SKars de Jong #define Cy_6_BITS (0x05) 185f9994894SKars de Jong #define Cy_7_BITS (0x06) 186f9994894SKars de Jong #define Cy_8_BITS (0x07) 187f9994894SKars de Jong #define CyCOR2 (0x17) 188f9994894SKars de Jong #define CyETC (0x20) 189f9994894SKars de Jong #define CyCtsAE (0x02) 190f9994894SKars de Jong #define CyCOR3 (0x16) 191f9994894SKars de Jong #define Cy_1_STOP (0x02) 192f9994894SKars de Jong #define Cy_2_STOP (0x04) 193f9994894SKars de Jong #define CyCOR4 (0x15) 194f9994894SKars de Jong #define CyREC_FIFO (0x0F) /* Receive FIFO threshold */ 195f9994894SKars de Jong #define CyCOR5 (0x14) 196f9994894SKars de Jong #define CyCOR6 (0x18) 197f9994894SKars de Jong #define CyCOR7 (0x07) 198f9994894SKars de Jong #define CyRBPR (0xcb) 199f9994894SKars de Jong #define CyRCOR (0xc8) 200f9994894SKars de Jong #define CyTBPR (0xc3) 201f9994894SKars de Jong #define CyTCOR (0xc0) 202f9994894SKars de Jong #define CySCHR1 (0x1f) 203f9994894SKars de Jong #define CySCHR2 (0x1e) 204f9994894SKars de Jong #define CyTPR (0xda) 205f9994894SKars de Jong #define CyPILR1 (0xe3) 206f9994894SKars de Jong #define CyPILR2 (0xe0) 207f9994894SKars de Jong #define CyPILR3 (0xe1) 208f9994894SKars de Jong #define CyCMR (0x1b) 209f9994894SKars de Jong #define CyASYNC (0x02) 210f9994894SKars de Jong #define CyLICR (0x26) 211f9994894SKars de Jong #define CyLIVR (0x09) 212f9994894SKars de Jong #define CySCRL (0x23) 213f9994894SKars de Jong #define CySCRH (0x22) 214f9994894SKars de Jong #define CyTFTC (0x80) 215f9994894SKars de Jong 216c46f46d0SFinn Thain void mvme16x_cons_write(struct console *co, const char *str, unsigned count) 217f9994894SKars de Jong { 218f9994894SKars de Jong volatile unsigned char *base_addr = (u_char *)CD2401_ADDR; 219f9994894SKars de Jong volatile u_char sink; 220f9994894SKars de Jong u_char ier; 221f9994894SKars de Jong int port; 222f9994894SKars de Jong u_char do_lf = 0; 223f9994894SKars de Jong int i = 0; 224f9994894SKars de Jong 225f9994894SKars de Jong /* Ensure transmitter is enabled! */ 226f9994894SKars de Jong 227f9994894SKars de Jong port = 0; 228f9994894SKars de Jong base_addr[CyCAR] = (u_char)port; 229f9994894SKars de Jong while (base_addr[CyCCR]) 230f9994894SKars de Jong ; 231f9994894SKars de Jong base_addr[CyCCR] = CyENB_XMTR; 232f9994894SKars de Jong 233f9994894SKars de Jong ier = base_addr[CyIER]; 234f9994894SKars de Jong base_addr[CyIER] = CyTxMpty; 235f9994894SKars de Jong 236f9994894SKars de Jong while (1) { 237f9994894SKars de Jong if (pcc2chip[PccSCCTICR] & 0x20) 238f9994894SKars de Jong { 239f9994894SKars de Jong /* We have a Tx int. Acknowledge it */ 240f9994894SKars de Jong sink = pcc2chip[PccTPIACKR]; 241f9994894SKars de Jong if ((base_addr[CyLICR] >> 2) == port) { 242f9994894SKars de Jong if (i == count) { 243f9994894SKars de Jong /* Last char of string is now output */ 244f9994894SKars de Jong base_addr[CyTEOIR] = CyNOTRANS; 245f9994894SKars de Jong break; 246f9994894SKars de Jong } 247f9994894SKars de Jong if (do_lf) { 248f9994894SKars de Jong base_addr[CyTDR] = '\n'; 249f9994894SKars de Jong str++; 250f9994894SKars de Jong i++; 251f9994894SKars de Jong do_lf = 0; 252f9994894SKars de Jong } 253f9994894SKars de Jong else if (*str == '\n') { 254f9994894SKars de Jong base_addr[CyTDR] = '\r'; 255f9994894SKars de Jong do_lf = 1; 256f9994894SKars de Jong } 257f9994894SKars de Jong else { 258f9994894SKars de Jong base_addr[CyTDR] = *str++; 259f9994894SKars de Jong i++; 260f9994894SKars de Jong } 261f9994894SKars de Jong base_addr[CyTEOIR] = 0; 262f9994894SKars de Jong } 263f9994894SKars de Jong else 264f9994894SKars de Jong base_addr[CyTEOIR] = CyNOTRANS; 265f9994894SKars de Jong } 266f9994894SKars de Jong } 267f9994894SKars de Jong 268f9994894SKars de Jong base_addr[CyIER] = ier; 269f9994894SKars de Jong } 270f9994894SKars de Jong 271f9994894SKars de Jong #endif 2721da177e4SLinus Torvalds 2731da177e4SLinus Torvalds void __init config_mvme16x(void) 2741da177e4SLinus Torvalds { 2751da177e4SLinus Torvalds p_bdid p = &mvme_bdid; 2761da177e4SLinus Torvalds char id[40]; 277abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(p->brdno); 2781da177e4SLinus Torvalds 2791da177e4SLinus Torvalds mach_max_dma_address = 0xffffffff; 2801da177e4SLinus Torvalds mach_sched_init = mvme16x_sched_init; 2811da177e4SLinus Torvalds mach_init_IRQ = mvme16x_init_IRQ; 282c8d5ba18SStephen Warren arch_gettimeoffset = mvme16x_gettimeoffset; 2831da177e4SLinus Torvalds mach_hwclk = mvme16x_hwclk; 2841da177e4SLinus Torvalds mach_set_clock_mmss = mvme16x_set_clock_mmss; 2851da177e4SLinus Torvalds mach_reset = mvme16x_reset; 2861da177e4SLinus Torvalds mach_get_model = mvme16x_get_model; 2871da177e4SLinus Torvalds mach_get_hardware_list = mvme16x_get_hardware_list; 2881da177e4SLinus Torvalds 2891da177e4SLinus Torvalds /* Report board revision */ 2901da177e4SLinus Torvalds 2911da177e4SLinus Torvalds if (strncmp("BDID", p->bdid, 4)) 2921da177e4SLinus Torvalds { 2931da177e4SLinus Torvalds printk ("\n\nBug call .BRD_ID returned garbage - giving up\n\n"); 2941da177e4SLinus Torvalds while (1) 2951da177e4SLinus Torvalds ; 2961da177e4SLinus Torvalds } 2971da177e4SLinus Torvalds /* Board type is only set by newer versions of vmelilo/tftplilo */ 2981da177e4SLinus Torvalds if (vme_brdtype == 0) 299abe48101SGeert Uytterhoeven vme_brdtype = brdno; 3001da177e4SLinus Torvalds 3011da177e4SLinus Torvalds mvme16x_get_model(id); 3021da177e4SLinus Torvalds printk ("\nBRD_ID: %s BUG %x.%x %02x/%02x/%02x\n", id, p->rev>>4, 3031da177e4SLinus Torvalds p->rev&0xf, p->yr, p->mth, p->day); 304abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3051da177e4SLinus Torvalds { 3061da177e4SLinus Torvalds unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; 3071da177e4SLinus Torvalds 3081da177e4SLinus Torvalds mvme16x_config = rev | MVME16x_CONFIG_GOT_SCCA; 3091da177e4SLinus Torvalds 310abe48101SGeert Uytterhoeven printk ("MVME%x Hardware status:\n", brdno); 3111da177e4SLinus Torvalds printk (" CPU Type 68%s040\n", 3121da177e4SLinus Torvalds rev & MVME16x_CONFIG_GOT_FPU ? "" : "LC"); 3131da177e4SLinus Torvalds printk (" CPU clock %dMHz\n", 3141da177e4SLinus Torvalds rev & MVME16x_CONFIG_SPEED_32 ? 32 : 25); 3151da177e4SLinus Torvalds printk (" VMEchip2 %spresent\n", 3161da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_VMECHIP2 ? "NOT " : ""); 3171da177e4SLinus Torvalds printk (" SCSI interface %spresent\n", 3181da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_SCSICHIP ? "NOT " : ""); 3191da177e4SLinus Torvalds printk (" Ethernet interface %spresent\n", 3201da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_ETHERNET ? "NOT " : ""); 3211da177e4SLinus Torvalds } 3221da177e4SLinus Torvalds else 3231da177e4SLinus Torvalds { 3241da177e4SLinus Torvalds mvme16x_config = MVME16x_CONFIG_GOT_LP | MVME16x_CONFIG_GOT_CD2401; 3251da177e4SLinus Torvalds } 3261da177e4SLinus Torvalds } 3271da177e4SLinus Torvalds 3282850bc27SAl Viro static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) 3291da177e4SLinus Torvalds { 3301da177e4SLinus Torvalds unsigned long *new = (unsigned long *)vectors; 3311da177e4SLinus Torvalds unsigned long *old = (unsigned long *)0xffe00000; 3321da177e4SLinus Torvalds volatile unsigned char uc, *ucp; 333abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); 3341da177e4SLinus Torvalds 335abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3361da177e4SLinus Torvalds { 3371da177e4SLinus Torvalds ucp = (volatile unsigned char *)0xfff42043; 3381da177e4SLinus Torvalds uc = *ucp | 8; 3391da177e4SLinus Torvalds *ucp = uc; 3401da177e4SLinus Torvalds } 3411da177e4SLinus Torvalds else 3421da177e4SLinus Torvalds { 3431da177e4SLinus Torvalds *(volatile unsigned long *)0xfff40074 = 0x40000000; 3441da177e4SLinus Torvalds } 3451da177e4SLinus Torvalds *(new+4) = *(old+4); /* Illegal instruction */ 3461da177e4SLinus Torvalds *(new+9) = *(old+9); /* Trace */ 3471da177e4SLinus Torvalds *(new+47) = *(old+47); /* Trap #15 */ 3481da177e4SLinus Torvalds 349abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3501da177e4SLinus Torvalds *(new+0x5e) = *(old+0x5e); /* ABORT switch */ 3511da177e4SLinus Torvalds else 3521da177e4SLinus Torvalds *(new+0x6e) = *(old+0x6e); /* ABORT switch */ 3531da177e4SLinus Torvalds return IRQ_HANDLED; 3541da177e4SLinus Torvalds } 3551da177e4SLinus Torvalds 3562850bc27SAl Viro static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) 3571da177e4SLinus Torvalds { 3581da177e4SLinus Torvalds *(volatile unsigned char *)0xfff4201b |= 8; 3592850bc27SAl Viro return tick_handler(irq, dev_id); 3601da177e4SLinus Torvalds } 3611da177e4SLinus Torvalds 36240220c1aSDavid Howells void mvme16x_sched_init (irq_handler_t timer_routine) 3631da177e4SLinus Torvalds { 364abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); 3651da177e4SLinus Torvalds int irq; 3661da177e4SLinus Torvalds 3671da177e4SLinus Torvalds tick_handler = timer_routine; 3681da177e4SLinus Torvalds /* Using PCCchip2 or MC2 chip tick timer 1 */ 3691da177e4SLinus Torvalds *(volatile unsigned long *)0xfff42008 = 0; 3701da177e4SLinus Torvalds *(volatile unsigned long *)0xfff42004 = 10000; /* 10ms */ 3711da177e4SLinus Torvalds *(volatile unsigned char *)0xfff42017 |= 3; 3721da177e4SLinus Torvalds *(volatile unsigned char *)0xfff4201b = 0x16; 3731da177e4SLinus Torvalds if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, 3741da177e4SLinus Torvalds "timer", mvme16x_timer_int)) 3751da177e4SLinus Torvalds panic ("Couldn't register timer int"); 3761da177e4SLinus Torvalds 377abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3781da177e4SLinus Torvalds irq = MVME162_IRQ_ABORT; 3791da177e4SLinus Torvalds else 3801da177e4SLinus Torvalds irq = MVME167_IRQ_ABORT; 3811da177e4SLinus Torvalds if (request_irq(irq, mvme16x_abort_int, 0, 3821da177e4SLinus Torvalds "abort", mvme16x_abort_int)) 3831da177e4SLinus Torvalds panic ("Couldn't register abort int"); 3841da177e4SLinus Torvalds } 3851da177e4SLinus Torvalds 3861da177e4SLinus Torvalds 3871da177e4SLinus Torvalds /* This is always executed with interrupts disabled. */ 388c8d5ba18SStephen Warren u32 mvme16x_gettimeoffset(void) 3891da177e4SLinus Torvalds { 390c8d5ba18SStephen Warren return (*(volatile u32 *)0xfff42008) * 1000; 3911da177e4SLinus Torvalds } 3921da177e4SLinus Torvalds 3931da177e4SLinus Torvalds int bcd2int (unsigned char b) 3941da177e4SLinus Torvalds { 3951da177e4SLinus Torvalds return ((b>>4)*10 + (b&15)); 3961da177e4SLinus Torvalds } 3971da177e4SLinus Torvalds 3981da177e4SLinus Torvalds int mvme16x_hwclk(int op, struct rtc_time *t) 3991da177e4SLinus Torvalds { 4001da177e4SLinus Torvalds #warning check me! 4011da177e4SLinus Torvalds if (!op) { 4021da177e4SLinus Torvalds rtc->ctrl = RTC_READ; 4031da177e4SLinus Torvalds t->tm_year = bcd2int (rtc->bcd_year); 4041da177e4SLinus Torvalds t->tm_mon = bcd2int (rtc->bcd_mth); 4051da177e4SLinus Torvalds t->tm_mday = bcd2int (rtc->bcd_dom); 4061da177e4SLinus Torvalds t->tm_hour = bcd2int (rtc->bcd_hr); 4071da177e4SLinus Torvalds t->tm_min = bcd2int (rtc->bcd_min); 4081da177e4SLinus Torvalds t->tm_sec = bcd2int (rtc->bcd_sec); 4091da177e4SLinus Torvalds rtc->ctrl = 0; 4101da177e4SLinus Torvalds } 4111da177e4SLinus Torvalds return 0; 4121da177e4SLinus Torvalds } 4131da177e4SLinus Torvalds 4141da177e4SLinus Torvalds int mvme16x_set_clock_mmss (unsigned long nowtime) 4151da177e4SLinus Torvalds { 4161da177e4SLinus Torvalds return 0; 4171da177e4SLinus Torvalds } 4181da177e4SLinus Torvalds 419