···110110 }111111}112112113113-void __init per_cpu_init(void)113113+void __cpuinit per_cpu_init(void)114114{115115 int cpu = smp_processor_id();116116 int slice = LOCAL_HUB_L(PI_CPU_NUM);
+80-72
arch/mips/sgi-ip27/ip27-timer.c
···111111 return mktime(year, month, date, hour, min, sec);112112}113113114114-static int rt_set_next_event(unsigned long delta,115115- struct clock_event_device *evt)116116-{117117- unsigned int cpu = smp_processor_id();118118- int slice = cputoslice(cpu) == 0;119119- unsigned long cnt;120120-121121- cnt = LOCAL_HUB_L(PI_RT_COUNT);122122- cnt += delta;123123- LOCAL_HUB_S(slice ? PI_RT_COMPARE_A : PI_RT_COMPARE_B, cnt);124124-125125- return LOCAL_HUB_L(PI_RT_COUNT) >= cnt ? -ETIME : 0;126126-}127127-128128-static void rt_set_mode(enum clock_event_mode mode,129129- struct clock_event_device *evt)130130-{131131- switch (mode) {132132- case CLOCK_EVT_MODE_PERIODIC:133133- /* The only mode supported */134134- break;135135-136136- case CLOCK_EVT_MODE_UNUSED:137137- case CLOCK_EVT_MODE_SHUTDOWN:138138- case CLOCK_EVT_MODE_ONESHOT:139139- case CLOCK_EVT_MODE_RESUME:140140- /* Nothing to do */141141- break;142142- }143143-}144144-145145-struct clock_event_device rt_clock_event_device = {146146- .name = "HUB-RT",147147- .features = CLOCK_EVT_FEAT_ONESHOT,148148-149149- .rating = 300,150150- .set_next_event = rt_set_next_event,151151- .set_mode = rt_set_mode,152152-};153153-154114static void enable_rt_irq(unsigned int irq)155115{156116}···128168 .eoi = enable_rt_irq,129169};130170171171+static int rt_next_event(unsigned long delta, struct clock_event_device *evt)172172+{173173+ unsigned int cpu = smp_processor_id();174174+ int slice = cputoslice(cpu) == 0;175175+ unsigned long cnt;176176+177177+ cnt = LOCAL_HUB_L(PI_RT_COUNT);178178+ cnt += delta;179179+ LOCAL_HUB_S(slice ? PI_RT_COMPARE_A : PI_RT_COMPARE_B, cnt);180180+181181+ return LOCAL_HUB_L(PI_RT_COUNT) >= cnt ? -ETIME : 0;182182+}183183+184184+static void rt_set_mode(enum clock_event_mode mode,185185+ struct clock_event_device *evt)186186+{187187+ switch (mode) {188188+ case CLOCK_EVT_MODE_ONESHOT:189189+ /* The only mode supported */190190+ break;191191+192192+ case CLOCK_EVT_MODE_PERIODIC:193193+ case CLOCK_EVT_MODE_UNUSED:194194+ case CLOCK_EVT_MODE_SHUTDOWN:195195+ case CLOCK_EVT_MODE_RESUME:196196+ /* Nothing to do */197197+ break;198198+ }199199+}200200+131201unsigned int rt_timer_irq;132202133133-static irqreturn_t ip27_rt_timer_interrupt(int irq, void *dev_id)203203+static irqreturn_t hub_rt_counter_handler(int irq, void *dev_id)134204{135135- struct clock_event_device *cd = &rt_clock_event_device;205205+ struct clock_event_device *cd = dev_id;136206 unsigned int cpu = smp_processor_id();137207 int slice = cputoslice(cpu) == 0;138208···172182 return IRQ_HANDLED;173183}174184175175-static struct irqaction rt_irqaction = {176176- .handler = (irq_handler_t) ip27_rt_timer_interrupt,177177- .flags = IRQF_DISABLED,178178- .mask = CPU_MASK_NONE,179179- .name = "timer"185185+struct irqaction hub_rt_irqaction = {186186+ .handler = hub_rt_counter_handler,187187+ .flags = IRQF_DISABLED | IRQF_PERCPU,188188+ .name = "hub-rt",180189};181190182191/*···189200#define NSEC_PER_CYCLE 800190201#define CYCLES_PER_SEC (NSEC_PER_SEC / NSEC_PER_CYCLE)191202192192-static void __init ip27_rt_clock_event_init(void)203203+static DEFINE_PER_CPU(struct clock_event_device, hub_rt_clockevent);204204+static DEFINE_PER_CPU(char [11], hub_rt_name);205205+206206+static void __cpuinit hub_rt_clock_event_init(void)193207{194194- struct clock_event_device *cd = &rt_clock_event_device;195208 unsigned int cpu = smp_processor_id();196196- int irq = allocate_irqno();209209+ struct clock_event_device *cd = &per_cpu(hub_rt_clockevent, cpu);210210+ unsigned char *name = per_cpu(hub_rt_name, cpu);211211+ int irq = rt_timer_irq;197212198198- if (irq < 0)199199- panic("Can't allocate interrupt number for timer interrupt");200200-201201- rt_timer_irq = irq;202202-213213+ sprintf(name, "hub-rt %d", cpu);214214+ cd->name = "HUB-RT",215215+ cd->features = CLOCK_EVT_FEAT_ONESHOT,216216+ clockevent_set_clock(cd, CYCLES_PER_SEC);217217+ cd->max_delta_ns = clockevent_delta2ns(0xfffffffffffff, cd);218218+ cd->min_delta_ns = clockevent_delta2ns(0x300, cd);219219+ cd->rating = 200,203220 cd->irq = irq,204221 cd->cpumask = cpumask_of_cpu(cpu),205205-206206- /*207207- * Calculate the min / max delta208208- */209209- cd->mult =210210- div_sc((unsigned long) CYCLES_PER_SEC, NSEC_PER_SEC, 32);211211- cd->shift = 32;212212- cd->max_delta_ns = clockevent_delta2ns(0x7fffffff, cd);213213- cd->min_delta_ns = clockevent_delta2ns(0x300, cd);222222+ cd->rating = 300,223223+ cd->set_next_event = rt_next_event,224224+ cd->set_mode = rt_set_mode,214225 clockevents_register_device(cd);226226+}227227+228228+static void __init hub_rt_clock_event_global_init(void)229229+{230230+ unsigned int irq;231231+232232+ do {233233+ smp_wmb();234234+ irq = rt_timer_irq;235235+ if (irq)236236+ break;237237+238238+ irq = allocate_irqno();239239+ if (irq < 0)240240+ panic("Allocation of irq number for timer failed");241241+ } while (xchg(&rt_timer_irq, irq));215242216243 set_irq_chip_and_handler(irq, &rt_irq_type, handle_percpu_irq);217217- setup_irq(irq, &rt_irqaction);244244+ setup_irq(irq, &hub_rt_irqaction);218245}219246220247static cycle_t hub_rt_read(void)···238233 return REMOTE_HUB_L(cputonasid(0), PI_RT_COUNT);239234}240235241241-struct clocksource ht_rt_clocksource = {236236+struct clocksource hub_rt_clocksource = {242237 .name = "HUB-RT",243238 .rating = 200,244239 .read = hub_rt_read,245240 .mask = CLOCKSOURCE_MASK(52),246246- .shift = 32,247241 .flags = CLOCK_SOURCE_IS_CONTINUOUS,248242};249243250250-static void __init ip27_rt_clocksource_init(void)244244+static void __init hub_rt_clocksource_init(void)251245{252252- clocksource_register(&ht_rt_clocksource);246246+ struct clocksource *cs = &hub_rt_clocksource;247247+248248+ clocksource_set_clock(cs, CYCLES_PER_SEC);249249+ clocksource_register(cs);253250}254251255252void __init plat_time_init(void)256253{257257- ip27_rt_clock_event_init();258258- ip27_rt_clocksource_init();254254+ hub_rt_clocksource_init();255255+ hub_rt_clock_event_global_init();259256}260257261261-void __init cpu_time_init(void)258258+void __cpuinit cpu_time_init(void)262259{263260 lboard_t *board;264261 klcpu_t *cpu;···278271279272 printk("CPU %d clock is %dMHz.\n", smp_processor_id(), cpu->cpu_speed);280273274274+ hub_rt_clock_event_init();281275 set_c0_status(SRB_TIMOCLK);282276}283277