/* * clockevent setup for boot CPU */ static int __init arc_clockevent_setup(struct device_node *node) { struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); int ret; arc_timer_irq = irq_of_parse_and_map(node, 0); if (arc_timer_irq <= 0) { pr_err("clockevent: missing irq"); return -EINVAL; } ret = arc_get_timer_clk(node); if (ret) { pr_err("clockevent: missing clk"); return ret; } /* Needs apriori irq_set_percpu_devid() done in intc map function */ ret = request_percpu_irq(arc_timer_irq, timer_irq_handler, "Timer0 (per-cpu-tick)", evt); if (ret) { pr_err("clockevent: unable to request irq\n"); return ret; } ret = cpuhp_setup_state(CPUHP_AP_ARC_TIMER_STARTING, "AP_ARC_TIMER_STARTING", arc_timer_starting_cpu, arc_timer_dying_cpu); if (ret) { pr_err("Failed to setup hotplug state"); return ret; } return 0; }
/* * clockevent setup for boot CPU */ static void __init arc_clockevent_setup(struct device_node *node) { struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); int ret; register_cpu_notifier(&arc_timer_cpu_nb); arc_timer_irq = irq_of_parse_and_map(node, 0); if (arc_timer_irq <= 0) panic("clockevent: missing irq"); ret = arc_get_timer_clk(node); if (ret) panic("clockevent: missing clk"); evt->irq = arc_timer_irq; evt->cpumask = cpumask_of(smp_processor_id()); clockevents_config_and_register(evt, arc_timer_freq, 0, ARC_TIMER_MAX); /* Needs apriori irq_set_percpu_devid() done in intc map function */ ret = request_percpu_irq(arc_timer_irq, timer_irq_handler, "Timer0 (per-cpu-tick)", evt); if (ret) panic("clockevent: unable to request irq\n"); enable_percpu_irq(arc_timer_irq, 0); }
static int __init arc_cs_setup_rtc(struct device_node *node) { struct bcr_timer timer; int ret; READ_BCR(ARC_REG_TIMERS_BCR, timer); if (!timer.rtc) { pr_warn("Local-64-bit-Ctr clocksource not detected"); return -ENXIO; } /* Local to CPU hence not usable in SMP */ if (IS_ENABLED(CONFIG_SMP)) { pr_warn("Local-64-bit-Ctr not usable in SMP"); return -EINVAL; } ret = arc_get_timer_clk(node); if (ret) return ret; write_aux_reg(AUX_RTC_CTRL, 1); return clocksource_register_hz(&arc_counter_rtc, arc_timer_freq); }
static void __init arc_cs_setup_gfrc(struct device_node *node) { int exists = cpuinfo_arc700[0].extn.gfrc; int ret; if (WARN(!exists, "Global-64-bit-Ctr clocksource not detected")) return; ret = arc_get_timer_clk(node); if (ret) return; clocksource_register_hz(&arc_counter_gfrc, arc_timer_freq); }
static int __init arc_cs_setup_gfrc(struct device_node *node) { struct mcip_bcr mp; int ret; READ_BCR(ARC_REG_MCIP_BCR, mp); if (!mp.gfrc) { pr_warn("Global-64-bit-Ctr clocksource not detected"); return -ENXIO; } ret = arc_get_timer_clk(node); if (ret) return ret; return clocksource_register_hz(&arc_counter_gfrc, arc_timer_freq); }
static void __init arc_cs_setup_timer1(struct device_node *node) { int ret; /* Local to CPU hence not usable in SMP */ if (IS_ENABLED(CONFIG_SMP)) return; ret = arc_get_timer_clk(node); if (ret) return; write_aux_reg(ARC_REG_TIMER1_LIMIT, ARC_TIMER_MAX); write_aux_reg(ARC_REG_TIMER1_CNT, 0); write_aux_reg(ARC_REG_TIMER1_CTRL, TIMER_CTRL_NH); clocksource_register_hz(&arc_counter_timer1, arc_timer_freq); }
static void __init arc_cs_setup_rtc(struct device_node *node) { int exists = cpuinfo_arc700[smp_processor_id()].extn.rtc; int ret; if (WARN(!exists, "Local-64-bit-Ctr clocksource not detected")) return; /* Local to CPU hence not usable in SMP */ if (WARN(IS_ENABLED(CONFIG_SMP), "Local-64-bit-Ctr not usable in SMP")) return; ret = arc_get_timer_clk(node); if (ret) return; write_aux_reg(AUX_RTC_CTRL, 1); clocksource_register_hz(&arc_counter_rtc, arc_timer_freq); }