cregit-Linux how code gets into the kernel

Release 4.11 arch/arm/lib/delay.c

Directory: arch/arm/lib
/*
 * Delay loops based on the OpenRISC implementation.
 *
 * Copyright (C) 2012 ARM Limited
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 * Author: Will Deacon <will.deacon@arm.com>
 */

#include <linux/clocksource.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/timex.h>

/*
 * Default to the loop-based delay implementation.
 */

struct arm_delay_ops arm_delay_ops __ro_after_init = {
	.delay		= __loop_delay,
	.const_udelay	= __loop_const_udelay,
	.udelay		= __loop_udelay,
};


static const struct delay_timer *delay_timer;

static bool delay_calibrated;

static u64 delay_res;


int read_current_timer(unsigned long *timer_val) { if (!delay_timer) return -ENXIO; *timer_val = delay_timer->read_current_timer(); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jonathan Austin30100.00%1100.00%
Total30100.00%1100.00%

EXPORT_SYMBOL_GPL(read_current_timer);
static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift) { return (cyc * mult) >> shift; }

Contributors

PersonTokensPropCommitsCommitProp
Peter 'p2' De Schrijver25100.00%1100.00%
Total25100.00%1100.00%


static void __timer_delay(unsigned long cycles) { cycles_t start = get_cycles(); while ((get_cycles() - start) < cycles) cpu_relax(); }

Contributors

PersonTokensPropCommitsCommitProp
Will Deacon30100.00%1100.00%
Total30100.00%1100.00%


static void __timer_const_udelay(unsigned long xloops) { unsigned long long loops = xloops; loops *= arm_delay_ops.ticks_per_jiffy; __timer_delay(loops >> UDELAY_SHIFT); }

Contributors

PersonTokensPropCommitsCommitProp
Will Deacon30100.00%2100.00%
Total30100.00%2100.00%


static void __timer_udelay(unsigned long usecs) { __timer_const_udelay(usecs * UDELAY_MULT); }

Contributors

PersonTokensPropCommitsCommitProp
Will Deacon17100.00%1100.00%
Total17100.00%1100.00%


void __init register_current_timer_delay(const struct delay_timer *timer) { u32 new_mult, new_shift; u64 res; clocks_calc_mult_shift(&new_mult, &new_shift, timer->freq, NSEC_PER_SEC, 3600); res = cyc_to_ns(1ULL, new_mult, new_shift); if (res > 1000) { pr_err("Ignoring delay timer %ps, which has insufficient resolution of %lluns\n", timer, res); return; } if (!delay_calibrated && (!delay_res || (res < delay_res))) { pr_info("Switching to timer-based delay loop, resolution %lluns\n", res); delay_timer = timer; lpj_fine = timer->freq / HZ; delay_res = res; /* cpufreq may scale loops_per_jiffy, so keep a private copy */ arm_delay_ops.ticks_per_jiffy = lpj_fine; arm_delay_ops.delay = __timer_delay; arm_delay_ops.const_udelay = __timer_const_udelay; arm_delay_ops.udelay = __timer_udelay; } else { pr_info("Ignoring duplicate/late registration of read_current_timer delay\n"); } }

Contributors

PersonTokensPropCommitsCommitProp
Peter 'p2' De Schrijver5438.57%120.00%
Will Deacon3827.14%240.00%
Jonathan Austin3021.43%120.00%
Russell King1812.86%120.00%
Total140100.00%5100.00%


unsigned long calibrate_delay_is_known(void) { delay_calibrated = true; return lpj_fine; }

Contributors

PersonTokensPropCommitsCommitProp
Will Deacon1173.33%150.00%
Jonathan Austin426.67%150.00%
Total15100.00%2100.00%


void calibration_delay_done(void) { delay_calibrated = true; }

Contributors

PersonTokensPropCommitsCommitProp
Peter 'p2' De Schrijver11100.00%1100.00%
Total11100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Will Deacon16445.56%228.57%
Peter 'p2' De Schrijver9726.94%114.29%
Jonathan Austin7520.83%114.29%
Russell King185.00%114.29%
Arnd Bergmann51.39%114.29%
Kees Cook10.28%114.29%
Total360100.00%7100.00%
Directory: arch/arm/lib
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.