1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Joshua Henderson <joshua.henderson@microchip.com> 4 * Copyright (C) 2015 Microchip Technology Inc. All rights reserved. 5 */ 6 #include <linux/init.h> 7 #include <linux/pm.h> 8 #include <asm/reboot.h> 9 #include <asm/mach-pic32/pic32.h> 10 11 #define PIC32_RSWRST 0x10 12 13 static void pic32_halt(void) 14 { 15 while (1) { 16 __asm__(".set push;\n" 17 ".set arch=r4000;\n" 18 "wait;\n" 19 ".set pop;\n" 20 ); 21 } 22 } 23 24 static void pic32_machine_restart(char *command) 25 { 26 void __iomem *reg = 27 ioremap(PIC32_BASE_RESET + PIC32_RSWRST, sizeof(u32)); 28 29 pic32_syskey_unlock(); 30 31 /* magic write/read */ 32 __raw_writel(1, reg); 33 (void)__raw_readl(reg); 34 35 pic32_halt(); 36 } 37 38 static void pic32_machine_halt(void) 39 { 40 local_irq_disable(); 41 42 pic32_halt(); 43 } 44 45 static int __init mips_reboot_setup(void) 46 { 47 _machine_restart = pic32_machine_restart; 48 _machine_halt = pic32_machine_halt; 49 pm_power_off = pic32_machine_halt; 50 51 return 0; 52 } 53 54 arch_initcall(mips_reboot_setup); 55