Lines Matching +full:layer +full:- +full:buffer +full:- +full:offset

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
37 #include <asm/parisc-device.h>
39 MODULE_AUTHOR("Laurent Canet <canetl@esiee.fr>, Thibaut Varene <varenet@parisc-linux.org>, Helge De…
53 #define GSC_DINO_OFFSET 0x0800 /* offset for DINO controller versus LASI one */
56 #define GSC_ID 0x00 /* device ID offset (see: GSC_ID_XXX) */
57 #define GSC_RESET 0x00 /* reset port offset */
58 #define GSC_RCVDATA 0x04 /* receive port offset */
59 #define GSC_XMTDATA 0x04 /* transmit port offset */
71 #define GSC_STAT_RBNE 0x01 /* Receive Buffer Not Empty */
72 #define GSC_STAT_TBNE 0x02 /* Transmit Buffer Not Empty */
95 u8 act, append; /* position in buffer[] */
99 } buffer[BUFFER_SIZE+1]; member
114 * wait_TBE() - wait for Transmit Buffer Empty
121 if (!--timeout) in wait_TBE()
130 * gscps2_flush() - flush the receive buffer
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()
141 * gscps2_writeb_output() - write a byte to the port
149 char __iomem *addr = ps2port->addr; in gscps2_writeb_output()
152 printk(KERN_DEBUG PFX "timeout - could not write byte %#x\n", data); 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()
175 * gscps2_enable() - enables or disables the port
184 spin_lock_irqsave(&ps2port->lock, flags); 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()
198 * gscps2_reset() - resets the PS/2 port
206 spin_lock_irqsave(&ps2port->lock, flags); in gscps2_reset()
208 writeb(0xff, ps2port->addr + GSC_RESET); in gscps2_reset()
210 spin_unlock_irqrestore(&ps2port->lock, flags); in gscps2_reset()
216 * gscps2_interrupt() - Interruption service routine
223 * the data as fast as possible and handle the reporting to the upper layer
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()
247 /* all data was read from the ports - now report the data to upper layer */ 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()
279 * gscps2_write() - send a byte out through the aux interface.
284 struct gscps2port *ps2port = port->port_data; in gscps2_write()
288 return -1; in gscps2_write()
294 * gscps2_open() is called when a port is opened by the higher layer.
300 struct gscps2port *ps2port = port->port_data; in gscps2_open()
318 struct gscps2port *ps2port = port->port_data; in gscps2_close()
323 * gscps2_probe() - Probes PS2 devices
331 unsigned long hpa = dev->hpa.start; in gscps2_probe()
334 if (!dev->irq) in gscps2_probe()
335 return -ENODEV; in gscps2_probe()
337 /* Offset for DINO PS/2. Works with LASI even */ in gscps2_probe()
338 if (dev->id.sversion == 0x96) in gscps2_probe()
344 ret = -ENOMEM; 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()
354 ret = -ENOMEM; in gscps2_probe()
357 spin_lock_init(&ps2port->lock); in gscps2_probe()
360 ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f; in gscps2_probe()
362 snprintf(serio->name, sizeof(serio->name), "gsc-ps2-%s", in gscps2_probe()
363 (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse"); in gscps2_probe()
364 strscpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys)); in gscps2_probe()
365 serio->id.type = SERIO_8042; in gscps2_probe()
366 serio->write = gscps2_write; in gscps2_probe()
367 serio->open = gscps2_open; in gscps2_probe()
368 serio->close = gscps2_close; in gscps2_probe()
369 serio->port_data = ps2port; in gscps2_probe()
370 serio->dev.parent = &dev->dev; in gscps2_probe()
372 ret = -EBUSY; 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()
379 ret = -ENODEV; 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()
405 release_mem_region(dev->hpa.start, GSC_STATUS + 4); in gscps2_probe()
414 * gscps2_remove() - Removes PS2 devices
420 struct gscps2port *ps2port = dev_get_drvdata(&dev->dev); in gscps2_remove()
422 serio_unregister_port(ps2port->port); in gscps2_remove()
423 free_irq(dev->irq, ps2port); in gscps2_remove()
425 list_del(&ps2port->node); in gscps2_remove()
426 iounmap(ps2port->addr); in gscps2_remove()
428 release_mem_region(dev->hpa, GSC_STATUS + 4); in gscps2_remove()
430 dev_set_drvdata(&dev->dev, NULL); in gscps2_remove()