Lines Matching refs:psm
64 static void ps2mult_select_port(struct ps2mult *psm, struct ps2mult_port *port) in ps2mult_select_port() argument
66 struct serio *mx_serio = psm->mx_serio; in ps2mult_select_port()
69 psm->out_port = port; in ps2mult_select_port()
76 struct ps2mult *psm = serio_get_drvdata(mx_port); in ps2mult_serio_write() local
81 spin_lock_irqsave(&psm->lock, flags); in ps2mult_serio_write()
83 if (psm->out_port != port) in ps2mult_serio_write()
84 ps2mult_select_port(psm, port); in ps2mult_serio_write()
96 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_serio_write()
103 struct ps2mult *psm = serio_get_drvdata(serio->parent); in ps2mult_serio_start() local
107 spin_lock_irqsave(&psm->lock, flags); in ps2mult_serio_start()
109 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_serio_start()
116 struct ps2mult *psm = serio_get_drvdata(serio->parent); in ps2mult_serio_stop() local
120 spin_lock_irqsave(&psm->lock, flags); in ps2mult_serio_stop()
122 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_serio_stop()
125 static int ps2mult_create_port(struct ps2mult *psm, int i) in ps2mult_create_port() argument
127 struct serio *mx_serio = psm->mx_serio; in ps2mult_create_port()
141 serio->parent = psm->mx_serio; in ps2mult_create_port()
142 serio->port_data = &psm->ports[i]; in ps2mult_create_port()
144 psm->ports[i].serio = serio; in ps2mult_create_port()
149 static void ps2mult_reset(struct ps2mult *psm) in ps2mult_reset() argument
153 spin_lock_irqsave(&psm->lock, flags); in ps2mult_reset()
155 serio_write(psm->mx_serio, PS2MULT_SESSION_END); in ps2mult_reset()
156 serio_write(psm->mx_serio, PS2MULT_SESSION_START); in ps2mult_reset()
158 ps2mult_select_port(psm, &psm->ports[PS2MULT_KBD_PORT]); in ps2mult_reset()
160 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_reset()
165 struct ps2mult *psm; in ps2mult_connect() local
172 psm = kzalloc(sizeof(*psm), GFP_KERNEL); in ps2mult_connect()
173 if (!psm) in ps2mult_connect()
176 spin_lock_init(&psm->lock); in ps2mult_connect()
177 psm->mx_serio = serio; in ps2mult_connect()
180 psm->ports[i].sel = ps2mult_controls[i]; in ps2mult_connect()
181 error = ps2mult_create_port(psm, i); in ps2mult_connect()
186 psm->in_port = psm->out_port = &psm->ports[PS2MULT_KBD_PORT]; in ps2mult_connect()
188 serio_set_drvdata(serio, psm); in ps2mult_connect()
193 ps2mult_reset(psm); in ps2mult_connect()
196 struct serio *s = psm->ports[i].serio; in ps2mult_connect()
206 kfree(psm->ports[i].serio); in ps2mult_connect()
207 kfree(psm); in ps2mult_connect()
213 struct ps2mult *psm = serio_get_drvdata(serio); in ps2mult_disconnect() local
218 kfree(psm); in ps2mult_disconnect()
225 struct ps2mult *psm = serio_get_drvdata(serio); in ps2mult_reconnect() local
227 ps2mult_reset(psm); in ps2mult_reconnect()
235 struct ps2mult *psm = serio_get_drvdata(serio); in ps2mult_interrupt() local
241 spin_lock_irqsave(&psm->lock, flags); in ps2mult_interrupt()
243 if (psm->escape) { in ps2mult_interrupt()
244 psm->escape = false; in ps2mult_interrupt()
245 in_port = psm->in_port; in ps2mult_interrupt()
254 psm->escape = true; in ps2mult_interrupt()
259 psm->in_port = psm->out_port; in ps2mult_interrupt()
272 psm->in_port = &psm->ports[PS2MULT_KBD_PORT]; in ps2mult_interrupt()
277 psm->in_port = &psm->ports[PS2MULT_MOUSE_PORT]; in ps2mult_interrupt()
281 in_port = psm->in_port; in ps2mult_interrupt()
288 spin_unlock_irqrestore(&psm->lock, flags); in ps2mult_interrupt()