Commit 97dc6c03 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branch 'pm-cpuidle'

* pm-cpuidle:
  ARM: cpuidle: Convert to use cpuidle_register|unregister()
  ARM: cpuidle: Don't register the driver when back-end init returns -ENXIO
parents aeaf6a4b 3e452e63
Loading
Loading
Loading
Loading
+7 −33
Original line number Diff line number Diff line
@@ -82,7 +82,6 @@ static int __init arm_idle_init_cpu(int cpu)
{
	int ret;
	struct cpuidle_driver *drv;
	struct cpuidle_device *dev;

	drv = kmemdup(&arm_idle_driver, sizeof(*drv), GFP_KERNEL);
	if (!drv)
@@ -103,13 +102,6 @@ static int __init arm_idle_init_cpu(int cpu)
		goto out_kfree_drv;
	}

	ret = cpuidle_register_driver(drv);
	if (ret) {
		if (ret != -EBUSY)
			pr_err("Failed to register cpuidle driver\n");
		goto out_kfree_drv;
	}

	/*
	 * Call arch CPU operations in order to initialize
	 * idle states suspend back-end specific data
@@ -117,37 +109,21 @@ static int __init arm_idle_init_cpu(int cpu)
	ret = arm_cpuidle_init(cpu);

	/*
	 * Skip the cpuidle device initialization if the reported
	 * Allow the initialization to continue for other CPUs, if the reported
	 * failure is a HW misconfiguration/breakage (-ENXIO).
	 */
	if (ret == -ENXIO)
		return 0;

	if (ret) {
		pr_err("CPU %d failed to init idle CPU ops\n", cpu);
		goto out_unregister_drv;
	}

	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev) {
		ret = -ENOMEM;
		goto out_unregister_drv;
		ret = ret == -ENXIO ? 0 : ret;
		goto out_kfree_drv;
	}
	dev->cpu = cpu;

	ret = cpuidle_register_device(dev);
	if (ret) {
		pr_err("Failed to register cpuidle device for CPU %d\n",
		       cpu);
		goto out_kfree_dev;
	}
	ret = cpuidle_register(drv, NULL);
	if (ret)
		goto out_kfree_drv;

	return 0;

out_kfree_dev:
	kfree(dev);
out_unregister_drv:
	cpuidle_unregister_driver(drv);
out_kfree_drv:
	kfree(drv);
	return ret;
@@ -178,9 +154,7 @@ out_fail:
	while (--cpu >= 0) {
		dev = per_cpu(cpuidle_devices, cpu);
		drv = cpuidle_get_cpu_driver(dev);
		cpuidle_unregister_device(dev);
		cpuidle_unregister_driver(drv);
		kfree(dev);
		cpuidle_unregister(drv);
		kfree(drv);
	}