ret = dt_init_idle_driver(drv, arm_idle_state_match, 1);
                if (ret <= 0) {
                        ret = ret ? : -ENODEV;
-                       goto init_fail;
+                       goto out_kfree_drv;
                }
 
                ret = cpuidle_register_driver(drv);
                if (ret) {
                        pr_err("Failed to register cpuidle driver\n");
-                       goto init_fail;
+                       goto out_kfree_drv;
                }
 
                /*
 
                if (ret) {
                        pr_err("CPU %d failed to init idle CPU ops\n", cpu);
-                       goto out_fail;
+                       goto out_unregister_drv;
                }
 
                dev = kzalloc(sizeof(*dev), GFP_KERNEL);
                if (!dev) {
                        pr_err("Failed to allocate cpuidle device\n");
                        ret = -ENOMEM;
-                       goto out_fail;
+                       goto out_unregister_drv;
                }
                dev->cpu = cpu;
 
                if (ret) {
                        pr_err("Failed to register cpuidle device for CPU %d\n",
                               cpu);
-                       kfree(dev);
-                       goto out_fail;
+                       goto out_kfree_dev;
                }
        }
 
        return 0;
-init_fail:
+
+out_kfree_dev:
+       kfree(dev);
+out_unregister_drv:
+       cpuidle_unregister_driver(drv);
+out_kfree_drv:
        kfree(drv);
 out_fail:
        while (--cpu >= 0) {
                dev = per_cpu(cpuidle_devices, cpu);
+               drv = cpuidle_get_cpu_driver(dev);
                cpuidle_unregister_device(dev);
-               kfree(dev);
-               drv = cpuidle_get_driver();
                cpuidle_unregister_driver(drv);
+               kfree(dev);
                kfree(drv);
        }