Merge master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-drm-fsl-dcu.git] / arch / powerpc / kernel / sysfs.c
index 400ab2b946e760964bd164f282ec1f270579ac6a..cae39d9dfe48add64f8be93cff924f630003cfd4 100644 (file)
@@ -66,16 +66,17 @@ static int __init smt_setup(void)
        if (!cpu_has_feature(CPU_FTR_SMT))
                return -ENODEV;
 
-       options = find_path_device("/options");
+       options = of_find_node_by_path("/options");
        if (!options)
                return -ENODEV;
 
-       val = get_property(options, "ibm,smt-snooze-delay", NULL);
+       val = of_get_property(options, "ibm,smt-snooze-delay", NULL);
        if (!smt_snooze_cmdline && val) {
                for_each_possible_cpu(cpu)
                        per_cpu(smt_snooze_delay, cpu) = *val;
        }
 
+       of_node_put(options);
        return 0;
 }
 __initcall(smt_setup);
@@ -169,6 +170,11 @@ static ssize_t __attribute_used__ \
        return count; \
 }
 
+
+/* Let's define all possible registers, we'll only hook up the ones
+ * that are implemented on the current processor
+ */
+
 SYSFS_PMCSETUP(mmcr0, SPRN_MMCR0);
 SYSFS_PMCSETUP(mmcr1, SPRN_MMCR1);
 SYSFS_PMCSETUP(mmcra, SPRN_MMCRA);
@@ -184,55 +190,87 @@ SYSFS_PMCSETUP(purr, SPRN_PURR);
 SYSFS_PMCSETUP(spurr, SPRN_SPURR);
 SYSFS_PMCSETUP(dscr, SPRN_DSCR);
 
-static SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0);
-static SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1);
+SYSFS_PMCSETUP(pa6t_pmc0, SPRN_PA6T_PMC0);
+SYSFS_PMCSETUP(pa6t_pmc1, SPRN_PA6T_PMC1);
+SYSFS_PMCSETUP(pa6t_pmc2, SPRN_PA6T_PMC2);
+SYSFS_PMCSETUP(pa6t_pmc3, SPRN_PA6T_PMC3);
+SYSFS_PMCSETUP(pa6t_pmc4, SPRN_PA6T_PMC4);
+SYSFS_PMCSETUP(pa6t_pmc5, SPRN_PA6T_PMC5);
+
+
 static SYSDEV_ATTR(mmcra, 0600, show_mmcra, store_mmcra);
-static SYSDEV_ATTR(pmc1, 0600, show_pmc1, store_pmc1);
-static SYSDEV_ATTR(pmc2, 0600, show_pmc2, store_pmc2);
-static SYSDEV_ATTR(pmc3, 0600, show_pmc3, store_pmc3);
-static SYSDEV_ATTR(pmc4, 0600, show_pmc4, store_pmc4);
-static SYSDEV_ATTR(pmc5, 0600, show_pmc5, store_pmc5);
-static SYSDEV_ATTR(pmc6, 0600, show_pmc6, store_pmc6);
-static SYSDEV_ATTR(pmc7, 0600, show_pmc7, store_pmc7);
-static SYSDEV_ATTR(pmc8, 0600, show_pmc8, store_pmc8);
-static SYSDEV_ATTR(purr, 0600, show_purr, NULL);
 static SYSDEV_ATTR(spurr, 0600, show_spurr, NULL);
 static SYSDEV_ATTR(dscr, 0600, show_dscr, store_dscr);
+static SYSDEV_ATTR(purr, 0600, show_purr, store_purr);
+
+static struct sysdev_attribute ibm_common_attrs[] = {
+       _SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0),
+       _SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1),
+};
+
+static struct sysdev_attribute ibm_pmc_attrs[] = {
+       _SYSDEV_ATTR(pmc1, 0600, show_pmc1, store_pmc1),
+       _SYSDEV_ATTR(pmc2, 0600, show_pmc2, store_pmc2),
+       _SYSDEV_ATTR(pmc3, 0600, show_pmc3, store_pmc3),
+       _SYSDEV_ATTR(pmc4, 0600, show_pmc4, store_pmc4),
+       _SYSDEV_ATTR(pmc5, 0600, show_pmc5, store_pmc5),
+       _SYSDEV_ATTR(pmc6, 0600, show_pmc6, store_pmc6),
+       _SYSDEV_ATTR(pmc7, 0600, show_pmc7, store_pmc7),
+       _SYSDEV_ATTR(pmc8, 0600, show_pmc8, store_pmc8),
+};
+
+static struct sysdev_attribute pa6t_attrs[] = {
+       _SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0),
+       _SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1),
+       _SYSDEV_ATTR(pmc0, 0600, show_pa6t_pmc0, store_pa6t_pmc0),
+       _SYSDEV_ATTR(pmc1, 0600, show_pa6t_pmc1, store_pa6t_pmc1),
+       _SYSDEV_ATTR(pmc2, 0600, show_pa6t_pmc2, store_pa6t_pmc2),
+       _SYSDEV_ATTR(pmc3, 0600, show_pa6t_pmc3, store_pa6t_pmc3),
+       _SYSDEV_ATTR(pmc4, 0600, show_pa6t_pmc4, store_pa6t_pmc4),
+       _SYSDEV_ATTR(pmc5, 0600, show_pa6t_pmc5, store_pa6t_pmc5),
+};
+
 
 static void register_cpu_online(unsigned int cpu)
 {
        struct cpu *c = &per_cpu(cpu_devices, cpu);
        struct sys_device *s = &c->sysdev;
+       struct sysdev_attribute *attrs, *pmc_attrs;
+       int i, nattrs;
 
        if (!firmware_has_feature(FW_FEATURE_ISERIES) &&
                        cpu_has_feature(CPU_FTR_SMT))
                sysdev_create_file(s, &attr_smt_snooze_delay);
 
        /* PMC stuff */
+       switch (cur_cpu_spec->pmc_type) {
+       case PPC_PMC_IBM:
+               attrs = ibm_common_attrs;
+               nattrs = sizeof(ibm_common_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = ibm_pmc_attrs;
+               break;
+       case PPC_PMC_PA6T:
+               /* PA Semi starts counting at PMC0 */
+               attrs = pa6t_attrs;
+               nattrs = sizeof(pa6t_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = NULL;
+               break;
+       default:
+               attrs = NULL;
+               nattrs = 0;
+               pmc_attrs = NULL;
+       }
+
+       for (i = 0; i < nattrs; i++)
+               sysdev_create_file(s, &attrs[i]);
 
-       sysdev_create_file(s, &attr_mmcr0);
-       sysdev_create_file(s, &attr_mmcr1);
+       if (pmc_attrs)
+               for (i = 0; i < cur_cpu_spec->num_pmcs; i++)
+                       sysdev_create_file(s, &pmc_attrs[i]);
 
        if (cpu_has_feature(CPU_FTR_MMCRA))
                sysdev_create_file(s, &attr_mmcra);
 
-       if (cur_cpu_spec->num_pmcs >= 1)
-               sysdev_create_file(s, &attr_pmc1);
-       if (cur_cpu_spec->num_pmcs >= 2)
-               sysdev_create_file(s, &attr_pmc2);
-       if (cur_cpu_spec->num_pmcs >= 3)
-               sysdev_create_file(s, &attr_pmc3);
-       if (cur_cpu_spec->num_pmcs >= 4)
-               sysdev_create_file(s, &attr_pmc4);
-       if (cur_cpu_spec->num_pmcs >= 5)
-               sysdev_create_file(s, &attr_pmc5);
-       if (cur_cpu_spec->num_pmcs >= 6)
-               sysdev_create_file(s, &attr_pmc6);
-       if (cur_cpu_spec->num_pmcs >= 7)
-               sysdev_create_file(s, &attr_pmc7);
-       if (cur_cpu_spec->num_pmcs >= 8)
-               sysdev_create_file(s, &attr_pmc8);
-
        if (cpu_has_feature(CPU_FTR_PURR))
                sysdev_create_file(s, &attr_purr);
 
@@ -248,6 +286,8 @@ static void unregister_cpu_online(unsigned int cpu)
 {
        struct cpu *c = &per_cpu(cpu_devices, cpu);
        struct sys_device *s = &c->sysdev;
+       struct sysdev_attribute *attrs, *pmc_attrs;
+       int i, nattrs;
 
        BUG_ON(!c->hotpluggable);
 
@@ -256,30 +296,34 @@ static void unregister_cpu_online(unsigned int cpu)
                sysdev_remove_file(s, &attr_smt_snooze_delay);
 
        /* PMC stuff */
+       switch (cur_cpu_spec->pmc_type) {
+       case PPC_PMC_IBM:
+               attrs = ibm_common_attrs;
+               nattrs = sizeof(ibm_common_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = ibm_pmc_attrs;
+               break;
+       case PPC_PMC_PA6T:
+               /* PA Semi starts counting at PMC0 */
+               attrs = pa6t_attrs;
+               nattrs = sizeof(pa6t_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = NULL;
+               break;
+       default:
+               attrs = NULL;
+               nattrs = 0;
+               pmc_attrs = NULL;
+       }
 
-       sysdev_remove_file(s, &attr_mmcr0);
-       sysdev_remove_file(s, &attr_mmcr1);
+       for (i = 0; i < nattrs; i++)
+               sysdev_remove_file(s, &attrs[i]);
+
+       if (pmc_attrs)
+               for (i = 0; i < cur_cpu_spec->num_pmcs; i++)
+                       sysdev_remove_file(s, &pmc_attrs[i]);
 
        if (cpu_has_feature(CPU_FTR_MMCRA))
                sysdev_remove_file(s, &attr_mmcra);
 
-       if (cur_cpu_spec->num_pmcs >= 1)
-               sysdev_remove_file(s, &attr_pmc1);
-       if (cur_cpu_spec->num_pmcs >= 2)
-               sysdev_remove_file(s, &attr_pmc2);
-       if (cur_cpu_spec->num_pmcs >= 3)
-               sysdev_remove_file(s, &attr_pmc3);
-       if (cur_cpu_spec->num_pmcs >= 4)
-               sysdev_remove_file(s, &attr_pmc4);
-       if (cur_cpu_spec->num_pmcs >= 5)
-               sysdev_remove_file(s, &attr_pmc5);
-       if (cur_cpu_spec->num_pmcs >= 6)
-               sysdev_remove_file(s, &attr_pmc6);
-       if (cur_cpu_spec->num_pmcs >= 7)
-               sysdev_remove_file(s, &attr_pmc7);
-       if (cur_cpu_spec->num_pmcs >= 8)
-               sysdev_remove_file(s, &attr_pmc8);
-
        if (cpu_has_feature(CPU_FTR_PURR))
                sysdev_remove_file(s, &attr_purr);
 
@@ -455,4 +499,4 @@ static int __init topology_init(void)
 
        return 0;
 }
-__initcall(topology_init);
+subsys_initcall(topology_init);