aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpuidle/cpuidle-arm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpuidle/cpuidle-arm.c')
-rw-r--r--drivers/cpuidle/cpuidle-arm.c40
1 files changed, 7 insertions, 33 deletions
diff --git a/drivers/cpuidle/cpuidle-arm.c b/drivers/cpuidle/cpuidle-arm.c
index 073557f433eb..3a407a3ef22b 100644
--- a/drivers/cpuidle/cpuidle-arm.c
+++ b/drivers/cpuidle/cpuidle-arm.c
@@ -82,7 +82,6 @@ static int __init arm_idle_init_cpu(int cpu)
82{ 82{
83 int ret; 83 int ret;
84 struct cpuidle_driver *drv; 84 struct cpuidle_driver *drv;
85 struct cpuidle_device *dev;
86 85
87 drv = kmemdup(&arm_idle_driver, sizeof(*drv), GFP_KERNEL); 86 drv = kmemdup(&arm_idle_driver, sizeof(*drv), GFP_KERNEL);
88 if (!drv) 87 if (!drv)
@@ -103,13 +102,6 @@ static int __init arm_idle_init_cpu(int cpu)
103 goto out_kfree_drv; 102 goto out_kfree_drv;
104 } 103 }
105 104
106 ret = cpuidle_register_driver(drv);
107 if (ret) {
108 if (ret != -EBUSY)
109 pr_err("Failed to register cpuidle driver\n");
110 goto out_kfree_drv;
111 }
112
113 /* 105 /*
114 * Call arch CPU operations in order to initialize 106 * Call arch CPU operations in order to initialize
115 * idle states suspend back-end specific data 107 * idle states suspend back-end specific data
@@ -117,37 +109,21 @@ static int __init arm_idle_init_cpu(int cpu)
117 ret = arm_cpuidle_init(cpu); 109 ret = arm_cpuidle_init(cpu);
118 110
119 /* 111 /*
120 * Skip the cpuidle device initialization if the reported 112 * Allow the initialization to continue for other CPUs, if the reported
121 * failure is a HW misconfiguration/breakage (-ENXIO). 113 * failure is a HW misconfiguration/breakage (-ENXIO).
122 */ 114 */
123 if (ret == -ENXIO)
124 return 0;
125
126 if (ret) { 115 if (ret) {
127 pr_err("CPU %d failed to init idle CPU ops\n", cpu); 116 pr_err("CPU %d failed to init idle CPU ops\n", cpu);
128 goto out_unregister_drv; 117 ret = ret == -ENXIO ? 0 : ret;
129 } 118 goto out_kfree_drv;
130
131 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
132 if (!dev) {
133 ret = -ENOMEM;
134 goto out_unregister_drv;
135 } 119 }
136 dev->cpu = cpu;
137 120
138 ret = cpuidle_register_device(dev); 121 ret = cpuidle_register(drv, NULL);
139 if (ret) { 122 if (ret)
140 pr_err("Failed to register cpuidle device for CPU %d\n", 123 goto out_kfree_drv;
141 cpu);
142 goto out_kfree_dev;
143 }
144 124
145 return 0; 125 return 0;
146 126
147out_kfree_dev:
148 kfree(dev);
149out_unregister_drv:
150 cpuidle_unregister_driver(drv);
151out_kfree_drv: 127out_kfree_drv:
152 kfree(drv); 128 kfree(drv);
153 return ret; 129 return ret;
@@ -178,9 +154,7 @@ out_fail:
178 while (--cpu >= 0) { 154 while (--cpu >= 0) {
179 dev = per_cpu(cpuidle_devices, cpu); 155 dev = per_cpu(cpuidle_devices, cpu);
180 drv = cpuidle_get_cpu_driver(dev); 156 drv = cpuidle_get_cpu_driver(dev);
181 cpuidle_unregister_device(dev); 157 cpuidle_unregister(drv);
182 cpuidle_unregister_driver(drv);
183 kfree(dev);
184 kfree(drv); 158 kfree(drv);
185 } 159 }
186 160