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