From: Dmitry Torokhov <dtor_core@ameritech.net>
To: linux-kernel@vger.kernel.org
Cc: Pavel Machek <pavel@ucw.cz>, Vojtech Pavlik <vojtech@suse.cz>
Subject: [RFC/PATCH 1/3] Input: resume support for i8042 (atkbd & psmouse)
Date: Mon, 1 Dec 2003 02:15:56 -0500 [thread overview]
Message-ID: <200312010215.58533.dtor_core@ameritech.net> (raw)
Hi,
Here is an attempt to implement resume for i8042 using serio_reconnect
facility that can be found in -mm kernels. It also depends on bunch of
other changes in input subsystem all of which can be found here:
http://www.geocities.com/dt_or/input
They should apply cleanly to -test11.
Dmitry
===================================================================
ChangeSet@1.1514, 2003-12-01 01:41:05-05:00, dtor_core@ameritech.net
Input: add i8042 to sysfs, implement resume methods using
serio_reconnect facility
i8042.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 81 insertions(+), 9 deletions(-)
===================================================================
diff -Nru a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
--- a/drivers/input/serio/i8042.c Mon Dec 1 01:45:25 2003
+++ b/drivers/input/serio/i8042.c Mon Dec 1 01:45:25 2003
@@ -17,6 +17,7 @@
#include <linux/config.h>
#include <linux/reboot.h>
#include <linux/init.h>
+#include <linux/sysdev.h>
#include <linux/serio.h>
#include <asm/io.h>
@@ -61,6 +62,8 @@
static unsigned char i8042_mux_open;
struct timer_list i8042_timer;
+static int i8042_sysdev_initialized;
+
/*
* Shared IRQ's require a device pointer, but this driver doesn't support
* multiple devices
@@ -214,16 +217,35 @@
}
/*
- * i8042_open() is called when a port is open by the higher layer.
- * It allocates the interrupt and enables it in the chip.
+ * i8042_activate_port() enables port on a chip.
*/
-static int i8042_open(struct serio *port)
+static int i8042_activate_port(struct serio *port)
{
struct i8042_values *values = port->driver;
i8042_flush();
+ i8042_ctr |= values->irqen;
+
+ if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+ i8042_ctr &= ~values->irqen;
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * i8042_open() is called when a port is open by the higher layer.
+ * It allocates the interrupt and calls i8042_enable_port.
+ */
+
+static int i8042_open(struct serio *port)
+{
+ struct i8042_values *values = port->driver;
+
if (values->mux != -1)
if (i8042_mux_open++)
return 0;
@@ -234,10 +256,8 @@
goto irq_fail;
}
- i8042_ctr |= values->irqen;
-
- if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
- printk(KERN_ERR "i8042.c: Can't write CTR while opening %s, unregistering the port\n", values->name);
+ if (i8042_activate_port(port)) {
+ printk(KERN_ERR "i8042.c: Can't activate %s, unregistering the port\n", values->name);
goto ctr_fail;
}
@@ -246,7 +266,6 @@
return 0;
ctr_fail:
- i8042_ctr &= ~values->irqen;
free_irq(values->irq, i8042_request_irq_cookie);
irq_fail:
@@ -406,7 +425,7 @@
* desired.
*/
-static int __init i8042_controller_init(void)
+static int i8042_controller_init(void)
{
/*
@@ -541,6 +560,37 @@
}
/*
+ * Here we try to reset everything back to a state in which suspended
+ */
+
+static int i8042_controller_resume(struct sys_device *dev)
+{
+ int i;
+
+ if (i8042_controller_init()) {
+ printk(KERN_ERR "i8042: resume failed\n");
+ return -1;
+ }
+
+/*
+ * Reconnect anything that was connected to the ports.
+ */
+
+ if (i8042_kbd_values.exists && i8042_activate_port(&i8042_kbd_port) == 0)
+ serio_reconnect(&i8042_kbd_port);
+
+ if (i8042_aux_values.exists && i8042_activate_port(&i8042_aux_port) == 0)
+ serio_reconnect(&i8042_aux_port);
+
+ for (i = 0; i < 4; i++)
+ if (i8042_mux_values[i].exists && i8042_activate_port(i8042_mux_port + i) == 0)
+ serio_reconnect(i8042_mux_port + i);
+
+ return 0;
+}
+
+
+/*
* i8042_check_mux() checks whether the controller supports the PS/2 Active
* Multiplexing specification by Synaptics, Phoenix, Insyde and
* LCS/Telegraphics.
@@ -791,6 +841,16 @@
values->mux = index;
}
+static struct sysdev_class kbc_sysclass = {
+ set_kset_name("i8042"),
+ .resume = i8042_controller_resume,
+};
+
+static struct sys_device device_i8042 = {
+ .id = 0,
+ .cls = &kbc_sysclass,
+};
+
int __init i8042_init(void)
{
int i;
@@ -825,6 +885,13 @@
i8042_timer.function = i8042_timer_func;
mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
+ if (sysdev_class_register(&kbc_sysclass) == 0) {
+ if (sys_device_register(&device_i8042) == 0)
+ i8042_sysdev_initialized = 1;
+ else
+ sysdev_class_unregister(&kbc_sysclass);
+ }
+
register_reboot_notifier(&i8042_notifier);
return 0;
@@ -835,6 +902,11 @@
int i;
unregister_reboot_notifier(&i8042_notifier);
+
+ if (i8042_sysdev_initialized) {
+ sys_device_unregister(&device_i8042);
+ sysdev_class_unregister(&kbc_sysclass);
+ }
del_timer(&i8042_timer);
next reply other threads:[~2003-12-01 7:18 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-01 7:15 Dmitry Torokhov [this message]
2003-12-01 7:17 ` [RFC/PATCH 2/3] Input: resume support for i8042 (atkbd & psmouse) Dmitry Torokhov
2003-12-01 7:17 ` [RFC/PATCH 3/3] " Dmitry Torokhov
2003-12-03 8:01 ` [RFC/PATCH 4/3] Input: correctly activate i0842 ports on resume Dmitry Torokhov
2003-12-01 17:15 ` [RFC/PATCH 1/3] Input: resume support for i8042 (atkbd & psmouse) Pavel Machek
2003-12-02 10:40 ` Thomas Weidner
[not found] <XQFu.15s.3@gated-at.bofh.it>
2003-12-04 22:46 ` Karol Kozimor
2003-12-05 4:27 ` Dmitry Torokhov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200312010215.58533.dtor_core@ameritech.net \
--to=dtor_core@ameritech.net \
--cc=linux-kernel@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=vojtech@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.