linux/arch/arm/mach-shmobile/timer.c
<<
>>
Prefs
   1/*
   2 * SH-Mobile Timer
   3 *
   4 * Copyright (C) 2010  Magnus Damm
   5 * Copyright (C) 2002 - 2009  Paul Mundt
   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 as published by
   9 * the Free Software Foundation; version 2 of the License.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 */
  16#include <linux/platform_device.h>
  17#include <linux/clocksource.h>
  18#include <linux/delay.h>
  19#include <linux/of_address.h>
  20
  21#include "common.h"
  22
  23void __init shmobile_init_delay(void)
  24{
  25        struct device_node *np, *cpus;
  26        u32 max_freq = 0;
  27
  28        cpus = of_find_node_by_path("/cpus");
  29        if (!cpus)
  30                return;
  31
  32        for_each_child_of_node(cpus, np) {
  33                u32 freq;
  34
  35                if (IS_ENABLED(CONFIG_ARM_ARCH_TIMER) &&
  36                    (of_device_is_compatible(np, "arm,cortex-a7") ||
  37                     of_device_is_compatible(np, "arm,cortex-a15"))) {
  38                        of_node_put(np);
  39                        of_node_put(cpus);
  40                        return;
  41                }
  42
  43                if (!of_property_read_u32(np, "clock-frequency", &freq))
  44                        max_freq = max(max_freq, freq);
  45        }
  46
  47        of_node_put(cpus);
  48
  49        if (!max_freq)
  50                return;
  51
  52        /*
  53         * Calculate a worst-case loops-per-jiffy value
  54         * based on maximum cpu core hz setting and the
  55         * __delay() implementation in arch/arm/lib/delay.S.
  56         *
  57         * This will result in a longer delay than expected
  58         * when the cpu core runs on lower frequencies.
  59         */
  60
  61        if (!preset_lpj)
  62                preset_lpj = max_freq / HZ;
  63}
  64