Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 243123
b: refs/heads/master
c: 143a4c0
h: refs/heads/master
i:
  243121: f40c064
  243119: 02bfc0d
v: v3
  • Loading branch information
Lee, Chun-Yi authored and Matthew Garrett committed Mar 28, 2011
1 parent 40d356a commit b1510c1
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8941178efad900e48e44000208513a6426c74368
refs/heads/master: 143a4c0284dc2378b3ce78866b3548d90121d843
81 changes: 79 additions & 2 deletions trunk/drivers/platform/x86/msi-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
#include <linux/platform_device.h>
#include <linux/rfkill.h>
#include <linux/i8042.h>
#include <linux/input.h>
#include <linux/input/sparse-keymap.h>

#define MSI_DRIVER_VERSION "0.5"

Expand All @@ -78,6 +80,9 @@
#define MSI_STANDARD_EC_SCM_LOAD_ADDRESS 0x2d
#define MSI_STANDARD_EC_SCM_LOAD_MASK (1 << 0)

#define MSI_STANDARD_EC_TOUCHPAD_ADDRESS 0xe4
#define MSI_STANDARD_EC_TOUCHPAD_MASK (1 << 4)

static int msi_laptop_resume(struct platform_device *device);

#define MSI_STANDARD_EC_DEVICES_EXISTS_ADDRESS 0x2f
Expand All @@ -90,6 +95,14 @@ static int auto_brightness;
module_param(auto_brightness, int, 0);
MODULE_PARM_DESC(auto_brightness, "Enable automatic brightness control (0: disabled; 1: enabled; 2: don't touch)");

static const struct key_entry msi_laptop_keymap[] = {
{KE_KEY, KEY_TOUCHPAD_ON, {KEY_TOUCHPAD_ON} }, /* Touch Pad On */
{KE_KEY, KEY_TOUCHPAD_OFF, {KEY_TOUCHPAD_OFF} },/* Touch Pad On */
{KE_END, 0}
};

static struct input_dev *msi_laptop_input_dev;

static bool old_ec_model;
static int wlan_s, bluetooth_s, threeg_s;
static int threeg_exists;
Expand Down Expand Up @@ -605,6 +618,21 @@ static void msi_update_rfkill(struct work_struct *ignored)
}
static DECLARE_DELAYED_WORK(msi_rfkill_work, msi_update_rfkill);

static void msi_send_touchpad_key(struct work_struct *ignored)
{
u8 rdata;
int result;

result = ec_read(MSI_STANDARD_EC_TOUCHPAD_ADDRESS, &rdata);
if (result < 0)
return;

sparse_keymap_report_event(msi_laptop_input_dev,
(rdata & MSI_STANDARD_EC_TOUCHPAD_MASK) ?
KEY_TOUCHPAD_ON : KEY_TOUCHPAD_OFF, 1, true);
}
static DECLARE_DELAYED_WORK(msi_touchpad_work, msi_send_touchpad_key);

static bool msi_laptop_i8042_filter(unsigned char data, unsigned char str,
struct serio *port)
{
Expand All @@ -613,20 +641,24 @@ static bool msi_laptop_i8042_filter(unsigned char data, unsigned char str,
if (str & 0x20)
return false;

/* 0x54 wwan, 0x62 bluetooth, 0x76 wlan*/
/* 0x54 wwan, 0x62 bluetooth, 0x76 wlan, 0xE4 touchpad toggle*/
if (unlikely(data == 0xe0)) {
extended = true;
return false;
} else if (unlikely(extended)) {
extended = false;
switch (data) {
case 0xE4:
schedule_delayed_work(&msi_touchpad_work,
round_jiffies_relative(0.5 * HZ));
break;
case 0x54:
case 0x62:
case 0x76:
schedule_delayed_work(&msi_rfkill_work,
round_jiffies_relative(0.5 * HZ));
break;
}
extended = false;
}

return false;
Expand Down Expand Up @@ -731,6 +763,42 @@ static int msi_laptop_resume(struct platform_device *device)
return 0;
}

static int __init msi_laptop_input_setup(void)
{
int err;

msi_laptop_input_dev = input_allocate_device();
if (!msi_laptop_input_dev)
return -ENOMEM;

msi_laptop_input_dev->name = "MSI Laptop hotkeys";
msi_laptop_input_dev->phys = "msi-laptop/input0";
msi_laptop_input_dev->id.bustype = BUS_HOST;

err = sparse_keymap_setup(msi_laptop_input_dev,
msi_laptop_keymap, NULL);
if (err)
goto err_free_dev;

err = input_register_device(msi_laptop_input_dev);
if (err)
goto err_free_keymap;

return 0;

err_free_keymap:
sparse_keymap_free(msi_laptop_input_dev);
err_free_dev:
input_free_device(msi_laptop_input_dev);
return err;
}

static void msi_laptop_input_destroy(void)
{
sparse_keymap_free(msi_laptop_input_dev);
input_unregister_device(msi_laptop_input_dev);
}

static int load_scm_model_init(struct platform_device *sdev)
{
u8 data;
Expand Down Expand Up @@ -759,6 +827,11 @@ static int load_scm_model_init(struct platform_device *sdev)
if (result < 0)
goto fail_rfkill;

/* setup input device */
result = msi_laptop_input_setup();
if (result)
goto fail_input;

result = i8042_install_filter(msi_laptop_i8042_filter);
if (result) {
printk(KERN_ERR
Expand All @@ -769,6 +842,9 @@ static int load_scm_model_init(struct platform_device *sdev)
return 0;

fail_filter:
msi_laptop_input_destroy();

fail_input:
rfkill_cleanup();

fail_rfkill:
Expand Down Expand Up @@ -886,6 +962,7 @@ static void __exit msi_cleanup(void)
{
if (load_scm_model) {
i8042_remove_filter(msi_laptop_i8042_filter);
msi_laptop_input_destroy();
cancel_delayed_work_sync(&msi_rfkill_work);
rfkill_cleanup();
}
Expand Down

0 comments on commit b1510c1

Please sign in to comment.