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 "common.h" 17 #include "prm2xxx.h" 18 19 /* 20 * reset_virt_prcm_set_ck, reset_sys_ck: pointers to the virt_prcm_set 21 * clock and the sys_ck. Used during the reset process 22 */ 23 static struct clk *reset_virt_prcm_set_ck, *reset_sys_ck; 24 25 /* Reboot handling */ 26 27 /** 28 * omap2xxx_restart - Set DPLL to bypass mode for reboot to work 29 * 30 * Set the DPLL to bypass so that reboot completes successfully. No 31 * return value. 32 */ 33 void omap2xxx_restart(char mode, const char *cmd) 34 { 35 u32 rate; 36 37 rate = clk_get_rate(reset_sys_ck); 38 clk_set_rate(reset_virt_prcm_set_ck, rate); 39 40 /* XXX Should save the cmd argument for use after the reboot */ 41 42 omap2xxx_prm_dpll_reset(); /* never returns */ 43 while (1); 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 core_initcall(omap2xxx_common_look_up_clks_for_reset); 66