View | Details | Raw Unified | Return to bug 448004
Collapse All | Expand All

(-)a/drivers/misc/asus-laptop.c (-93 / +89 lines)
Lines 24-30 Link Here
24
 *  http://sourceforge.net/projects/acpi4asus/
24
 *  http://sourceforge.net/projects/acpi4asus/
25
 *
25
 *
26
 *  Credits:
26
 *  Credits:
27
 *  Nicolas Trangez  - Initial work to let ACPI buttons work over INPUT layer
27
 *  Daniel Nascimento - Reworked input layer and add more keys
28
 *  Nicolas Trangez - Initial work to let ACPI buttons work over INPUT layer
28
 *  Pontus Fuchs   - Helper functions, cleanup
29
 *  Pontus Fuchs   - Helper functions, cleanup
29
 *  Johann Wiesner - Small compile fixes
30
 *  Johann Wiesner - Small compile fixes
30
 *  John Belmonte  - ACPI code for Toshiba laptop was a good starting point.
31
 *  John Belmonte  - ACPI code for Toshiba laptop was a good starting point.
Lines 253-263 Link Here
253
ASUS_LED(gled, "gaming");
254
ASUS_LED(gled, "gaming");
254
255
255
/* Input layer variables */
256
/* Input layer variables */
257
/* Magic number set 154 because 153 is the highest event in M51Sn */
258
#define ASUS_HOTK_MAP_LEN       154
259
#define ASUS_HOTK_MAP_SIZE      ASUS_HOTK_MAP_LEN*sizeof(typeof(*hotk_keycode_map)) 
260
256
static u16 *hotk_keycode_map;
261
static u16 *hotk_keycode_map;
257
static int hotk_keycode_map_size;
258
static struct input_dev *asus_hotk_inputdev;
262
static struct input_dev *asus_hotk_inputdev;
259
static int asus_hotk_inputdev_registered;
263
static int asus_hotk_inputdev_registered;
260
264
265
struct key_event {
266
	u16 key;
267
	u8  event;
268
};
269
261
/*
270
/*
262
 * This function evaluates an ACPI method, given an int as parameter, the
271
 * This function evaluates an ACPI method, given an int as parameter, the
263
 * method is searched within the scope of the handle, can be NULL. The output
272
 * method is searched within the scope of the handle, can be NULL. The output
Lines 748-756 Link Here
748
		lcd_blank(FB_BLANK_POWERDOWN);
757
		lcd_blank(FB_BLANK_POWERDOWN);
749
	}
758
	}
750
759
751
	if (event < hotk_keycode_map_size) {
760
	if (event < ASUS_HOTK_MAP_LEN) {
752
		keycode = hotk_keycode_map[event];
761
		keycode = hotk_keycode_map[event];
753
		printk("Keycode: %04x (%d)\n", keycode, keycode);
754
	} else {
762
	} else {
755
		keycode = KEY_UNKNOWN;
763
		keycode = KEY_UNKNOWN;
756
		printk("Scancode %d out of keymap\n", event);
764
		printk("Scancode %d out of keymap\n", event);
Lines 1144-1247 Link Here
1144
	platform_driver_unregister(&asuspf_driver);
1152
	platform_driver_unregister(&asuspf_driver);
1145
}
1153
}
1146
1154
1147
static int asus_hotk_init(void)
1155
static int set_keycode_map(void)
1148
{
1156
{
1149
	int ret, i;
1157
	int i;
1150
1158
1151
	static u16 keycode_map_1[] __initdata = {
1159
	/* Some of these values are ovewriten by something */
1152
		KEY_UNKNOWN, /* 0 */
1160
	static struct key_event map_1[] = {
1153
		KEY_UNKNOWN, /* 1 */
1161
		{ KEY_RESERVED, 17 }, /* Brightness up   */ 
1154
		KEY_UNKNOWN, /* 2 */
1162
		{ KEY_RESERVED, 18 }, /* Brightness up   */ 
1155
		KEY_UNKNOWN, /* 3 */
1163
		{ KEY_RESERVED, 19 }, /* Brightness up   */ 
1156
		KEY_UNKNOWN, /* 4 */
1164
		{ KEY_RESERVED, 20 }, /* Brightness up   */ 
1157
		KEY_UNKNOWN, /* 5 */
1165
		{ KEY_RESERVED, 21 }, /* Brightness up   */ 
1158
		KEY_UNKNOWN, /* 6 */
1166
		{ KEY_RESERVED, 22 }, /* Brightness up   */ 
1159
		KEY_UNKNOWN, /* 7 */
1167
		{ KEY_RESERVED, 23 }, /* Brightness up   */ 
1160
		KEY_UNKNOWN, /* 8 */
1168
		{ KEY_RESERVED, 24 }, /* Brightness up   */ 
1161
		KEY_UNKNOWN, /* 9 */
1169
		{ KEY_RESERVED, 25 }, /* Brightness up   */ 
1162
		KEY_UNKNOWN, /* 10 */
1170
		{ KEY_RESERVED, 26 }, /* Brightness up   */ 
1163
		KEY_UNKNOWN, /* 11 */
1171
		{ KEY_RESERVED, 27 }, /* Brightness up   */ 
1164
		KEY_UNKNOWN, /* 12 */
1172
		{ KEY_RESERVED, 28 }, /* Brightness up   */ 
1165
		KEY_UNKNOWN, /* 13 */
1173
		{ KEY_RESERVED, 29 }, /* Brightness up   */ 
1166
		KEY_UNKNOWN, /* 14 */
1174
		{ KEY_RESERVED, 30 }, /* Brightness up   */ 
1167
		KEY_UNKNOWN, /* 15 */
1175
		{ KEY_RESERVED, 31 }, /* Brightness up   */ 
1168
		KEY_UNKNOWN, /* 16 */
1176
		{ KEY_RESERVED, 32 }, /* Brightness down */ 
1169
		KEY_UNKNOWN, /* 17 */
1177
		{ KEY_RESERVED, 33 }, /* Brightness down */ 
1170
		KEY_UNKNOWN, /* 18 */
1178
		{ KEY_RESERVED, 34 }, /* Brightness down */ 
1171
		KEY_UNKNOWN, /* 19 */
1179
		{ KEY_RESERVED, 35 }, /* Brightness down */ 
1172
		KEY_UNKNOWN, /* 20 */
1180
		{ KEY_RESERVED, 36 }, /* Brightness down */ 
1173
		KEY_UNKNOWN, /* 21 */
1181
		{ KEY_RESERVED, 37 }, /* Brightness down */ 
1174
		KEY_UNKNOWN, /* 22 */
1182
		{ KEY_RESERVED, 38 }, /* Brightness down */ 
1175
		KEY_UNKNOWN, /* 23 */
1183
		{ KEY_RESERVED, 39 }, /* Brightness down */ 
1176
		KEY_UNKNOWN, /* 24 */
1184
		{ KEY_RESERVED, 40 }, /* Brightness down */ 
1177
		KEY_UNKNOWN, /* 25 */
1185
		{ KEY_RESERVED, 41 }, /* Brightness down */ 
1178
		KEY_UNKNOWN, /* 26 */
1186
		{ KEY_RESERVED, 42 }, /* Brightness down */ 
1179
		KEY_UNKNOWN, /* 27 */
1187
		{ KEY_RESERVED, 43 }, /* Brightness down */ 
1180
		KEY_UNKNOWN, /* 28 */
1188
		{ KEY_RESERVED, 44 }, /* Brightness down */ 
1181
		KEY_UNKNOWN, /* 29 */
1189
		{ KEY_RESERVED, 45 }, /* Brightness down */ 
1182
		KEY_UNKNOWN, /* 30 */
1190
		{ KEY_RESERVED, 46 }, /* Brightness down */ 
1183
		KEY_UNKNOWN, /* 31 */
1191
		{ KEY_VOLUMEUP, 48 }, 
1184
		KEY_UNKNOWN, /* 32 */
1192
		{ KEY_VOLUMEDOWN, 49 },
1185
		KEY_UNKNOWN, /* 33 */
1193
		{ KEY_MUTE,     50 },
1186
		KEY_UNKNOWN, /* 34 */
1194
		{ KEY_RESERVED, 51 }, /* LCD Switch */
1187
		KEY_UNKNOWN, /* 35 */
1195
		{ KEY_RESERVED, 52 }, /* LCD Switch */
1188
		KEY_UNKNOWN, /* 36 */
1196
		{ KEY_PREVIOUSSONG, 64 }, 
1189
		KEY_UNKNOWN, /* 37 */
1197
		{ KEY_NEXTSONG, 65 }, 
1190
		KEY_UNKNOWN, /* 38 */
1198
		{ KEY_STOP,     67 }, 
1191
		KEY_UNKNOWN, /* 39 */
1199
		{ KEY_PLAYPAUSE,69 }, 
1192
		KEY_UNKNOWN, /* 40 */
1200
		{ KEY_EMAIL,    80 }, 
1193
		KEY_UNKNOWN, /* 41 */
1201
		{ KEY_WWW,      81 }, 
1194
		KEY_UNKNOWN, /* 42 */
1202
		{ BTN_EXTRA,    92 },  /* Performance */
1195
		KEY_UNKNOWN, /* 43 */
1203
		{ KEY_WLAN,     93 },
1196
		KEY_UNKNOWN, /* 44 */
1204
		{ KEY_SWITCHVIDEOMODE,    97 },
1197
		KEY_UNKNOWN, /* 45 */
1205
		{ BTN_TOUCH,    107 }, /* Lock Mouse */
1198
		KEY_UNKNOWN, /* 46 */
1206
		{ KEY_BLUETOOTH,125 }, /* Bluetooth up */
1199
		KEY_UNKNOWN, /* 47 */
1207
		{ KEY_BLUETOOTH,126 }, /* Bluetooth down */
1200
		KEY_UNKNOWN, /* 48 */
1208
		{ KEY_CAMERA,   130 }, 
1201
		KEY_UNKNOWN, /* 49 */
1209
		{ KEY_TV,       138 }, 
1202
		KEY_UNKNOWN, /* 50 */
1210
		{ KEY_MEDIA,    149 }, 
1203
		KEY_UNKNOWN, /* 51 */
1211
		{ KEY_PHONE,    153 }
1204
		KEY_UNKNOWN, /* 52 */
1205
		KEY_UNKNOWN, /* 53 */
1206
		KEY_UNKNOWN, /* 54 */
1207
		KEY_UNKNOWN, /* 55 */
1208
		KEY_UNKNOWN, /* 56 */
1209
		KEY_UNKNOWN, /* 57 */
1210
		KEY_UNKNOWN, /* 58 */
1211
		KEY_UNKNOWN, /* 59 */
1212
		KEY_UNKNOWN, /* 60 */
1213
		KEY_UNKNOWN, /* 61 */
1214
		KEY_UNKNOWN, /* 62 */
1215
		KEY_UNKNOWN, /* 63 */
1216
		KEY_PREVIOUSSONG, /* 64 */
1217
		KEY_NEXTSONG, /* 65 */
1218
		KEY_UNKNOWN, /* 66 */
1219
		KEY_STOP, /* 67 */
1220
		KEY_UNKNOWN, /* 68 */
1221
		KEY_PLAYPAUSE, /* 69 */
1222
		KEY_UNKNOWN, /* 70 */
1223
	};
1212
	};
1224
1213
 
1225
#define ASUS_HOTK_MAP_LEN       ARRAY_SIZE(keycode_map_1)
1226
#define ASUS_HOTK_MAP_SIZE      sizeof(keycode_map_1)
1227
#define ASUS_HOTK_MAP_TYPESIZE  sizeof(keycode_map_1[0])
1228
1229
	/* Always use first keymap. TODO make this model-specific */
1230
	hotk_keycode_map = kmalloc(ASUS_HOTK_MAP_SIZE, GFP_KERNEL);
1214
	hotk_keycode_map = kmalloc(ASUS_HOTK_MAP_SIZE, GFP_KERNEL);
1231
	hotk_keycode_map_size = ASUS_HOTK_MAP_LEN;
1232
	if (!hotk_keycode_map) {
1215
	if (!hotk_keycode_map) {
1233
		printk(ASUS_ERR "failed to allocate memory for keymap\n");
1216
		printk(ASUS_ERR "failed to allocate memory for keymap\n");
1234
		return -ENOMEM;
1217
		return -ENOMEM;
1235
	}
1218
	}
1236
	printk(ASUS_NOTICE "using keycode_map_1\n");
1237
	memcpy(hotk_keycode_map, &keycode_map_1, ASUS_HOTK_MAP_SIZE);
1238
	/* TODO make sure no ACPI events are sent on known keycodes */
1239
1219
1240
	asus_hotk_inputdev = input_allocate_device();
1220
	asus_hotk_inputdev = input_allocate_device();
1241
	if (!asus_hotk_inputdev) {
1221
	if (!asus_hotk_inputdev) {
1242
		printk(ASUS_ERR "unable to allocate input device\n");
1222
		printk(ASUS_ERR "unable to allocate input device\n");
1243
		return -ENOMEM;
1223
		return -ENOMEM;
1244
	}
1224
	}
1225
	for (i = 0; i < ASUS_HOTK_MAP_SIZE; i++)
1226
		hotk_keycode_map[i] = KEY_UNKNOWN;
1227
1228
	/* Always use first keymap. TODO make this model-specific
1229
	 * (not sure if it's needed more than one) */
1230
	printk(ASUS_NOTICE "using map_1\n");
1231
	for (i = 0; i < ARRAY_SIZE(map_1); i++)
1232
		hotk_keycode_map[map_1[i].event] = map_1[i].key;
1233
1234
	return 0;
1235
}
1236
1237
static int asus_hotk_init(void)
1238
{
1239
	int ret, i;
1240
1241
	if ((ret = set_keycode_map()) != 0)
1242
		return ret;
1243
1245
	asus_hotk_inputdev->name = "Asus Extra Buttons";
1244
	asus_hotk_inputdev->name = "Asus Extra Buttons";
1246
	asus_hotk_inputdev->phys = ASUS_HOTK_FILE "/input0";
1245
	asus_hotk_inputdev->phys = ASUS_HOTK_FILE "/input0";
1247
	asus_hotk_inputdev->id.bustype = BUS_HOST;
1246
	asus_hotk_inputdev->id.bustype = BUS_HOST;
Lines 1254-1269 Link Here
1254
	set_bit(EV_KEY, asus_hotk_inputdev->evbit);
1253
	set_bit(EV_KEY, asus_hotk_inputdev->evbit);
1255
	set_bit(EV_MSC, asus_hotk_inputdev->evbit);
1254
	set_bit(EV_MSC, asus_hotk_inputdev->evbit);
1256
	set_bit(MSC_SCAN, asus_hotk_inputdev->mscbit);
1255
	set_bit(MSC_SCAN, asus_hotk_inputdev->mscbit);
1257
	asus_hotk_inputdev->keycodesize = ASUS_HOTK_MAP_TYPESIZE;
1256
	asus_hotk_inputdev->keycodesize = sizeof(hotk_keycode_map[0]);
1258
	asus_hotk_inputdev->keycodemax = ASUS_HOTK_MAP_LEN;
1257
	asus_hotk_inputdev->keycodemax = ASUS_HOTK_MAP_LEN;
1259
	asus_hotk_inputdev->keycode = hotk_keycode_map;
1258
	asus_hotk_inputdev->keycode = hotk_keycode_map;
1260
	for (i = 0; i < ASUS_HOTK_MAP_LEN; i++) {
1259
	for (i = 0; i < ASUS_HOTK_MAP_LEN; i++) {
1261
		if (hotk_keycode_map[i] != KEY_RESERVED) {
1260
		if (hotk_keycode_map[i] != KEY_RESERVED) {
1262
			set_bit(hotk_keycode_map[i], asus_hotk_inputdev->keybit);
1261
			set_bit(hotk_keycode_map[i], asus_hotk_inputdev->keybit);
1263
		} /*else {
1262
		}
1264
			if (i < sizeof(hotk_reserved_mask)*8)
1265
				hotk_reserved_mask |= 1 << i;
1266
		}*/
1267
	}
1263
	}
1268
1264
1269
	ret = input_register_device(asus_hotk_inputdev);
1265
	ret = input_register_device(asus_hotk_inputdev);

Return to bug 448004