Lines Matching refs:ps2port

133 static void gscps2_flush(struct gscps2port *ps2port)  in gscps2_flush()  argument
135 while (gscps2_readb_status(ps2port->addr) & GSC_STAT_RBNE) in gscps2_flush()
136 gscps2_readb_input(ps2port->addr); in gscps2_flush()
137 ps2port->act = ps2port->append = 0; in gscps2_flush()
146 static inline int gscps2_writeb_output(struct gscps2port *ps2port, u8 data) in gscps2_writeb_output() argument
149 char __iomem *addr = ps2port->addr; in gscps2_writeb_output()
159 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_writeb_output()
161 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_writeb_output()
178 static void gscps2_enable(struct gscps2port *ps2port, int enable) in gscps2_enable() argument
184 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_enable()
185 gscps2_flush(ps2port); in gscps2_enable()
186 data = gscps2_readb_control(ps2port->addr); in gscps2_enable()
191 gscps2_writeb_control(data, ps2port->addr); in gscps2_enable()
192 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_enable()
193 wait_TBE(ps2port->addr); in gscps2_enable()
194 gscps2_flush(ps2port); in gscps2_enable()
201 static void gscps2_reset(struct gscps2port *ps2port) in gscps2_reset() argument
206 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_reset()
207 gscps2_flush(ps2port); in gscps2_reset()
208 writeb(0xff, ps2port->addr + GSC_RESET); in gscps2_reset()
209 gscps2_flush(ps2port); in gscps2_reset()
210 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_reset()
229 struct gscps2port *ps2port; in gscps2_interrupt() local
231 list_for_each_entry(ps2port, &ps2port_list, node) { in gscps2_interrupt()
234 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_interrupt()
236 while ( (ps2port->buffer[ps2port->append].str = in gscps2_interrupt()
237 gscps2_readb_status(ps2port->addr)) & GSC_STAT_RBNE ) { in gscps2_interrupt()
238 ps2port->buffer[ps2port->append].data = in gscps2_interrupt()
239 gscps2_readb_input(ps2port->addr); in gscps2_interrupt()
240 ps2port->append = ((ps2port->append+1) & BUFFER_SIZE); in gscps2_interrupt()
243 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_interrupt()
249 list_for_each_entry(ps2port, &ps2port_list, node) { in gscps2_interrupt()
251 while (ps2port->act != ps2port->append) { in gscps2_interrupt()
258 if (gscps2_readb_status(ps2port->addr) & GSC_STAT_CMPINTR) in gscps2_interrupt()
261 status = ps2port->buffer[ps2port->act].str; in gscps2_interrupt()
262 data = ps2port->buffer[ps2port->act].data; in gscps2_interrupt()
264 ps2port->act = ((ps2port->act+1) & BUFFER_SIZE); in gscps2_interrupt()
268 serio_interrupt(ps2port->port, data, rxflags); in gscps2_interrupt()
284 struct gscps2port *ps2port = port->port_data; in gscps2_write() local
286 if (!gscps2_writeb_output(ps2port, data)) { in gscps2_write()
300 struct gscps2port *ps2port = port->port_data; in gscps2_open() local
302 gscps2_reset(ps2port); in gscps2_open()
305 gscps2_enable(ps2port, ENABLE); in gscps2_open()
318 struct gscps2port *ps2port = port->port_data; in gscps2_close() local
319 gscps2_enable(ps2port, DISABLE); in gscps2_close()
329 struct gscps2port *ps2port; in gscps2_probe() local
341 ps2port = kzalloc(sizeof(struct gscps2port), GFP_KERNEL); in gscps2_probe()
343 if (!ps2port || !serio) { in gscps2_probe()
348 dev_set_drvdata(&dev->dev, ps2port); in gscps2_probe()
350 ps2port->port = serio; in gscps2_probe()
351 ps2port->padev = dev; in gscps2_probe()
352 ps2port->addr = ioremap(hpa, GSC_STATUS + 4); in gscps2_probe()
353 if (!ps2port->addr) { in gscps2_probe()
357 spin_lock_init(&ps2port->lock); in gscps2_probe()
359 gscps2_reset(ps2port); in gscps2_probe()
360 ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f; in gscps2_probe()
363 (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse"); in gscps2_probe()
369 serio->port_data = ps2port; in gscps2_probe()
373 if (request_irq(dev->irq, gscps2_interrupt, IRQF_SHARED, ps2port->port->name, ps2port)) in gscps2_probe()
376 if (ps2port->id != GSC_ID_KEYBOARD && ps2port->id != GSC_ID_MOUSE) { in gscps2_probe()
378 hpa, ps2port->id); in gscps2_probe()
384 if (!request_mem_region(hpa, GSC_STATUS + 4, ps2port->port.name)) in gscps2_probe()
389 ps2port->port->name, in gscps2_probe()
391 ps2port->padev->irq, in gscps2_probe()
392 ps2port->port->phys); in gscps2_probe()
394 serio_register_port(ps2port->port); in gscps2_probe()
396 list_add_tail(&ps2port->node, &ps2port_list); in gscps2_probe()
401 free_irq(dev->irq, ps2port); in gscps2_probe()
404 iounmap(ps2port->addr); in gscps2_probe()
408 kfree(ps2port); in gscps2_probe()
420 struct gscps2port *ps2port = dev_get_drvdata(&dev->dev); in gscps2_remove() local
422 serio_unregister_port(ps2port->port); in gscps2_remove()
423 free_irq(dev->irq, ps2port); in gscps2_remove()
424 gscps2_flush(ps2port); in gscps2_remove()
425 list_del(&ps2port->node); in gscps2_remove()
426 iounmap(ps2port->addr); in gscps2_remove()
431 kfree(ps2port); in gscps2_remove()