Commit 85b99875 authored by Vojtech Pavlik's avatar Vojtech Pavlik

input: Always bring the i8042 multiplexer out of multiplexing mode before

       rebooting.
Signed-off-by: default avatarVojtech Pavlik <vojtech@suse.cz>
parent 4941e7d4
...@@ -458,12 +458,11 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -458,12 +458,11 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs)
} }
/* /*
* i8042_enable_mux_mode checks whether the controller has an active * i8042_set_mux_mode checks whether the controller has an active
* multiplexor and puts the chip into Multiplexed (as opposed to * multiplexor and puts the chip into Multiplexed (1) or Legacy (0) mode.
* Legacy) mode.
*/ */
static int i8042_enable_mux_mode(struct i8042_values *values, unsigned char *mux_version) static int i8042_set_mux_mode(unsigned int mode, unsigned char *mux_version)
{ {
unsigned char param; unsigned char param;
...@@ -482,11 +481,11 @@ static int i8042_enable_mux_mode(struct i8042_values *values, unsigned char *mux ...@@ -482,11 +481,11 @@ static int i8042_enable_mux_mode(struct i8042_values *values, unsigned char *mux
param = 0xf0; param = 0xf0;
if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x0f) if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x0f)
return -1; return -1;
param = 0x56; param = mode ? 0x56 : 0xf6;
if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0xa9) if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0xa9)
return -1; return -1;
param = 0xa4; param = mode ? 0xa4 : 0xa5;
if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == 0x5b) if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == (mode ? 0x5b : 0x5a))
return -1; return -1;
if (mux_version) if (mux_version)
...@@ -540,11 +539,11 @@ static int __init i8042_check_mux(struct i8042_values *values) ...@@ -540,11 +539,11 @@ static int __init i8042_check_mux(struct i8042_values *values)
{ {
unsigned char mux_version; unsigned char mux_version;
if (i8042_enable_mux_mode(values, &mux_version)) if (i8042_set_mux_mode(1, &mux_version))
return -1; return -1;
/* Workaround for broken chips which seem to support MUX, but in reality don't. */ /* Workaround for interference with USB Legacy emulation */
/* They all report version 10.12 */ /* that causes a v10.12 MUX to be found. */
if (mux_version == 0xAC) if (mux_version == 0xAC)
return -1; return -1;
...@@ -774,12 +773,21 @@ static int i8042_controller_init(void) ...@@ -774,12 +773,21 @@ static int i8042_controller_init(void)
*/ */
void i8042_controller_reset(void) void i8042_controller_reset(void)
{ {
if (i8042_reset) { unsigned char param;
unsigned char param;
/*
* Reset the controller if requested.
*/
if (i8042_reset)
if (i8042_command(&param, I8042_CMD_CTL_TEST)) if (i8042_command(&param, I8042_CMD_CTL_TEST))
printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n"); printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
}
/*
* Disable MUX mode if present.
*/
i8042_set_mux_mode(0, NULL);
/* /*
* Restore the original control register setting. * Restore the original control register setting.
...@@ -888,7 +896,7 @@ static int i8042_resume(struct device *dev, u32 level) ...@@ -888,7 +896,7 @@ static int i8042_resume(struct device *dev, u32 level)
} }
if (i8042_mux_present) if (i8042_mux_present)
if (i8042_enable_mux_mode(&i8042_aux_values, NULL) || if (i8042_set_mux_mode(1, NULL) ||
i8042_enable_mux_ports(&i8042_aux_values)) { i8042_enable_mux_ports(&i8042_aux_values)) {
printk(KERN_WARNING "i8042: failed to resume active multiplexor, mouse won't work.\n"); printk(KERN_WARNING "i8042: failed to resume active multiplexor, mouse won't work.\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment