1 /* 2 * omap2-restart.c - code common to all OMAP2xxx machines. 3 * 4 * Copyright (C) 2012 Texas Instruments 5 * Paul Walmsley 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 #include <linux/kernel.h> 12 #include <linux/init.h> 13 #include <linux/clk.h> 14 #include <linux/io.h> 15 16 #include "soc.h" 17 #include "common.h" 18 #include "prm.h" 19 20 /* 21 * reset_virt_prcm_set_ck, reset_sys_ck: pointers to the virt_prcm_set 22 * clock and the sys_ck. Used during the reset process 23 */ 24 static struct clk *reset_virt_prcm_set_ck, *reset_sys_ck; 25 26 /* Reboot handling */ 27 28 /** 29 * omap2xxx_restart - Set DPLL to bypass mode for reboot to work 30 * 31 * Set the DPLL to bypass so that reboot completes successfully. No 32 * return value. 33 */ 34 void omap2xxx_restart(enum reboot_mode mode, const char *cmd) 35 { 36 u32 rate; 37 38 rate = clk_get_rate(reset_sys_ck); 39 clk_set_rate(reset_virt_prcm_set_ck, rate); 40 41 /* XXX Should save the cmd argument for use after the reboot */ 42 43 omap_prm_reset_system(); 44 } 45 46 /** 47 * omap2xxx_common_look_up_clks_for_reset - look up clocks needed for restart 48 * 49 * Some clocks need to be looked up in advance for the SoC restart 50 * operation to work - see omap2xxx_restart(). Returns -EINVAL upon 51 * error or 0 upon success. 52 */ 53 static int __init omap2xxx_common_look_up_clks_for_reset(void) 54 { 55 reset_virt_prcm_set_ck = clk_get(NULL, "virt_prcm_set"); 56 if (IS_ERR(reset_virt_prcm_set_ck)) 57 return -EINVAL; 58 59 reset_sys_ck = clk_get(NULL, "sys_ck"); 60 if (IS_ERR(reset_sys_ck)) 61 return -EINVAL; 62 63 return 0; 64 } 65 omap_core_initcall(omap2xxx_common_look_up_clks_for_reset); 66