Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | // SPDX-License-Identifier: GPL-2.0-only /* * Carsten Langgaard, carstenl@mips.com * Copyright (C) 1999 MIPS Technologies, Inc. All rights reserved. * * Thomas Horsten <thh@lasat.com> * Copyright (C) 2000 LASAT Networks A/S. * * Brian Murphy <brian@murphy.dk> * * Lasat specific setup. */ #include <linux/init.h> #include <linux/sched.h> #include <linux/pci.h> #include <linux/interrupt.h> #include <linux/tty.h> #include <asm/time.h> #include <asm/cpu.h> #include <asm/bootinfo.h> #include <asm/irq.h> #include <asm/lasat/lasat.h> #include <asm/lasat/serial.h> #ifdef CONFIG_PICVUE #include <linux/notifier.h> #endif #include "ds1603.h" #include <asm/lasat/ds1603.h> #include <asm/lasat/picvue.h> #include <asm/lasat/eeprom.h> #include "prom.h" int lasat_command_line; void lasatint_init(void); extern void lasat_reboot_setup(void); extern void pcisetup(void); extern void edhac_init(void *, void *, void *); extern void addrflt_init(void); struct lasat_misc lasat_misc_info[N_MACHTYPES] = { { .reset_reg = (void *)KSEG1ADDR(0x1c840000), .flash_wp_reg = (void *)KSEG1ADDR(0x1c800000), 2 }, { .reset_reg = (void *)KSEG1ADDR(0x11080000), .flash_wp_reg = (void *)KSEG1ADDR(0x11000000), 6 } }; struct lasat_misc *lasat_misc; #ifdef CONFIG_DS1603 static struct ds_defs ds_defs[N_MACHTYPES] = { { (void *)DS1603_REG_100, (void *)DS1603_REG_100, DS1603_RST_100, DS1603_CLK_100, DS1603_DATA_100, DS1603_DATA_SHIFT_100, 0, 0 }, { (void *)DS1603_REG_200, (void *)DS1603_DATA_REG_200, DS1603_RST_200, DS1603_CLK_200, DS1603_DATA_200, DS1603_DATA_READ_SHIFT_200, 1, 2000 } }; #endif #ifdef CONFIG_PICVUE #include "picvue.h" static struct pvc_defs pvc_defs[N_MACHTYPES] = { { (void *)PVC_REG_100, PVC_DATA_SHIFT_100, PVC_DATA_M_100, PVC_E_100, PVC_RW_100, PVC_RS_100 }, { (void *)PVC_REG_200, PVC_DATA_SHIFT_200, PVC_DATA_M_200, PVC_E_200, PVC_RW_200, PVC_RS_200 } }; #endif static int lasat_panic_display(struct notifier_block *this, unsigned long event, void *ptr) { #ifdef CONFIG_PICVUE unsigned char *string = ptr; if (string == NULL) string = "Kernel Panic"; pvc_dump_string(string); #endif return NOTIFY_DONE; } static int lasat_panic_prom_monitor(struct notifier_block *this, unsigned long event, void *ptr) { prom_monitor(); return NOTIFY_DONE; } static struct notifier_block lasat_panic_block[] = { { .notifier_call = lasat_panic_display, .priority = INT_MAX }, { .notifier_call = lasat_panic_prom_monitor, .priority = INT_MIN } }; void __init plat_time_init(void) { mips_hpt_frequency = lasat_board_info.li_cpu_hz / 2; change_c0_status(ST0_IM, IE_IRQ0); } void __init plat_mem_setup(void) { int i; int lasat_type = IS_LASAT_200() ? 1 : 0; lasat_misc = &lasat_misc_info[lasat_type]; #ifdef CONFIG_PICVUE picvue = &pvc_defs[lasat_type]; #endif /* Set up panic notifier */ for (i = 0; i < ARRAY_SIZE(lasat_panic_block); i++) atomic_notifier_chain_register(&panic_notifier_list, &lasat_panic_block[i]); lasat_reboot_setup(); #ifdef CONFIG_DS1603 ds1603 = &ds_defs[lasat_type]; #endif #ifdef DYNAMIC_SERIAL_INIT serial_init(); #endif pr_info("Lasat specific initialization complete\n"); } |