From eb9243fda20fee0def8e54d58e687df84c18c2c1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mathieu=20B=C3=A9rard?= Date: Tue, 27 Jun 2006 23:23:47 +0000 Subject: [PATCH] Redo laptop model detection engine: -Convert and merge omnibook_models_t and omnibook_tc_t structures into a giant dmi_system_id -Use dmi_check_system + a dmi_mached function -Kill cmp_with_glob, omnibook_ident and omnibook_get_tc Make some functions static --- blank.c | 2 +- ec.c | 1 + ec.h | 1 + fan_policy.c | 2 +- init.c | 126 +------ laptop.h | 951 +++++++++++++++++++++++++++++++++++++++++++------- lcd.c | 8 +- temperature.c | 2 +- touchpad.c | 2 +- 9 files changed, 846 insertions(+), 249 deletions(-) diff --git a/blank.c b/blank.c index 8659ee2..86d57e4 100644 --- a/blank.c +++ b/blank.c @@ -22,7 +22,7 @@ #include "ec.h" -int omnibook_console_blank_enabled = 0; +static int omnibook_console_blank_enabled = 0; extern int (*console_blank_hook) (int); diff --git a/ec.c b/ec.c index e31a7e2..e3f97e3 100644 --- a/ec.c +++ b/ec.c @@ -13,6 +13,7 @@ * General Public License for more details. * * Written by Soós Péter , 2002-2004 + * Written by Mathieu Bérard , 2006 */ #include diff --git a/ec.h b/ec.h index 67ef19f..1521916 100644 --- a/ec.h +++ b/ec.h @@ -13,6 +13,7 @@ * General Public License for more details. * * Written by Soós Péter , 2002-2004 + * Written by Mathieu Bérard , 2006 */ extern int omnibook_ec_read(u8 addr, u8 *data); diff --git a/fan_policy.c b/fan_policy.c index 415f81f..db740cc 100644 --- a/fan_policy.c +++ b/fan_policy.c @@ -42,7 +42,7 @@ #define OMNIBOOK_FAN6_DEFAULT 95 /* Default value of fan level 6 temperature */ #define OMNIBOOK_FAN7_DEFAULT 95 /* Default value of fan level 7 temperature */ -u8 omnibook_fan_policy[OMNIBOOK_FAN_LEVELS]; +static u8 omnibook_fan_policy[OMNIBOOK_FAN_LEVELS]; static int omnibook_get_fan_policy(void) { diff --git a/init.c b/init.c index a95252f..4f65f52 100644 --- a/init.c +++ b/init.c @@ -12,6 +12,7 @@ * General Public License for more details. * * Written by Soós Péter , 2002-2004 + * Written by Mathieu Bérard , 2006 */ #ifdef OMNIBOOK_STANDALONE @@ -38,6 +39,8 @@ static struct proc_dir_entry *omnibook_proc_root = NULL; int omnibook_ectype = NONE; +static char* laptop_model __initdata; + static int omnibook_userset = 0; /* @@ -89,68 +92,14 @@ static struct omnibook_feature *omnibook_available_feature; extern struct omnibook_feature _features_start[]; extern struct omnibook_feature _features_end[]; - -/* - * Compare the saved DMI info at "index" with a string. - * A '*' at the end of the string will match anything. - * Returns 0 for a match. - * - * This preserves the semantics of the old omnibook_features[] - * table. I don't know if its generally useful or not. - */ -static int __init cmp_with_glob(int index, char *str) +static int __init dmi_matched(struct dmi_system_id *dmi) { - int retval = 0; - char *glob; - unsigned int len; - - if (str) { - glob = strchr(str, '*'); - len = glob ? glob - str : strlen(str); - retval = strncmp(dmi_get_system_info(index), str, len); - } - - return retval; -} - -static int __init omnibook_ident(void) -{ - struct omnibook_models_t *mp; - - for (mp = omnibook_models; mp->ectype != NONE; ++mp) { - /* Check all fields for a match */ - if (cmp_with_glob(DMI_SYS_VENDOR, mp->sys_vendor)) - continue; - if (cmp_with_glob(DMI_PRODUCT_NAME, mp->product_name)) - continue; - if (cmp_with_glob(DMI_PRODUCT_VERSION, mp->product_version)) - continue; - if (cmp_with_glob(DMI_BOARD_NAME, mp->board_name)) - continue; - - /* All required fields matched */ - break; - } - - return (mp - omnibook_models); -} - -static int __init omnibook_get_tc(void) -{ - struct omnibook_tc_t *tc; - - for (tc = omnibook_tc; tc->ectype != NONE; ++tc) { - /* - * Technology code appears in the first two chracters of BIOS version string - * ended by a dot, but it prefixed a space character on some models and BIOS - * versions. - * New HP/Compaq models use more characters (eg. KF_KH.). - */ - if (strstr(dmi_get_system_info(DMI_BIOS_VERSION), tc->tc)) - break; - } - - return (tc - omnibook_tc); + omnibook_ectype = (int) dmi->driver_data; + if (dmi->ident) + laptop_model = (char*) dmi->ident; + else + laptop_model = dmi_get_system_info(DMI_PRODUCT_VERSION); + return 0; } /* @@ -296,15 +245,8 @@ static int __init omnibook_probe(struct platform_device *dev) if (!feature->enabled) continue; - if ((omnibook_ectype & feature->ectypes) || (!feature->ectypes)) { -/* printk("cursor is at: %p\n", (void*) feature); - if(feature->name) - printk("trying to init:%s\n",feature->name); - else - printk("trying to init nameless feature\n"); */ - + if ((omnibook_ectype & feature->ectypes) || (!feature->ectypes)) omnibook_init(feature); - } } printk(KERN_INFO "%s: Enabled features:",OMNIBOOK_MODULE_NAME); @@ -409,10 +351,6 @@ static int get_ectype_param(char *buffer, struct kernel_param *kp) static int __init omnibook_module_init(void) { - int model = 0; - int tc = 0; - char *syslog_name; - char *glob; int retval; printk(KERN_INFO "%s: Driver version %s.\n", OMNIBOOK_MODULE_NAME, @@ -422,40 +360,12 @@ static int __init omnibook_module_init(void) printk(KERN_WARNING "%s: Forced load with EC firmware type %i.\n", OMNIBOOK_MODULE_NAME, ffs(omnibook_ectype)); - - else { - model = omnibook_ident(); - if (omnibook_models[model].ectype != NONE) { - omnibook_ectype = omnibook_models[model].ectype; - syslog_name = omnibook_models[model].syslog_name; - if (!syslog_name) { - syslog_name = - omnibook_models[model].product_version; - glob = strchr(syslog_name, '*'); - if (glob) - *glob = '\0'; - } - printk(KERN_INFO "%s: %s detected.\n", - OMNIBOOK_MODULE_NAME, syslog_name); - } else { - /* Without explicit informations try chechking for technology code of HP laptops */ - tc = omnibook_get_tc(); - if ((strncmp - (dmi_get_system_info(DMI_SYS_VENDOR), HP_SIGNATURE, - strlen(HP_SIGNATURE)) == 0) - && (omnibook_tc[tc].ectype != NONE)) { - omnibook_ectype = omnibook_tc[tc].ectype; - printk(KERN_INFO - "%s: HP tecnology code %s detected.\n", - OMNIBOOK_MODULE_NAME, - omnibook_tc[tc].tc); - } else { - printk(KERN_INFO - "%s: Unknown model detected.\n", - OMNIBOOK_MODULE_NAME); - } - } - } + else if ( dmi_check_system(omnibook_ids) ) + printk(KERN_INFO "%s: %s detected.\n", + OMNIBOOK_MODULE_NAME, laptop_model); + else + printk(KERN_INFO "%s: Unknown model detected.\n", + OMNIBOOK_MODULE_NAME); omnibook_proc_root = proc_mkdir(OMNIBOOK_MODULE_NAME, NULL); if (!omnibook_proc_root) { @@ -525,7 +435,7 @@ static void __exit omnibook_module_cleanup(void) module_init(omnibook_module_init); module_exit(omnibook_module_cleanup); -MODULE_AUTHOR("Soós Péter "); +MODULE_AUTHOR("Soós Péter, Mathieu Bérard"); MODULE_DESCRIPTION("Kernel interface for HP OmniBook, HP Pavilion, Toshiba Satellite, Acer Aspire and Compal ACL00 laptops"); MODULE_LICENSE("GPL"); module_param_call(ectype, set_ectype_param, get_ectype_param, NULL, S_IRUGO); diff --git a/laptop.h b/laptop.h index acc745f..dd8c975 100644 --- a/laptop.h +++ b/laptop.h @@ -18,138 +18,823 @@ #define HP_SIGNATURE "Hewlett-Packard" -struct omnibook_models_t { - /* DMI field matchers (table inputs) */ - char *sys_vendor; - char *product_name; - char *product_version; - char *board_name; - /* Table outputs */ - char *syslog_name; /* Name which will appear in the syslog */ - int ectype; /* Type of the embedded controller firmware, see omnibook.h and README */ -}; - -static struct omnibook_models_t omnibook_models[] __initdata = { - /* sys_vendor product_name product_version board_name syslog_name ectype */ - { NULL, "HP OmniBook PC*", "HP OmniBook XE3 GF*", NULL, NULL, XE3GF }, - { NULL, "HP OmniBook PC*", "HP OmniBook XT1000*", NULL, NULL, XE3GF }, - { NULL, "HP OmniBook PC*", "HP OmniBook XE2 DC*", NULL, NULL, XE2 }, - { NULL, "HP OmniBook PC*", "HP OmniBook XE3 GC*", NULL, NULL, XE3GC }, - /* HP Pavilion N5430 */ - { NULL, "HP OmniBook PC*", "HP OmniBook XE3 GD*", NULL, NULL, XE3GC }, - /* HP Pavilion N5415 */ - { NULL, "HP OmniBook PC*", "HP OmniBook XE3 GE*", NULL, NULL, XE3GC }, - { NULL, "HP OmniBook PC*", "HP OmniBook 500 FA*", NULL, NULL, OB500 }, - { NULL, "HP OmniBook PC*", "HP OmniBook 510 FB*", NULL, NULL, OB510 }, - { NULL, "HP OmniBook PC*", "HP OmniBook 4150*", NULL, NULL, OB4150 }, - { NULL, "HP OmniBook PC*", "HP OmniBook 900 B*", NULL, NULL, OB4150 }, - { NULL, "HP OmniBook PC*", "HP OmniBook 6000 EA*", NULL, NULL, OB6000 }, - { NULL, "HP OmniBook PC*", "HP OmniBook 6100 EB*", NULL, NULL, OB6100 }, - /* HP OmniBook xe4100 */ - { NULL, "HP OmniBook PC*", "HP OmniBook xe4000*", NULL, NULL, XE4500 }, - { NULL, "HP OmniBook PC*", "HP OmniBook xe4400*", NULL, NULL, XE4500 }, - { NULL, "HP OmniBook PC*", "HP OmniBook xe4500*", NULL, NULL, XE4500 }, - /* HP OmniBook vt6200 and xt6200 */ - { NULL, "HP OmniBook PC*", "HP OmniBook 6200 EG*", NULL, NULL, XE4500 }, - /* There are no model specific strings of some HP OmniBook XT1500 */ - { NULL, "HP OmniBook PC*", "HP OmniBook*", NULL, NULL, XE3GF }, - /* HP Pavilion ze4125 */ - { NULL, "HP NoteBook PC*", "HP NoteBook ze4000*", NULL, NULL, XE4500 }, - /* There are no model specific strings of some HP Pavilion xt155 and some HP Pavilion ze4100 */ - { NULL, "HP NoteBook PC*", "HP NoteBook PC*", NULL, NULL, XE4500 }, - /* There are no model specific strings of some HP nx9000 */ - { NULL, "HP Notebook PC*", "HP Notebook PC*", NULL, NULL, XE4500 }, - /* HP Pavilion ZU1155 and ZU1175 */ - { NULL, "HP Pavilion Notebook PC*", "HP Pavilion ZU1000 FA*", NULL, NULL, OB500 }, - /* HP Pavilion N5290 */ - { NULL, "HP Pavilion Notebook PC*", "HP Pavilion Notebook XE3 GC*", NULL, NULL, XE3GC }, - /* HP Pavilion N5441 */ - { NULL, "HP Pavilion Notebook PC*", "HP Pavilion Notebook Model GD*", NULL, NULL, XE3GC }, - /* HP Pavilion XH545 */ - { NULL, "HP Pavilion Notebook PC*", "HP Pavilion Notebook Model GE*", NULL, NULL, XE3GC }, - /* HP Pavilion ZT1141 */ - { NULL, "HP Pavilion Notebook PC*", "HP Pavilion Notebook ZT1000*", NULL, NULL, XE3GF }, - /* There are no model specific strings of some HP Pavilion ZT1175 and ZT1195 notebooks */ - { NULL, "HP Pavilion Notebook PC*", "HP Pavilion Notebook*", NULL, NULL, XE3GF }, - { NULL, "Pavilion ze4200*", NULL, NULL, "HP Pavilion ze4200 series", XE4500 }, - { NULL, "Pavilion ze4300*", NULL, NULL, "HP Pavilion ze4300 series", XE4500 }, - { NULL, "Pavilion ze8500*", NULL, NULL, "HP Pavilion ze8500 series", XE4500 }, - /* Compaq nx9000 */ - { NULL, "HP nx9000*", NULL, NULL, "HP Compaq nx9000", XE4500 }, - /* Compaq nx9005 */ - { NULL, "HP nx9005*", NULL, NULL, "HP Compaq nx9005", XE4500 }, - /* Compaq nx9010 */ - { NULL, "HP nx9010*", NULL, NULL, "HP Compaq nx9010", XE4500 }, - { "TOSHIBA", "S1000*", NULL, NULL, "Toshiba Satellite 1000", XE3GF }, - { "TOSHIBA", "S1005*", NULL, NULL, "Toshiba Satellite 1005", XE3GF }, - { "TOSHIBA", "S1110*", NULL, NULL, "Toshiba Satellite 1110", XE3GF }, - { "TOSHIBA", "S1115*", NULL, NULL, "Toshiba Satellite 1115", XE3GF }, - { "TOSHIBA", "S1900*", NULL, NULL, "Toshiba Satellite 1900", XE3GF }, - { "TOSHIBA", "S1905*", NULL, NULL, "Toshiba Satellite 1905", XE3GF }, - { "TOSHIBA", "S1950*", NULL, NULL, "Toshiba Satellite 1950", XE3GF }, - { "TOSHIBA", "S1955*", NULL, NULL, "Toshiba Satellite 1955", XE3GF }, - { "TOSHIBA", "S2430*", NULL, NULL, "Toshiba Satellite 2430", XE3GF }, - { "TOSHIBA", "S2435*", NULL, NULL, "Toshiba Satellite 2435", XE3GF }, - { "TOSHIBA", "S3000*", NULL, NULL, "Toshiba Satellite 3000", XE3GF }, - { "TOSHIBA", "S3005*", NULL, NULL, "Toshiba Satellite 3005", XE3GF }, - { "TOSHIBA", "Satellite 1000*", NULL, NULL, "Toshiba Satellite 1000", XE3GF }, - { "TOSHIBA", "Satellite 1005*", NULL, NULL, "Toshiba Satellite 1005", XE3GF }, - { "TOSHIBA", "Satellite 1110*", NULL, NULL, "Toshiba Satellite 1110", XE3GF }, - { "TOSHIBA", "Satellite 1115*", NULL, NULL, "Toshiba Satellite 1115", XE3GF }, - { "TOSHIBA", "Toshiba 1115*", NULL, NULL, "Toshiba Satellite 1115", XE3GF }, - { "TOSHIBA", "Satellite 1900*", NULL, NULL, "Toshiba Satellite 1900", XE3GF }, - { "TOSHIBA", "Satellite 1905*", NULL, NULL, "Toshiba Satellite 1905", XE3GF }, - { "TOSHIBA", "Satellite 1950*", NULL, NULL, "Toshiba Satellite 1950", XE3GF }, - { "TOSHIBA", "Satellite 1955*", NULL, NULL, "Toshiba Satellite 1955", XE3GF }, - { "TOSHIBA", "Satellite 2430*", NULL, NULL, "Toshiba Satellite 2430", XE3GF }, - { "TOSHIBA", "Satellite 2435*", NULL, NULL, "Toshiba Satellite 2435", XE3GF }, - { "TOSHIBA", "Satellite 3000*", NULL, NULL, "Toshiba Satellite 3000", XE3GF }, - { "TOSHIBA", "Satellite 3005*", NULL, NULL, "Toshiba Satellite 3005", XE3GF }, - { "TOSHIBA", "Satellite P10*", NULL, NULL, "Toshiba Satellite P10", TSP10 }, - { "TOSHIBA", "Satellite P15*", NULL, NULL, "Toshiba Satellite P15", TSP10 }, - { "TOSHIBA", "Satellite P20*", NULL, NULL, "Toshiba Satellite P20", TSP10 }, - { "TOSHIBA", "Satellite M30X*", NULL, NULL, "Toshiba Satellite M30X", TSM30X }, - { "TOSHIBA", "Satellite M35X*", NULL, NULL, "Toshiba Satellite M35X", TSM30X }, - { "TOSHIBA", "Satellite M70*", NULL, NULL, "Toshiba Satellite M70", TSM30X }, - { "TOSHIBA", "Satellite M40*", NULL, NULL, "Toshiba Satellite M40", TSM40 }, - { "COMPAL", NULL, NULL, "ACL00", "Compal ACL00", XE3GF }, - { "COMPAL", NULL, NULL, "ACL10", "Compal ACL10", XE3GF }, - { "Acer", "Aspire 1400 series*", NULL, NULL, "Acer Aspire 1400 series", XE3GF }, - { "Acer", "Aspire 1350*", NULL, NULL, "Acer Aspire 1350", XE4500 }, - { "FUJITSU SIEMENS", "Amilo D-Series*", NULL, NULL, "Fujitsu-Siemens Amilo D series", AMILOD }, - /* This sentinel at the end catches all unsupported models */ - { NULL, NULL, NULL, NULL, NULL, NONE } -}; +static int __init dmi_matched(struct dmi_system_id *dmi); -struct omnibook_tc_t { - char *tc; - int ectype; -}; - -/* HP technology codes */ -static struct omnibook_tc_t omnibook_tc[] __initdata = { - /* technology code ectype */ - {"CI.", OB4150}, - {"CL.", OB4150}, - {"DC.", XE2}, - {"EA.", OB6000}, - {"EB.", OB6100}, - {"EG.", XE4500}, - {"FA.", OB500}, - {"FB.", OB510}, - {"GC.", XE3GC}, - {"GD.", XE3GC}, - {"GE.", XE3GC}, - {"GF.", XE3GF}, - {"IB.", XE3GF}, - {"IC.", XE3GF}, - {"ID.", XE3GF}, - {"KA.", XE4500}, - {"KB.", XE4500}, - {"KC.", XE4500}, - {"KD.", XE4500}, - {"KE.", XE4500}, - {"KE_KG.", XE4500}, - {"KF_KH.", XE4500}, - {NULL, NONE} +static struct dmi_system_id omnibook_ids[] __initdata = { + { + .callback = dmi_matched, + .ident = "HP OmniBook XE3 GF", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook XE3 GF"), + }, + .driver_data = (void *) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook XT1000", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook XT1000"), + }, + .driver_data = (void *) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook XE2 DC", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook XE2 DC"), + }, + .driver_data = (void *) XE2 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook XE3 GC", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook XE3 GC"), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook XE3 GD / Pavilion N5430", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook XE3 GD"), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook XE3 GE / Pavilion N5415", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook XE3 GE"), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook 500 FA", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 500 FA"), + }, + .driver_data = (void*) OB500 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook 510 FB", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 510 FB"), + }, + .driver_data = (void*) OB510 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook 4150", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 4150"), + }, + .driver_data = (void*) OB4150 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook 900 B", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 900 B"), + }, + .driver_data = (void*) OB4150 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook 6000 EA", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 6000 EA"), + }, + .driver_data = (void*) OB6000 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook 6100 EB", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 6100 EB"), + }, + .driver_data = (void*) OB6100 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook xe4000/xe4100", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook xe4000"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook xe4400", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook xe4400"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook xe4500", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook xe4500"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP OmniBook 6200 EG / vt6200 / xt 6200", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 6200 EG"), + }, + .driver_data = (void*) XE4500 + }, + /* There are no model specific strings of some HP OmniBook XT1500 */ + { + .callback = dmi_matched, + .ident = "HP OmniBook XT1500", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion ze4000 / ze4125", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP NoteBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP NoteBook ze4000"), + }, + .driver_data = (void*) XE4500 + }, + /* There are no model specific strings of some HP Pavilion xt155 and some HP Pavilion ze4100 + * There are no model specific strings of some HP nx9000 */ + { + .callback = dmi_matched, + .ident = "HP Pavilion xt155 / ze4100 / nx9000", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP NoteBook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP NoteBook PC"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion ZU1000 FA / ZU1000 FA / ZU1175", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion ZU1000 FA"), + }, + .driver_data = (void*) OB500 + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion Notebook XE3 GC / N5290", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook XE3 GC"), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion Notebook GD / N5441", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GD"), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion Notebook GE / XH545", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion Notebook ZT1000 / ZT1141", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), + }, + .driver_data = (void*) XE3GF + }, + /* There are no model specific strings of some HP Pavilion ZT1175 and ZT1195 notebooks */ + { + .callback = dmi_matched, + .ident = "HP Pavilion ZT1175 / ZT1195", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion ze4200 series", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ze4200"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion ze4300 series", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ze4300"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP Pavilion ze8500 series", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ze8500"), + }, + .driver_data = (void*) XE4500 + }, + /* Compaq nx9000 */ + { + .callback = dmi_matched, + .ident = "HP Compaq nx9000", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP nx9000"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP Compaq nx9005", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP nx9005"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP Compaq nx9010", + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP nx9010"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1000", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1000"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1005", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1005"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1110", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1110"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1115", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1115"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1900", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1900"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1905", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1905"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1950", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1950"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1955", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S1955"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 2430", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S2430"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 2435", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S2435"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 3000", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S3000"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 3005", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "S3005"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1000", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1000"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1005", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1005"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1110", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1110"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1115", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1115"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1115", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Toshiba 1115"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1900", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1900"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1905", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1905"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1950", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1950"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 1955", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 1955"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 2430"), + }, + .ident = "Toshiba Satellite 2430", + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 2435", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 2435"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 3000", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 3000"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite 3005", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite 3005"), + }, + .driver_data = (void*) XE3GF, + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite P10", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), + }, + .driver_data = (void*) TSP10 + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite P15", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P15"), + }, + .driver_data = (void*) TSP10 + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite P20", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P20"), + }, + .driver_data = (void*) TSP10 + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite M30X", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite M30X"), + }, + .driver_data = (void*) TSM30X + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite M35X", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite M35X"), + }, + .driver_data = (void*) TSM30X + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite M70", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite M70"), + }, + .driver_data = (void*) TSM30X + }, + { + .callback = dmi_matched, + .ident = "Toshiba Satellite M40", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite M40"), + }, + .driver_data = (void*) TSM40 + }, + { + .callback = dmi_matched, + .ident = "Compal ACL00", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), + DMI_MATCH(DMI_BOARD_NAME, "ACL00"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Compal ACL10", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), + DMI_MATCH(DMI_BOARD_NAME, "ACL10"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Acer Aspire 1400 series", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1400 series"), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "Acer Aspire 1350", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1350"), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "Fujitsu-Siemens Amilo D series", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D-Series"), + }, + .driver_data = (void*) AMILOD + }, +/* HP Technology code Matching: + * Technology code appears in the first two chracters of BIOS version string + * ended by a dot, but it prefixed a space character on some models and BIOS + * versions. + * New HP/Compaq models use more characters (eg. KF_KH.). + */ + { + .callback = dmi_matched, + .ident = "HP model with technology code CI", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "CI."), + }, + .driver_data = (void*) OB4150 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code CL", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "CL."), + }, + .driver_data = (void*) OB4150 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code DC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "DC."), + }, + .driver_data = (void*) XE2 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code EA", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "EA."), + }, + .driver_data = (void*) OB6000 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code EB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "EB."), + }, + .driver_data = (void*) OB6100 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code EG", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "EG."), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code FA", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "FA."), + }, + .driver_data = (void*) OB500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code FB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "FB."), + }, + .driver_data = (void*) OB510 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code GC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "GC."), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code GD", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "GD."), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code GE", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "GE."), + }, + .driver_data = (void*) XE3GC + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code GF", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "GF."), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code IB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "IB."), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code IC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "IC."), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code ID", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "ID."), + }, + .driver_data = (void*) XE3GF + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code KA", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "KA."), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code KB", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "KB."), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code KC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "KC."), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code KD", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "KD."), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code KE", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "KE."), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code KE_KG", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "KE_KG."), + }, + .driver_data = (void*) XE4500 + }, + { + .callback = dmi_matched, + .ident = "HP model with technology code KF_KH", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, HP_SIGNATURE), + DMI_MATCH(DMI_BIOS_VERSION, "KF_KH."), + }, + .driver_data = (void*) XE4500 + }, + { NULL, } }; diff --git a/lcd.c b/lcd.c index aa09c15..1e973e5 100644 --- a/lcd.c +++ b/lcd.c @@ -35,8 +35,8 @@ static int omnibook_max_brightness; static struct backlight_device *omnibook_backlight_device; -int omnibook_get_backlight(struct backlight_device *bd); -int omnibook_set_backlight(struct backlight_device *bd); +static int omnibook_get_backlight(struct backlight_device *bd); +static int omnibook_set_backlight(struct backlight_device *bd); static struct backlight_properties omnibookbl_data = { .owner = THIS_MODULE, @@ -125,12 +125,12 @@ static int omnibook_set_lcd_brightness(int brgt) } #ifdef CONFIG_OMNIBOOK_BACKLIGHT -int omnibook_get_backlight(struct backlight_device *bd) +static int omnibook_get_backlight(struct backlight_device *bd) { return omnibook_get_lcd_brightness(); } -int omnibook_set_backlight(struct backlight_device *bd) +static int omnibook_set_backlight(struct backlight_device *bd) { int intensity = bd->props->brightness; return omnibook_set_lcd_brightness(intensity); diff --git a/temperature.c b/temperature.c index 5a72268..18dddab 100644 --- a/temperature.c +++ b/temperature.c @@ -72,7 +72,7 @@ static int omnibook_get_cpu_temp(void) return retval; } -int omnibook_temperature_read(char *buffer) +static int omnibook_temperature_read(char *buffer) { int len = 0; int cpu_temp; diff --git a/touchpad.c b/touchpad.c index e4f2d3b..5ba5abb 100644 --- a/touchpad.c +++ b/touchpad.c @@ -23,7 +23,7 @@ #include "ec.h" /* Touchpad is enabled by default */ -int omnibook_touchpad_enabled = 1; +static int omnibook_touchpad_enabled = 1; static int omnibook_touchpad_on(void) { -- 2.43.5