void __init time_init_deferred(void) { struct resource *resource = NULL; struct clock_event_device *ce_dev = &hexagon_clockevent_dev; struct device_node *dn; struct resource r; int err; ce_dev->cpumask = cpu_all_mask; if (!resource) resource = rtos_timer_device.resource; rtos_timer = ioremap(resource->start, resource->end - resource->start + 1); if (!rtos_timer) { release_mem_region(resource->start, resource->end - resource->start + 1); } clocksource_register_khz(&hexagon_clocksource, pcycle_freq_mhz * 1000); clockevents_calc_mult_shift(ce_dev, sleep_clk_freq, 4); ce_dev->max_delta_ns = clockevent_delta2ns(0x7fffffff, ce_dev); ce_dev->min_delta_ns = clockevent_delta2ns(0xf, ce_dev); #ifdef CONFIG_SMP setup_percpu_clockdev(); #endif clockevents_register_device(ce_dev); setup_irq(ce_dev->irq, &rtos_timer_intdesc); }
/* * time_init_deferred - called by start_kernel to set up timer/clock source * * Install the IRQ handler for the clock, setup timers. * This is done late, as that way, we can use ioremap(). * * This runs just before the delay loop is calibrated, and * is used for delay calibration. */ void __init time_init_deferred(void) { struct resource *resource = NULL; struct clock_event_device *ce_dev = &hexagon_clockevent_dev; ce_dev->cpumask = cpu_all_mask; if (!resource) resource = rtos_timer_device.resource; /* ioremap here means this has to run later, after paging init */ rtos_timer = ioremap(resource->start, resource_size(resource)); if (!rtos_timer) { release_mem_region(resource->start, resource_size(resource)); } clocksource_register_khz(&hexagon_clocksource, pcycle_freq_mhz * 1000); /* Note: the sim generic RTOS clock is apparently really 18750Hz */ /* * Last arg is some guaranteed seconds for which the conversion will * work without overflow. */ clockevents_calc_mult_shift(ce_dev, sleep_clk_freq, 4); ce_dev->max_delta_ns = clockevent_delta2ns(0x7fffffff, ce_dev); ce_dev->min_delta_ns = clockevent_delta2ns(0xf, ce_dev); #ifdef CONFIG_SMP setup_percpu_clockdev(); #endif clockevents_register_device(ce_dev); setup_irq(ce_dev->irq, &rtos_timer_intdesc); }