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 *addr = ps2port->addr; in gscps2_writeb_output()
156 while (gscps2_readb_status(ps2port->addr) & GSC_STAT_RBNE) 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
203 char *addr = ps2port->addr; in gscps2_reset()
207 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_reset()
208 gscps2_flush(ps2port); in gscps2_reset()
210 gscps2_flush(ps2port); in gscps2_reset()
211 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_reset()
230 struct gscps2port *ps2port; in gscps2_interrupt() local
232 list_for_each_entry(ps2port, &ps2port_list, node) { in gscps2_interrupt()
235 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_interrupt()
237 while ( (ps2port->buffer[ps2port->append].str = in gscps2_interrupt()
238 gscps2_readb_status(ps2port->addr)) & GSC_STAT_RBNE ) { in gscps2_interrupt()
239 ps2port->buffer[ps2port->append].data = in gscps2_interrupt()
240 gscps2_readb_input(ps2port->addr); in gscps2_interrupt()
241 ps2port->append = ((ps2port->append+1) & BUFFER_SIZE); in gscps2_interrupt()
244 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_interrupt()
250 list_for_each_entry(ps2port, &ps2port_list, node) { in gscps2_interrupt()
252 while (ps2port->act != ps2port->append) { in gscps2_interrupt()
259 if (gscps2_readb_status(ps2port->addr) & GSC_STAT_CMPINTR) in gscps2_interrupt()
262 status = ps2port->buffer[ps2port->act].str; in gscps2_interrupt()
263 data = ps2port->buffer[ps2port->act].data; in gscps2_interrupt()
265 ps2port->act = ((ps2port->act+1) & BUFFER_SIZE); in gscps2_interrupt()
269 serio_interrupt(ps2port->port, data, rxflags); in gscps2_interrupt()
285 struct gscps2port *ps2port = port->port_data; in gscps2_write() local
287 if (!gscps2_writeb_output(ps2port, data)) { in gscps2_write()
301 struct gscps2port *ps2port = port->port_data; in gscps2_open() local
303 gscps2_reset(ps2port); in gscps2_open()
306 gscps2_enable(ps2port, ENABLE); in gscps2_open()
319 struct gscps2port *ps2port = port->port_data; in gscps2_close() local
320 gscps2_enable(ps2port, DISABLE); in gscps2_close()
330 struct gscps2port *ps2port; in gscps2_probe() local
342 ps2port = kzalloc(sizeof(struct gscps2port), GFP_KERNEL); in gscps2_probe()
344 if (!ps2port || !serio) { in gscps2_probe()
349 dev_set_drvdata(&dev->dev, ps2port); in gscps2_probe()
351 ps2port->port = serio; in gscps2_probe()
352 ps2port->padev = dev; in gscps2_probe()
353 ps2port->addr = ioremap_nocache(hpa, GSC_STATUS + 4); in gscps2_probe()
354 spin_lock_init(&ps2port->lock); in gscps2_probe()
356 gscps2_reset(ps2port); in gscps2_probe()
357 ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f; in gscps2_probe()
360 (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse"); in gscps2_probe()
366 serio->port_data = ps2port; in gscps2_probe()
370 if (request_irq(dev->irq, gscps2_interrupt, IRQF_SHARED, ps2port->port->name, ps2port)) in gscps2_probe()
373 if (ps2port->id != GSC_ID_KEYBOARD && ps2port->id != GSC_ID_MOUSE) { in gscps2_probe()
375 hpa, ps2port->id); in gscps2_probe()
381 if (!request_mem_region(hpa, GSC_STATUS + 4, ps2port->port.name)) in gscps2_probe()
386 ps2port->port->name, in gscps2_probe()
387 ps2port->addr, in gscps2_probe()
388 ps2port->padev->irq, in gscps2_probe()
389 ps2port->port->phys); in gscps2_probe()
391 serio_register_port(ps2port->port); in gscps2_probe()
393 list_add_tail(&ps2port->node, &ps2port_list); in gscps2_probe()
398 free_irq(dev->irq, ps2port); in gscps2_probe()
401 iounmap(ps2port->addr); in gscps2_probe()
405 kfree(ps2port); in gscps2_probe()
417 struct gscps2port *ps2port = dev_get_drvdata(&dev->dev); in gscps2_remove() local
419 serio_unregister_port(ps2port->port); in gscps2_remove()
420 free_irq(dev->irq, ps2port); in gscps2_remove()
421 gscps2_flush(ps2port); in gscps2_remove()
422 list_del(&ps2port->node); in gscps2_remove()
423 iounmap(ps2port->addr); in gscps2_remove()
428 kfree(ps2port); in gscps2_remove()