Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Wistron laptop button driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <linux/input/sparse-keymap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/mc146818rtc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/preempt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #include <linux/leds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) /* How often we poll keys - msecs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #define POLL_INTERVAL_DEFAULT	500 /* when idle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #define POLL_INTERVAL_BURST	100 /* when a key was recently pressed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) /* BIOS subsystem IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #define WIFI		0x35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #define BLUETOOTH	0x34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #define MAIL_LED	0x31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) MODULE_AUTHOR("Miloslav Trmac <mitr@volny.cz>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) MODULE_DESCRIPTION("Wistron laptop button driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) MODULE_LICENSE("GPL v2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) static bool force; /* = 0; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) module_param(force, bool, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) MODULE_PARM_DESC(force, "Load even if computer is not in database");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) static char *keymap_name; /* = NULL; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) module_param_named(keymap, keymap_name, charp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) MODULE_PARM_DESC(keymap, "Keymap name, if it can't be autodetected [generic, 1557/MS2141]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) static struct platform_device *wistron_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48)  /* BIOS interface implementation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) static void __iomem *bios_entry_point; /* BIOS routine entry point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) static void __iomem *bios_code_map_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) static void __iomem *bios_data_map_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) static u8 cmos_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) struct regs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	u32 eax, ebx, ecx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) static void call_bios(struct regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	preempt_disable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	asm volatile ("pushl %%ebp;"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 		      "movl %7, %%ebp;"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 		      "call *%6;"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 		      "popl %%ebp"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 		      : "=a" (regs->eax), "=b" (regs->ebx), "=c" (regs->ecx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 		      : "0" (regs->eax), "1" (regs->ebx), "2" (regs->ecx),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 			"m" (bios_entry_point), "m" (bios_data_map_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 		      : "edx", "edi", "esi", "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 	preempt_enable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) static ssize_t __init locate_wistron_bios(void __iomem *base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	static unsigned char __initdata signature[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 		{ 0x42, 0x21, 0x55, 0x30 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	ssize_t offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	for (offset = 0; offset < 0x10000; offset += 0x10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 		if (check_signature(base + offset, signature,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 				    sizeof(signature)) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 			return offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) static int __init map_bios(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	void __iomem *base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	ssize_t offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	u32 entry_point;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 	base = ioremap(0xF0000, 0x10000); /* Can't fail */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	offset = locate_wistron_bios(base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	if (offset < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 		printk(KERN_ERR "wistron_btns: BIOS entry point not found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 		iounmap(base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	entry_point = readl(base + offset + 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	printk(KERN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 		"wistron_btns: BIOS signature found at %p, entry point %08X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 		base + offset, entry_point);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 	if (entry_point >= 0xF0000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 		bios_code_map_base = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 		bios_entry_point = bios_code_map_base + (entry_point & 0xFFFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 		iounmap(base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 		bios_code_map_base = ioremap(entry_point & ~0x3FFF, 0x4000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 		if (bios_code_map_base == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 			printk(KERN_ERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 				"wistron_btns: Can't map BIOS code at %08X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 				entry_point & ~0x3FFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 			goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 		bios_entry_point = bios_code_map_base + (entry_point & 0x3FFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	/* The Windows driver maps 0x10000 bytes, we keep only one page... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 	bios_data_map_base = ioremap(0x400, 0xc00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	if (bios_data_map_base == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 		printk(KERN_ERR "wistron_btns: Can't map BIOS data\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 		goto err_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) err_code:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	iounmap(bios_code_map_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) static inline void unmap_bios(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 	iounmap(bios_code_map_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	iounmap(bios_data_map_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145)  /* BIOS calls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) static u16 bios_pop_queue(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	struct regs regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	memset(&regs, 0, sizeof (regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	regs.eax = 0x9610;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 	regs.ebx = 0x061C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	regs.ecx = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	call_bios(&regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	return regs.eax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) static void bios_attach(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	struct regs regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	memset(&regs, 0, sizeof (regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	regs.eax = 0x9610;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	regs.ebx = 0x012E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	call_bios(&regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) static void bios_detach(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	struct regs regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	memset(&regs, 0, sizeof (regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	regs.eax = 0x9610;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 	regs.ebx = 0x002E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	call_bios(&regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) static u8 bios_get_cmos_address(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	struct regs regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	memset(&regs, 0, sizeof (regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	regs.eax = 0x9610;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	regs.ebx = 0x051C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	call_bios(&regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	return regs.ecx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) static u16 bios_get_default_setting(u8 subsys)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	struct regs regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	memset(&regs, 0, sizeof (regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	regs.eax = 0x9610;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	regs.ebx = 0x0200 | subsys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	call_bios(&regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	return regs.eax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) static void bios_set_state(u8 subsys, int enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	struct regs regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	memset(&regs, 0, sizeof (regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	regs.eax = 0x9610;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 	regs.ebx = (enable ? 0x0100 : 0x0000) | subsys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	call_bios(&regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) /* Hardware database */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) #define KE_WIFI		(KE_LAST + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) #define KE_BLUETOOTH	(KE_LAST + 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) #define FE_MAIL_LED 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) #define FE_WIFI_LED 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) #define FE_UNTESTED 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) static struct key_entry *keymap; /* = NULL; Current key map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) static bool have_wifi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) static bool have_bluetooth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) static int leds_present;	/* bitmask of leds present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) static int __init dmi_matched(const struct dmi_system_id *dmi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	const struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 	keymap = dmi->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	for (key = keymap; key->type != KE_END; key++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 		if (key->type == KE_WIFI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 			have_wifi = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 		else if (key->type == KE_BLUETOOTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 			have_bluetooth = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	leds_present = key->code & (FE_MAIL_LED | FE_WIFI_LED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) static struct key_entry keymap_empty[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 	{ KE_END, 0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) static struct key_entry keymap_fs_amilo_pro_v2000[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	{ KE_KEY,  0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 	{ KE_KEY,  0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	{ KE_KEY,  0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	{ KE_KEY,  0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	{ KE_KEY,  0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	{ KE_END,  0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) static struct key_entry keymap_fs_amilo_pro_v3505[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	{ KE_KEY,       0x01, {KEY_HELP} },          /* Fn+F1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	{ KE_KEY,       0x06, {KEY_DISPLAYTOGGLE} }, /* Fn+F4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	{ KE_BLUETOOTH, 0x30 },                      /* Fn+F10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 	{ KE_KEY,       0x31, {KEY_MAIL} },          /* mail button */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	{ KE_KEY,       0x36, {KEY_WWW} },           /* www button */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	{ KE_WIFI,      0x78 },                      /* satellite dish button */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	{ KE_END,       0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) static struct key_entry keymap_fs_amilo_pro_v8210[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	{ KE_KEY,       0x01, {KEY_HELP} },          /* Fn+F1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 	{ KE_KEY,       0x06, {KEY_DISPLAYTOGGLE} }, /* Fn+F4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	{ KE_BLUETOOTH, 0x30 },                      /* Fn+F10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	{ KE_KEY,       0x31, {KEY_MAIL} },          /* mail button */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	{ KE_KEY,       0x36, {KEY_WWW} },           /* www button */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	{ KE_WIFI,      0x78 },                      /* satelite dish button */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	{ KE_END,       FE_WIFI_LED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) static struct key_entry keymap_fujitsu_n3510[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	{ KE_KEY, 0x71, {KEY_STOPCD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 	{ KE_KEY, 0x72, {KEY_PLAYPAUSE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	{ KE_KEY, 0x74, {KEY_REWIND} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	{ KE_KEY, 0x78, {KEY_FORWARD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	{ KE_END, 0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) static struct key_entry keymap_wistron_ms2111[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	{ KE_KEY,  0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	{ KE_KEY,  0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	{ KE_KEY,  0x13, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	{ KE_KEY,  0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	{ KE_KEY,  0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	{ KE_END, FE_MAIL_LED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) static struct key_entry keymap_wistron_md40100[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	{ KE_KEY, 0x37, {KEY_DISPLAYTOGGLE} }, /* Display on/off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 	{ KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) static struct key_entry keymap_wistron_ms2141[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 	{ KE_KEY,  0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	{ KE_KEY,  0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	{ KE_KEY,  0x22, {KEY_REWIND} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	{ KE_KEY,  0x23, {KEY_FORWARD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	{ KE_KEY,  0x24, {KEY_PLAYPAUSE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	{ KE_KEY,  0x25, {KEY_STOPCD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	{ KE_KEY,  0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	{ KE_KEY,  0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	{ KE_END,  0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) static struct key_entry keymap_acer_aspire_1500[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	{ KE_KEY, 0x49, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	{ KE_END, FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) static struct key_entry keymap_acer_aspire_1600[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	{ KE_KEY, 0x08, {KEY_MUTE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	{ KE_KEY, 0x13, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	{ KE_KEY, 0x49, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) /* 3020 has been tested */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) static struct key_entry keymap_acer_aspire_5020[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	{ KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	{ KE_KEY, 0x6a, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) static struct key_entry keymap_acer_travelmate_2410[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	{ KE_KEY, 0x6d, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 	{ KE_KEY, 0x6a, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) static struct key_entry keymap_acer_travelmate_110[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	{ KE_KEY, 0x08, {KEY_MUTE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	{ KE_KEY, 0x20, {KEY_VOLUMEUP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 	{ KE_KEY, 0x21, {KEY_VOLUMEDOWN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 	{ KE_SW, 0x4a, {.sw = {SW_LID, 1}} }, /* lid close */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	{ KE_SW, 0x4b, {.sw = {SW_LID, 0}} }, /* lid open */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) static struct key_entry keymap_acer_travelmate_300[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	{ KE_KEY, 0x08, {KEY_MUTE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	{ KE_KEY, 0x20, {KEY_VOLUMEUP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	{ KE_KEY, 0x21, {KEY_VOLUMEDOWN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) static struct key_entry keymap_acer_travelmate_380[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	{ KE_KEY, 0x03, {KEY_POWER} }, /* not 370 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	{ KE_KEY, 0x13, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) /* unusual map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) static struct key_entry keymap_acer_travelmate_220[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	{ KE_KEY, 0x11, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	{ KE_KEY, 0x12, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 	{ KE_KEY, 0x13, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	{ KE_KEY, 0x31, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	{ KE_END, FE_WIFI_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) static struct key_entry keymap_acer_travelmate_230[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	{ KE_END, FE_WIFI_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) static struct key_entry keymap_acer_travelmate_240[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	{ KE_KEY, 0x08, {KEY_MUTE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	{ KE_END, FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) static struct key_entry keymap_acer_travelmate_350[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	{ KE_KEY, 0x13, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	{ KE_KEY, 0x14, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	{ KE_KEY, 0x15, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	{ KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) static struct key_entry keymap_acer_travelmate_360[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	{ KE_KEY, 0x13, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	{ KE_KEY, 0x14, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	{ KE_KEY, 0x15, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	{ KE_KEY, 0x40, {KEY_WLAN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	{ KE_END, FE_WIFI_LED | FE_UNTESTED } /* no mail led */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) /* Wifi subsystem only activates the led. Therefore we need to pass
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482)  * wifi event as a normal key, then userspace can really change the wifi state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483)  * TODO we need to export led state to userspace (wifi and mail) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) static struct key_entry keymap_acer_travelmate_610[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	{ KE_KEY, 0x13, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	{ KE_KEY, 0x14, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	{ KE_KEY, 0x15, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	{ KE_KEY, 0x40, {KEY_WLAN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	{ KE_END, FE_MAIL_LED | FE_WIFI_LED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) static struct key_entry keymap_acer_travelmate_630[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	{ KE_KEY, 0x08, {KEY_MUTE} }, /* not 620 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	{ KE_KEY, 0x13, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	{ KE_KEY, 0x20, {KEY_VOLUMEUP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	{ KE_KEY, 0x21, {KEY_VOLUMEDOWN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) static struct key_entry keymap_aopen_1559as[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	{ KE_KEY,  0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	{ KE_KEY,  0x06, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	{ KE_KEY,  0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	{ KE_KEY,  0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	{ KE_KEY,  0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	{ KE_KEY,  0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 	{ KE_END,  0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) static struct key_entry keymap_fs_amilo_d88x0[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	{ KE_KEY, 0x08, {KEY_MUTE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 	{ KE_KEY, 0x13, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	{ KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) static struct key_entry keymap_wistron_md2900[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	{ KE_END, FE_MAIL_LED | FE_UNTESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) static struct key_entry keymap_wistron_md96500[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 	{ KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 	{ KE_KEY, 0x06, {KEY_DISPLAYTOGGLE} }, /* Display on/off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	{ KE_KEY, 0x08, {KEY_MUTE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	{ KE_KEY, 0x20, {KEY_VOLUMEUP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	{ KE_KEY, 0x21, {KEY_VOLUMEDOWN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	{ KE_KEY, 0x22, {KEY_REWIND} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	{ KE_KEY, 0x23, {KEY_FORWARD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	{ KE_KEY, 0x24, {KEY_PLAYPAUSE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	{ KE_KEY, 0x25, {KEY_STOPCD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	{ KE_END, 0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) static struct key_entry keymap_wistron_generic[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	{ KE_KEY, 0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	{ KE_KEY, 0x02, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	{ KE_KEY, 0x03, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	{ KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	{ KE_KEY, 0x06, {KEY_DISPLAYTOGGLE} }, /* Display on/off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	{ KE_KEY, 0x08, {KEY_MUTE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	{ KE_KEY, 0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	{ KE_KEY, 0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	{ KE_KEY, 0x13, {KEY_PROG3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	{ KE_KEY, 0x14, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	{ KE_KEY, 0x15, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	{ KE_KEY, 0x20, {KEY_VOLUMEUP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	{ KE_KEY, 0x21, {KEY_VOLUMEDOWN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	{ KE_KEY, 0x22, {KEY_REWIND} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 	{ KE_KEY, 0x23, {KEY_FORWARD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	{ KE_KEY, 0x24, {KEY_PLAYPAUSE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	{ KE_KEY, 0x25, {KEY_STOPCD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	{ KE_KEY, 0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	{ KE_KEY, 0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	{ KE_KEY, 0x37, {KEY_DISPLAYTOGGLE} }, /* Display on/off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	{ KE_KEY, 0x40, {KEY_WLAN} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 	{ KE_KEY, 0x49, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 	{ KE_SW, 0x4a, {.sw = {SW_LID, 1}} }, /* lid close */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	{ KE_SW, 0x4b, {.sw = {SW_LID, 0}} }, /* lid open */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 	{ KE_KEY, 0x6a, {KEY_CONFIG} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	{ KE_KEY, 0x6d, {KEY_POWER} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	{ KE_KEY, 0x71, {KEY_STOPCD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	{ KE_KEY, 0x72, {KEY_PLAYPAUSE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 	{ KE_KEY, 0x74, {KEY_REWIND} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	{ KE_KEY, 0x78, {KEY_FORWARD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	{ KE_BLUETOOTH, 0x44 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 	{ KE_END, 0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) static struct key_entry keymap_aopen_1557[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	{ KE_KEY,  0x01, {KEY_HELP} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	{ KE_KEY,  0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	{ KE_KEY,  0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	{ KE_KEY,  0x22, {KEY_REWIND} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 	{ KE_KEY,  0x23, {KEY_FORWARD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	{ KE_KEY,  0x24, {KEY_PLAYPAUSE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	{ KE_KEY,  0x25, {KEY_STOPCD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	{ KE_KEY,  0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	{ KE_KEY,  0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	{ KE_END,  0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) static struct key_entry keymap_prestigio[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	{ KE_KEY,  0x11, {KEY_PROG1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 	{ KE_KEY,  0x12, {KEY_PROG2} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	{ KE_WIFI, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	{ KE_KEY,  0x22, {KEY_REWIND} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	{ KE_KEY,  0x23, {KEY_FORWARD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	{ KE_KEY,  0x24, {KEY_PLAYPAUSE} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	{ KE_KEY,  0x25, {KEY_STOPCD} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	{ KE_KEY,  0x31, {KEY_MAIL} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	{ KE_KEY,  0x36, {KEY_WWW} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	{ KE_END,  0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631)  * If your machine is not here (which is currently rather likely), please send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)  * a list of buttons and their key codes (reported when loading this module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)  * with force=1) and the output of dmidecode to $MODULE_AUTHOR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) static const struct dmi_system_id dmi_ids[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 		/* Fujitsu-Siemens Amilo Pro V2000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 		.driver_data = keymap_fs_amilo_pro_v2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 		/* Fujitsu-Siemens Amilo Pro Edition V3505 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro Edition V3505"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 		.driver_data = keymap_fs_amilo_pro_v3505
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 		/* Fujitsu-Siemens Amilo Pro Edition V8210 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro Series V8210"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 		.driver_data = keymap_fs_amilo_pro_v8210
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 		/* Fujitsu-Siemens Amilo M7400 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M        "),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 		.driver_data = keymap_fs_amilo_pro_v2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 		/* Maxdata Pro 7000 DX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 			DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 			DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 		.driver_data = keymap_fs_amilo_pro_v2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 		/* Fujitsu N3510 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 			DMI_MATCH(DMI_PRODUCT_NAME, "N3510"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 		.driver_data = keymap_fujitsu_n3510
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 		/* Acer Aspire 1500 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 		.driver_data = keymap_acer_aspire_1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 		/* Acer Aspire 1600 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1600"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 		.driver_data = keymap_acer_aspire_1600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 		/* Acer Aspire 3020 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3020"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 		.driver_data = keymap_acer_aspire_5020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 		/* Acer Aspire 5020 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5020"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 		.driver_data = keymap_acer_aspire_5020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 		/* Acer TravelMate 2100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2100"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 		.driver_data = keymap_acer_aspire_5020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 		/* Acer TravelMate 2410 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2410"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 		.driver_data = keymap_acer_travelmate_2410
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 		/* Acer TravelMate C300 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C300"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 		.driver_data = keymap_acer_travelmate_300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 		/* Acer TravelMate C100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C100"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 		.driver_data = keymap_acer_travelmate_300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 		/* Acer TravelMate C110 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C110"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 		.driver_data = keymap_acer_travelmate_110
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 		/* Acer TravelMate 380 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 380"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 		.driver_data = keymap_acer_travelmate_380
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 		/* Acer TravelMate 370 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 370"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 		.driver_data = keymap_acer_travelmate_380 /* keyboard minus 1 key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 		/* Acer TravelMate 220 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 220"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 		.driver_data = keymap_acer_travelmate_220
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		/* Acer TravelMate 260 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 260"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 		.driver_data = keymap_acer_travelmate_220
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 		/* Acer TravelMate 230 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 230"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 			/* acerhk looks for "TravelMate F4..." ?! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 		.driver_data = keymap_acer_travelmate_230
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 		/* Acer TravelMate 280 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 280"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 		.driver_data = keymap_acer_travelmate_230
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 		/* Acer TravelMate 240 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 240"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 		.driver_data = keymap_acer_travelmate_240
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 		/* Acer TravelMate 250 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 250"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 		.driver_data = keymap_acer_travelmate_240
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 		/* Acer TravelMate 2424NWXCi */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2420"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 		.driver_data = keymap_acer_travelmate_240
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 		/* Acer TravelMate 350 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 350"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 		.driver_data = keymap_acer_travelmate_350
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 		/* Acer TravelMate 360 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 		.driver_data = keymap_acer_travelmate_360
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 		/* Acer TravelMate 610 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 			DMI_MATCH(DMI_SYS_VENDOR, "ACER"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 610"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 		.driver_data = keymap_acer_travelmate_610
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 		/* Acer TravelMate 620 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 620"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 		.driver_data = keymap_acer_travelmate_630
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 		/* Acer TravelMate 630 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 630"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 		.driver_data = keymap_acer_travelmate_630
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 		/* AOpen 1559AS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 			DMI_MATCH(DMI_PRODUCT_NAME, "E2U"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 			DMI_MATCH(DMI_BOARD_NAME, "E2U"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 		.driver_data = keymap_aopen_1559as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 		/* Medion MD 9783 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 			DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 			DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 		.driver_data = keymap_wistron_ms2111
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 		/* Medion MD 40100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 			DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 			DMI_MATCH(DMI_PRODUCT_NAME, "WID2000"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 		.driver_data = keymap_wistron_md40100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 		/* Medion MD 2900 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 			DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 			DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2000"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 		.driver_data = keymap_wistron_md2900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 		/* Medion MD 42200 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 			DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 			DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2030"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 		.driver_data = keymap_fs_amilo_pro_v2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 		/* Medion MD 96500 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 			DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 			DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2040"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 		.driver_data = keymap_wistron_md96500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 		/* Medion MD 95400 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 			DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 			DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2050"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 		.driver_data = keymap_wistron_md96500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 		/* Fujitsu Siemens Amilo D7820 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), /* not sure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 			DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 		.driver_data = keymap_fs_amilo_d88x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 		/* Fujitsu Siemens Amilo D88x0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 		.callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 		.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO D"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 		.driver_data = keymap_fs_amilo_d88x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	{ NULL, }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) MODULE_DEVICE_TABLE(dmi, dmi_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) /* Copy the good keymap, as the original ones are free'd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) static int __init copy_keymap(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	const struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	struct key_entry *new_keymap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	unsigned int length = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	for (key = keymap; key->type != KE_END; key++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		length++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	new_keymap = kmemdup(keymap, length * sizeof(struct key_entry),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 			     GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	if (!new_keymap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	keymap = new_keymap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) static int __init select_keymap(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	dmi_check_system(dmi_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	if (keymap_name != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 		if (strcmp (keymap_name, "1557/MS2141") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 			keymap = keymap_wistron_ms2141;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 		else if (strcmp (keymap_name, "aopen1557") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 			keymap = keymap_aopen_1557;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 		else if (strcmp (keymap_name, "prestigio") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 			keymap = keymap_prestigio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 		else if (strcmp (keymap_name, "generic") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 			keymap = keymap_wistron_generic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 			printk(KERN_ERR "wistron_btns: Keymap unknown\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 	if (keymap == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 		if (!force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 			printk(KERN_ERR "wistron_btns: System unknown\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 			return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 		keymap = keymap_empty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	return copy_keymap();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031)  /* Input layer interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) static struct input_dev *wistron_idev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) static unsigned long jiffies_last_press;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) static bool wifi_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) static bool bluetooth_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)  /* led management */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) static void wistron_mail_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 				enum led_brightness value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 	bios_set_state(MAIL_LED, (value != LED_OFF) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) /* same as setting up wifi card, but for laptops on which the led is managed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) static void wistron_wifi_led_set(struct led_classdev *led_cdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 				enum led_brightness value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	bios_set_state(WIFI, (value != LED_OFF) ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) static struct led_classdev wistron_mail_led = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	.name			= "wistron:green:mail",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	.brightness_set		= wistron_mail_led_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) static struct led_classdev wistron_wifi_led = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	.name			= "wistron:red:wifi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 	.brightness_set		= wistron_wifi_led_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) static void wistron_led_init(struct device *parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	if (leds_present & FE_WIFI_LED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 		u16 wifi = bios_get_default_setting(WIFI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 		if (wifi & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 			wistron_wifi_led.brightness = (wifi & 2) ? LED_FULL : LED_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 			if (led_classdev_register(parent, &wistron_wifi_led))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 				leds_present &= ~FE_WIFI_LED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 				bios_set_state(WIFI, wistron_wifi_led.brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 			leds_present &= ~FE_WIFI_LED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	if (leds_present & FE_MAIL_LED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 		/* bios_get_default_setting(MAIL) always retuns 0, so just turn the led off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 		wistron_mail_led.brightness = LED_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 		if (led_classdev_register(parent, &wistron_mail_led))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 			leds_present &= ~FE_MAIL_LED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 			bios_set_state(MAIL_LED, wistron_mail_led.brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) static void wistron_led_remove(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	if (leds_present & FE_MAIL_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 		led_classdev_unregister(&wistron_mail_led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	if (leds_present & FE_WIFI_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 		led_classdev_unregister(&wistron_wifi_led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) static inline void wistron_led_suspend(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	if (leds_present & FE_MAIL_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 		led_classdev_suspend(&wistron_mail_led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	if (leds_present & FE_WIFI_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 		led_classdev_suspend(&wistron_wifi_led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) static inline void wistron_led_resume(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	if (leds_present & FE_MAIL_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 		led_classdev_resume(&wistron_mail_led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	if (leds_present & FE_WIFI_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 		led_classdev_resume(&wistron_wifi_led);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) static void handle_key(u8 code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	const struct key_entry *key =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 		sparse_keymap_entry_from_scancode(wistron_idev, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	if (key) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		switch (key->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 		case KE_WIFI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 			if (have_wifi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 				wifi_enabled = !wifi_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 				bios_set_state(WIFI, wifi_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 		case KE_BLUETOOTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 			if (have_bluetooth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 				bluetooth_enabled = !bluetooth_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 				bios_set_state(BLUETOOTH, bluetooth_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 			sparse_keymap_report_entry(wistron_idev, key, 1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 		jiffies_last_press = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 		printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 			"wistron_btns: Unknown key code %02X\n", code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) static void poll_bios(bool discard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 	u8 qlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 	u16 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 		qlen = CMOS_READ(cmos_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 		if (qlen == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 		val = bios_pop_queue();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 		if (val != 0 && !discard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 			handle_key((u8)val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) static int wistron_flush(struct input_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	/* Flush stale event queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 	poll_bios(true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) static void wistron_poll(struct input_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 	poll_bios(false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	/* Increase poll frequency if user is currently pressing keys (< 2s ago) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	if (time_before(jiffies, jiffies_last_press + 2 * HZ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 		input_set_poll_interval(dev, POLL_INTERVAL_BURST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 		input_set_poll_interval(dev, POLL_INTERVAL_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) static int wistron_setup_keymap(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 					  struct key_entry *entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	switch (entry->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	/* if wifi or bluetooth are not available, create normal keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	case KE_WIFI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 		if (!have_wifi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 			entry->type = KE_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 			entry->keycode = KEY_WLAN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 	case KE_BLUETOOTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 		if (!have_bluetooth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 			entry->type = KE_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 			entry->keycode = KEY_BLUETOOTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	case KE_END:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 		if (entry->code & FE_UNTESTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 			printk(KERN_WARNING "Untested laptop multimedia keys, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 				"please report success or failure to "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 				"eric.piel@tremplin-utc.net\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) static int setup_input_dev(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 	wistron_idev = input_allocate_device();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	if (!wistron_idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 	wistron_idev->name = "Wistron laptop buttons";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	wistron_idev->phys = "wistron/input0";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 	wistron_idev->id.bustype = BUS_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	wistron_idev->dev.parent = &wistron_device->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	wistron_idev->open = wistron_flush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	error = sparse_keymap_setup(wistron_idev, keymap, wistron_setup_keymap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 		goto err_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 	error = input_setup_polling(wistron_idev, wistron_poll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 		goto err_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	input_set_poll_interval(wistron_idev, POLL_INTERVAL_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 	error = input_register_device(wistron_idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 	if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 		goto err_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)  err_free_dev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 	input_free_device(wistron_idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) /* Driver core */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) static int wistron_probe(struct platform_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	bios_attach();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	cmos_address = bios_get_cmos_address();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	if (have_wifi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 		u16 wifi = bios_get_default_setting(WIFI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 		if (wifi & 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 			wifi_enabled = wifi & 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 			have_wifi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 		if (have_wifi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 			bios_set_state(WIFI, wifi_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 	if (have_bluetooth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 		u16 bt = bios_get_default_setting(BLUETOOTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 		if (bt & 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 			bluetooth_enabled = bt & 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 			have_bluetooth = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 		if (have_bluetooth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 			bios_set_state(BLUETOOTH, bluetooth_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	wistron_led_init(&dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	err = setup_input_dev();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 		bios_detach();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) static int wistron_remove(struct platform_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	wistron_led_remove();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 	input_unregister_device(wistron_idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	bios_detach();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) static int wistron_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	if (have_wifi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 		bios_set_state(WIFI, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 	if (have_bluetooth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 		bios_set_state(BLUETOOTH, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 	wistron_led_suspend();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) static int wistron_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 	if (have_wifi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 		bios_set_state(WIFI, wifi_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	if (have_bluetooth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 		bios_set_state(BLUETOOTH, bluetooth_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 	wistron_led_resume();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 	poll_bios(true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) static const struct dev_pm_ops wistron_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 	.suspend	= wistron_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 	.resume		= wistron_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 	.poweroff	= wistron_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 	.restore	= wistron_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) static struct platform_driver wistron_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 	.driver		= {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 		.name	= "wistron-bios",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 		.pm	= &wistron_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	.probe		= wistron_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 	.remove		= wistron_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) static int __init wb_module_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 	err = select_keymap();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 	err = map_bios();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 		goto err_free_keymap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	err = platform_driver_register(&wistron_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 		goto err_unmap_bios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 	wistron_device = platform_device_alloc("wistron-bios", -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 	if (!wistron_device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 		goto err_unregister_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 	err = platform_device_add(wistron_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 		goto err_free_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)  err_free_device:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 	platform_device_put(wistron_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)  err_unregister_driver:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 	platform_driver_unregister(&wistron_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)  err_unmap_bios:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 	unmap_bios();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380)  err_free_keymap:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 	kfree(keymap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) static void __exit wb_module_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	platform_device_unregister(wistron_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	platform_driver_unregister(&wistron_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 	unmap_bios();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 	kfree(keymap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) module_init(wb_module_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) module_exit(wb_module_exit);