18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2014 Freescale Semiconductor, Inc. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/cpuidle.h> 78c2ecf20Sopenharmony_ci#include <linux/module.h> 88c2ecf20Sopenharmony_ci#include <asm/cpuidle.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "common.h" 118c2ecf20Sopenharmony_ci#include "cpuidle.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistatic int imx6sl_enter_wait(struct cpuidle_device *dev, 148c2ecf20Sopenharmony_ci struct cpuidle_driver *drv, int index) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci imx6_set_lpm(WAIT_UNCLOCKED); 178c2ecf20Sopenharmony_ci /* 188c2ecf20Sopenharmony_ci * Software workaround for ERR005311, see function 198c2ecf20Sopenharmony_ci * description for details. 208c2ecf20Sopenharmony_ci */ 218c2ecf20Sopenharmony_ci imx6sl_set_wait_clk(true); 228c2ecf20Sopenharmony_ci cpu_do_idle(); 238c2ecf20Sopenharmony_ci imx6sl_set_wait_clk(false); 248c2ecf20Sopenharmony_ci imx6_set_lpm(WAIT_CLOCKED); 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci return index; 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic struct cpuidle_driver imx6sl_cpuidle_driver = { 308c2ecf20Sopenharmony_ci .name = "imx6sl_cpuidle", 318c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 328c2ecf20Sopenharmony_ci .states = { 338c2ecf20Sopenharmony_ci /* WFI */ 348c2ecf20Sopenharmony_ci ARM_CPUIDLE_WFI_STATE, 358c2ecf20Sopenharmony_ci /* WAIT */ 368c2ecf20Sopenharmony_ci { 378c2ecf20Sopenharmony_ci .exit_latency = 50, 388c2ecf20Sopenharmony_ci .target_residency = 75, 398c2ecf20Sopenharmony_ci .flags = CPUIDLE_FLAG_TIMER_STOP, 408c2ecf20Sopenharmony_ci .enter = imx6sl_enter_wait, 418c2ecf20Sopenharmony_ci .name = "WAIT", 428c2ecf20Sopenharmony_ci .desc = "Clock off", 438c2ecf20Sopenharmony_ci }, 448c2ecf20Sopenharmony_ci }, 458c2ecf20Sopenharmony_ci .state_count = 2, 468c2ecf20Sopenharmony_ci .safe_state_index = 0, 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ciint __init imx6sl_cpuidle_init(void) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci return cpuidle_register(&imx6sl_cpuidle_driver, NULL); 528c2ecf20Sopenharmony_ci} 53