diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2011-12-21 17:29:42 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-12-21 17:29:42 -0500 |
commit | 8a25a2fd126c621f44f3aeaef80d51f00fc11639 (patch) | |
tree | 41694ab1a9c82a7a02d9cd33c929fd039c98c815 /drivers/cpufreq | |
parent | cb0c05c5fae12eeb7c85c205578df277bd706155 (diff) |
cpu: convert 'cpu' and 'machinecheck' sysdev_class to a regular subsystem
This moves the 'cpu sysdev_class' over to a regular 'cpu' subsystem
and converts the devices to regular devices. The sysdev drivers are
implemented as subsystem interfaces now.
After all sysdev classes are ported to regular driver core entities, the
sysdev implementation will be entirely removed from the kernel.
Userspace relies on events and generic sysfs subsystem infrastructure
from sysdev devices, which are made available with this conversion.
Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Borislav Petkov <bp@amd64.org>
Cc: Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
Cc: Len Brown <lenb@kernel.org>
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Dave Jones <davej@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 79 | ||||
-rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 1 |
2 files changed, 39 insertions, 41 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 987a165ede26..8c2df3499da7 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -679,7 +679,7 @@ static struct kobj_type ktype_cpufreq = { | |||
679 | */ | 679 | */ |
680 | static int cpufreq_add_dev_policy(unsigned int cpu, | 680 | static int cpufreq_add_dev_policy(unsigned int cpu, |
681 | struct cpufreq_policy *policy, | 681 | struct cpufreq_policy *policy, |
682 | struct sys_device *sys_dev) | 682 | struct device *dev) |
683 | { | 683 | { |
684 | int ret = 0; | 684 | int ret = 0; |
685 | #ifdef CONFIG_SMP | 685 | #ifdef CONFIG_SMP |
@@ -728,7 +728,7 @@ static int cpufreq_add_dev_policy(unsigned int cpu, | |||
728 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); | 728 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); |
729 | 729 | ||
730 | pr_debug("CPU already managed, adding link\n"); | 730 | pr_debug("CPU already managed, adding link\n"); |
731 | ret = sysfs_create_link(&sys_dev->kobj, | 731 | ret = sysfs_create_link(&dev->kobj, |
732 | &managed_policy->kobj, | 732 | &managed_policy->kobj, |
733 | "cpufreq"); | 733 | "cpufreq"); |
734 | if (ret) | 734 | if (ret) |
@@ -761,7 +761,7 @@ static int cpufreq_add_dev_symlink(unsigned int cpu, | |||
761 | 761 | ||
762 | for_each_cpu(j, policy->cpus) { | 762 | for_each_cpu(j, policy->cpus) { |
763 | struct cpufreq_policy *managed_policy; | 763 | struct cpufreq_policy *managed_policy; |
764 | struct sys_device *cpu_sys_dev; | 764 | struct device *cpu_dev; |
765 | 765 | ||
766 | if (j == cpu) | 766 | if (j == cpu) |
767 | continue; | 767 | continue; |
@@ -770,8 +770,8 @@ static int cpufreq_add_dev_symlink(unsigned int cpu, | |||
770 | 770 | ||
771 | pr_debug("CPU %u already managed, adding link\n", j); | 771 | pr_debug("CPU %u already managed, adding link\n", j); |
772 | managed_policy = cpufreq_cpu_get(cpu); | 772 | managed_policy = cpufreq_cpu_get(cpu); |
773 | cpu_sys_dev = get_cpu_sysdev(j); | 773 | cpu_dev = get_cpu_device(j); |
774 | ret = sysfs_create_link(&cpu_sys_dev->kobj, &policy->kobj, | 774 | ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj, |
775 | "cpufreq"); | 775 | "cpufreq"); |
776 | if (ret) { | 776 | if (ret) { |
777 | cpufreq_cpu_put(managed_policy); | 777 | cpufreq_cpu_put(managed_policy); |
@@ -783,7 +783,7 @@ static int cpufreq_add_dev_symlink(unsigned int cpu, | |||
783 | 783 | ||
784 | static int cpufreq_add_dev_interface(unsigned int cpu, | 784 | static int cpufreq_add_dev_interface(unsigned int cpu, |
785 | struct cpufreq_policy *policy, | 785 | struct cpufreq_policy *policy, |
786 | struct sys_device *sys_dev) | 786 | struct device *dev) |
787 | { | 787 | { |
788 | struct cpufreq_policy new_policy; | 788 | struct cpufreq_policy new_policy; |
789 | struct freq_attr **drv_attr; | 789 | struct freq_attr **drv_attr; |
@@ -793,7 +793,7 @@ static int cpufreq_add_dev_interface(unsigned int cpu, | |||
793 | 793 | ||
794 | /* prepare interface data */ | 794 | /* prepare interface data */ |
795 | ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, | 795 | ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, |
796 | &sys_dev->kobj, "cpufreq"); | 796 | &dev->kobj, "cpufreq"); |
797 | if (ret) | 797 | if (ret) |
798 | return ret; | 798 | return ret; |
799 | 799 | ||
@@ -866,9 +866,9 @@ err_out_kobj_put: | |||
866 | * with with cpu hotplugging and all hell will break loose. Tried to clean this | 866 | * with with cpu hotplugging and all hell will break loose. Tried to clean this |
867 | * mess up, but more thorough testing is needed. - Mathieu | 867 | * mess up, but more thorough testing is needed. - Mathieu |
868 | */ | 868 | */ |
869 | static int cpufreq_add_dev(struct sys_device *sys_dev) | 869 | static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif) |
870 | { | 870 | { |
871 | unsigned int cpu = sys_dev->id; | 871 | unsigned int cpu = dev->id; |
872 | int ret = 0, found = 0; | 872 | int ret = 0, found = 0; |
873 | struct cpufreq_policy *policy; | 873 | struct cpufreq_policy *policy; |
874 | unsigned long flags; | 874 | unsigned long flags; |
@@ -947,7 +947,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev) | |||
947 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, | 947 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, |
948 | CPUFREQ_START, policy); | 948 | CPUFREQ_START, policy); |
949 | 949 | ||
950 | ret = cpufreq_add_dev_policy(cpu, policy, sys_dev); | 950 | ret = cpufreq_add_dev_policy(cpu, policy, dev); |
951 | if (ret) { | 951 | if (ret) { |
952 | if (ret > 0) | 952 | if (ret > 0) |
953 | /* This is a managed cpu, symlink created, | 953 | /* This is a managed cpu, symlink created, |
@@ -956,7 +956,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev) | |||
956 | goto err_unlock_policy; | 956 | goto err_unlock_policy; |
957 | } | 957 | } |
958 | 958 | ||
959 | ret = cpufreq_add_dev_interface(cpu, policy, sys_dev); | 959 | ret = cpufreq_add_dev_interface(cpu, policy, dev); |
960 | if (ret) | 960 | if (ret) |
961 | goto err_out_unregister; | 961 | goto err_out_unregister; |
962 | 962 | ||
@@ -999,15 +999,15 @@ module_out: | |||
999 | * Caller should already have policy_rwsem in write mode for this CPU. | 999 | * Caller should already have policy_rwsem in write mode for this CPU. |
1000 | * This routine frees the rwsem before returning. | 1000 | * This routine frees the rwsem before returning. |
1001 | */ | 1001 | */ |
1002 | static int __cpufreq_remove_dev(struct sys_device *sys_dev) | 1002 | static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) |
1003 | { | 1003 | { |
1004 | unsigned int cpu = sys_dev->id; | 1004 | unsigned int cpu = dev->id; |
1005 | unsigned long flags; | 1005 | unsigned long flags; |
1006 | struct cpufreq_policy *data; | 1006 | struct cpufreq_policy *data; |
1007 | struct kobject *kobj; | 1007 | struct kobject *kobj; |
1008 | struct completion *cmp; | 1008 | struct completion *cmp; |
1009 | #ifdef CONFIG_SMP | 1009 | #ifdef CONFIG_SMP |
1010 | struct sys_device *cpu_sys_dev; | 1010 | struct device *cpu_dev; |
1011 | unsigned int j; | 1011 | unsigned int j; |
1012 | #endif | 1012 | #endif |
1013 | 1013 | ||
@@ -1032,7 +1032,7 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev) | |||
1032 | pr_debug("removing link\n"); | 1032 | pr_debug("removing link\n"); |
1033 | cpumask_clear_cpu(cpu, data->cpus); | 1033 | cpumask_clear_cpu(cpu, data->cpus); |
1034 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); | 1034 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); |
1035 | kobj = &sys_dev->kobj; | 1035 | kobj = &dev->kobj; |
1036 | cpufreq_cpu_put(data); | 1036 | cpufreq_cpu_put(data); |
1037 | unlock_policy_rwsem_write(cpu); | 1037 | unlock_policy_rwsem_write(cpu); |
1038 | sysfs_remove_link(kobj, "cpufreq"); | 1038 | sysfs_remove_link(kobj, "cpufreq"); |
@@ -1071,8 +1071,8 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev) | |||
1071 | strncpy(per_cpu(cpufreq_cpu_governor, j), | 1071 | strncpy(per_cpu(cpufreq_cpu_governor, j), |
1072 | data->governor->name, CPUFREQ_NAME_LEN); | 1072 | data->governor->name, CPUFREQ_NAME_LEN); |
1073 | #endif | 1073 | #endif |
1074 | cpu_sys_dev = get_cpu_sysdev(j); | 1074 | cpu_dev = get_cpu_device(j); |
1075 | kobj = &cpu_sys_dev->kobj; | 1075 | kobj = &cpu_dev->kobj; |
1076 | unlock_policy_rwsem_write(cpu); | 1076 | unlock_policy_rwsem_write(cpu); |
1077 | sysfs_remove_link(kobj, "cpufreq"); | 1077 | sysfs_remove_link(kobj, "cpufreq"); |
1078 | lock_policy_rwsem_write(cpu); | 1078 | lock_policy_rwsem_write(cpu); |
@@ -1112,11 +1112,11 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev) | |||
1112 | if (unlikely(cpumask_weight(data->cpus) > 1)) { | 1112 | if (unlikely(cpumask_weight(data->cpus) > 1)) { |
1113 | /* first sibling now owns the new sysfs dir */ | 1113 | /* first sibling now owns the new sysfs dir */ |
1114 | cpumask_clear_cpu(cpu, data->cpus); | 1114 | cpumask_clear_cpu(cpu, data->cpus); |
1115 | cpufreq_add_dev(get_cpu_sysdev(cpumask_first(data->cpus))); | 1115 | cpufreq_add_dev(get_cpu_device(cpumask_first(data->cpus)), NULL); |
1116 | 1116 | ||
1117 | /* finally remove our own symlink */ | 1117 | /* finally remove our own symlink */ |
1118 | lock_policy_rwsem_write(cpu); | 1118 | lock_policy_rwsem_write(cpu); |
1119 | __cpufreq_remove_dev(sys_dev); | 1119 | __cpufreq_remove_dev(dev, sif); |
1120 | } | 1120 | } |
1121 | #endif | 1121 | #endif |
1122 | 1122 | ||
@@ -1128,9 +1128,9 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev) | |||
1128 | } | 1128 | } |
1129 | 1129 | ||
1130 | 1130 | ||
1131 | static int cpufreq_remove_dev(struct sys_device *sys_dev) | 1131 | static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) |
1132 | { | 1132 | { |
1133 | unsigned int cpu = sys_dev->id; | 1133 | unsigned int cpu = dev->id; |
1134 | int retval; | 1134 | int retval; |
1135 | 1135 | ||
1136 | if (cpu_is_offline(cpu)) | 1136 | if (cpu_is_offline(cpu)) |
@@ -1139,7 +1139,7 @@ static int cpufreq_remove_dev(struct sys_device *sys_dev) | |||
1139 | if (unlikely(lock_policy_rwsem_write(cpu))) | 1139 | if (unlikely(lock_policy_rwsem_write(cpu))) |
1140 | BUG(); | 1140 | BUG(); |
1141 | 1141 | ||
1142 | retval = __cpufreq_remove_dev(sys_dev); | 1142 | retval = __cpufreq_remove_dev(dev, sif); |
1143 | return retval; | 1143 | return retval; |
1144 | } | 1144 | } |
1145 | 1145 | ||
@@ -1271,9 +1271,11 @@ out: | |||
1271 | } | 1271 | } |
1272 | EXPORT_SYMBOL(cpufreq_get); | 1272 | EXPORT_SYMBOL(cpufreq_get); |
1273 | 1273 | ||
1274 | static struct sysdev_driver cpufreq_sysdev_driver = { | 1274 | static struct subsys_interface cpufreq_interface = { |
1275 | .add = cpufreq_add_dev, | 1275 | .name = "cpufreq", |
1276 | .remove = cpufreq_remove_dev, | 1276 | .subsys = &cpu_subsys, |
1277 | .add_dev = cpufreq_add_dev, | ||
1278 | .remove_dev = cpufreq_remove_dev, | ||
1277 | }; | 1279 | }; |
1278 | 1280 | ||
1279 | 1281 | ||
@@ -1765,25 +1767,25 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb, | |||
1765 | unsigned long action, void *hcpu) | 1767 | unsigned long action, void *hcpu) |
1766 | { | 1768 | { |
1767 | unsigned int cpu = (unsigned long)hcpu; | 1769 | unsigned int cpu = (unsigned long)hcpu; |
1768 | struct sys_device *sys_dev; | 1770 | struct device *dev; |
1769 | 1771 | ||
1770 | sys_dev = get_cpu_sysdev(cpu); | 1772 | dev = get_cpu_device(cpu); |
1771 | if (sys_dev) { | 1773 | if (dev) { |
1772 | switch (action) { | 1774 | switch (action) { |
1773 | case CPU_ONLINE: | 1775 | case CPU_ONLINE: |
1774 | case CPU_ONLINE_FROZEN: | 1776 | case CPU_ONLINE_FROZEN: |
1775 | cpufreq_add_dev(sys_dev); | 1777 | cpufreq_add_dev(dev, NULL); |
1776 | break; | 1778 | break; |
1777 | case CPU_DOWN_PREPARE: | 1779 | case CPU_DOWN_PREPARE: |
1778 | case CPU_DOWN_PREPARE_FROZEN: | 1780 | case CPU_DOWN_PREPARE_FROZEN: |
1779 | if (unlikely(lock_policy_rwsem_write(cpu))) | 1781 | if (unlikely(lock_policy_rwsem_write(cpu))) |
1780 | BUG(); | 1782 | BUG(); |
1781 | 1783 | ||
1782 | __cpufreq_remove_dev(sys_dev); | 1784 | __cpufreq_remove_dev(dev, NULL); |
1783 | break; | 1785 | break; |
1784 | case CPU_DOWN_FAILED: | 1786 | case CPU_DOWN_FAILED: |
1785 | case CPU_DOWN_FAILED_FROZEN: | 1787 | case CPU_DOWN_FAILED_FROZEN: |
1786 | cpufreq_add_dev(sys_dev); | 1788 | cpufreq_add_dev(dev, NULL); |
1787 | break; | 1789 | break; |
1788 | } | 1790 | } |
1789 | } | 1791 | } |
@@ -1830,8 +1832,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | |||
1830 | cpufreq_driver = driver_data; | 1832 | cpufreq_driver = driver_data; |
1831 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); | 1833 | spin_unlock_irqrestore(&cpufreq_driver_lock, flags); |
1832 | 1834 | ||
1833 | ret = sysdev_driver_register(&cpu_sysdev_class, | 1835 | ret = subsys_interface_register(&cpufreq_interface); |
1834 | &cpufreq_sysdev_driver); | ||
1835 | if (ret) | 1836 | if (ret) |
1836 | goto err_null_driver; | 1837 | goto err_null_driver; |
1837 | 1838 | ||
@@ -1850,7 +1851,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | |||
1850 | if (ret) { | 1851 | if (ret) { |
1851 | pr_debug("no CPU initialized for driver %s\n", | 1852 | pr_debug("no CPU initialized for driver %s\n", |
1852 | driver_data->name); | 1853 | driver_data->name); |
1853 | goto err_sysdev_unreg; | 1854 | goto err_if_unreg; |
1854 | } | 1855 | } |
1855 | } | 1856 | } |
1856 | 1857 | ||
@@ -1858,9 +1859,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | |||
1858 | pr_debug("driver %s up and running\n", driver_data->name); | 1859 | pr_debug("driver %s up and running\n", driver_data->name); |
1859 | 1860 | ||
1860 | return 0; | 1861 | return 0; |
1861 | err_sysdev_unreg: | 1862 | err_if_unreg: |
1862 | sysdev_driver_unregister(&cpu_sysdev_class, | 1863 | subsys_interface_unregister(&cpufreq_interface); |
1863 | &cpufreq_sysdev_driver); | ||
1864 | err_null_driver: | 1864 | err_null_driver: |
1865 | spin_lock_irqsave(&cpufreq_driver_lock, flags); | 1865 | spin_lock_irqsave(&cpufreq_driver_lock, flags); |
1866 | cpufreq_driver = NULL; | 1866 | cpufreq_driver = NULL; |
@@ -1887,7 +1887,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver) | |||
1887 | 1887 | ||
1888 | pr_debug("unregistering driver %s\n", driver->name); | 1888 | pr_debug("unregistering driver %s\n", driver->name); |
1889 | 1889 | ||
1890 | sysdev_driver_unregister(&cpu_sysdev_class, &cpufreq_sysdev_driver); | 1890 | subsys_interface_unregister(&cpufreq_interface); |
1891 | unregister_hotcpu_notifier(&cpufreq_cpu_notifier); | 1891 | unregister_hotcpu_notifier(&cpufreq_cpu_notifier); |
1892 | 1892 | ||
1893 | spin_lock_irqsave(&cpufreq_driver_lock, flags); | 1893 | spin_lock_irqsave(&cpufreq_driver_lock, flags); |
@@ -1907,8 +1907,7 @@ static int __init cpufreq_core_init(void) | |||
1907 | init_rwsem(&per_cpu(cpu_policy_rwsem, cpu)); | 1907 | init_rwsem(&per_cpu(cpu_policy_rwsem, cpu)); |
1908 | } | 1908 | } |
1909 | 1909 | ||
1910 | cpufreq_global_kobject = kobject_create_and_add("cpufreq", | 1910 | cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj); |
1911 | &cpu_sysdev_class.kset.kobj); | ||
1912 | BUG_ON(!cpufreq_global_kobject); | 1911 | BUG_ON(!cpufreq_global_kobject); |
1913 | register_syscore_ops(&cpufreq_syscore_ops); | 1912 | register_syscore_ops(&cpufreq_syscore_ops); |
1914 | 1913 | ||
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index c5072a91e848..390380a8cfc9 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c | |||
@@ -11,7 +11,6 @@ | |||
11 | 11 | ||
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/sysdev.h> | ||
15 | #include <linux/cpu.h> | 14 | #include <linux/cpu.h> |
16 | #include <linux/sysfs.h> | 15 | #include <linux/sysfs.h> |
17 | #include <linux/cpufreq.h> | 16 | #include <linux/cpufreq.h> |