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 "prm2xxx.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 omap2xxx_prm_dpll_reset(); /* never returns */ 44 while (1); 45 } 46 47 /** 48 * omap2xxx_common_look_up_clks_for_reset - look up clocks needed for restart 49 * 50 * Some clocks need to be looked up in advance for the SoC restart 51 * operation to work - see omap2xxx_restart(). Returns -EINVAL upon 52 * error or 0 upon success. 53 */ 54 static int __init omap2xxx_common_look_up_clks_for_reset(void) 55 { 56 reset_virt_prcm_set_ck = clk_get(NULL, "virt_prcm_set"); 57 if (IS_ERR(reset_virt_prcm_set_ck)) 58 return -EINVAL; 59 60 reset_sys_ck = clk_get(NULL, "sys_ck"); 61 if (IS_ERR(reset_sys_ck)) 62 return -EINVAL; 63 64 return 0; 65 } 66 omap_core_initcall(omap2xxx_common_look_up_clks_for_reset); 67