diff options
Diffstat (limited to 'drivers/cpuidle/cpuidle-arm.c')
-rw-r--r-- | drivers/cpuidle/cpuidle-arm.c | 40 |
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 | ||
147 | out_kfree_dev: | ||
148 | kfree(dev); | ||
149 | out_unregister_drv: | ||
150 | cpuidle_unregister_driver(drv); | ||
151 | out_kfree_drv: | 127 | out_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 | ||