17eb7819aSQing Zhang // SPDX-License-Identifier: GPL-2.0 27eb7819aSQing Zhang /* 37eb7819aSQing Zhang * Copyright (C) 2021, Qing Zhang <zhangqing@loongson.cn> 47eb7819aSQing Zhang * Loongson-2K1000 reset support 57eb7819aSQing Zhang */ 67eb7819aSQing Zhang 77eb7819aSQing Zhang #include <linux/of_address.h> 87eb7819aSQing Zhang #include <linux/pm.h> 97eb7819aSQing Zhang #include <asm/reboot.h> 107eb7819aSQing Zhang 117eb7819aSQing Zhang #define PM1_STS 0x0c /* Power Management 1 Status Register */ 127eb7819aSQing Zhang #define PM1_CNT 0x14 /* Power Management 1 Control Register */ 137eb7819aSQing Zhang #define RST_CNT 0x30 /* Reset Control Register */ 147eb7819aSQing Zhang 157eb7819aSQing Zhang static void __iomem *base; 167eb7819aSQing Zhang ls2k_restart(char * command)177eb7819aSQing Zhangstatic void ls2k_restart(char *command) 187eb7819aSQing Zhang { 197eb7819aSQing Zhang writel(0x1, base + RST_CNT); 207eb7819aSQing Zhang } 217eb7819aSQing Zhang ls2k_poweroff(void)227eb7819aSQing Zhangstatic void ls2k_poweroff(void) 237eb7819aSQing Zhang { 247eb7819aSQing Zhang /* Clear */ 257eb7819aSQing Zhang writel((readl(base + PM1_STS) & 0xffffffff), base + PM1_STS); 267eb7819aSQing Zhang /* Sleep Enable | Soft Off*/ 277eb7819aSQing Zhang writel(GENMASK(12, 10) | BIT(13), base + PM1_CNT); 287eb7819aSQing Zhang } 297eb7819aSQing Zhang ls2k_reset_init(void)307eb7819aSQing Zhangstatic int ls2k_reset_init(void) 317eb7819aSQing Zhang { 327eb7819aSQing Zhang struct device_node *np; 337eb7819aSQing Zhang 347eb7819aSQing Zhang np = of_find_compatible_node(NULL, NULL, "loongson,ls2k-pm"); 357eb7819aSQing Zhang if (!np) { 367eb7819aSQing Zhang pr_info("Failed to get PM node\n"); 377eb7819aSQing Zhang return -ENODEV; 387eb7819aSQing Zhang } 397eb7819aSQing Zhang 407eb7819aSQing Zhang base = of_iomap(np, 0); 41*a029ccc8SYang Yingliang of_node_put(np); 427eb7819aSQing Zhang if (!base) { 437eb7819aSQing Zhang pr_info("Failed to map PM register base address\n"); 447eb7819aSQing Zhang return -ENOMEM; 457eb7819aSQing Zhang } 467eb7819aSQing Zhang 477eb7819aSQing Zhang _machine_restart = ls2k_restart; 487eb7819aSQing Zhang pm_power_off = ls2k_poweroff; 497eb7819aSQing Zhang 507eb7819aSQing Zhang return 0; 517eb7819aSQing Zhang } 527eb7819aSQing Zhang 537eb7819aSQing Zhang arch_initcall(ls2k_reset_init); 54