Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'metag-for-v3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag

Pull Metag architecture changes from James Hogan:
- Infrastructure and DT files for TZ1090 SoC (pin control drivers
already merged via pinctrl tree).
- Panic on boot instead of just warning if cache aliasing possible.
- Various SMP/hotplug fixes.
- Various other randconfig/sparse fixes.

* tag 'metag-for-v3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag: (24 commits)
metag: move EXPORT_SYMBOL(csum_partial) to metag_ksyms.c
metag: cpu hotplug: route_irq: preserve irq mask
metag: kick: add missing irq_enter/exit to kick_handler()
metag: smp: don't spin waiting for CPU to start
metag: smp: enable irqs after set_cpu_online
metag: use clear_tasks_mm_cpumask()
metag: tz1090: select and instantiate pinctrl-tz1090-pdc
metag: tz1090: select and instantiate pinctrl-tz1090
metag: don't check for cache aliasing on smp cpu boot
metag: panic if cache aliasing possible
metag: *.dts: include using preprocessor
metag: add <dt-bindings/> symlink
metag/.gitignore: Extend the *.dtb pattern to match the dtb.S files
metag/traps: include setup.h for the per_cpu_trap_init declaration
metag/traps: Mark die() as __noreturn to match the declaration.
metag/processor.h: Add missing cpuinfo_op declaration.
metag/setup: Restrict scope for the capabilities variable
metag/mm/cache: Restrict scope for metag_lnkget_probe
metag/asm/irq.h: Declare init_IRQ
metag/kernel/irq.c: Declare root_domain as static
...

+275 -52
+30
Documentation/devicetree/bindings/metag/meta.txt
··· 1 + * Meta Processor Binding 2 + 3 + This binding specifies what properties must be available in the device tree 4 + representation of a Meta Processor Core, which is the root node in the tree. 5 + 6 + Required properties: 7 + 8 + - compatible: Specifies the compatibility list for the Meta processor. 9 + The type shall be <string> and the value shall include "img,meta". 10 + 11 + Optional properties: 12 + 13 + - clocks: Clock consumer specifiers as described in 14 + Documentation/devicetree/bindings/clock/clock-bindings.txt 15 + 16 + - clock-names: Clock consumer names as described in 17 + Documentation/devicetree/bindings/clock/clock-bindings.txt. 18 + 19 + Clocks are identified by name. Valid clocks are: 20 + 21 + - "core": The Meta core clock from which the Meta timers are derived. 22 + 23 + * Examples 24 + 25 + / { 26 + compatible = "toumaz,tz1090", "img,meta"; 27 + 28 + clocks = <&meta_core_clk>; 29 + clock-names = "core"; 30 + };
+1
Documentation/devicetree/bindings/vendor-prefixes.txt
··· 58 58 st STMicroelectronics 59 59 ste ST-Ericsson 60 60 stericsson ST-Ericsson 61 + toumaz Toumaz 61 62 ti Texas Instruments 62 63 toshiba Toshiba Corporation 63 64 v3 V3 Semiconductor
+12
arch/metag/Kconfig.soc
··· 14 14 help 15 15 This is a Meta 2.1 FPGA bitstream, just a bare CPU. 16 16 17 + config SOC_TZ1090 18 + bool "Toumaz Xenif TZ1090 SoC (Comet)" 19 + select METAG_LNKGET_AROUND_CACHE 20 + select METAG_META21 21 + select METAG_SMP_WRITE_REORDERING 22 + select PINCTRL 23 + select PINCTRL_TZ1090 24 + select PINCTRL_TZ1090_PDC 25 + help 26 + This is a Toumaz Technology Xenif TZ1090 (A.K.A. Comet) SoC containing 27 + a 2-threaded HTP. 28 + 17 29 endchoice 18 30 19 31 menu "SoC configuration"
+1 -1
arch/metag/Makefile
··· 20 20 checkflags-$(CONFIG_METAG_META21) += -DMETAC_2_1 21 21 CHECKFLAGS += -D__metag__ $(checkflags-y) 22 22 23 - KBUILD_DEFCONFIG := meta2_defconfig 23 + KBUILD_DEFCONFIG := tz1090_defconfig 24 24 25 25 sflags-$(CONFIG_METAG_META12) += -mmetac=1.2 26 26 ifeq ($(CONFIG_METAG_META12),y)
+1 -1
arch/metag/boot/.gitignore
··· 1 1 vmlinux* 2 2 uImage* 3 3 ramdisk.* 4 - *.dtb 4 + *.dtb*
+2
arch/metag/boot/dts/Makefile
··· 1 1 dtb-y += skeleton.dtb 2 + dtb-y += tz1090_generic.dtb 2 3 3 4 # Built-in dtb 4 5 builtindtb-y := skeleton 6 + builtindtb-$(CONFIG_SOC_TZ1090) := tz1090_generic 5 7 6 8 ifneq ($(CONFIG_METAG_BUILTIN_DTB_NAME),"") 7 9 builtindtb-y := $(patsubst "%",%,$(CONFIG_METAG_BUILTIN_DTB_NAME))
+1 -1
arch/metag/boot/dts/skeleton.dts
··· 7 7 */ 8 8 /dts-v1/; 9 9 10 - /include/ "skeleton.dtsi" 10 + #include "skeleton.dtsi"
+41
arch/metag/boot/dts/tz1090.dtsi
··· 1 + /* 2 + * Copyright (C) 2012 Imagination Technologies Ltd. 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + */ 8 + 9 + #include "skeleton.dtsi" 10 + 11 + / { 12 + compatible = "toumaz,tz1090", "img,meta"; 13 + 14 + interrupt-parent = <&intc>; 15 + 16 + intc: interrupt-controller { 17 + compatible = "img,meta-intc"; 18 + interrupt-controller; 19 + #interrupt-cells = <2>; 20 + num-banks = <2>; 21 + }; 22 + 23 + soc { 24 + compatible = "simple-bus"; 25 + #address-cells = <1>; 26 + #size-cells = <1>; 27 + ranges; 28 + 29 + pinctrl: pinctrl@02005800 { 30 + #gpio-range-cells = <3>; 31 + compatible = "img,tz1090-pinctrl"; 32 + reg = <0x02005800 0xe4>; 33 + }; 34 + 35 + pdc_pinctrl: pinctrl@02006500 { 36 + #gpio-range-cells = <3>; 37 + compatible = "img,tz1090-pdc-pinctrl"; 38 + reg = <0x02006500 0x100>; 39 + }; 40 + }; 41 + };
+10
arch/metag/boot/dts/tz1090_generic.dts
··· 1 + /* 2 + * Copyright (C) 2012 Imagination Technologies Ltd. 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + */ 8 + /dts-v1/; 9 + 10 + #include "tz1090.dtsi"
+42
arch/metag/configs/tz1090_defconfig
··· 1 + # CONFIG_LOCALVERSION_AUTO is not set 2 + # CONFIG_SWAP is not set 3 + CONFIG_SYSVIPC=y 4 + CONFIG_SYSFS_DEPRECATED=y 5 + CONFIG_SYSFS_DEPRECATED_V2=y 6 + CONFIG_KALLSYMS_ALL=y 7 + # CONFIG_ELF_CORE is not set 8 + CONFIG_SLAB=y 9 + # CONFIG_BLK_DEV_BSG is not set 10 + CONFIG_PARTITION_ADVANCED=y 11 + # CONFIG_MSDOS_PARTITION is not set 12 + # CONFIG_IOSCHED_DEADLINE is not set 13 + # CONFIG_IOSCHED_CFQ is not set 14 + CONFIG_FLATMEM_MANUAL=y 15 + CONFIG_SOC_TZ1090=y 16 + CONFIG_METAG_HALT_ON_PANIC=y 17 + # CONFIG_METAG_FPU is not set 18 + CONFIG_METAG_DA=y 19 + CONFIG_HZ_100=y 20 + CONFIG_DEVTMPFS=y 21 + # CONFIG_STANDALONE is not set 22 + # CONFIG_PREVENT_FIRMWARE_BUILD is not set 23 + # CONFIG_FW_LOADER is not set 24 + CONFIG_BLK_DEV_RAM=y 25 + CONFIG_BLK_DEV_RAM_COUNT=1 26 + CONFIG_BLK_DEV_RAM_SIZE=16384 27 + # CONFIG_INPUT is not set 28 + # CONFIG_SERIO is not set 29 + # CONFIG_VT is not set 30 + # CONFIG_LEGACY_PTYS is not set 31 + CONFIG_DA_TTY=y 32 + CONFIG_DA_CONSOLE=y 33 + # CONFIG_DEVKMEM is not set 34 + # CONFIG_HW_RANDOM is not set 35 + CONFIG_GPIOLIB=y 36 + # CONFIG_HWMON is not set 37 + # CONFIG_USB_SUPPORT is not set 38 + # CONFIG_DNOTIFY is not set 39 + CONFIG_TMPFS=y 40 + # CONFIG_MISC_FILESYSTEMS is not set 41 + # CONFIG_SCHED_DEBUG is not set 42 + CONFIG_DEBUG_INFO=y
+2 -2
arch/metag/include/asm/bug.h
··· 6 6 struct pt_regs; 7 7 8 8 extern const char *trap_name(int trapno); 9 - extern void die(const char *str, struct pt_regs *regs, long err, 10 - unsigned long addr) __attribute__ ((noreturn)); 9 + extern void __noreturn die(const char *str, struct pt_regs *regs, long err, 10 + unsigned long addr); 11 11 12 12 #endif
+8
arch/metag/include/asm/clock.h
··· 19 19 * core frequency will be determined like this: 20 20 * Meta 1: based on loops_per_jiffy. 21 21 * Meta 2: (EXPAND_TIMER_DIV + 1) MHz. 22 + * If a "core" clock is provided by the device tree, it 23 + * will override this function. 22 24 */ 23 25 struct meta_clock_desc { 24 26 unsigned long (*get_core_freq)(void); 25 27 }; 26 28 27 29 extern struct meta_clock_desc _meta_clock; 30 + 31 + /* 32 + * Perform platform clock initialisation, reading clocks from device tree etc. 33 + * Only accessible during boot. 34 + */ 35 + void init_metag_clocks(void); 28 36 29 37 /* 30 38 * Set up the default clock, ensuring all callbacks are valid - only accessible
+1
arch/metag/include/asm/irq.h
··· 17 17 18 18 int tbisig_map(unsigned int hw); 19 19 extern void do_IRQ(int irq, struct pt_regs *regs); 20 + extern void init_IRQ(void); 20 21 21 22 #ifdef CONFIG_METAG_SUSPEND_MEM 22 23 int traps_save_context(void);
+2
arch/metag/include/asm/processor.h
··· 199 199 extern void show_trace(struct task_struct *tsk, unsigned long *sp, 200 200 struct pt_regs *regs); 201 201 202 + extern const struct seq_operations cpuinfo_op; 203 + 202 204 #endif
+7 -6
arch/metag/kernel/cachepart.c
··· 100 100 thread_cache_size = 101 101 get_thread_cache_size(cache_type, thread_id); 102 102 if (thread_cache_size < 0) 103 - pr_emerg("Can't read %s cache size", \ 103 + pr_emerg("Can't read %s cache size\n", 104 104 cache_type ? "DCACHE" : "ICACHE"); 105 105 else if (thread_cache_size == 0) 106 106 /* Cache is off. No need to check for aliasing */ 107 107 continue; 108 108 if (thread_cache_size / CACHE_ASSOCIATIVITY > PAGE_SIZE) { 109 - pr_emerg("Cache aliasing detected in %s on Thread %d", 109 + pr_emerg("Potential cache aliasing detected in %s on Thread %d\n", 110 110 cache_type ? "DCACHE" : "ICACHE", thread_id); 111 - pr_warn("Total %s size: %u bytes", 112 - cache_type ? "DCACHE" : "ICACHE ", 111 + pr_warn("Total %s size: %u bytes\n", 112 + cache_type ? "DCACHE" : "ICACHE", 113 113 cache_type ? get_dcache_size() 114 114 : get_icache_size()); 115 - pr_warn("Thread %s size: %d bytes", 115 + pr_warn("Thread %s size: %d bytes\n", 116 116 cache_type ? "CACHE" : "ICACHE", 117 117 thread_cache_size); 118 - pr_warn("Page Size: %lu bytes", PAGE_SIZE); 118 + pr_warn("Page Size: %lu bytes\n", PAGE_SIZE); 119 + panic("Potential cache aliasing detected"); 119 120 } 120 121 } 121 122 }
+58 -1
arch/metag/kernel/clock.c
··· 8 8 * published by the Free Software Foundation. 9 9 */ 10 10 11 + #include <linux/clk.h> 11 12 #include <linux/delay.h> 12 13 #include <linux/io.h> 14 + #include <linux/of.h> 13 15 14 16 #include <asm/param.h> 15 17 #include <asm/clock.h> ··· 36 34 #endif 37 35 } 38 36 37 + static struct clk *clk_core; 38 + 39 + /* Clk based get_core_freq callback. */ 40 + static unsigned long get_core_freq_clk(void) 41 + { 42 + return clk_get_rate(clk_core); 43 + } 44 + 39 45 /** 40 - * setup_meta_clocks() - Set up the Meta clock. 46 + * init_metag_core_clock() - Set up core clock from devicetree. 47 + * 48 + * Checks to see if a "core" clock is provided in the device tree, and overrides 49 + * the get_core_freq callback to use it. 50 + */ 51 + static void __init init_metag_core_clock(void) 52 + { 53 + /* 54 + * See if a core clock is provided by the devicetree (and 55 + * registered by the init callback above). 56 + */ 57 + struct device_node *node; 58 + node = of_find_compatible_node(NULL, NULL, "img,meta"); 59 + if (!node) { 60 + pr_warn("%s: no compatible img,meta DT node found\n", 61 + __func__); 62 + return; 63 + } 64 + 65 + clk_core = of_clk_get_by_name(node, "core"); 66 + if (IS_ERR(clk_core)) { 67 + pr_warn("%s: no core clock found in DT\n", 68 + __func__); 69 + return; 70 + } 71 + 72 + /* 73 + * Override the core frequency callback to use 74 + * this clk. 75 + */ 76 + _meta_clock.get_core_freq = get_core_freq_clk; 77 + } 78 + 79 + /** 80 + * init_metag_clocks() - Set up clocks from devicetree. 81 + * 82 + * Set up important clocks from device tree. In particular any needed for clock 83 + * sources. 84 + */ 85 + void __init init_metag_clocks(void) 86 + { 87 + init_metag_core_clock(); 88 + 89 + pr_info("Core clock frequency: %lu Hz\n", get_coreclock()); 90 + } 91 + 92 + /** 93 + * setup_meta_clocks() - Early set up of the Meta clock. 41 94 * @desc: Clock descriptor usually provided by machine description 42 95 * 43 96 * Ensures all callbacks are valid.
+4 -3
arch/metag/kernel/irq.c
··· 25 25 static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; 26 26 #endif 27 27 28 - struct irq_domain *root_domain; 28 + static struct irq_domain *root_domain; 29 29 30 30 static unsigned int startup_meta_irq(struct irq_data *data) 31 31 { ··· 279 279 { 280 280 struct irq_desc *desc = irq_to_desc(irq); 281 281 struct irq_chip *chip = irq_data_get_irq_chip(data); 282 + unsigned long flags; 282 283 283 - raw_spin_lock_irq(&desc->lock); 284 + raw_spin_lock_irqsave(&desc->lock, flags); 284 285 if (chip->irq_set_affinity) 285 286 chip->irq_set_affinity(data, cpumask_of(cpu), false); 286 - raw_spin_unlock_irq(&desc->lock); 287 + raw_spin_unlock_irqrestore(&desc->lock, flags); 287 288 } 288 289 289 290 /*
+9
arch/metag/kernel/kick.c
··· 26 26 * pass it as an argument. 27 27 */ 28 28 #include <linux/export.h> 29 + #include <linux/hardirq.h> 30 + #include <linux/irq.h> 29 31 #include <linux/kernel.h> 30 32 #include <linux/mm.h> 31 33 #include <linux/types.h> ··· 68 66 TBIRES 69 67 kick_handler(TBIRES State, int SigNum, int Triggers, int Inst, PTBI pTBI) 70 68 { 69 + struct pt_regs *old_regs; 71 70 struct kick_irq_handler *kh; 72 71 struct list_head *lh; 73 72 int handled = 0; ··· 81 78 restart_critical_section(State); 82 79 83 80 trace_hardirqs_off(); 81 + 82 + old_regs = set_irq_regs((struct pt_regs *)State.Sig.pCtx); 83 + irq_enter(); 84 84 85 85 /* 86 86 * There is no need to disable interrupts here because we ··· 102 96 spin_unlock(&kick_handlers_lock); 103 97 104 98 WARN_ON(!handled); 99 + 100 + irq_exit(); 101 + set_irq_regs(old_regs); 105 102 106 103 return tail_end(ret); 107 104 }
+5
arch/metag/kernel/metag_ksyms.c
··· 1 1 #include <linux/export.h> 2 + #include <linux/types.h> 2 3 4 + #include <asm/checksum.h> 3 5 #include <asm/div64.h> 4 6 #include <asm/ftrace.h> 5 7 #include <asm/page.h> ··· 16 14 EXPORT_SYMBOL(max_pfn); 17 15 EXPORT_SYMBOL(min_low_pfn); 18 16 #endif 17 + 18 + /* Network checksum functions */ 19 + EXPORT_SYMBOL(csum_partial); 19 20 20 21 /* TBI symbols */ 21 22 EXPORT_SYMBOL(__TBI);
+10 -6
arch/metag/kernel/setup.c
··· 20 20 #include <linux/memblock.h> 21 21 #include <linux/mm.h> 22 22 #include <linux/of_fdt.h> 23 + #include <linux/of_platform.h> 23 24 #include <linux/pfn.h> 24 25 #include <linux/root_dev.h> 25 26 #include <linux/sched.h> ··· 425 424 /* customizes platform devices, or adds new ones */ 426 425 if (machine_desc->init_machine) 427 426 machine_desc->init_machine(); 427 + else 428 + of_platform_populate(NULL, of_default_bus_match_table, NULL, 429 + NULL); 428 430 return 0; 429 431 } 430 432 arch_initcall(customize_machine); ··· 591 587 EXPORT_SYMBOL(pTBI_get); 592 588 593 589 #if defined(CONFIG_METAG_DSP) && defined(CONFIG_METAG_FPU) 594 - char capabilites[] = "dsp fpu"; 590 + static char capabilities[] = "dsp fpu"; 595 591 #elif defined(CONFIG_METAG_DSP) 596 - char capabilites[] = "dsp"; 592 + static char capabilities[] = "dsp"; 597 593 #elif defined(CONFIG_METAG_FPU) 598 - char capabilites[] = "fpu"; 594 + static char capabilities[] = "fpu"; 599 595 #else 600 - char capabilites[] = ""; 596 + static char capabilities[] = ""; 601 597 #endif 602 598 603 599 static struct ctl_table caps_kern_table[] = { 604 600 { 605 601 .procname = "capabilities", 606 - .data = capabilites, 607 - .maxlen = sizeof(capabilites), 602 + .data = capabilities, 603 + .maxlen = sizeof(capabilities), 608 604 .mode = 0444, 609 605 .proc_handler = proc_dostring, 610 606 },
+10 -25
arch/metag/kernel/smp.c
··· 8 8 * published by the Free Software Foundation. 9 9 */ 10 10 #include <linux/atomic.h> 11 + #include <linux/completion.h> 11 12 #include <linux/delay.h> 12 13 #include <linux/init.h> 13 14 #include <linux/spinlock.h> ··· 62 61 }; 63 62 64 63 static DEFINE_SPINLOCK(boot_lock); 64 + 65 + static DECLARE_COMPLETION(cpu_running); 65 66 66 67 /* 67 68 * "thread" is assumed to be a valid Meta hardware thread ID. ··· 238 235 */ 239 236 ret = boot_secondary(thread, idle); 240 237 if (ret == 0) { 241 - unsigned long timeout; 242 - 243 238 /* 244 239 * CPU was successfully started, wait for it 245 240 * to come online or time out. 246 241 */ 247 - timeout = jiffies + HZ; 248 - while (time_before(jiffies, timeout)) { 249 - if (cpu_online(cpu)) 250 - break; 251 - 252 - udelay(10); 253 - barrier(); 254 - } 242 + wait_for_completion_timeout(&cpu_running, 243 + msecs_to_jiffies(1000)); 255 244 256 245 if (!cpu_online(cpu)) 257 246 ret = -EIO; ··· 271 276 int __cpuexit __cpu_disable(void) 272 277 { 273 278 unsigned int cpu = smp_processor_id(); 274 - struct task_struct *p; 275 279 276 280 /* 277 281 * Take this CPU offline. Once we clear this, we can't return, ··· 290 296 flush_cache_all(); 291 297 local_flush_tlb_all(); 292 298 293 - read_lock(&tasklist_lock); 294 - for_each_process(p) { 295 - if (p->mm) 296 - cpumask_clear_cpu(cpu, mm_cpumask(p->mm)); 297 - } 298 - read_unlock(&tasklist_lock); 299 + clear_tasks_mm_cpumask(cpu); 299 300 300 301 return 0; 301 302 } ··· 374 385 375 386 setup_priv(); 376 387 377 - /* 378 - * Enable local interrupts. 379 - */ 380 - tbi_startup_interrupt(TBID_SIGNUM_TRT); 381 388 notify_cpu_starting(cpu); 382 - local_irq_enable(); 383 389 384 390 pr_info("CPU%u (thread %u): Booted secondary processor\n", 385 391 cpu, cpu_2_hwthread_id[cpu]); ··· 386 402 * OK, now it's safe to let the boot CPU continue 387 403 */ 388 404 set_cpu_online(cpu, true); 405 + complete(&cpu_running); 389 406 390 407 /* 391 - * Check for cache aliasing. 392 - * Preemption is disabled 408 + * Enable local interrupts. 393 409 */ 394 - check_for_cache_aliasing(cpu); 410 + tbi_startup_interrupt(TBID_SIGNUM_TRT); 411 + local_irq_enable(); 395 412 396 413 /* 397 414 * OK, it's off to the idle thread for us
+12 -2
arch/metag/kernel/time.c
··· 5 5 * 6 6 */ 7 7 8 - #include <linux/init.h> 9 - 10 8 #include <clocksource/metag_generic.h> 9 + #include <linux/clk-provider.h> 10 + #include <linux/init.h> 11 + #include <asm/clock.h> 11 12 12 13 void __init time_init(void) 13 14 { 15 + #ifdef CONFIG_COMMON_CLK 16 + /* Init clocks from device tree */ 17 + of_clk_init(NULL); 18 + #endif 19 + 20 + /* Init meta clocks, particularly the core clock */ 21 + init_metag_clocks(); 22 + 23 + /* Set up the timer clock sources */ 14 24 metag_generic_timer_init(); 15 25 }
+3 -2
arch/metag/kernel/traps.c
··· 33 33 #include <asm/siginfo.h> 34 34 #include <asm/traps.h> 35 35 #include <asm/hwthread.h> 36 + #include <asm/setup.h> 36 37 #include <asm/switch.h> 37 38 #include <asm/user_gateway.h> 38 39 #include <asm/syscall.h> ··· 88 87 89 88 static DEFINE_SPINLOCK(die_lock); 90 89 91 - void die(const char *str, struct pt_regs *regs, long err, 92 - unsigned long addr) 90 + void __noreturn die(const char *str, struct pt_regs *regs, 91 + long err, unsigned long addr) 93 92 { 94 93 static int die_counter; 95 94
-1
arch/metag/lib/checksum.c
··· 124 124 result += 1; 125 125 return (__force __wsum)result; 126 126 } 127 - EXPORT_SYMBOL(csum_partial); 128 127 129 128 /* 130 129 * this routine is used for miscellaneous IP-like checksums, mainly
+1 -1
arch/metag/mm/cache.c
··· 45 45 46 46 #define LNKGET_CONSTANT 0xdeadbeef 47 47 48 - void __init metag_lnkget_probe(void) 48 + static void __init metag_lnkget_probe(void) 49 49 { 50 50 int temp; 51 51 long flags;
+2
drivers/clocksource/metag_generic.c
··· 184 184 #ifdef CONFIG_METAG_META21 185 185 hwtimer_freq = get_coreclock() / (metag_in32(EXPAND_TIMER_DIV) + 1); 186 186 #endif 187 + pr_info("Timer frequency: %u Hz\n", hwtimer_freq); 188 + 187 189 clocksource_register_hz(&clocksource_metag, hwtimer_freq); 188 190 189 191 setup_irq(tbisig_map(TBID_SIGNUM_TRT), &metag_timer_irq);