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)
}
/*
* i8042_enable_mux_mode checks whether the controller has an active
* multiplexor and puts the chip into Multiplexed (as opposed to
* Legacy) mode.
* i8042_set_mux_mode checks whether the controller has an active
* multiplexor and puts the chip into Multiplexed (1) or Legacy (0) 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;
......@@ -482,11 +481,11 @@ static int i8042_enable_mux_mode(struct i8042_values *values, unsigned char *mux
param = 0xf0;
if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x0f)
return -1;
param = 0x56;
param = mode ? 0x56 : 0xf6;
if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0xa9)
return -1;
param = 0xa4;
if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == 0x5b)
param = mode ? 0xa4 : 0xa5;
if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == (mode ? 0x5b : 0x5a))
return -1;
if (mux_version)
......@@ -540,11 +539,11 @@ static int __init i8042_check_mux(struct i8042_values *values)
{
unsigned char mux_version;
if (i8042_enable_mux_mode(values, &mux_version))
if (i8042_set_mux_mode(1, &mux_version))
return -1;
/* Workaround for broken chips which seem to support MUX, but in reality don't. */
/* They all report version 10.12 */
/* Workaround for interference with USB Legacy emulation */
/* that causes a v10.12 MUX to be found. */
if (mux_version == 0xAC)
return -1;
......@@ -774,12 +773,21 @@ static int i8042_controller_init(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))
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.
......@@ -888,7 +896,7 @@ static int i8042_resume(struct device *dev, u32 level)
}
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)) {
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