@@ -28,6 +28,7 @@ MODULE_LICENSE("GPL");
struct ps2mult_port {
struct serio *serio;
unsigned char sel;
+ bool registered;
};
#define PS2MULT_NUM_PORTS 2
@@ -107,7 +108,7 @@ static int ps2mult_serio_start(struct serio *serio)
unsigned long flags;
spin_lock_irqsave(&psm->lock, flags);
- port->serio = serio;
+ port->registered = true;
spin_unlock_irqrestore(&psm->lock, flags);
return 0;
@@ -120,7 +121,7 @@ static void ps2mult_serio_stop(struct serio *serio)
unsigned long flags;
spin_lock_irqsave(&psm->lock, flags);
- port->serio = NULL;
+ port->registered = false;
spin_unlock_irqrestore(&psm->lock, flags);
}
@@ -144,8 +145,7 @@ static int ps2mult_create_port(struct ps2mult *psm, int i)
serio->parent = psm->mx_serio;
serio->port_data = &psm->ports[i];
- serio_register_port(serio);
- dev_info(&serio->dev, "%s port at %s\n", serio->name, mx_serio->phys);
+ psm->ports[i].serio = serio;
return 0;
}
@@ -196,8 +196,12 @@ static int ps2mult_connect(struct serio *serio, struct serio_driver *drv)
ps2mult_reset(psm);
- for (i = 0; i < PS2MULT_NUM_PORTS; i++)
- serio_register_port(psm->ports[i].serio);
+ for (i = 0; i < PS2MULT_NUM_PORTS; i++) {
+ struct serio *s = psm->ports[i].serio;
+
+ dev_info(&serio->dev, "%s port at %s\n", s->name, serio->phys);
+ serio_register_port(s);
+ }
return 0;
@@ -243,7 +247,7 @@ static irqreturn_t ps2mult_interrupt(struct serio *serio,
if (psm->escape) {
psm->escape = false;
in_port = psm->in_port;
- if (in_port->serio)
+ if (in_port->registered)
serio_interrupt(in_port->serio, data, dfl);
goto out;
}
@@ -279,8 +283,9 @@ static irqreturn_t ps2mult_interrupt(struct serio *serio,
default:
in_port = psm->in_port;
- if (in_port->serio)
+ if (in_port->registered)
serio_interrupt(in_port->serio, data, dfl);
+ break;
}
out: