Lines Matching +full:fail +full:- +full:fast

4  * Copyright (c) 2004-2006 Helge Deller <deller@gmx.de>
6 * Copyright (c) 2002 Thibaut Varene <varenet@parisc-linux.org>
8 * Pieces of code based on linux-2.4's hp_mouse.c & hp_keyb.c
10 * Copyright (c) 1999-2000 Philipp Rumpf <prumpf@tux.org>
12 * Copyright (c) 2000-2001 Thomas Marteau <marteaut@esiee.fr>
21 * - Dino testing (did HP ever shipped a machine on which this port
38 #include <asm/parisc-device.h>
40 MODULE_AUTHOR("Laurent Canet <canetl@esiee.fr>, Thibaut Varene <varenet@parisc-linux.org>, Helge De…
116 * wait_TBE() - wait for Transmit Buffer Empty
123 if (!--timeout) in wait_TBE()
132 * gscps2_flush() - flush the receive buffer
137 while (gscps2_readb_status(ps2port->addr) & GSC_STAT_RBNE) in gscps2_flush()
138 gscps2_readb_input(ps2port->addr); in gscps2_flush()
139 ps2port->act = ps2port->append = 0; in gscps2_flush()
143 * gscps2_writeb_output() - write a byte to the port
151 char *addr = ps2port->addr; in gscps2_writeb_output()
154 printk(KERN_DEBUG PFX "timeout - could not write byte %#x\n", data); in gscps2_writeb_output()
158 while (gscps2_readb_status(ps2port->addr) & GSC_STAT_RBNE) in gscps2_writeb_output()
161 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_writeb_output()
163 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_writeb_output()
168 /* make sure any received data is returned as fast as possible */ in gscps2_writeb_output()
177 * gscps2_enable() - enables or disables the port
186 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_enable()
188 data = gscps2_readb_control(ps2port->addr); in gscps2_enable()
193 gscps2_writeb_control(data, ps2port->addr); in gscps2_enable()
194 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_enable()
195 wait_TBE(ps2port->addr); in gscps2_enable()
200 * gscps2_reset() - resets the PS/2 port
205 char *addr = ps2port->addr; in gscps2_reset()
209 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_reset()
213 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_reset()
219 * gscps2_interrupt() - Interruption service routine
226 * the data as fast as possible and handle the reporting to the upper layer
237 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_interrupt()
239 while ( (ps2port->buffer[ps2port->append].str = in gscps2_interrupt()
240 gscps2_readb_status(ps2port->addr)) & GSC_STAT_RBNE ) { in gscps2_interrupt()
241 ps2port->buffer[ps2port->append].data = in gscps2_interrupt()
242 gscps2_readb_input(ps2port->addr); in gscps2_interrupt()
243 ps2port->append = ((ps2port->append+1) & BUFFER_SIZE); in gscps2_interrupt()
246 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_interrupt()
250 /* all data was read from the ports - now report the data to upper layer */ in gscps2_interrupt()
254 while (ps2port->act != ps2port->append) { in gscps2_interrupt()
261 if (gscps2_readb_status(ps2port->addr) & GSC_STAT_CMPINTR) in gscps2_interrupt()
264 status = ps2port->buffer[ps2port->act].str; in gscps2_interrupt()
265 data = ps2port->buffer[ps2port->act].data; in gscps2_interrupt()
267 ps2port->act = ((ps2port->act+1) & BUFFER_SIZE); in gscps2_interrupt()
271 serio_interrupt(ps2port->port, data, rxflags); in gscps2_interrupt()
282 * gscps2_write() - send a byte out through the aux interface.
287 struct gscps2port *ps2port = port->port_data; in gscps2_write()
291 return -1; in gscps2_write()
303 struct gscps2port *ps2port = port->port_data; in gscps2_open()
321 struct gscps2port *ps2port = port->port_data; in gscps2_close()
326 * gscps2_probe() - Probes PS2 devices
334 unsigned long hpa = dev->hpa.start; in gscps2_probe()
337 if (!dev->irq) in gscps2_probe()
338 return -ENODEV; in gscps2_probe()
341 if (dev->id.sversion == 0x96) in gscps2_probe()
347 ret = -ENOMEM; in gscps2_probe()
351 dev_set_drvdata(&dev->dev, ps2port); in gscps2_probe()
353 ps2port->port = serio; in gscps2_probe()
354 ps2port->padev = dev; in gscps2_probe()
355 ps2port->addr = ioremap_nocache(hpa, GSC_STATUS + 4); in gscps2_probe()
356 spin_lock_init(&ps2port->lock); in gscps2_probe()
359 ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f; in gscps2_probe()
361 snprintf(serio->name, sizeof(serio->name), "gsc-ps2-%s", in gscps2_probe()
362 (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse"); in gscps2_probe()
363 strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys)); in gscps2_probe()
364 serio->id.type = SERIO_8042; in gscps2_probe()
365 serio->write = gscps2_write; in gscps2_probe()
366 serio->open = gscps2_open; in gscps2_probe()
367 serio->close = gscps2_close; in gscps2_probe()
368 serio->port_data = ps2port; in gscps2_probe()
369 serio->dev.parent = &dev->dev; in gscps2_probe()
371 ret = -EBUSY; in gscps2_probe()
372 if (request_irq(dev->irq, gscps2_interrupt, IRQF_SHARED, ps2port->port->name, ps2port)) in gscps2_probe()
375 if (ps2port->id != GSC_ID_KEYBOARD && ps2port->id != GSC_ID_MOUSE) { in gscps2_probe()
377 hpa, ps2port->id); in gscps2_probe()
378 ret = -ENODEV; in gscps2_probe()
379 goto fail; in gscps2_probe()
383 if (!request_mem_region(hpa, GSC_STATUS + 4, ps2port->port.name)) in gscps2_probe()
384 goto fail; in gscps2_probe()
388 ps2port->port->name, in gscps2_probe()
389 ps2port->addr, in gscps2_probe()
390 ps2port->padev->irq, in gscps2_probe()
391 ps2port->port->phys); in gscps2_probe()
393 serio_register_port(ps2port->port); in gscps2_probe()
395 list_add_tail(&ps2port->node, &ps2port_list); in gscps2_probe()
399 fail: in gscps2_probe()
400 free_irq(dev->irq, ps2port); in gscps2_probe()
403 iounmap(ps2port->addr); in gscps2_probe()
404 release_mem_region(dev->hpa.start, GSC_STATUS + 4); in gscps2_probe()
413 * gscps2_remove() - Removes PS2 devices
419 struct gscps2port *ps2port = dev_get_drvdata(&dev->dev); in gscps2_remove()
421 serio_unregister_port(ps2port->port); in gscps2_remove()
422 free_irq(dev->irq, ps2port); in gscps2_remove()
424 list_del(&ps2port->node); in gscps2_remove()
425 iounmap(ps2port->addr); in gscps2_remove()
427 release_mem_region(dev->hpa, GSC_STATUS + 4); in gscps2_remove()
429 dev_set_drvdata(&dev->dev, NULL); in gscps2_remove()