Commit c5e29ea7 authored by Shilpasri G Bhat's avatar Shilpasri G Bhat Committed by Rafael J. Wysocki

cpufreq: powernv: Fix bugs in powernv_cpufreq_{init/exit}

Unregister the notifiers if cpufreq_driver_register() fails in
powernv_cpufreq_init(). Re-arrange the unregistration and cleanup routines
in powernv_cpufreq_exit() to free all the resources after the driver
has unregistered.
Signed-off-by: default avatarShilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent f05c9665
...@@ -595,6 +595,19 @@ static int init_chip_info(void) ...@@ -595,6 +595,19 @@ static int init_chip_info(void)
return ret; return ret;
} }
static inline void clean_chip_info(void)
{
kfree(chips);
kfree(core_to_chip_map);
}
static inline void unregister_all_notifiers(void)
{
opal_message_notifier_unregister(OPAL_MSG_OCC,
&powernv_cpufreq_opal_nb);
unregister_reboot_notifier(&powernv_cpufreq_reboot_nb);
}
static int __init powernv_cpufreq_init(void) static int __init powernv_cpufreq_init(void)
{ {
int rc = 0; int rc = 0;
...@@ -605,30 +618,35 @@ static int __init powernv_cpufreq_init(void) ...@@ -605,30 +618,35 @@ static int __init powernv_cpufreq_init(void)
/* Discover pstates from device tree and init */ /* Discover pstates from device tree and init */
rc = init_powernv_pstates(); rc = init_powernv_pstates();
if (rc) { if (rc)
pr_info("powernv-cpufreq disabled. System does not support PState control\n"); goto out;
return rc;
}
/* Populate chip info */ /* Populate chip info */
rc = init_chip_info(); rc = init_chip_info();
if (rc) if (rc)
return rc; goto out;
register_reboot_notifier(&powernv_cpufreq_reboot_nb); register_reboot_notifier(&powernv_cpufreq_reboot_nb);
opal_message_notifier_register(OPAL_MSG_OCC, &powernv_cpufreq_opal_nb); opal_message_notifier_register(OPAL_MSG_OCC, &powernv_cpufreq_opal_nb);
return cpufreq_register_driver(&powernv_cpufreq_driver);
rc = cpufreq_register_driver(&powernv_cpufreq_driver);
if (!rc)
return 0;
pr_info("Failed to register the cpufreq driver (%d)\n", rc);
unregister_all_notifiers();
clean_chip_info();
out:
pr_info("Platform driver disabled. System does not support PState control\n");
return rc;
} }
module_init(powernv_cpufreq_init); module_init(powernv_cpufreq_init);
static void __exit powernv_cpufreq_exit(void) static void __exit powernv_cpufreq_exit(void)
{ {
unregister_reboot_notifier(&powernv_cpufreq_reboot_nb);
opal_message_notifier_unregister(OPAL_MSG_OCC,
&powernv_cpufreq_opal_nb);
kfree(chips);
kfree(core_to_chip_map);
cpufreq_unregister_driver(&powernv_cpufreq_driver); cpufreq_unregister_driver(&powernv_cpufreq_driver);
unregister_all_notifiers();
clean_chip_info();
} }
module_exit(powernv_cpufreq_exit); module_exit(powernv_cpufreq_exit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment