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 
imx7ulp_enter_wait(struct cpuidle_device * dev,struct cpuidle_driver * drv,int index)15*26388a7cSPeter Zijlstra static __cpuidle 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 
imx7ulp_cpuidle_init(void)576d45a402SAnson Huang int __init imx7ulp_cpuidle_init(void)
586d45a402SAnson Huang {
596d45a402SAnson Huang 	return cpuidle_register(&imx7ulp_cpuidle_driver, NULL);
606d45a402SAnson Huang }
61