| /* |
| * arch/metag/kernel/clock.c |
| * |
| * Copyright (C) 2012 Imagination Technologies Ltd. |
| * |
| * 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. |
| */ |
| |
| #include <linux/delay.h> |
| #include <linux/io.h> |
| |
| #include <asm/param.h> |
| #include <asm/clock.h> |
| |
| struct meta_clock_desc _meta_clock; |
| |
| /* Default machine get_core_freq callback. */ |
| static unsigned long get_core_freq_default(void) |
| { |
| #ifdef CONFIG_METAG_META21 |
| /* |
| * Meta 2 cores divide down the core clock for the Meta timers, so we |
| * can estimate the core clock from the divider. |
| */ |
| return (metag_in32(EXPAND_TIMER_DIV) + 1) * 1000000; |
| #else |
| /* |
| * On Meta 1 we don't know the core clock, but assuming the Meta timer |
| * is correct it can be estimated based on loops_per_jiffy. |
| */ |
| return (loops_per_jiffy * HZ * 5) >> 1; |
| #endif |
| } |
| |
| /** |
| * setup_meta_clocks() - Set up the Meta clock. |
| * @desc: Clock descriptor usually provided by machine description |
| * |
| * Ensures all callbacks are valid. |
| */ |
| void __init setup_meta_clocks(struct meta_clock_desc *desc) |
| { |
| /* copy callbacks */ |
| if (desc) |
| _meta_clock = *desc; |
| |
| /* set fallback functions */ |
| if (!_meta_clock.get_core_freq) |
| _meta_clock.get_core_freq = get_core_freq_default; |
| } |
| |