18 #include <linux/module.h>
19 #include <linux/serio.h>
21 #include <linux/errno.h>
22 #include <linux/slab.h>
24 #include <linux/list.h>
30 #define DRIVER_NAME "xilinx_ps2"
33 #define XPS2_SRST_OFFSET 0x00000000
34 #define XPS2_STATUS_OFFSET 0x00000004
35 #define XPS2_RX_DATA_OFFSET 0x00000008
36 #define XPS2_TX_DATA_OFFSET 0x0000000C
37 #define XPS2_GIER_OFFSET 0x0000002C
38 #define XPS2_IPISR_OFFSET 0x00000030
39 #define XPS2_IPIER_OFFSET 0x00000038
42 #define XPS2_SRST_RESET 0x0000000A
45 #define XPS2_STATUS_RX_FULL 0x00000001
46 #define XPS2_STATUS_TX_FULL 0x00000002
50 #define XPS2_IPIXR_WDT_TOUT 0x00000001
51 #define XPS2_IPIXR_TX_NOACK 0x00000002
52 #define XPS2_IPIXR_TX_ACK 0x00000004
53 #define XPS2_IPIXR_RX_OVF 0x00000008
54 #define XPS2_IPIXR_RX_ERR 0x00000010
55 #define XPS2_IPIXR_RX_FULL 0x00000020
58 #define XPS2_IPIXR_TX_ALL (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_TX_ACK)
61 #define XPS2_IPIXR_RX_ALL (XPS2_IPIXR_RX_OVF | XPS2_IPIXR_RX_ERR | \
65 #define XPS2_IPIXR_ALL (XPS2_IPIXR_TX_ALL | XPS2_IPIXR_RX_ALL | \
69 #define XPS2_GIER_GIE_MASK 0x80000000
132 status = xps2_recv(drvdata, &c);
137 "wrong rcvd byte count (%d)\n", status);
161 static int sxps2_write(
struct serio *pserio,
unsigned char c)
177 spin_unlock_irqrestore(&drvdata->
lock, flags);
188 static int sxps2_open(
struct serio *pserio)
198 "Couldn't allocate interrupt %d\n", drvdata->
irq);
205 (
void)xps2_recv(drvdata, &c);
216 static void sxps2_close(
struct serio *pserio)
246 dev_info(dev,
"Device Tree Probing \'%s\'\n",
247 ofdev->
dev.of_node->name);
252 dev_err(dev,
"invalid address\n");
258 dev_err(dev,
"no IRQ found\n");
263 serio = kzalloc(
sizeof(
struct serio),
GFP_KERNEL);
264 if (!drvdata || !serio) {
270 drvdata->
irq = r_irq.start;
271 drvdata->
serio = serio;
274 phys_addr = r_mem.start;
275 remap_size = resource_size(&r_mem);
277 dev_err(dev,
"Couldn't lock memory region at 0x%08llX\n",
278 (
unsigned long long)phys_addr);
286 dev_err(dev,
"Couldn't ioremap memory at 0x%08llX\n",
287 (
unsigned long long)phys_addr);
299 dev_info(dev,
"Xilinx PS2 at 0x%08llX mapped to 0x%p, irq=%d\n",
304 serio->
write = sxps2_write;
305 serio->
open = sxps2_open;
306 serio->
close = sxps2_close;
310 "Xilinx XPS PS/2 at %08llX", (
unsigned long long)phys_addr);
312 "xilinxps2/serio at %08llX", (
unsigned long long)phys_addr);
316 platform_set_drvdata(ofdev, drvdata);
338 struct xps2data *drvdata = platform_get_drvdata(of_dev);
352 platform_set_drvdata(of_dev,
NULL);
359 { .compatible =
"xlnx,xps-ps2-1.00.a", },
368 .of_match_table = xps2_of_match,
370 .probe = xps2_of_probe,