16d45a402SAnson Huang // SPDX-License-Identifier: GPL-2.0+ 26d45a402SAnson Huang /* 36d45a402SAnson Huang * Copyright (C) 2016 Freescale Semiconductor, Inc. 46d45a402SAnson Huang * Copyright 2017-2018 NXP 56d45a402SAnson Huang * Anson Huang <Anson.Huang@nxp.com> 66d45a402SAnson Huang */ 76d45a402SAnson Huang 86d45a402SAnson Huang #include <linux/cpuidle.h> 96d45a402SAnson Huang #include <linux/module.h> 106d45a402SAnson Huang #include <asm/cpuidle.h> 116d45a402SAnson Huang 126d45a402SAnson Huang #include "common.h" 136d45a402SAnson Huang #include "cpuidle.h" 146d45a402SAnson Huang 156d45a402SAnson Huang static int imx7ulp_enter_wait(struct cpuidle_device *dev, 166d45a402SAnson Huang struct cpuidle_driver *drv, int index) 176d45a402SAnson Huang { 186d45a402SAnson Huang if (index == 1) 196d45a402SAnson Huang imx7ulp_set_lpm(ULP_PM_WAIT); 206d45a402SAnson Huang else 216d45a402SAnson Huang imx7ulp_set_lpm(ULP_PM_STOP); 226d45a402SAnson Huang 236d45a402SAnson Huang cpu_do_idle(); 246d45a402SAnson Huang 256d45a402SAnson Huang imx7ulp_set_lpm(ULP_PM_RUN); 266d45a402SAnson Huang 276d45a402SAnson Huang return index; 286d45a402SAnson Huang } 296d45a402SAnson Huang 306d45a402SAnson Huang static struct cpuidle_driver imx7ulp_cpuidle_driver = { 316d45a402SAnson Huang .name = "imx7ulp_cpuidle", 326d45a402SAnson Huang .owner = THIS_MODULE, 336d45a402SAnson Huang .states = { 346d45a402SAnson Huang /* WFI */ 356d45a402SAnson Huang ARM_CPUIDLE_WFI_STATE, 366d45a402SAnson Huang /* WAIT */ 376d45a402SAnson Huang { 386d45a402SAnson Huang .exit_latency = 50, 396d45a402SAnson Huang .target_residency = 75, 406d45a402SAnson Huang .enter = imx7ulp_enter_wait, 416d45a402SAnson Huang .name = "WAIT", 426d45a402SAnson Huang .desc = "PSTOP2", 436d45a402SAnson Huang }, 446d45a402SAnson Huang /* STOP */ 456d45a402SAnson Huang { 466d45a402SAnson Huang .exit_latency = 100, 476d45a402SAnson Huang .target_residency = 150, 486d45a402SAnson Huang .enter = imx7ulp_enter_wait, 496d45a402SAnson Huang .name = "STOP", 506d45a402SAnson Huang .desc = "PSTOP1", 516d45a402SAnson Huang }, 526d45a402SAnson Huang }, 536d45a402SAnson Huang .state_count = 3, 546d45a402SAnson Huang .safe_state_index = 0, 556d45a402SAnson Huang }; 566d45a402SAnson Huang 576d45a402SAnson Huang int __init imx7ulp_cpuidle_init(void) 586d45a402SAnson Huang { 596d45a402SAnson Huang return cpuidle_register(&imx7ulp_cpuidle_driver, NULL); 606d45a402SAnson Huang } 61