25
27
struct input_dev *inputdev;
28
struct tps_key_entry {
33
static struct tps_key_entry topstar_keymap[] = {
34
{ 0x80, KEY_BRIGHTNESSUP },
35
{ 0x81, KEY_BRIGHTNESSDOWN },
36
{ 0x83, KEY_VOLUMEUP },
37
{ 0x84, KEY_VOLUMEDOWN },
39
{ 0x86, KEY_SWITCHVIDEOMODE },
40
{ 0x87, KEY_F13 }, /* touchpad enable/disable key */
45
{ 0x96, KEY_F14 }, /* G key? */
49
static struct tps_key_entry *tps_get_key_by_scancode(int code)
51
struct tps_key_entry *key;
53
for (key = topstar_keymap; key->code; key++)
54
if (code == key->code)
60
static struct tps_key_entry *tps_get_key_by_keycode(int code)
62
struct tps_key_entry *key;
64
for (key = topstar_keymap; key->code; key++)
65
if (code == key->keycode)
30
static const struct key_entry topstar_keymap[] = {
31
{ KE_KEY, 0x80, { KEY_BRIGHTNESSUP } },
32
{ KE_KEY, 0x81, { KEY_BRIGHTNESSDOWN } },
33
{ KE_KEY, 0x83, { KEY_VOLUMEUP } },
34
{ KE_KEY, 0x84, { KEY_VOLUMEDOWN } },
35
{ KE_KEY, 0x85, { KEY_MUTE } },
36
{ KE_KEY, 0x86, { KEY_SWITCHVIDEOMODE } },
37
{ KE_KEY, 0x87, { KEY_F13 } }, /* touchpad enable/disable key */
38
{ KE_KEY, 0x88, { KEY_WLAN } },
39
{ KE_KEY, 0x8a, { KEY_WWW } },
40
{ KE_KEY, 0x8b, { KEY_MAIL } },
41
{ KE_KEY, 0x8c, { KEY_MEDIA } },
43
/* Known non hotkey events don't handled or that we don't care yet */
49
* 'G key' generate two event codes, convert to only
50
* one event/key code for now, consider replacing by
51
* a switch (3G switch - SW_3G?)
53
{ KE_KEY, 0x96, { KEY_F14 } },
54
{ KE_KEY, 0x97, { KEY_F14 } },
71
59
static void acpi_topstar_notify(struct acpi_device *device, u32 event)
73
struct tps_key_entry *key;
74
61
static bool dup_evnt[2];
76
63
struct topstar_hkey *hkey = acpi_driver_data(device);
89
* 'G key' generate two event codes, convert to only
90
* one event/key code for now (3G switch?)
95
key = tps_get_key_by_scancode(event);
97
input_report_key(hkey->inputdev, key->keycode, 1);
98
input_sync(hkey->inputdev);
99
input_report_key(hkey->inputdev, key->keycode, 0);
100
input_sync(hkey->inputdev);
104
/* Known non hotkey events don't handled or that we don't care yet */
105
if (event == 0x8e || event == 0x8f || event == 0x90)
108
pr_info("unknown event = 0x%02x\n", event);
75
if (!sparse_keymap_report_event(hkey->inputdev, event, 1, true))
76
pr_info("unknown event = 0x%02x\n", event);
111
79
static int acpi_topstar_fncx_switch(struct acpi_device *device, bool state)
129
static int topstar_getkeycode(struct input_dev *dev, int scancode, int *keycode)
131
struct tps_key_entry *key = tps_get_key_by_scancode(scancode);
136
*keycode = key->keycode;
140
static int topstar_setkeycode(struct input_dev *dev, int scancode, int keycode)
142
struct tps_key_entry *key;
145
if (keycode < 0 || keycode > KEY_MAX)
148
key = tps_get_key_by_scancode(scancode);
153
old_keycode = key->keycode;
154
key->keycode = keycode;
155
set_bit(keycode, dev->keybit);
156
if (!tps_get_key_by_keycode(old_keycode))
157
clear_bit(old_keycode, dev->keybit);
161
97
static int acpi_topstar_init_hkey(struct topstar_hkey *hkey)
163
struct tps_key_entry *key;
99
struct input_dev *input;
165
hkey->inputdev = input_allocate_device();
166
if (!hkey->inputdev) {
102
input = input_allocate_device();
167
104
pr_err("Unable to allocate input device\n");
170
hkey->inputdev->name = "Topstar Laptop extra buttons";
171
hkey->inputdev->phys = "topstar/input0";
172
hkey->inputdev->id.bustype = BUS_HOST;
173
hkey->inputdev->getkeycode = topstar_getkeycode;
174
hkey->inputdev->setkeycode = topstar_setkeycode;
175
for (key = topstar_keymap; key->code; key++) {
176
set_bit(EV_KEY, hkey->inputdev->evbit);
177
set_bit(key->keycode, hkey->inputdev->keybit);
179
if (input_register_device(hkey->inputdev)) {
108
input->name = "Topstar Laptop extra buttons";
109
input->phys = "topstar/input0";
110
input->id.bustype = BUS_HOST;
112
error = sparse_keymap_setup(input, topstar_keymap, NULL);
114
pr_err("Unable to setup input device keymap\n");
118
error = input_register_device(input);
180
120
pr_err("Unable to register input device\n");
181
input_free_device(hkey->inputdev);
121
goto err_free_keymap;
124
hkey->inputdev = input;
128
sparse_keymap_free(input);
130
input_free_device(input);
188
134
static int acpi_topstar_add(struct acpi_device *device)