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/machdep.h> 391da177e4SLinus Torvalds #include <asm/mvme16xhw.h> 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds extern t_bdid mvme_bdid; 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds static MK48T08ptr_t volatile rtc = (MK48T08ptr_t)MVME_RTC_BASE; 441da177e4SLinus Torvalds 451da177e4SLinus Torvalds static void mvme16x_get_model(char *model); 4640220c1aSDavid Howells extern void mvme16x_sched_init(irq_handler_t handler); 47c8d5ba18SStephen Warren extern u32 mvme16x_gettimeoffset(void); 481da177e4SLinus Torvalds extern int mvme16x_hwclk (int, struct rtc_time *); 491da177e4SLinus Torvalds extern int mvme16x_set_clock_mmss (unsigned long); 501da177e4SLinus Torvalds extern void mvme16x_reset (void); 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds int bcd2int (unsigned char b); 531da177e4SLinus Torvalds 54e53f276bSTorben Hohn /* Save tick handler routine pointer, will point to xtime_update() in 55e53f276bSTorben Hohn * kernel/time/timekeeping.c, called via mvme16x_process_int() */ 561da177e4SLinus Torvalds 5740220c1aSDavid Howells static irq_handler_t tick_handler; 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds unsigned short mvme16x_config; 61612e484fSAdrian Bunk EXPORT_SYMBOL(mvme16x_config); 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds 64a4df02a2SGeert Uytterhoeven int __init mvme16x_parse_bootinfo(const struct bi_record *bi) 651da177e4SLinus Torvalds { 66abe48101SGeert Uytterhoeven uint16_t tag = be16_to_cpu(bi->tag); 67abe48101SGeert Uytterhoeven if (tag == BI_VME_TYPE || tag == BI_VME_BRDINFO) 681da177e4SLinus Torvalds return 0; 691da177e4SLinus Torvalds else 701da177e4SLinus Torvalds return 1; 711da177e4SLinus Torvalds } 721da177e4SLinus Torvalds 731da177e4SLinus Torvalds void mvme16x_reset(void) 741da177e4SLinus Torvalds { 753c8bc6b7SGeert Uytterhoeven pr_info("\r\n\nCalled mvme16x_reset\r\n" 761da177e4SLinus Torvalds "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"); 771da177e4SLinus Torvalds /* The string of returns is to delay the reset until the whole 781da177e4SLinus Torvalds * message is output. Assert reset bit in GCSR */ 791da177e4SLinus Torvalds *(volatile char *)0xfff40107 = 0x80; 801da177e4SLinus Torvalds } 811da177e4SLinus Torvalds 821da177e4SLinus Torvalds static void mvme16x_get_model(char *model) 831da177e4SLinus Torvalds { 841da177e4SLinus Torvalds p_bdid p = &mvme_bdid; 851da177e4SLinus Torvalds char suf[4]; 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds suf[1] = p->brdsuffix[0]; 881da177e4SLinus Torvalds suf[2] = p->brdsuffix[1]; 891da177e4SLinus Torvalds suf[3] = '\0'; 901da177e4SLinus Torvalds suf[0] = suf[1] ? '-' : '\0'; 911da177e4SLinus Torvalds 92abe48101SGeert Uytterhoeven sprintf(model, "Motorola MVME%x%s", be16_to_cpu(p->brdno), suf); 931da177e4SLinus Torvalds } 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds 96813dcf7aSAlexey Dobriyan static void mvme16x_get_hardware_list(struct seq_file *m) 971da177e4SLinus Torvalds { 98abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); 991da177e4SLinus Torvalds 100abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x0172) 1011da177e4SLinus Torvalds { 1021da177e4SLinus Torvalds unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; 1031da177e4SLinus Torvalds 104813dcf7aSAlexey Dobriyan seq_printf (m, "VMEchip2 %spresent\n", 1051da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_VMECHIP2 ? "NOT " : ""); 106813dcf7aSAlexey Dobriyan seq_printf (m, "SCSI interface %spresent\n", 1071da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_SCSICHIP ? "NOT " : ""); 108813dcf7aSAlexey Dobriyan seq_printf (m, "Ethernet i/f %spresent\n", 1091da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_ETHERNET ? "NOT " : ""); 1101da177e4SLinus Torvalds } 1111da177e4SLinus Torvalds } 1121da177e4SLinus Torvalds 113200a3d35SRoman Zippel /* 114200a3d35SRoman Zippel * This function is called during kernel startup to initialize 115200a3d35SRoman Zippel * the mvme16x IRQ handling routines. Should probably ensure 116200a3d35SRoman Zippel * that the base vectors for the VMEChip2 and PCCChip2 are valid. 117200a3d35SRoman Zippel */ 118200a3d35SRoman Zippel 11966a3f820SAl Viro static void __init mvme16x_init_IRQ (void) 120200a3d35SRoman Zippel { 121f30a6484SGeert Uytterhoeven m68k_setup_user_interrupt(VEC_USER, 192); 122200a3d35SRoman Zippel } 1231da177e4SLinus Torvalds 1241da177e4SLinus Torvalds #define pcc2chip ((volatile u_char *)0xfff42000) 1251da177e4SLinus Torvalds #define PccSCCMICR 0x1d 1261da177e4SLinus Torvalds #define PccSCCTICR 0x1e 1271da177e4SLinus Torvalds #define PccSCCRICR 0x1f 128f9994894SKars de Jong #define PccTPIACKR 0x25 129f9994894SKars de Jong 130f9994894SKars de Jong #ifdef CONFIG_EARLY_PRINTK 131f9994894SKars de Jong 132f9994894SKars de Jong /**** cd2401 registers ****/ 133f9994894SKars de Jong #define CD2401_ADDR (0xfff45000) 134f9994894SKars de Jong 135f9994894SKars de Jong #define CyGFRCR (0x81) 136f9994894SKars de Jong #define CyCCR (0x13) 137f9994894SKars de Jong #define CyCLR_CHAN (0x40) 138f9994894SKars de Jong #define CyINIT_CHAN (0x20) 139f9994894SKars de Jong #define CyCHIP_RESET (0x10) 140f9994894SKars de Jong #define CyENB_XMTR (0x08) 141f9994894SKars de Jong #define CyDIS_XMTR (0x04) 142f9994894SKars de Jong #define CyENB_RCVR (0x02) 143f9994894SKars de Jong #define CyDIS_RCVR (0x01) 144f9994894SKars de Jong #define CyCAR (0xee) 145f9994894SKars de Jong #define CyIER (0x11) 146f9994894SKars de Jong #define CyMdmCh (0x80) 147f9994894SKars de Jong #define CyRxExc (0x20) 148f9994894SKars de Jong #define CyRxData (0x08) 149f9994894SKars de Jong #define CyTxMpty (0x02) 150f9994894SKars de Jong #define CyTxRdy (0x01) 151f9994894SKars de Jong #define CyLICR (0x26) 152f9994894SKars de Jong #define CyRISR (0x89) 153f9994894SKars de Jong #define CyTIMEOUT (0x80) 154f9994894SKars de Jong #define CySPECHAR (0x70) 155f9994894SKars de Jong #define CyOVERRUN (0x08) 156f9994894SKars de Jong #define CyPARITY (0x04) 157f9994894SKars de Jong #define CyFRAME (0x02) 158f9994894SKars de Jong #define CyBREAK (0x01) 159f9994894SKars de Jong #define CyREOIR (0x84) 160f9994894SKars de Jong #define CyTEOIR (0x85) 161f9994894SKars de Jong #define CyMEOIR (0x86) 162f9994894SKars de Jong #define CyNOTRANS (0x08) 163f9994894SKars de Jong #define CyRFOC (0x30) 164f9994894SKars de Jong #define CyRDR (0xf8) 165f9994894SKars de Jong #define CyTDR (0xf8) 166f9994894SKars de Jong #define CyMISR (0x8b) 167f9994894SKars de Jong #define CyRISR (0x89) 168f9994894SKars de Jong #define CyTISR (0x8a) 169f9994894SKars de Jong #define CyMSVR1 (0xde) 170f9994894SKars de Jong #define CyMSVR2 (0xdf) 171f9994894SKars de Jong #define CyDSR (0x80) 172f9994894SKars de Jong #define CyDCD (0x40) 173f9994894SKars de Jong #define CyCTS (0x20) 174f9994894SKars de Jong #define CyDTR (0x02) 175f9994894SKars de Jong #define CyRTS (0x01) 176f9994894SKars de Jong #define CyRTPRL (0x25) 177f9994894SKars de Jong #define CyRTPRH (0x24) 178f9994894SKars de Jong #define CyCOR1 (0x10) 179f9994894SKars de Jong #define CyPARITY_NONE (0x00) 180f9994894SKars de Jong #define CyPARITY_E (0x40) 181f9994894SKars de Jong #define CyPARITY_O (0xC0) 182f9994894SKars de Jong #define Cy_5_BITS (0x04) 183f9994894SKars de Jong #define Cy_6_BITS (0x05) 184f9994894SKars de Jong #define Cy_7_BITS (0x06) 185f9994894SKars de Jong #define Cy_8_BITS (0x07) 186f9994894SKars de Jong #define CyCOR2 (0x17) 187f9994894SKars de Jong #define CyETC (0x20) 188f9994894SKars de Jong #define CyCtsAE (0x02) 189f9994894SKars de Jong #define CyCOR3 (0x16) 190f9994894SKars de Jong #define Cy_1_STOP (0x02) 191f9994894SKars de Jong #define Cy_2_STOP (0x04) 192f9994894SKars de Jong #define CyCOR4 (0x15) 193f9994894SKars de Jong #define CyREC_FIFO (0x0F) /* Receive FIFO threshold */ 194f9994894SKars de Jong #define CyCOR5 (0x14) 195f9994894SKars de Jong #define CyCOR6 (0x18) 196f9994894SKars de Jong #define CyCOR7 (0x07) 197f9994894SKars de Jong #define CyRBPR (0xcb) 198f9994894SKars de Jong #define CyRCOR (0xc8) 199f9994894SKars de Jong #define CyTBPR (0xc3) 200f9994894SKars de Jong #define CyTCOR (0xc0) 201f9994894SKars de Jong #define CySCHR1 (0x1f) 202f9994894SKars de Jong #define CySCHR2 (0x1e) 203f9994894SKars de Jong #define CyTPR (0xda) 204f9994894SKars de Jong #define CyPILR1 (0xe3) 205f9994894SKars de Jong #define CyPILR2 (0xe0) 206f9994894SKars de Jong #define CyPILR3 (0xe1) 207f9994894SKars de Jong #define CyCMR (0x1b) 208f9994894SKars de Jong #define CyASYNC (0x02) 209f9994894SKars de Jong #define CyLICR (0x26) 210f9994894SKars de Jong #define CyLIVR (0x09) 211f9994894SKars de Jong #define CySCRL (0x23) 212f9994894SKars de Jong #define CySCRH (0x22) 213f9994894SKars de Jong #define CyTFTC (0x80) 214f9994894SKars de Jong 215c46f46d0SFinn Thain void mvme16x_cons_write(struct console *co, const char *str, unsigned count) 216f9994894SKars de Jong { 217f9994894SKars de Jong volatile unsigned char *base_addr = (u_char *)CD2401_ADDR; 218f9994894SKars de Jong volatile u_char sink; 219f9994894SKars de Jong u_char ier; 220f9994894SKars de Jong int port; 221f9994894SKars de Jong u_char do_lf = 0; 222f9994894SKars de Jong int i = 0; 223f9994894SKars de Jong 224f9994894SKars de Jong /* Ensure transmitter is enabled! */ 225f9994894SKars de Jong 226f9994894SKars de Jong port = 0; 227f9994894SKars de Jong base_addr[CyCAR] = (u_char)port; 228f9994894SKars de Jong while (base_addr[CyCCR]) 229f9994894SKars de Jong ; 230f9994894SKars de Jong base_addr[CyCCR] = CyENB_XMTR; 231f9994894SKars de Jong 232f9994894SKars de Jong ier = base_addr[CyIER]; 233f9994894SKars de Jong base_addr[CyIER] = CyTxMpty; 234f9994894SKars de Jong 235f9994894SKars de Jong while (1) { 236f9994894SKars de Jong if (pcc2chip[PccSCCTICR] & 0x20) 237f9994894SKars de Jong { 238f9994894SKars de Jong /* We have a Tx int. Acknowledge it */ 239f9994894SKars de Jong sink = pcc2chip[PccTPIACKR]; 240f9994894SKars de Jong if ((base_addr[CyLICR] >> 2) == port) { 241f9994894SKars de Jong if (i == count) { 242f9994894SKars de Jong /* Last char of string is now output */ 243f9994894SKars de Jong base_addr[CyTEOIR] = CyNOTRANS; 244f9994894SKars de Jong break; 245f9994894SKars de Jong } 246f9994894SKars de Jong if (do_lf) { 247f9994894SKars de Jong base_addr[CyTDR] = '\n'; 248f9994894SKars de Jong str++; 249f9994894SKars de Jong i++; 250f9994894SKars de Jong do_lf = 0; 251f9994894SKars de Jong } 252f9994894SKars de Jong else if (*str == '\n') { 253f9994894SKars de Jong base_addr[CyTDR] = '\r'; 254f9994894SKars de Jong do_lf = 1; 255f9994894SKars de Jong } 256f9994894SKars de Jong else { 257f9994894SKars de Jong base_addr[CyTDR] = *str++; 258f9994894SKars de Jong i++; 259f9994894SKars de Jong } 260f9994894SKars de Jong base_addr[CyTEOIR] = 0; 261f9994894SKars de Jong } 262f9994894SKars de Jong else 263f9994894SKars de Jong base_addr[CyTEOIR] = CyNOTRANS; 264f9994894SKars de Jong } 265f9994894SKars de Jong } 266f9994894SKars de Jong 267f9994894SKars de Jong base_addr[CyIER] = ier; 268f9994894SKars de Jong } 269f9994894SKars de Jong 270f9994894SKars de Jong #endif 2711da177e4SLinus Torvalds 2721da177e4SLinus Torvalds void __init config_mvme16x(void) 2731da177e4SLinus Torvalds { 2741da177e4SLinus Torvalds p_bdid p = &mvme_bdid; 2751da177e4SLinus Torvalds char id[40]; 276abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(p->brdno); 2771da177e4SLinus Torvalds 2781da177e4SLinus Torvalds mach_max_dma_address = 0xffffffff; 2791da177e4SLinus Torvalds mach_sched_init = mvme16x_sched_init; 2801da177e4SLinus Torvalds mach_init_IRQ = mvme16x_init_IRQ; 281c8d5ba18SStephen Warren arch_gettimeoffset = mvme16x_gettimeoffset; 2821da177e4SLinus Torvalds mach_hwclk = mvme16x_hwclk; 2831da177e4SLinus Torvalds mach_set_clock_mmss = mvme16x_set_clock_mmss; 2841da177e4SLinus Torvalds mach_reset = mvme16x_reset; 2851da177e4SLinus Torvalds mach_get_model = mvme16x_get_model; 2861da177e4SLinus Torvalds mach_get_hardware_list = mvme16x_get_hardware_list; 2871da177e4SLinus Torvalds 2881da177e4SLinus Torvalds /* Report board revision */ 2891da177e4SLinus Torvalds 2901da177e4SLinus Torvalds if (strncmp("BDID", p->bdid, 4)) 2911da177e4SLinus Torvalds { 2923c8bc6b7SGeert Uytterhoeven pr_crit("Bug call .BRD_ID returned garbage - giving up\n"); 2931da177e4SLinus Torvalds while (1) 2941da177e4SLinus Torvalds ; 2951da177e4SLinus Torvalds } 2961da177e4SLinus Torvalds /* Board type is only set by newer versions of vmelilo/tftplilo */ 2971da177e4SLinus Torvalds if (vme_brdtype == 0) 298abe48101SGeert Uytterhoeven vme_brdtype = brdno; 2991da177e4SLinus Torvalds 3001da177e4SLinus Torvalds mvme16x_get_model(id); 3013c8bc6b7SGeert Uytterhoeven pr_info("BRD_ID: %s BUG %x.%x %02x/%02x/%02x\n", id, p->rev >> 4, 3021da177e4SLinus Torvalds p->rev & 0xf, p->yr, p->mth, p->day); 303abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3041da177e4SLinus Torvalds { 3051da177e4SLinus Torvalds unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; 3061da177e4SLinus Torvalds 3071da177e4SLinus Torvalds mvme16x_config = rev | MVME16x_CONFIG_GOT_SCCA; 3081da177e4SLinus Torvalds 3093c8bc6b7SGeert Uytterhoeven pr_info("MVME%x Hardware status:\n", brdno); 3103c8bc6b7SGeert Uytterhoeven pr_info(" CPU Type 68%s040\n", 3111da177e4SLinus Torvalds rev & MVME16x_CONFIG_GOT_FPU ? "" : "LC"); 3123c8bc6b7SGeert Uytterhoeven pr_info(" CPU clock %dMHz\n", 3131da177e4SLinus Torvalds rev & MVME16x_CONFIG_SPEED_32 ? 32 : 25); 3143c8bc6b7SGeert Uytterhoeven pr_info(" VMEchip2 %spresent\n", 3151da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_VMECHIP2 ? "NOT " : ""); 3163c8bc6b7SGeert Uytterhoeven pr_info(" SCSI interface %spresent\n", 3171da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_SCSICHIP ? "NOT " : ""); 3183c8bc6b7SGeert Uytterhoeven pr_info(" Ethernet interface %spresent\n", 3191da177e4SLinus Torvalds rev & MVME16x_CONFIG_NO_ETHERNET ? "NOT " : ""); 3201da177e4SLinus Torvalds } 3211da177e4SLinus Torvalds else 3221da177e4SLinus Torvalds { 3231da177e4SLinus Torvalds mvme16x_config = MVME16x_CONFIG_GOT_LP | MVME16x_CONFIG_GOT_CD2401; 3241da177e4SLinus Torvalds } 3251da177e4SLinus Torvalds } 3261da177e4SLinus Torvalds 3272850bc27SAl Viro static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) 3281da177e4SLinus Torvalds { 3291da177e4SLinus Torvalds unsigned long *new = (unsigned long *)vectors; 3301da177e4SLinus Torvalds unsigned long *old = (unsigned long *)0xffe00000; 3311da177e4SLinus Torvalds volatile unsigned char uc, *ucp; 332abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); 3331da177e4SLinus Torvalds 334abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3351da177e4SLinus Torvalds { 3361da177e4SLinus Torvalds ucp = (volatile unsigned char *)0xfff42043; 3371da177e4SLinus Torvalds uc = *ucp | 8; 3381da177e4SLinus Torvalds *ucp = uc; 3391da177e4SLinus Torvalds } 3401da177e4SLinus Torvalds else 3411da177e4SLinus Torvalds { 3421da177e4SLinus Torvalds *(volatile unsigned long *)0xfff40074 = 0x40000000; 3431da177e4SLinus Torvalds } 3441da177e4SLinus Torvalds *(new+4) = *(old+4); /* Illegal instruction */ 3451da177e4SLinus Torvalds *(new+9) = *(old+9); /* Trace */ 3461da177e4SLinus Torvalds *(new+47) = *(old+47); /* Trap #15 */ 3471da177e4SLinus Torvalds 348abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3491da177e4SLinus Torvalds *(new+0x5e) = *(old+0x5e); /* ABORT switch */ 3501da177e4SLinus Torvalds else 3511da177e4SLinus Torvalds *(new+0x6e) = *(old+0x6e); /* ABORT switch */ 3521da177e4SLinus Torvalds return IRQ_HANDLED; 3531da177e4SLinus Torvalds } 3541da177e4SLinus Torvalds 3552850bc27SAl Viro static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) 3561da177e4SLinus Torvalds { 3571da177e4SLinus Torvalds *(volatile unsigned char *)0xfff4201b |= 8; 3582850bc27SAl Viro return tick_handler(irq, dev_id); 3591da177e4SLinus Torvalds } 3601da177e4SLinus Torvalds 36140220c1aSDavid Howells void mvme16x_sched_init (irq_handler_t timer_routine) 3621da177e4SLinus Torvalds { 363abe48101SGeert Uytterhoeven uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); 3641da177e4SLinus Torvalds int irq; 3651da177e4SLinus Torvalds 3661da177e4SLinus Torvalds tick_handler = timer_routine; 3671da177e4SLinus Torvalds /* Using PCCchip2 or MC2 chip tick timer 1 */ 3681da177e4SLinus Torvalds *(volatile unsigned long *)0xfff42008 = 0; 3691da177e4SLinus Torvalds *(volatile unsigned long *)0xfff42004 = 10000; /* 10ms */ 3701da177e4SLinus Torvalds *(volatile unsigned char *)0xfff42017 |= 3; 3711da177e4SLinus Torvalds *(volatile unsigned char *)0xfff4201b = 0x16; 3721da177e4SLinus Torvalds if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, 3731da177e4SLinus Torvalds "timer", mvme16x_timer_int)) 3741da177e4SLinus Torvalds panic ("Couldn't register timer int"); 3751da177e4SLinus Torvalds 376abe48101SGeert Uytterhoeven if (brdno == 0x0162 || brdno == 0x172) 3771da177e4SLinus Torvalds irq = MVME162_IRQ_ABORT; 3781da177e4SLinus Torvalds else 3791da177e4SLinus Torvalds irq = MVME167_IRQ_ABORT; 3801da177e4SLinus Torvalds if (request_irq(irq, mvme16x_abort_int, 0, 3811da177e4SLinus Torvalds "abort", mvme16x_abort_int)) 3821da177e4SLinus Torvalds panic ("Couldn't register abort int"); 3831da177e4SLinus Torvalds } 3841da177e4SLinus Torvalds 3851da177e4SLinus Torvalds 3861da177e4SLinus Torvalds /* This is always executed with interrupts disabled. */ 387c8d5ba18SStephen Warren u32 mvme16x_gettimeoffset(void) 3881da177e4SLinus Torvalds { 389c8d5ba18SStephen Warren return (*(volatile u32 *)0xfff42008) * 1000; 3901da177e4SLinus Torvalds } 3911da177e4SLinus Torvalds 3921da177e4SLinus Torvalds int bcd2int (unsigned char b) 3931da177e4SLinus Torvalds { 3941da177e4SLinus Torvalds return ((b>>4)*10 + (b&15)); 3951da177e4SLinus Torvalds } 3961da177e4SLinus Torvalds 3971da177e4SLinus Torvalds int mvme16x_hwclk(int op, struct rtc_time *t) 3981da177e4SLinus Torvalds { 3991da177e4SLinus Torvalds #warning check me! 4001da177e4SLinus Torvalds if (!op) { 4011da177e4SLinus Torvalds rtc->ctrl = RTC_READ; 4021da177e4SLinus Torvalds t->tm_year = bcd2int (rtc->bcd_year); 4031da177e4SLinus Torvalds t->tm_mon = bcd2int (rtc->bcd_mth); 4041da177e4SLinus Torvalds t->tm_mday = bcd2int (rtc->bcd_dom); 4051da177e4SLinus Torvalds t->tm_hour = bcd2int (rtc->bcd_hr); 4061da177e4SLinus Torvalds t->tm_min = bcd2int (rtc->bcd_min); 4071da177e4SLinus Torvalds t->tm_sec = bcd2int (rtc->bcd_sec); 4081da177e4SLinus Torvalds rtc->ctrl = 0; 4091da177e4SLinus Torvalds } 4101da177e4SLinus Torvalds return 0; 4111da177e4SLinus Torvalds } 4121da177e4SLinus Torvalds 4131da177e4SLinus Torvalds int mvme16x_set_clock_mmss (unsigned long nowtime) 4141da177e4SLinus Torvalds { 4151da177e4SLinus Torvalds return 0; 4161da177e4SLinus Torvalds } 4171da177e4SLinus Torvalds 418