linux/arch/sparc/kernel/tick14.c
<<
>>
Prefs
   1/* tick14.c
   2 * linux/arch/sparc/kernel/tick14.c
   3 *
   4 * Copyright (C) 1996 David Redman (djhr@tadpole.co.uk)
   5 *
   6 * This file handles the Sparc specific level14 ticker
   7 * This is really useful for profiling OBP uses it for keyboard
   8 * aborts and other stuff.
   9 *
  10 *
  11 */
  12#include <linux/errno.h>
  13#include <linux/sched.h>
  14#include <linux/kernel.h>
  15#include <linux/param.h>
  16#include <linux/string.h>
  17#include <linux/mm.h>
  18#include <linux/timex.h>
  19#include <linux/interrupt.h>
  20
  21#include <asm/oplib.h>
  22#include <asm/timer.h>
  23#include <asm/mostek.h>
  24#include <asm/system.h>
  25#include <asm/irq.h>
  26#include <asm/io.h>
  27
  28#include "irq.h"
  29
  30extern unsigned long lvl14_save[5];
  31static unsigned long *linux_lvl14 = NULL;
  32static unsigned long obp_lvl14[4];
  33 
  34/*
  35 * Call with timer IRQ closed.
  36 * First time we do it with disable_irq, later prom code uses spin_lock_irq().
  37 */
  38void install_linux_ticker(void)
  39{
  40
  41        if (!linux_lvl14)
  42                return;
  43        linux_lvl14[0] =  lvl14_save[0];
  44        linux_lvl14[1] =  lvl14_save[1];
  45        linux_lvl14[2] =  lvl14_save[2];
  46        linux_lvl14[3] =  lvl14_save[3];
  47}
  48
  49void install_obp_ticker(void)
  50{
  51
  52        if (!linux_lvl14)
  53                return;
  54        linux_lvl14[0] =  obp_lvl14[0];
  55        linux_lvl14[1] =  obp_lvl14[1];
  56        linux_lvl14[2] =  obp_lvl14[2];
  57        linux_lvl14[3] =  obp_lvl14[3]; 
  58}
  59
  60void claim_ticker14(irq_handler_t handler,
  61                    int irq_nr, unsigned int timeout )
  62{
  63        int cpu = smp_processor_id();
  64
  65        /* first we copy the obp handler instructions
  66         */
  67        __disable_irq(irq_nr);
  68        if (!handler)
  69                return;
  70    
  71        linux_lvl14 = (unsigned long *)lvl14_save[4];
  72        obp_lvl14[0] = linux_lvl14[0];
  73        obp_lvl14[1] = linux_lvl14[1];
  74        obp_lvl14[2] = linux_lvl14[2];
  75        obp_lvl14[3] = linux_lvl14[3];
  76
  77        if (!request_irq(irq_nr,
  78                         handler,
  79                         (IRQF_DISABLED | SA_STATIC_ALLOC),
  80                         "counter14",
  81                         NULL)) {
  82                install_linux_ticker();
  83                load_profile_irq(cpu, timeout);
  84                __enable_irq(irq_nr);
  85        }
  86}
  87