|  | // 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"); | 
|  | } |