^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(®s, 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(®s);
^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(®s, 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(®s);
^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(®s, 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(®s);
^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(®s, 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(®s);
^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(®s, 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(®s);
^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(®s, 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(®s);
^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);