[MIPS] IP32: Enable PCI bridges
[linux-2.6.git] / arch / mips / oprofile / common.c
index ab65ce3..4e0a90b 100644 (file)
@@ -3,7 +3,8 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 2004 by Ralf Baechle
+ * Copyright (C) 2004, 2005 Ralf Baechle
+ * Copyright (C) 2005 MIPS Technologies, Inc.
  */
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -13,8 +14,8 @@
 
 #include "op_impl.h"
 
-extern struct op_mips_model op_model_mipsxx __attribute__((weak));
-extern struct op_mips_model op_model_rm9000 __attribute__((weak));
+extern struct op_mips_model op_model_mipsxx_ops __attribute__((weak));
+extern struct op_mips_model op_model_rm9000_ops __attribute__((weak));
 
 static struct op_mips_model *model;
 
@@ -26,7 +27,7 @@ static int op_mips_setup(void)
        model->reg_setup(ctr);
 
        /* Configure the registers on all cpus.  */
-       on_each_cpu(model->cpu_setup, 0, 0, 1);
+       on_each_cpu(model->cpu_setup, NULL, 0, 1);
 
         return 0;
 }
@@ -37,7 +38,7 @@ static int op_mips_create_files(struct super_block * sb, struct dentry * root)
 
        for (i = 0; i < model->num_counters; ++i) {
                struct dentry *dir;
-               char buf[3];
+               char buf[4];
 
                snprintf(buf, sizeof buf, "%d", i);
                dir = oprofilefs_mkdir(sb, root, buf);
@@ -45,10 +46,10 @@ static int op_mips_create_files(struct super_block * sb, struct dentry * root)
                oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled);
                oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event);
                oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count);
-               /* Dummies.  */
                oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel);
                oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user);
                oprofilefs_create_ulong(sb, dir, "exl", &ctr[i].exl);
+               /* Dummy.  */
                oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask);
        }
 
@@ -68,39 +69,55 @@ static void op_mips_stop(void)
        on_each_cpu(model->cpu_stop, NULL, 0, 1);
 }
 
-void __init oprofile_arch_init(struct oprofile_operations *ops)
+int __init oprofile_arch_init(struct oprofile_operations *ops)
 {
        struct op_mips_model *lmodel = NULL;
+       int res;
 
        switch (current_cpu_data.cputype) {
+       case CPU_5KC:
+       case CPU_20KC:
        case CPU_24K:
-               lmodel = &op_model_mipsxx;
+       case CPU_25KF:
+       case CPU_34K:
+       case CPU_74K:
+       case CPU_SB1:
+       case CPU_SB1A:
+       case CPU_R10000:
+       case CPU_R12000:
+       case CPU_R14000:
+               lmodel = &op_model_mipsxx_ops;
                break;
 
        case CPU_RM9000:
-               lmodel = &op_model_rm9000;
+               lmodel = &op_model_rm9000_ops;
                break;
        };
 
        if (!lmodel)
-               return;
+               return -ENODEV;
 
-       if (lmodel->init())
-               return;
+       res = lmodel->init();
+       if (res)
+               return res;
 
        model = lmodel;
 
-       ops->create_files = op_mips_create_files;
-       ops->setup = op_mips_setup;
-       ops->start = op_mips_start;
-       ops->stop = op_mips_stop;
-       ops->cpu_type = lmodel->cpu_type;
+       ops->create_files       = op_mips_create_files;
+       ops->setup              = op_mips_setup;
+       //ops->shutdown         = op_mips_shutdown;
+       ops->start              = op_mips_start;
+       ops->stop               = op_mips_stop;
+       ops->cpu_type           = lmodel->cpu_type;
 
        printk(KERN_INFO "oprofile: using %s performance monitoring.\n",
               lmodel->cpu_type);
+
+       return 0;
 }
 
 void oprofile_arch_exit(void)
 {
-       model->exit();
+       if (model)
+               model->exit();
 }