priv->pt_port = NULL;
 }
 
+static int synaptics_pt_open(struct serio *serio)
+{
+       struct psmouse *parent = psmouse_from_serio(serio->parent);
+       struct synaptics_data *priv = parent->private;
+
+       guard(serio_pause_rx)(parent->ps2dev.serio);
+       priv->pt_port_open = true;
+
+       return 0;
+}
+
+static void synaptics_pt_close(struct serio *serio)
+{
+       struct psmouse *parent = psmouse_from_serio(serio->parent);
+       struct synaptics_data *priv = parent->private;
+
+       guard(serio_pause_rx)(parent->ps2dev.serio);
+       priv->pt_port_open = false;
+}
+
 static int synaptics_is_pt_packet(u8 *buf)
 {
        return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4;
 }
 
-static void synaptics_pass_pt_packet(struct serio *ptport, u8 *packet)
+static void synaptics_pass_pt_packet(struct synaptics_data *priv, u8 *packet)
 {
-       struct psmouse *child = psmouse_from_serio(ptport);
+       struct serio *ptport;
 
-       if (child && child->state == PSMOUSE_ACTIVATED) {
-               serio_interrupt(ptport, packet[1], 0);
-               serio_interrupt(ptport, packet[4], 0);
-               serio_interrupt(ptport, packet[5], 0);
-               if (child->pktsize == 4)
-                       serio_interrupt(ptport, packet[2], 0);
-       } else {
-               serio_interrupt(ptport, packet[1], 0);
+       ptport = priv->pt_port;
+       if (!ptport)
+               return;
+
+       serio_interrupt(ptport, packet[1], 0);
+
+       if (priv->pt_port_open) {
+               struct psmouse *child = psmouse_from_serio(ptport);
+
+               if (child->state == PSMOUSE_ACTIVATED) {
+                       serio_interrupt(ptport, packet[4], 0);
+                       serio_interrupt(ptport, packet[5], 0);
+                       if (child->pktsize == 4)
+                               serio_interrupt(ptport, packet[2], 0);
+               }
        }
 }
 
        serio->write = synaptics_pt_write;
        serio->start = synaptics_pt_start;
        serio->stop = synaptics_pt_stop;
+       serio->open = synaptics_pt_open;
+       serio->close = synaptics_pt_close;
        serio->parent = psmouse->ps2dev.serio;
 
        psmouse->pt_activate = synaptics_pt_activate;
 
                if (SYN_CAP_PASS_THROUGH(priv->info.capabilities) &&
                    synaptics_is_pt_packet(psmouse->packet)) {
-                       if (priv->pt_port)
-                               synaptics_pass_pt_packet(priv->pt_port,
-                                                        psmouse->packet);
-               } else
+                       synaptics_pass_pt_packet(priv, psmouse->packet);
+               } else {
                        synaptics_process_packet(psmouse);
+               }
 
                return PSMOUSE_FULL_PACKET;
        }