#include <linux/init.h>
 #include <linux/module.h>
 
+#include <asm/oprofile_impl.h>
 #include <asm/cputable.h>
 
 struct cpu_spec* cur_cpu_spec = NULL;
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power3,
                .oprofile_cpu_type      = "ppc64/power3",
+               .oprofile_model         = &op_model_rs64,
        },
        {       /* Power3+ */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power3,
                .oprofile_cpu_type      = "ppc64/power3",
+               .oprofile_model         = &op_model_rs64,
        },
        {       /* Northstar */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power3,
                .oprofile_cpu_type      = "ppc64/rs64",
+               .oprofile_model         = &op_model_rs64,
        },
        {       /* Pulsar */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power3,
                .oprofile_cpu_type      = "ppc64/rs64",
+               .oprofile_model         = &op_model_rs64,
        },
        {       /* I-star */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power3,
                .oprofile_cpu_type      = "ppc64/rs64",
+               .oprofile_model         = &op_model_rs64,
        },
        {       /* S-star */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power3,
                .oprofile_cpu_type      = "ppc64/rs64",
+               .oprofile_model         = &op_model_rs64,
        },
        {       /* Power4 */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power4,
                .oprofile_cpu_type      = "ppc64/power4",
+               .oprofile_model         = &op_model_rs64,
        },
        {       /* Power4+ */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_power4,
                .oprofile_cpu_type      = "ppc64/power4",
+               .oprofile_model         = &op_model_power4,
        },
        {       /* PPC970 */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
+               .oprofile_model         = &op_model_power4,
        },
        {       /* PPC970FX */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
+               .oprofile_model         = &op_model_power4,
        },
        {       /* PPC970MP */
                .pvr_mask               = 0xffff0000,
                .dcache_bsize           = 128,
                .cpu_setup              = __setup_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
+               .oprofile_model         = &op_model_power4,
        },
        {       /* Power5 */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 6,
                .cpu_setup              = __setup_cpu_power4,
                .oprofile_cpu_type      = "ppc64/power5",
+               .oprofile_model         = &op_model_power4,
        },
        {       /* Power5 */
                .pvr_mask               = 0xffff0000,
                .num_pmcs               = 6,
                .cpu_setup              = __setup_cpu_power4,
                .oprofile_cpu_type      = "ppc64/power5",
+               .oprofile_model         = &op_model_power4,
        },
        {       /* BE DD1.x */
                .pvr_mask               = 0xffff0000,
 
 
 int __init oprofile_arch_init(struct oprofile_operations *ops)
 {
-       unsigned int pvr;
-
-       pvr = mfspr(SPRN_PVR);
-
-       switch (PVR_VER(pvr)) {
-               case PV_630:
-               case PV_630p:
-                       model = &op_model_rs64;
-                       break;
-
-               case PV_NORTHSTAR:
-               case PV_PULSAR:
-               case PV_ICESTAR:
-               case PV_SSTAR:
-                       model = &op_model_rs64;
-                       break;
-
-               case PV_POWER4:
-               case PV_POWER4p:
-                       model = &op_model_power4;
-                       break;
-
-               case PV_970:
-               case PV_970FX:
-               case PV_970MP:
-                       model = &op_model_power4;
-                       break;
-
-               case PV_POWER5:
-               case PV_POWER5p:
-                       model = &op_model_power4;
-                       break;
-
-               default:
-                       return -ENODEV;
-       }
+       if (!cur_cpu_spec->oprofile_model || !cur_cpu_spec->oprofile_cpu_type)
+               return -ENODEV;
 
-       ops->cpu_type = cur_cpu_spec->oprofile_cpu_type;
+       model = cur_cpu_spec->oprofile_model;
        model->num_counters = cur_cpu_spec->num_pmcs;
+
+       ops->cpu_type = cur_cpu_spec->oprofile_cpu_type;
        ops->create_files = op_ppc64_create_files;
        ops->setup = op_ppc64_setup;
        ops->shutdown = op_ppc64_shutdown;