Touchpad state control psmouse driver patch by rkraevskiy@gmail.com
to check touchpad state:
cat /sys/bus/serio/drivers/psmouse/serio1/enabled
1 -> touchpad is enabled
0 -> touchpad is disabled
to disable touchpad:
echo 0 >/sys/bus/serio/drivers/psmouse/serio1/enabled
to enable touchpad:
echo 1 >/sys/bus/serio/drivers/psmouse/serio1/enabled
In /etc/acpi/handler.sh
button/lid)
STATE=`cat /proc/acpi/button/lid/LID/state | cut -c13-`
case "$STATE" in
closed)
echo 0 >/sys/bus/serio/drivers/psmouse/serio1/enabled
;;
open)
echo 1 >/sys/bus/serio/drivers/psmouse/serio1/enabled
;;
esac
;;
diff -ur a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c 2012-12-11 05:30:57.000000000 +0200
+++ b/drivers/input/mouse/psmouse-base.c 2012-12-21 23:57:06.000000000 +0200
@@ -87,6 +87,9 @@
PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO,
(void *) offsetof(struct psmouse, resync_time),
psmouse_show_int_attr, psmouse_set_int_attr);
+PSMOUSE_DEFINE_ATTR(enabled, S_IWUSR | S_IRUGO,
+ NULL,
+ psmouse_attr_show_enabled, psmouse_attr_set_enabled);
static struct attribute *psmouse_attributes[] = {
&psmouse_attr_protocol.dattr.attr,
@@ -94,6 +97,7 @@
&psmouse_attr_resolution.dattr.attr,
&psmouse_attr_resetafter.dattr.attr,
&psmouse_attr_resync_time.dattr.attr,
+ &psmouse_attr_enabled.dattr.attr,
NULL
};
@@ -1419,7 +1423,7 @@
psmouse->resetafter = psmouse_resetafter;
psmouse->resync_time = parent ? 0 : psmouse_resync_time;
psmouse->smartscroll = psmouse_smartscroll;
-
+ psmouse->enabled = true;
psmouse_switch_protocol(psmouse, NULL);
psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
@@ -1602,7 +1606,7 @@
retval = attr->set(psmouse, attr->data, buf, count);
if (attr->protect) {
- if (retval != -ENODEV)
+ if (retval != -ENODEV && psmouse->enabled)
psmouse_activate(psmouse);
if (parent)
@@ -1637,6 +1641,26 @@
return count;
}
+
+static ssize_t psmouse_attr_show_enabled(struct psmouse *psmouse, void *data, char *buf)
+{
+ return sprintf(buf, "%d\n", psmouse->enabled);
+}
+
+static ssize_t psmouse_attr_set_enabled(struct psmouse *psmouse, void *data, const char *buf, size_t count)
+{
+ unsigned int value;
+ int err;
+
+ err = kstrtouint(buf, 10, &value);
+ if (err){
+ return err;
+ }
+
+ psmouse->enabled = (value!=0);
+ return count;
+}
+
static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf)
{
return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name);
diff -ur a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
--- a/drivers/input/mouse/psmouse.h 2012-12-11 05:30:57.000000000 +0200
+++ b/drivers/input/mouse/psmouse.h 2012-12-21 23:53:54.000000000 +0200
@@ -62,6 +62,7 @@
unsigned int resolution;
unsigned int resetafter;
unsigned int resync_time;
+ bool enabled;
bool smartscroll; /* Logitech only */
psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse);