mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
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 <[email protected]> Cc: Hans-Christian Egtvedt <[email protected]> Cc: Tony Luck <[email protected]> Cc: Fenghua Yu <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Martin Schwidefsky <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Paul Mundt <[email protected]> Cc: "David S. Miller" <[email protected]> Cc: Chris Metcalf <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Tigran Aivazian <[email protected]> Cc: Len Brown <[email protected]> Cc: Zhang Rui <[email protected]> Cc: Dave Jones <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Russell King <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Arjan van de Ven <[email protected]> Cc: "Rafael J. Wysocki" <[email protected]> Cc: "Srivatsa S. Bhat" <[email protected]> Signed-off-by: Kay Sievers <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
parent
cb0c05c5fa
commit
8a25a2fd12
38 changed files with 874 additions and 877 deletions
|
|
@ -679,7 +679,7 @@ static struct kobj_type ktype_cpufreq = {
|
|||
*/
|
||||
static int cpufreq_add_dev_policy(unsigned int cpu,
|
||||
struct cpufreq_policy *policy,
|
||||
struct sys_device *sys_dev)
|
||||
struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
#ifdef CONFIG_SMP
|
||||
|
|
@ -728,7 +728,7 @@ static int cpufreq_add_dev_policy(unsigned int cpu,
|
|||
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
|
||||
pr_debug("CPU already managed, adding link\n");
|
||||
ret = sysfs_create_link(&sys_dev->kobj,
|
||||
ret = sysfs_create_link(&dev->kobj,
|
||||
&managed_policy->kobj,
|
||||
"cpufreq");
|
||||
if (ret)
|
||||
|
|
@ -761,7 +761,7 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,
|
|||
|
||||
for_each_cpu(j, policy->cpus) {
|
||||
struct cpufreq_policy *managed_policy;
|
||||
struct sys_device *cpu_sys_dev;
|
||||
struct device *cpu_dev;
|
||||
|
||||
if (j == cpu)
|
||||
continue;
|
||||
|
|
@ -770,8 +770,8 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,
|
|||
|
||||
pr_debug("CPU %u already managed, adding link\n", j);
|
||||
managed_policy = cpufreq_cpu_get(cpu);
|
||||
cpu_sys_dev = get_cpu_sysdev(j);
|
||||
ret = sysfs_create_link(&cpu_sys_dev->kobj, &policy->kobj,
|
||||
cpu_dev = get_cpu_device(j);
|
||||
ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
|
||||
"cpufreq");
|
||||
if (ret) {
|
||||
cpufreq_cpu_put(managed_policy);
|
||||
|
|
@ -783,7 +783,7 @@ static int cpufreq_add_dev_symlink(unsigned int cpu,
|
|||
|
||||
static int cpufreq_add_dev_interface(unsigned int cpu,
|
||||
struct cpufreq_policy *policy,
|
||||
struct sys_device *sys_dev)
|
||||
struct device *dev)
|
||||
{
|
||||
struct cpufreq_policy new_policy;
|
||||
struct freq_attr **drv_attr;
|
||||
|
|
@ -793,7 +793,7 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
|
|||
|
||||
/* prepare interface data */
|
||||
ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
|
||||
&sys_dev->kobj, "cpufreq");
|
||||
&dev->kobj, "cpufreq");
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -866,9 +866,9 @@ err_out_kobj_put:
|
|||
* with with cpu hotplugging and all hell will break loose. Tried to clean this
|
||||
* mess up, but more thorough testing is needed. - Mathieu
|
||||
*/
|
||||
static int cpufreq_add_dev(struct sys_device *sys_dev)
|
||||
static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
|
||||
{
|
||||
unsigned int cpu = sys_dev->id;
|
||||
unsigned int cpu = dev->id;
|
||||
int ret = 0, found = 0;
|
||||
struct cpufreq_policy *policy;
|
||||
unsigned long flags;
|
||||
|
|
@ -947,7 +947,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
|
|||
blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
|
||||
CPUFREQ_START, policy);
|
||||
|
||||
ret = cpufreq_add_dev_policy(cpu, policy, sys_dev);
|
||||
ret = cpufreq_add_dev_policy(cpu, policy, dev);
|
||||
if (ret) {
|
||||
if (ret > 0)
|
||||
/* This is a managed cpu, symlink created,
|
||||
|
|
@ -956,7 +956,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
|
|||
goto err_unlock_policy;
|
||||
}
|
||||
|
||||
ret = cpufreq_add_dev_interface(cpu, policy, sys_dev);
|
||||
ret = cpufreq_add_dev_interface(cpu, policy, dev);
|
||||
if (ret)
|
||||
goto err_out_unregister;
|
||||
|
||||
|
|
@ -999,15 +999,15 @@ module_out:
|
|||
* Caller should already have policy_rwsem in write mode for this CPU.
|
||||
* This routine frees the rwsem before returning.
|
||||
*/
|
||||
static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
||||
static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
|
||||
{
|
||||
unsigned int cpu = sys_dev->id;
|
||||
unsigned int cpu = dev->id;
|
||||
unsigned long flags;
|
||||
struct cpufreq_policy *data;
|
||||
struct kobject *kobj;
|
||||
struct completion *cmp;
|
||||
#ifdef CONFIG_SMP
|
||||
struct sys_device *cpu_sys_dev;
|
||||
struct device *cpu_dev;
|
||||
unsigned int j;
|
||||
#endif
|
||||
|
||||
|
|
@ -1032,7 +1032,7 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
|||
pr_debug("removing link\n");
|
||||
cpumask_clear_cpu(cpu, data->cpus);
|
||||
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
kobj = &sys_dev->kobj;
|
||||
kobj = &dev->kobj;
|
||||
cpufreq_cpu_put(data);
|
||||
unlock_policy_rwsem_write(cpu);
|
||||
sysfs_remove_link(kobj, "cpufreq");
|
||||
|
|
@ -1071,8 +1071,8 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
|||
strncpy(per_cpu(cpufreq_cpu_governor, j),
|
||||
data->governor->name, CPUFREQ_NAME_LEN);
|
||||
#endif
|
||||
cpu_sys_dev = get_cpu_sysdev(j);
|
||||
kobj = &cpu_sys_dev->kobj;
|
||||
cpu_dev = get_cpu_device(j);
|
||||
kobj = &cpu_dev->kobj;
|
||||
unlock_policy_rwsem_write(cpu);
|
||||
sysfs_remove_link(kobj, "cpufreq");
|
||||
lock_policy_rwsem_write(cpu);
|
||||
|
|
@ -1112,11 +1112,11 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
|||
if (unlikely(cpumask_weight(data->cpus) > 1)) {
|
||||
/* first sibling now owns the new sysfs dir */
|
||||
cpumask_clear_cpu(cpu, data->cpus);
|
||||
cpufreq_add_dev(get_cpu_sysdev(cpumask_first(data->cpus)));
|
||||
cpufreq_add_dev(get_cpu_device(cpumask_first(data->cpus)), NULL);
|
||||
|
||||
/* finally remove our own symlink */
|
||||
lock_policy_rwsem_write(cpu);
|
||||
__cpufreq_remove_dev(sys_dev);
|
||||
__cpufreq_remove_dev(dev, sif);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -1128,9 +1128,9 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
|||
}
|
||||
|
||||
|
||||
static int cpufreq_remove_dev(struct sys_device *sys_dev)
|
||||
static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
|
||||
{
|
||||
unsigned int cpu = sys_dev->id;
|
||||
unsigned int cpu = dev->id;
|
||||
int retval;
|
||||
|
||||
if (cpu_is_offline(cpu))
|
||||
|
|
@ -1139,7 +1139,7 @@ static int cpufreq_remove_dev(struct sys_device *sys_dev)
|
|||
if (unlikely(lock_policy_rwsem_write(cpu)))
|
||||
BUG();
|
||||
|
||||
retval = __cpufreq_remove_dev(sys_dev);
|
||||
retval = __cpufreq_remove_dev(dev, sif);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
@ -1271,9 +1271,11 @@ out:
|
|||
}
|
||||
EXPORT_SYMBOL(cpufreq_get);
|
||||
|
||||
static struct sysdev_driver cpufreq_sysdev_driver = {
|
||||
.add = cpufreq_add_dev,
|
||||
.remove = cpufreq_remove_dev,
|
||||
static struct subsys_interface cpufreq_interface = {
|
||||
.name = "cpufreq",
|
||||
.subsys = &cpu_subsys,
|
||||
.add_dev = cpufreq_add_dev,
|
||||
.remove_dev = cpufreq_remove_dev,
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1765,25 +1767,25 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
|
|||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
struct sys_device *sys_dev;
|
||||
struct device *dev;
|
||||
|
||||
sys_dev = get_cpu_sysdev(cpu);
|
||||
if (sys_dev) {
|
||||
dev = get_cpu_device(cpu);
|
||||
if (dev) {
|
||||
switch (action) {
|
||||
case CPU_ONLINE:
|
||||
case CPU_ONLINE_FROZEN:
|
||||
cpufreq_add_dev(sys_dev);
|
||||
cpufreq_add_dev(dev, NULL);
|
||||
break;
|
||||
case CPU_DOWN_PREPARE:
|
||||
case CPU_DOWN_PREPARE_FROZEN:
|
||||
if (unlikely(lock_policy_rwsem_write(cpu)))
|
||||
BUG();
|
||||
|
||||
__cpufreq_remove_dev(sys_dev);
|
||||
__cpufreq_remove_dev(dev, NULL);
|
||||
break;
|
||||
case CPU_DOWN_FAILED:
|
||||
case CPU_DOWN_FAILED_FROZEN:
|
||||
cpufreq_add_dev(sys_dev);
|
||||
cpufreq_add_dev(dev, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -1830,8 +1832,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
|||
cpufreq_driver = driver_data;
|
||||
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
|
||||
ret = sysdev_driver_register(&cpu_sysdev_class,
|
||||
&cpufreq_sysdev_driver);
|
||||
ret = subsys_interface_register(&cpufreq_interface);
|
||||
if (ret)
|
||||
goto err_null_driver;
|
||||
|
||||
|
|
@ -1850,7 +1851,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
|||
if (ret) {
|
||||
pr_debug("no CPU initialized for driver %s\n",
|
||||
driver_data->name);
|
||||
goto err_sysdev_unreg;
|
||||
goto err_if_unreg;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1858,9 +1859,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
|||
pr_debug("driver %s up and running\n", driver_data->name);
|
||||
|
||||
return 0;
|
||||
err_sysdev_unreg:
|
||||
sysdev_driver_unregister(&cpu_sysdev_class,
|
||||
&cpufreq_sysdev_driver);
|
||||
err_if_unreg:
|
||||
subsys_interface_unregister(&cpufreq_interface);
|
||||
err_null_driver:
|
||||
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||
cpufreq_driver = NULL;
|
||||
|
|
@ -1887,7 +1887,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
|
|||
|
||||
pr_debug("unregistering driver %s\n", driver->name);
|
||||
|
||||
sysdev_driver_unregister(&cpu_sysdev_class, &cpufreq_sysdev_driver);
|
||||
subsys_interface_unregister(&cpufreq_interface);
|
||||
unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
|
||||
|
||||
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||
|
|
@ -1907,8 +1907,7 @@ static int __init cpufreq_core_init(void)
|
|||
init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
|
||||
}
|
||||
|
||||
cpufreq_global_kobject = kobject_create_and_add("cpufreq",
|
||||
&cpu_sysdev_class.kset.kobj);
|
||||
cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
|
||||
BUG_ON(!cpufreq_global_kobject);
|
||||
register_syscore_ops(&cpufreq_syscore_ops);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/cpufreq.h>
|
||||
|
|
|
|||
Loading…
Reference in a new issue