Lines Matching refs:psm
67 static void ps2mult_select_port(struct ps2mult *psm, struct ps2mult_port *port) in ps2mult_select_port() argument
69 struct serio *mx_serio = psm->mx_serio; in ps2mult_select_port()
72 psm->out_port = port; in ps2mult_select_port()
79 struct ps2mult *psm = serio_get_drvdata(mx_port); in ps2mult_serio_write() local
84 spin_lock_irqsave(&psm->lock, flags); in ps2mult_serio_write()
86 if (psm->out_port != port) in ps2mult_serio_write()
87 ps2mult_select_port(psm, port); in ps2mult_serio_write()
99 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_serio_write()
106 struct ps2mult *psm = serio_get_drvdata(serio->parent); in ps2mult_serio_start() local
110 spin_lock_irqsave(&psm->lock, flags); in ps2mult_serio_start()
112 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_serio_start()
119 struct ps2mult *psm = serio_get_drvdata(serio->parent); in ps2mult_serio_stop() local
123 spin_lock_irqsave(&psm->lock, flags); in ps2mult_serio_stop()
125 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_serio_stop()
128 static int ps2mult_create_port(struct ps2mult *psm, int i) in ps2mult_create_port() argument
130 struct serio *mx_serio = psm->mx_serio; in ps2mult_create_port()
144 serio->parent = psm->mx_serio; in ps2mult_create_port()
145 serio->port_data = &psm->ports[i]; in ps2mult_create_port()
147 psm->ports[i].serio = serio; in ps2mult_create_port()
152 static void ps2mult_reset(struct ps2mult *psm) in ps2mult_reset() argument
156 spin_lock_irqsave(&psm->lock, flags); in ps2mult_reset()
158 serio_write(psm->mx_serio, PS2MULT_SESSION_END); in ps2mult_reset()
159 serio_write(psm->mx_serio, PS2MULT_SESSION_START); in ps2mult_reset()
161 ps2mult_select_port(psm, &psm->ports[PS2MULT_KBD_PORT]); in ps2mult_reset()
163 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_reset()
168 struct ps2mult *psm; in ps2mult_connect() local
175 psm = kzalloc(sizeof(*psm), GFP_KERNEL); in ps2mult_connect()
176 if (!psm) in ps2mult_connect()
179 spin_lock_init(&psm->lock); in ps2mult_connect()
180 psm->mx_serio = serio; in ps2mult_connect()
183 psm->ports[i].sel = ps2mult_controls[i]; in ps2mult_connect()
184 error = ps2mult_create_port(psm, i); in ps2mult_connect()
189 psm->in_port = psm->out_port = &psm->ports[PS2MULT_KBD_PORT]; in ps2mult_connect()
191 serio_set_drvdata(serio, psm); in ps2mult_connect()
196 ps2mult_reset(psm); in ps2mult_connect()
199 struct serio *s = psm->ports[i].serio; in ps2mult_connect()
209 kfree(psm->ports[i].serio); in ps2mult_connect()
210 kfree(psm); in ps2mult_connect()
216 struct ps2mult *psm = serio_get_drvdata(serio); in ps2mult_disconnect() local
221 kfree(psm); in ps2mult_disconnect()
228 struct ps2mult *psm = serio_get_drvdata(serio); in ps2mult_reconnect() local
230 ps2mult_reset(psm); in ps2mult_reconnect()
238 struct ps2mult *psm = serio_get_drvdata(serio); in ps2mult_interrupt() local
244 spin_lock_irqsave(&psm->lock, flags); in ps2mult_interrupt()
246 if (psm->escape) { in ps2mult_interrupt()
247 psm->escape = false; in ps2mult_interrupt()
248 in_port = psm->in_port; in ps2mult_interrupt()
257 psm->escape = true; in ps2mult_interrupt()
262 psm->in_port = psm->out_port; in ps2mult_interrupt()
275 psm->in_port = &psm->ports[PS2MULT_KBD_PORT]; in ps2mult_interrupt()
280 psm->in_port = &psm->ports[PS2MULT_MOUSE_PORT]; in ps2mult_interrupt()
284 in_port = psm->in_port; in ps2mult_interrupt()
291 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_interrupt()