104dc82e1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 22572f00dSJoshua Henderson /* 32572f00dSJoshua Henderson * Joshua Henderson <joshua.henderson@microchip.com> 42572f00dSJoshua Henderson * Copyright (C) 2015 Microchip Technology Inc. All rights reserved. 52572f00dSJoshua Henderson */ 62572f00dSJoshua Henderson #include <linux/clk-provider.h> 72572f00dSJoshua Henderson #include <linux/clocksource.h> 82572f00dSJoshua Henderson #include <linux/init.h> 96e4ad1b4SPurna Chandra Mandal #include <linux/irqdomain.h> 102572f00dSJoshua Henderson #include <linux/of.h> 112572f00dSJoshua Henderson #include <linux/of_irq.h> 122572f00dSJoshua Henderson 132572f00dSJoshua Henderson #include <asm/time.h> 142572f00dSJoshua Henderson 152572f00dSJoshua Henderson #include "pic32mzda.h" 162572f00dSJoshua Henderson 172572f00dSJoshua Henderson static const struct of_device_id pic32_infra_match[] = { 182572f00dSJoshua Henderson { .compatible = "microchip,pic32mzda-infra", }, 192572f00dSJoshua Henderson { }, 202572f00dSJoshua Henderson }; 212572f00dSJoshua Henderson 222572f00dSJoshua Henderson #define DEFAULT_CORE_TIMER_INTERRUPT 0 232572f00dSJoshua Henderson 242572f00dSJoshua Henderson static unsigned int pic32_xlate_core_timer_irq(void) 252572f00dSJoshua Henderson { 262572f00dSJoshua Henderson static struct device_node *node; 272572f00dSJoshua Henderson unsigned int irq; 282572f00dSJoshua Henderson 292572f00dSJoshua Henderson node = of_find_matching_node(NULL, pic32_infra_match); 302572f00dSJoshua Henderson 312572f00dSJoshua Henderson if (WARN_ON(!node)) 322572f00dSJoshua Henderson goto default_map; 332572f00dSJoshua Henderson 342572f00dSJoshua Henderson irq = irq_of_parse_and_map(node, 0); 352572f00dSJoshua Henderson if (!irq) 362572f00dSJoshua Henderson goto default_map; 372572f00dSJoshua Henderson 382572f00dSJoshua Henderson return irq; 392572f00dSJoshua Henderson 402572f00dSJoshua Henderson default_map: 412572f00dSJoshua Henderson 422572f00dSJoshua Henderson return irq_create_mapping(NULL, DEFAULT_CORE_TIMER_INTERRUPT); 432572f00dSJoshua Henderson } 442572f00dSJoshua Henderson 452572f00dSJoshua Henderson unsigned int get_c0_compare_int(void) 462572f00dSJoshua Henderson { 472572f00dSJoshua Henderson return pic32_xlate_core_timer_irq(); 482572f00dSJoshua Henderson } 492572f00dSJoshua Henderson 502572f00dSJoshua Henderson void __init plat_time_init(void) 512572f00dSJoshua Henderson { 526e4ad1b4SPurna Chandra Mandal unsigned long rate = pic32_get_pbclk(7); 532572f00dSJoshua Henderson 542572f00dSJoshua Henderson of_clk_init(NULL); 552572f00dSJoshua Henderson 566e4ad1b4SPurna Chandra Mandal pr_info("CPU Clock: %ldMHz\n", rate / 1000000); 576e4ad1b4SPurna Chandra Mandal mips_hpt_frequency = rate / 2; 582572f00dSJoshua Henderson 59ba5d08c0SDaniel Lezcano timer_probe(); 602572f00dSJoshua Henderson } 61