Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 817e6ba3 authored by Dmitry Torokhov's avatar Dmitry Torokhov
Browse files

Input: i8042 - supress ACK/NAKs when blinking during panic



This allows using SysRq and not fill logs with complaints from atkbd.

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 80fc9f53
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -106,6 +106,7 @@ static unsigned char i8042_ctr;
static unsigned char i8042_mux_present;
static unsigned char i8042_mux_present;
static unsigned char i8042_kbd_irq_registered;
static unsigned char i8042_kbd_irq_registered;
static unsigned char i8042_aux_irq_registered;
static unsigned char i8042_aux_irq_registered;
static unsigned char i8042_suppress_kbd_ack;
static struct platform_device *i8042_platform_device;
static struct platform_device *i8042_platform_device;


static irqreturn_t i8042_interrupt(int irq, void *dev_id);
static irqreturn_t i8042_interrupt(int irq, void *dev_id);
@@ -316,7 +317,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
	unsigned char str, data;
	unsigned char str, data;
	unsigned int dfl;
	unsigned int dfl;
	unsigned int port_no;
	unsigned int port_no;
	int ret;
	int ret = 1;


	spin_lock_irqsave(&i8042_lock, flags);
	spin_lock_irqsave(&i8042_lock, flags);
	str = i8042_read_status();
	str = i8042_read_status();
@@ -378,10 +379,16 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
	    dfl & SERIO_PARITY ? ", bad parity" : "",
	    dfl & SERIO_PARITY ? ", bad parity" : "",
	    dfl & SERIO_TIMEOUT ? ", timeout" : "");
	    dfl & SERIO_TIMEOUT ? ", timeout" : "");


	if (unlikely(i8042_suppress_kbd_ack))
		if (port_no == I8042_KBD_PORT_NO &&
		    (data == 0xfa || data == 0xfe)) {
			i8042_suppress_kbd_ack = 0;
			goto out;
		}

	if (likely(port->exists))
	if (likely(port->exists))
		serio_interrupt(port->serio, data, dfl);
		serio_interrupt(port->serio, data, dfl);


	ret = 1;
 out:
 out:
	return IRQ_RETVAL(ret);
	return IRQ_RETVAL(ret);
}
}
@@ -842,11 +849,13 @@ static long i8042_panic_blink(long count)
	led ^= 0x01 | 0x04;
	led ^= 0x01 | 0x04;
	while (i8042_read_status() & I8042_STR_IBF)
	while (i8042_read_status() & I8042_STR_IBF)
		DELAY;
		DELAY;
	i8042_suppress_kbd_ack = 1;
	i8042_write_data(0xed); /* set leds */
	i8042_write_data(0xed); /* set leds */
	DELAY;
	DELAY;
	while (i8042_read_status() & I8042_STR_IBF)
	while (i8042_read_status() & I8042_STR_IBF)
		DELAY;
		DELAY;
	DELAY;
	DELAY;
	i8042_suppress_kbd_ack = 1;
	i8042_write_data(led);
	i8042_write_data(led);
	DELAY;
	DELAY;
	last_blink = count;
	last_blink = count;