summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2016-11-22 17:42:05 +0000
committerGuenter Roeck <linux@roeck-us.net>2016-12-09 21:54:11 -0800
commit2195c31b127def509c806fe8a9d3b4092a28ce31 (patch)
treee0302cafd49446a2bed140482ba9c0ed3a72df2c
parente00ca5df37adc68052ea699cbd010ee4e19e39e4 (diff)
downloadlinux-2195c31b127def509c806fe8a9d3b4092a28ce31.tar.bz2
hwmon: (coretemp) Use proper error codes in cpu online callback
The cpu online callback returns success unconditionally even when the device has no support, micro code mismatches or device allocation fails. Only if CPU_HOTPLUG is disabled, the init function checks whether the device list is empty and removes the driver. This does not make sense. If CPU HOTPLUG is enabled then there is no point to keep the driver around when it failed to initialize on the already online cpus. The chance that not yet online CPUs will provide a functional interface later is very close to zero. Add proper error return codes, so the setup of the cpu hotplug states fails when the device cannot be initialized and remove all the magic cruft. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r--drivers/hwmon/coretemp.c24
1 files changed, 5 insertions, 19 deletions
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
index 984c02334910..c364bfd92d23 100644
--- a/drivers/hwmon/coretemp.c
+++ b/drivers/hwmon/coretemp.c
@@ -662,12 +662,12 @@ static int coretemp_cpu_online(unsigned int cpu)
* without thermal sensors will be filtered out.
*/
if (!cpu_has(c, X86_FEATURE_DTHERM))
- return 0;
+ return -ENODEV;
if (!pdev) {
/* Check the microcode version of the CPU */
if (chk_ucode_version(cpu))
- return 0;
+ return -EINVAL;
/*
* Alright, we have DTS support.
@@ -677,7 +677,7 @@ static int coretemp_cpu_online(unsigned int cpu)
*/
err = coretemp_device_add(cpu);
if (err)
- return 0;
+ return err;
pdev = coretemp_get_pdev(cpu);
/*
@@ -782,28 +782,14 @@ static int __init coretemp_init(void)
if (err)
return err;
- get_online_cpus();
err = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "hwmon/coretemp:online",
coretemp_cpu_online, coretemp_cpu_offline);
if (err < 0)
- goto exit_driver_unreg;
+ goto outdrv;
coretemp_hp_online = err;
-
-#ifndef CONFIG_HOTPLUG_CPU
- if (list_empty(&pdev_list)) {
- err = -ENODEV;
- goto exit_hp_unreg;
- }
-#endif
- put_online_cpus();
return 0;
-#ifndef CONFIG_HOTPLUG_CPU
-exit_hp_unreg:
- cpuhp_remove_state(coretemp_hp_online);
- put_online_cpus();
-#endif
-exit_driver_unreg:
+outdrv:
platform_driver_unregister(&coretemp_driver);
return err;
}