18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * omap2-restart.c - code common to all OMAP2xxx machines. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2012 Texas Instruments 68c2ecf20Sopenharmony_ci * Paul Walmsley 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#include <linux/kernel.h> 98c2ecf20Sopenharmony_ci#include <linux/init.h> 108c2ecf20Sopenharmony_ci#include <linux/clk.h> 118c2ecf20Sopenharmony_ci#include <linux/io.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "soc.h" 148c2ecf20Sopenharmony_ci#include "common.h" 158c2ecf20Sopenharmony_ci#include "prm.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci/* 188c2ecf20Sopenharmony_ci * reset_virt_prcm_set_ck, reset_sys_ck: pointers to the virt_prcm_set 198c2ecf20Sopenharmony_ci * clock and the sys_ck. Used during the reset process 208c2ecf20Sopenharmony_ci */ 218c2ecf20Sopenharmony_cistatic struct clk *reset_virt_prcm_set_ck, *reset_sys_ck; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci/* Reboot handling */ 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci/** 268c2ecf20Sopenharmony_ci * omap2xxx_restart - Set DPLL to bypass mode for reboot to work 278c2ecf20Sopenharmony_ci * 288c2ecf20Sopenharmony_ci * Set the DPLL to bypass so that reboot completes successfully. No 298c2ecf20Sopenharmony_ci * return value. 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_civoid omap2xxx_restart(enum reboot_mode mode, const char *cmd) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci u32 rate; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci rate = clk_get_rate(reset_sys_ck); 368c2ecf20Sopenharmony_ci clk_set_rate(reset_virt_prcm_set_ck, rate); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci /* XXX Should save the cmd argument for use after the reboot */ 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci omap_prm_reset_system(); 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci/** 448c2ecf20Sopenharmony_ci * omap2xxx_common_look_up_clks_for_reset - look up clocks needed for restart 458c2ecf20Sopenharmony_ci * 468c2ecf20Sopenharmony_ci * Some clocks need to be looked up in advance for the SoC restart 478c2ecf20Sopenharmony_ci * operation to work - see omap2xxx_restart(). Returns -EINVAL upon 488c2ecf20Sopenharmony_ci * error or 0 upon success. 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_cistatic int __init omap2xxx_common_look_up_clks_for_reset(void) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci reset_virt_prcm_set_ck = clk_get(NULL, "virt_prcm_set"); 538c2ecf20Sopenharmony_ci if (IS_ERR(reset_virt_prcm_set_ck)) 548c2ecf20Sopenharmony_ci return -EINVAL; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci reset_sys_ck = clk_get(NULL, "sys_ck"); 578c2ecf20Sopenharmony_ci if (IS_ERR(reset_sys_ck)) 588c2ecf20Sopenharmony_ci return -EINVAL; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci return 0; 618c2ecf20Sopenharmony_ci} 628c2ecf20Sopenharmony_ciomap_postcore_initcall(omap2xxx_common_look_up_clks_for_reset); 63