From: Bernhard Rosenkraenzer <bero@arklinux.org>
To: mitr@volny.cz, akpm@osdl.org, linux-kernel@vger.kernel.org
Subject: [PATCH] 2.6.14-rc5-mm1 wistron_btns Acer Aspire support + some fixes
Date: Wed, 26 Oct 2005 17:43:50 +0200 [thread overview]
Message-ID: <200510261743.50590.bero@arklinux.org> (raw)
Hi,
the patch below adds Acer Aspire 1500 support to wistron_btns and fixes a
potential issue with some notebooks:
The current code assumes the response to bios_wifi_get_default_setting is
either 1 (disabled) or 3 (enabled), or wifi isn't supported.
The BIOS response appears to be a bit field w/ 0x1 indicating hardware
presence, 0x2 indicating actiation status, and the other 6 bits being
unknown/reserved -- with the patch, these 6 bits are ignored.
Signed-off-by: Bernhard Rosenkraenzer <bero@arklinux.org>
---
--- linux-2.6.13/drivers/input/misc/wistron_btns.c.acer~ 2005-10-26
11:11:38.000000000 +0200
+++ linux-2.6.13/drivers/input/misc/wistron_btns.c 2005-10-26
11:36:32.000000000 +0200
@@ -1,5 +1,6 @@
/* Wistron laptop button driver
Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
+ Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
You can redistribute and/or modify this program under the terms of the
GNU General Public License version 2 as published by the Free Software
@@ -35,6 +36,10 @@
#error "POLL_FREQUENCY too high"
#endif
+/* BIOS subsystem IDs */
+#define WIFI 0x35
+#define BLUETOOTH 0x34
+
MODULE_AUTHOR("Miloslav Trmac <mitr@volny.cz>");
MODULE_DESCRIPTION("Wistron laptop button driver");
MODULE_LICENSE("GPL v2");
@@ -179,28 +184,28 @@
return (uint8_t)regs.ecx;
}
-static uint16_t __init bios_wifi_get_default_setting(void)
+static uint16_t __init bios_get_default_setting(uint8_t subsys)
{
struct regs regs;
memset(®s, 0, sizeof (regs));
regs.eax = 0x9610;
- regs.ebx = 0x0235;
+ regs.ebx = 0x0200 | subsys;
call_bios(®s);
return (uint16_t)regs.eax;
}
-static void bios_wifi_set_state(int enable)
+static void bios_set_state(uint8_t subsys, int enable)
{
struct regs regs;
memset(®s, 0, sizeof (regs));
regs.eax = 0x9610;
- regs.ebx = enable ? 0x0135 : 0x0035;
+ regs.ebx = (enable ? 0x0100 : 0x0000) | subsys;
call_bios(®s);
}
- /* Hardware database */
+/* Hardware database */
struct key_entry {
char type; /* See KE_* below */
@@ -208,10 +213,11 @@
unsigned keycode; /* For KE_KEY */
};
-enum { KE_END, KE_KEY, KE_WIFI };
+enum { KE_END, KE_KEY, KE_WIFI, KE_BLUETOOTH };
static const struct key_entry *keymap; /* = NULL; Current key map */
static int have_wifi;
+static int have_bluetooth;
static int __init dmi_matched(struct dmi_system_id *dmi)
{
@@ -222,6 +228,9 @@
if (key->type == KE_WIFI) {
have_wifi = 1;
break;
+ } else if(key->type == KE_BLUETOOTH) {
+ have_bluetooth = 1;
+ break;
}
}
return 1;
@@ -254,6 +263,16 @@
{ KE_END, 0 }
};
+static struct key_entry keymap_acer_aspire_1500[] = {
+ { KE_KEY, 0x11, KEY_PROG1 },
+ { KE_KEY, 0x12, KEY_PROG2 },
+ { KE_WIFI, 0x30, 0 },
+ { KE_KEY, 0x31, KEY_MAIL },
+ { KE_KEY, 0x36, KEY_WWW },
+ { KE_BLUETOOTH, 0x44, 0 },
+ { KE_END, 0 }
+};
+
/* If your machine is not here (which is currently rather likely), please
send
a list of buttons and their key codes (reported when loading this module
with force=1) and the output of dmidecode to $MODULE_AUTHOR. */
@@ -267,6 +286,15 @@
},
.driver_data = keymap_fs_amilo_pro_v2000
},
+ {
+ .callback = dmi_matched,
+ .ident = "Acer Aspire 1500",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"),
+ },
+ .driver_data = keymap_acer_aspire_1500
+ },
{ 0, }
};
@@ -321,6 +349,7 @@
/* Driver core */
static int wifi_enabled;
+static int bluetooth_enabled;
static void poll_bios(unsigned long);
@@ -341,7 +370,14 @@
if (have_wifi == 0)
break;
wifi_enabled = !wifi_enabled;
- bios_wifi_set_state(wifi_enabled);
+ bios_set_state(WIFI, wifi_enabled);
+ break;
+
+ case KE_BLUETOOTH:
+ if (have_bluetooth == 0)
+ break;
+ bluetooth_enabled = !bluetooth_enabled;
+ bios_set_state(BLUETOOTH, bluetooth_enabled);
break;
case KE_END: default:
@@ -383,21 +419,23 @@
bios_attach();
cmos_address = bios_get_cmos_address();
if (have_wifi != 0) {
- switch (bios_wifi_get_default_setting()) {
- case 0x01:
- wifi_enabled = 0;
- break;
-
- case 0x03:
- wifi_enabled = 1;
- break;
-
- default:
- have_wifi = 0;
- break;
- }
+ uint16_t wifi = bios_get_default_setting(WIFI);
+ if (wifi & 1)
+ wifi_enabled = (wifi & 2) ? 1 : 0;
+ else
+ have_wifi=0;
if (have_wifi != 0)
- bios_wifi_set_state(wifi_enabled);
+ bios_set_state(WIFI, wifi_enabled);
+ }
+ if (have_bluetooth != 0) {
+ uint16_t bt = bios_get_default_setting(BLUETOOTH);
+ if (bt & 1)
+ bluetooth_enabled = (bt & 2) ? 1 : 0;
+ else
+ have_bluetooth = 0;
+
+ if (have_bluetooth)
+ bios_set_state(BLUETOOTH, bluetooth_enabled);
}
setup_input_dev();
input_register_device(&input_dev);
reply other threads:[~2005-10-26 15:44 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200510261743.50590.bero@arklinux.org \
--to=bero@arklinux.org \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mitr@volny.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.