#include #include #include /*--- #include ---*/ /*--- #include ---*/ static unsigned long long cycles_to_usec_reciprocal; unsigned int ipq40xx_get_cyclefreq(void) { return (arch_timer_get_rate()); } EXPORT_SYMBOL(ipq40xx_get_cyclefreq); /** */ static int __init ipq40xx_cycle_init_reciprocal(void) { unsigned long long reciprocal = 0; unsigned long cycle_freq = ipq40xx_get_cyclefreq(); if (cycle_freq) { reciprocal = (1ULL << 32) * (unsigned long long)USEC_PER_SEC; do_div(reciprocal, cycle_freq); } cycles_to_usec_reciprocal = reciprocal; pr_debug("%s: reciprocal=%llu\n", __func__, cycles_to_usec_reciprocal); return 0; } subsys_initcall(ipq40xx_cycle_init_reciprocal); /** */ unsigned long ipq40xx_cycles_to_usec(unsigned long cycle) { return (((unsigned long long)cycle * cycles_to_usec_reciprocal) >> 32); } EXPORT_SYMBOL(ipq40xx_cycles_to_usec); /** * Liest den generic timer (CNTPCT) / arch timer. * Wird sehr früh initialisiert und läuft stetig mit 48MHz */ unsigned int ipq40xx_get_cycles(void) { u64 timeval; asm volatile("MRRC p15, 0, %Q0, %R0, c14 ": "=r"(timeval)); return (unsigned int)timeval; } EXPORT_SYMBOL(ipq40xx_get_cycles);