Commit f7eaf3fb authored by Paul Gortmaker's avatar Paul Gortmaker Committed by Andy Shevchenko

platform/x86: acerhdf: restructure to allow large BIOS table be __initconst

There is a table of Vendor/Model/Version {control data} in this driver,
but outside of the initial probe, the V/M/V is never used again, and
neither are any of the entries for platforms other than the one which
matches the running target.

By simply storing the {control data} for the matched platform, we can
mark the large table __initconst, which reduces the loaded driver size
by 20 percent.

Before:
	root@gw:~/git/linux-head# lsmod
	Module                  Size  Used by
	acerhdf                20480  0
	root@gw:~/git/linux-head#

After:
	root@gw:~/git/linux-head# lsmod
	Module                  Size  Used by
	acerhdf                16384  0
	root@gw:~/git/linux-head#

Cc: Peter Feuerer <peter@piie.net>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Andy Shevchenko <andy@infradead.org>
Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: default avatarPeter Feuerer <peter@piie.net>
parent 1d0c3fd0
...@@ -133,7 +133,7 @@ static const struct manualcmd mcmd = { ...@@ -133,7 +133,7 @@ static const struct manualcmd mcmd = {
.moff = 0xff, .moff = 0xff,
}; };
/* BIOS settings */ /* BIOS settings - only used during probe */
struct bios_settings { struct bios_settings {
const char *vendor; const char *vendor;
const char *product; const char *product;
...@@ -144,8 +144,18 @@ struct bios_settings { ...@@ -144,8 +144,18 @@ struct bios_settings {
int mcmd_enable; int mcmd_enable;
}; };
/* This could be a daughter struct in the above, but not worth the redirect */
struct ctrl_settings {
u8 fanreg;
u8 tempreg;
struct fancmd cmd;
int mcmd_enable;
};
static struct ctrl_settings ctrl_cfg __read_mostly;
/* Register addresses and values for different BIOS versions */ /* Register addresses and values for different BIOS versions */
static const struct bios_settings bios_tbl[] = { static const struct bios_settings bios_tbl[] __initconst = {
/* AOA110 */ /* AOA110 */
{"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00}, 0}, {"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00}, 0},
{"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00}, 0}, {"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00}, 0},
...@@ -260,8 +270,6 @@ static const struct bios_settings bios_tbl[] = { ...@@ -260,8 +270,6 @@ static const struct bios_settings bios_tbl[] = {
{"", "", "", 0, 0, {0, 0}, 0} {"", "", "", 0, 0, {0, 0}, 0}
}; };
static const struct bios_settings *bios_cfg __read_mostly;
/* /*
* this struct is used to instruct thermal layer to use bang_bang instead of * this struct is used to instruct thermal layer to use bang_bang instead of
* default governor for acerhdf * default governor for acerhdf
...@@ -274,7 +282,7 @@ static int acerhdf_get_temp(int *temp) ...@@ -274,7 +282,7 @@ static int acerhdf_get_temp(int *temp)
{ {
u8 read_temp; u8 read_temp;
if (ec_read(bios_cfg->tempreg, &read_temp)) if (ec_read(ctrl_cfg.tempreg, &read_temp))
return -EINVAL; return -EINVAL;
*temp = read_temp * 1000; *temp = read_temp * 1000;
...@@ -286,10 +294,10 @@ static int acerhdf_get_fanstate(int *state) ...@@ -286,10 +294,10 @@ static int acerhdf_get_fanstate(int *state)
{ {
u8 fan; u8 fan;
if (ec_read(bios_cfg->fanreg, &fan)) if (ec_read(ctrl_cfg.fanreg, &fan))
return -EINVAL; return -EINVAL;
if (fan != bios_cfg->cmd.cmd_off) if (fan != ctrl_cfg.cmd.cmd_off)
*state = ACERHDF_FAN_AUTO; *state = ACERHDF_FAN_AUTO;
else else
*state = ACERHDF_FAN_OFF; *state = ACERHDF_FAN_OFF;
...@@ -310,13 +318,13 @@ static void acerhdf_change_fanstate(int state) ...@@ -310,13 +318,13 @@ static void acerhdf_change_fanstate(int state)
state = ACERHDF_FAN_AUTO; state = ACERHDF_FAN_AUTO;
} }
cmd = (state == ACERHDF_FAN_OFF) ? bios_cfg->cmd.cmd_off cmd = (state == ACERHDF_FAN_OFF) ? ctrl_cfg.cmd.cmd_off
: bios_cfg->cmd.cmd_auto; : ctrl_cfg.cmd.cmd_auto;
fanstate = state; fanstate = state;
ec_write(bios_cfg->fanreg, cmd); ec_write(ctrl_cfg.fanreg, cmd);
if (bios_cfg->mcmd_enable && state == ACERHDF_FAN_OFF) { if (ctrl_cfg.mcmd_enable && state == ACERHDF_FAN_OFF) {
if (verbose) if (verbose)
pr_notice("turning off fan manually\n"); pr_notice("turning off fan manually\n");
ec_write(mcmd.mreg, mcmd.moff); ec_write(mcmd.mreg, mcmd.moff);
...@@ -623,6 +631,7 @@ static int __init acerhdf_check_hardware(void) ...@@ -623,6 +631,7 @@ static int __init acerhdf_check_hardware(void)
{ {
char const *vendor, *version, *product; char const *vendor, *version, *product;
const struct bios_settings *bt = NULL; const struct bios_settings *bt = NULL;
int found = 0;
/* get BIOS data */ /* get BIOS data */
vendor = dmi_get_system_info(DMI_SYS_VENDOR); vendor = dmi_get_system_info(DMI_SYS_VENDOR);
...@@ -672,17 +681,23 @@ static int __init acerhdf_check_hardware(void) ...@@ -672,17 +681,23 @@ static int __init acerhdf_check_hardware(void)
if (str_starts_with(vendor, bt->vendor) && if (str_starts_with(vendor, bt->vendor) &&
str_starts_with(product, bt->product) && str_starts_with(product, bt->product) &&
str_starts_with(version, bt->version)) { str_starts_with(version, bt->version)) {
bios_cfg = bt; found = 1;
break; break;
} }
} }
if (!bios_cfg) { if (!found) {
pr_err("unknown (unsupported) BIOS version %s/%s/%s, please report, aborting!\n", pr_err("unknown (unsupported) BIOS version %s/%s/%s, please report, aborting!\n",
vendor, product, version); vendor, product, version);
return -EINVAL; return -EINVAL;
} }
/* Copy control settings from BIOS table before we free it. */
ctrl_cfg.fanreg = bt->fanreg;
ctrl_cfg.tempreg = bt->tempreg;
memcpy(&ctrl_cfg.cmd, &bt->cmd, sizeof(struct fancmd));
ctrl_cfg.mcmd_enable = bt->mcmd_enable;
/* /*
* if started with kernel mode off, prevent the kernel from switching * if started with kernel mode off, prevent the kernel from switching
* off the fan * off the fan
......
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