keyboard: Use BIOS Keyboard variable to set Numlock
The PC BIOS does provide a NUMLOCK flag containing the desired state of this LED. This patch sets the current state according to the data in the bios. [ hpa: fixed __weak declaration without definition, changed "inline" to "static inline" ] Signed-Off-By: Joshua Cov <joshuacov@googlemail.com> Link: http://lkml.kernel.org/r/CAKL7Q7rvq87TNS1T_Km8fW_5OzS%2BSbYazLXKxW-6ztOxo3zorg@mail.gmail.com Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
c2c21e9bb1
commit
b2d0b7a061
5 changed files with 58 additions and 19 deletions
19
arch/parisc/include/asm/kbdleds.h
Normal file
19
arch/parisc/include/asm/kbdleds.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef _ASM_PARISC_KBDLEDS_H
|
||||
#define _ASM_PARISC_KBDLEDS_H
|
||||
|
||||
/*
|
||||
* On HIL keyboards of PARISC machines there is no NumLock key and
|
||||
* everyone expects the keypad to be used for numbers. That's why
|
||||
* we can safely turn on the NUMLOCK bit.
|
||||
*/
|
||||
|
||||
static inline int kbd_defleds(void)
|
||||
{
|
||||
#if defined(CONFIG_KEYBOARD_HIL) || defined(CONFIG_KEYBOARD_HIL_OLD)
|
||||
return 1 << VC_NUMLOCK;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* _ASM_PARISC_KBDLEDS_H */
|
|
@ -57,14 +57,20 @@ static void copy_boot_params(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* Set the keyboard repeat rate to maximum. Unclear why this
|
||||
* Query the keyboard lock status as given by the BIOS, and
|
||||
* set the keyboard repeat rate to maximum. Unclear why the latter
|
||||
* is done here; this might be possible to kill off as stale code.
|
||||
*/
|
||||
static void keyboard_set_repeat(void)
|
||||
static void keyboard_init(void)
|
||||
{
|
||||
struct biosregs ireg;
|
||||
struct biosregs ireg, oreg;
|
||||
initregs(&ireg);
|
||||
ireg.ax = 0x0305;
|
||||
|
||||
ireg.ah = 0x02; /* Get keyboard status */
|
||||
intcall(0x16, &ireg, &oreg);
|
||||
boot_params.kbd_status = oreg.al;
|
||||
|
||||
ireg.ax = 0x0305; /* Set keyboard repeat rate */
|
||||
intcall(0x16, &ireg, NULL);
|
||||
}
|
||||
|
||||
|
@ -151,8 +157,8 @@ void main(void)
|
|||
/* Detect memory layout */
|
||||
detect_memory();
|
||||
|
||||
/* Set keyboard repeat rate (why?) */
|
||||
keyboard_set_repeat();
|
||||
/* Set keyboard repeat rate (why?) and query the lock flags */
|
||||
keyboard_init();
|
||||
|
||||
/* Query MCA information */
|
||||
query_mca();
|
||||
|
|
|
@ -112,7 +112,8 @@ struct boot_params {
|
|||
__u8 e820_entries; /* 0x1e8 */
|
||||
__u8 eddbuf_entries; /* 0x1e9 */
|
||||
__u8 edd_mbr_sig_buf_entries; /* 0x1ea */
|
||||
__u8 _pad6[6]; /* 0x1eb */
|
||||
__u8 kbd_status; /* 0x1eb */
|
||||
__u8 _pad6[5]; /* 0x1ec */
|
||||
struct setup_header hdr; /* setup header */ /* 0x1f1 */
|
||||
__u8 _pad7[0x290-0x1f1-sizeof(struct setup_header)];
|
||||
__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 0x290 */
|
||||
|
|
17
arch/x86/include/asm/kbdleds.h
Normal file
17
arch/x86/include/asm/kbdleds.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#ifndef _ASM_X86_KBDLEDS_H
|
||||
#define _ASM_X86_KBDLEDS_H
|
||||
|
||||
/*
|
||||
* Some laptops take the 789uiojklm,. keys as number pad when NumLock is on.
|
||||
* This seems a good reason to start with NumLock off. That's why on X86 we
|
||||
* ask the bios for the correct state.
|
||||
*/
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
static inline int kbd_defleds(void)
|
||||
{
|
||||
return boot_params.kbd_status & 0x20 ? (1 << VC_NUMLOCK) : 0;
|
||||
}
|
||||
|
||||
#endif /* _ASM_X86_KBDLEDS_H */
|
|
@ -53,17 +53,13 @@ extern void ctrl_alt_del(void);
|
|||
|
||||
#define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META))
|
||||
|
||||
/*
|
||||
* Some laptops take the 789uiojklm,. keys as number pad when NumLock is on.
|
||||
* This seems a good reason to start with NumLock off. On HIL keyboards
|
||||
* of PARISC machines however there is no NumLock key and everyone expects the
|
||||
* keypad to be used for numbers.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_PARISC) && (defined(CONFIG_KEYBOARD_HIL) || defined(CONFIG_KEYBOARD_HIL_OLD))
|
||||
#define KBD_DEFLEDS (1 << VC_NUMLOCK)
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_PARISC)
|
||||
#include <asm/kbdleds.h>
|
||||
#else
|
||||
#define KBD_DEFLEDS 0
|
||||
static inline int kbd_defleds(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define KBD_DEFLOCK 0
|
||||
|
@ -1512,8 +1508,8 @@ int __init kbd_init(void)
|
|||
int error;
|
||||
|
||||
for (i = 0; i < MAX_NR_CONSOLES; i++) {
|
||||
kbd_table[i].ledflagstate = KBD_DEFLEDS;
|
||||
kbd_table[i].default_ledflagstate = KBD_DEFLEDS;
|
||||
kbd_table[i].ledflagstate = kbd_defleds();
|
||||
kbd_table[i].default_ledflagstate = kbd_defleds();
|
||||
kbd_table[i].ledmode = LED_SHOW_FLAGS;
|
||||
kbd_table[i].lockstate = KBD_DEFLOCK;
|
||||
kbd_table[i].slockstate = 0;
|
||||
|
|
Loading…
Reference in a new issue