diff options
Diffstat (limited to 'drivers/platform/x86/acerhdf.c')
| -rw-r--r-- | drivers/platform/x86/acerhdf.c | 151 | 
1 files changed, 99 insertions, 52 deletions
diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c index 7b2384d674d..60f9cfcac93 100644 --- a/drivers/platform/x86/acerhdf.c +++ b/drivers/platform/x86/acerhdf.c @@ -52,7 +52,7 @@   */  #undef START_IN_KERNEL_MODE -#define DRV_VER "0.5.22" +#define DRV_VER "0.5.24"  /*   * According to the Atom N270 datasheet, @@ -92,9 +92,9 @@ static unsigned int fanstate = ACERHDF_FAN_AUTO;  static char force_bios[16];  static char force_product[16];  static unsigned int prev_interval; -struct thermal_zone_device *thz_dev; -struct thermal_cooling_device *cl_dev; -struct platform_device *acerhdf_dev; +static struct thermal_zone_device *thz_dev; +static struct thermal_cooling_device *cl_dev; +static struct platform_device *acerhdf_dev;  module_param(kernelmode, uint, 0);  MODULE_PARM_DESC(kernelmode, "Kernel mode fan control on / off"); @@ -112,14 +112,12 @@ module_param_string(force_product, force_product, 16, 0);  MODULE_PARM_DESC(force_product, "Force BIOS product and omit BIOS check");  /* - * cmd_off: to switch the fan completely off - * chk_off: to check if the fan is off + * cmd_off: to switch the fan completely off and check if the fan is off   *	cmd_auto: to set the BIOS in control of the fan. The BIOS regulates then   *		the fan speed depending on the temperature   */  struct fancmd {  	u8 cmd_off; -	u8 chk_off;  	u8 cmd_auto;  }; @@ -136,47 +134,81 @@ struct bios_settings_t {  /* Register addresses and values for different BIOS versions */  static const struct bios_settings_t bios_tbl[] = {  	/* AOA110 */ -	{"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x1f, 0x00} }, -	{"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x1f, 0x00} }, -	{"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0xaf, 0x00} }, -	{"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0xaf, 0x00} }, -	{"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0xaf, 0x00} }, -	{"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0xaf, 0x00} }, -	{"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x21, 0x00} }, -	{"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x21, 0x00} }, -	{"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x21, 0x00} }, +	{"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, +	{"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, +	{"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, +	{"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, +	{"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, +	{"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0x00} }, +	{"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, +	{"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, +	{"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00} },  	/* AOA150 */ -	{"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x20, 0x00} }, +	{"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, +	{"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x00} }, +	{"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00} }, +	{"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00} }, +	{"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x00} }, +	{"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00} }, +	{"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00} }, +	{"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00} },  	/* Acer 1410 */ -	{"Acer", "Aspire 1410", "v0.3120", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, -	{"Acer", "Aspire 1410", "v1.3303", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1410", "v1.3310", 0x55, 0x58, {0x9e, 0x00} },  	/* Acer 1810xx */ -	{"Acer", "Aspire 1810TZ", "v0.3120", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, -	{"Acer", "Aspire 1810T", "v0.3120", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, -	{"Acer", "Aspire 1810T", "v1.3303", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, -	{"Acer", "Aspire 1810TZ", "v1.3303", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810TZ", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, +	{"Acer", "Aspire 1810T",  "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, +	/* Acer 531 */ +	{"Acer", "AO531h", "v0.3201", 0x55, 0x58, {0x20, 0x00} },  	/* Gateway */ -	{"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x21, 0x00} }, -	{"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Gateway", "LT31", "v1.3103", 0x55, 0x58, {0x10, 0x0f, 0x00} }, -	{"Gateway", "LT31", "v1.3201", 0x55, 0x58, {0x10, 0x0f, 0x00} }, -	{"Gateway", "LT31", "v1.3302", 0x55, 0x58, {0x10, 0x0f, 0x00} }, +	{"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, +	{"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00} }, +	{"Gateway", "LT31",   "v1.3103", 0x55, 0x58, {0x9e, 0x00} }, +	{"Gateway", "LT31",   "v1.3201", 0x55, 0x58, {0x9e, 0x00} }, +	{"Gateway", "LT31",   "v1.3302", 0x55, 0x58, {0x9e, 0x00} },  	/* Packard Bell */ -	{"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x21, 0x00} }, -	{"Packard Bell", "DOA150", "v0.3105", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x21, 0x00} }, -	{"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x20, 0x00} }, -	{"Packard Bell", "DOTMU", "v1.3303", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, -	{"Packard Bell", "DOTMU", "v0.3120", 0x55, 0x58, {0x9e, 0x9e, 0x00} }, +	{"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00} }, +	{"Packard Bell", "DOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} }, +	{"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, +	{"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} }, +	{"Packard Bell", "DOTMU",  "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMU",  "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMU",  "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMU",  "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMU",  "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMU",  "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMU",  "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMU",  "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMA",  "v1.3201", 0x55, 0x58, {0x9e, 0x00} }, +	{"Packard Bell", "DOTMA",  "v1.3302", 0x55, 0x58, {0x9e, 0x00} },  	/* pewpew-terminator */ -	{"", "", "", 0, 0, {0, 0, 0} } +	{"", "", "", 0, 0, {0, 0} }  };  static const struct bios_settings_t *bios_cfg __read_mostly; @@ -200,7 +232,7 @@ static int acerhdf_get_fanstate(int *state)  	if (ec_read(bios_cfg->fanreg, &fan))  		return -EINVAL; -	if (fan != bios_cfg->cmd.chk_off) +	if (fan != bios_cfg->cmd.cmd_off)  		*state = ACERHDF_FAN_AUTO;  	else  		*state = ACERHDF_FAN_OFF; @@ -374,7 +406,7 @@ static int acerhdf_get_crit_temp(struct thermal_zone_device *thermal,  }  /* bind callback functions to thermalzone */ -struct thermal_zone_device_ops acerhdf_dev_ops = { +static struct thermal_zone_device_ops acerhdf_dev_ops = {  	.bind = acerhdf_bind,  	.unbind = acerhdf_unbind,  	.get_temp = acerhdf_get_ec_temp, @@ -449,7 +481,7 @@ err_out:  }  /* bind fan callbacks to fan device */ -struct thermal_cooling_device_ops acerhdf_cooling_ops = { +static struct thermal_cooling_device_ops acerhdf_cooling_ops = {  	.get_max_state = acerhdf_get_max_state,  	.get_cur_state = acerhdf_get_cur_state,  	.set_cur_state = acerhdf_set_cur_state, @@ -518,6 +550,10 @@ static int acerhdf_check_hardware(void)  	version = dmi_get_system_info(DMI_BIOS_VERSION);  	product = dmi_get_system_info(DMI_PRODUCT_NAME); +	if (!vendor || !version || !product) { +		pr_err("error getting hardware information\n"); +		return -EINVAL; +	}  	pr_info("Acer Aspire One Fan driver, v.%s\n", DRV_VER); @@ -579,17 +615,26 @@ static int acerhdf_register_platform(void)  		return err;  	acerhdf_dev = platform_device_alloc("acerhdf", -1); -	platform_device_add(acerhdf_dev); +	if (!acerhdf_dev) { +		err = -ENOMEM; +		goto err_device_alloc; +	} +	err = platform_device_add(acerhdf_dev); +	if (err) +		goto err_device_add;  	return 0; + +err_device_add: +	platform_device_put(acerhdf_dev); +err_device_alloc: +	platform_driver_unregister(&acerhdf_driver); +	return err;  }  static void acerhdf_unregister_platform(void)  { -	if (!acerhdf_dev) -		return; - -	platform_device_del(acerhdf_dev); +	platform_device_unregister(acerhdf_dev);  	platform_driver_unregister(&acerhdf_driver);  } @@ -633,7 +678,7 @@ static int __init acerhdf_init(void)  	err = acerhdf_register_platform();  	if (err) -		goto err_unreg; +		goto out_err;  	err = acerhdf_register_thermal();  	if (err) @@ -646,7 +691,7 @@ err_unreg:  	acerhdf_unregister_platform();  out_err: -	return -ENODEV; +	return err;  }  static void __exit acerhdf_exit(void) @@ -662,11 +707,13 @@ MODULE_DESCRIPTION("Aspire One temperature and fan driver");  MODULE_ALIAS("dmi:*:*Acer*:pnAOA*:");  MODULE_ALIAS("dmi:*:*Acer*:pnAspire 1410*:");  MODULE_ALIAS("dmi:*:*Acer*:pnAspire 1810*:"); +MODULE_ALIAS("dmi:*:*Acer*:pnAO531*:");  MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:");  MODULE_ALIAS("dmi:*:*Gateway*:pnLT31*:");  MODULE_ALIAS("dmi:*:*Packard Bell*:pnAOA*:");  MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOA*:");  MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOTMU*:"); +MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOTMA*:");  module_init(acerhdf_init);  module_exit(acerhdf_exit);  |