vserver 1.9.3
[linux-2.6.git] / drivers / input / mouse / synaptics.c
index 2bd152f..101b809 100644 (file)
@@ -212,9 +212,9 @@ static int synaptics_set_mode(struct psmouse *psmouse, int mode)
 /*****************************************************************************
  *     Synaptics pass-through PS/2 port support
  ****************************************************************************/
-static int synaptics_pt_write(struct serio *port, unsigned char c)
+static int synaptics_pt_write(struct serio *serio, unsigned char c)
 {
-       struct psmouse *parent = port->driver;
+       struct psmouse *parent = serio->parent->private;
        char rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */
 
        if (psmouse_sliced_command(parent, c))
@@ -233,22 +233,19 @@ static void synaptics_pass_pt_packet(struct serio *ptport, unsigned char *packet
 {
        struct psmouse *child = ptport->private;
 
-       if (child) {
-               if (child->state == PSMOUSE_ACTIVATED) {
-                       serio_interrupt(ptport, packet[1], 0, NULL);
-                       serio_interrupt(ptport, packet[4], 0, NULL);
-                       serio_interrupt(ptport, packet[5], 0, NULL);
-                       if (child->type >= PSMOUSE_GENPS)
-                               serio_interrupt(ptport, packet[2], 0, NULL);
-               } else if (child->state != PSMOUSE_IGNORE) {
-                       serio_interrupt(ptport, packet[1], 0, NULL);
-               }
-       }
+       if (child && child->state == PSMOUSE_ACTIVATED) {
+               serio_interrupt(ptport, packet[1], 0, NULL);
+               serio_interrupt(ptport, packet[4], 0, NULL);
+               serio_interrupt(ptport, packet[5], 0, NULL);
+               if (child->type >= PSMOUSE_GENPS)
+                       serio_interrupt(ptport, packet[2], 0, NULL);
+       } else
+               serio_interrupt(ptport, packet[1], 0, NULL);
 }
 
 static void synaptics_pt_activate(struct psmouse *psmouse)
 {
-       struct psmouse *child = psmouse->ptport->serio.private;
+       struct psmouse *child = psmouse->serio->child->private;
 
        /* adjust the touchpad to child's choice of protocol */
        if (child && child->type >= PSMOUSE_GENPS) {
@@ -259,23 +256,25 @@ static void synaptics_pt_activate(struct psmouse *psmouse)
 
 static void synaptics_pt_create(struct psmouse *psmouse)
 {
-       struct psmouse_ptport *port;
+       struct serio *serio;
 
-       psmouse->ptport = port = kmalloc(sizeof(struct psmouse_ptport), GFP_KERNEL);
-       if (!port) {
+       serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
+       if (!serio) {
                printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n");
                return;
        }
 
-       memset(port, 0, sizeof(struct psmouse_ptport));
+       memset(serio, 0, sizeof(struct serio));
+
+       serio->type = SERIO_PS_PSTHRU;
+       strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name));
+       strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->name));
+       serio->write = synaptics_pt_write;
+       serio->parent = psmouse->serio;
 
-       port->serio.type = SERIO_PS_PSTHRU;
-       port->serio.name = "Synaptics pass-through";
-       port->serio.phys = "synaptics-pt/serio0";
-       port->serio.write = synaptics_pt_write;
-       port->serio.driver = psmouse;
+       psmouse->pt_activate = synaptics_pt_activate;
 
-       port->activate = synaptics_pt_activate;
+       psmouse->serio->child = serio;
 }
 
 /*****************************************************************************
@@ -470,9 +469,10 @@ static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse, struct pt_r
                if (unlikely(priv->pkt_type == SYN_NEWABS))
                        priv->pkt_type = synaptics_detect_pkt_type(psmouse);
 
-               if (psmouse->ptport && psmouse->ptport->serio.dev && synaptics_is_pt_packet(psmouse->packet))
-                       synaptics_pass_pt_packet(&psmouse->ptport->serio, psmouse->packet);
-               else
+               if (SYN_CAP_PASS_THROUGH(priv->capabilities) && synaptics_is_pt_packet(psmouse->packet)) {
+                       if (psmouse->serio->child)
+                               synaptics_pass_pt_packet(psmouse->serio->child, psmouse->packet);
+               } else
                        synaptics_process_packet(psmouse);
 
                return PSMOUSE_FULL_PACKET;