xref: /linux/drivers/input/serio/sa1111ps2.c (revision 3e51108c72e8adbcf3180ed40527a2a9d2d0123b)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  linux/drivers/input/serio/sa1111ps2.c
4  *
5  *  Copyright (C) 2002 Russell King
6  */
7 #include <linux/module.h>
8 #include <linux/init.h>
9 #include <linux/input.h>
10 #include <linux/serio.h>
11 #include <linux/errno.h>
12 #include <linux/interrupt.h>
13 #include <linux/ioport.h>
14 #include <linux/delay.h>
15 #include <linux/device.h>
16 #include <linux/slab.h>
17 #include <linux/spinlock.h>
18 
19 #include <asm/io.h>
20 
21 #include <asm/hardware/sa1111.h>
22 
23 #define PS2CR		0x0000
24 #define PS2STAT		0x0004
25 #define PS2DATA		0x0008
26 #define PS2CLKDIV	0x000c
27 #define PS2PRECNT	0x0010
28 
29 #define PS2CR_ENA	0x08
30 #define PS2CR_FKD	0x02
31 #define PS2CR_FKC	0x01
32 
33 #define PS2STAT_STP	0x0100
34 #define PS2STAT_TXE	0x0080
35 #define PS2STAT_TXB	0x0040
36 #define PS2STAT_RXF	0x0020
37 #define PS2STAT_RXB	0x0010
38 #define PS2STAT_ENA	0x0008
39 #define PS2STAT_RXP	0x0004
40 #define PS2STAT_KBD	0x0002
41 #define PS2STAT_KBC	0x0001
42 
43 struct ps2if {
44 	struct serio		*io;
45 	struct sa1111_dev	*dev;
46 	void __iomem		*base;
47 	int			rx_irq;
48 	int			tx_irq;
49 	unsigned int		open;
50 	spinlock_t		lock;
51 	unsigned int		head;
52 	unsigned int		tail;
53 	unsigned char		buf[4];
54 };
55 
56 /*
57  * Read all bytes waiting in the PS2 port.  There should be
58  * at the most one, but we loop for safety.  If there was a
59  * framing error, we have to manually clear the status.
60  */
ps2_rxint(int irq,void * dev_id)61 static irqreturn_t ps2_rxint(int irq, void *dev_id)
62 {
63 	struct ps2if *ps2if = dev_id;
64 	unsigned int scancode, flag, status;
65 
66 	status = readl_relaxed(ps2if->base + PS2STAT);
67 	while (status & PS2STAT_RXF) {
68 		if (status & PS2STAT_STP)
69 			writel_relaxed(PS2STAT_STP, ps2if->base + PS2STAT);
70 
71 		flag = (status & PS2STAT_STP ? SERIO_FRAME : 0) |
72 		       (status & PS2STAT_RXP ? 0 : SERIO_PARITY);
73 
74 		scancode = readl_relaxed(ps2if->base + PS2DATA) & 0xff;
75 
76 		if (hweight8(scancode) & 1)
77 			flag ^= SERIO_PARITY;
78 
79 		serio_interrupt(ps2if->io, scancode, flag);
80 
81 		status = readl_relaxed(ps2if->base + PS2STAT);
82         }
83 
84         return IRQ_HANDLED;
85 }
86 
87 /*
88  * Completion of ps2 write
89  */
ps2_txint(int irq,void * dev_id)90 static irqreturn_t ps2_txint(int irq, void *dev_id)
91 {
92 	struct ps2if *ps2if = dev_id;
93 	unsigned int status;
94 
95 	guard(spinlock)(&ps2if->lock);
96 
97 	status = readl_relaxed(ps2if->base + PS2STAT);
98 	if (ps2if->head == ps2if->tail) {
99 		disable_irq_nosync(irq);
100 		/* done */
101 	} else if (status & PS2STAT_TXE) {
102 		writel_relaxed(ps2if->buf[ps2if->tail], ps2if->base + PS2DATA);
103 		ps2if->tail = (ps2if->tail + 1) & (sizeof(ps2if->buf) - 1);
104 	}
105 
106 	return IRQ_HANDLED;
107 }
108 
109 /*
110  * Write a byte to the PS2 port.  We have to wait for the
111  * port to indicate that the transmitter is empty.
112  */
ps2_write(struct serio * io,unsigned char val)113 static int ps2_write(struct serio *io, unsigned char val)
114 {
115 	struct ps2if *ps2if = io->port_data;
116 	unsigned int head;
117 
118 	guard(spinlock_irqsave)(&ps2if->lock);
119 
120 	/*
121 	 * If the TX register is empty, we can go straight out.
122 	 */
123 	if (readl_relaxed(ps2if->base + PS2STAT) & PS2STAT_TXE) {
124 		writel_relaxed(val, ps2if->base + PS2DATA);
125 	} else {
126 		if (ps2if->head == ps2if->tail)
127 			enable_irq(ps2if->tx_irq);
128 		head = (ps2if->head + 1) & (sizeof(ps2if->buf) - 1);
129 		if (head != ps2if->tail) {
130 			ps2if->buf[ps2if->head] = val;
131 			ps2if->head = head;
132 		}
133 	}
134 
135 	return 0;
136 }
137 
ps2_open(struct serio * io)138 static int ps2_open(struct serio *io)
139 {
140 	struct ps2if *ps2if = io->port_data;
141 	int ret;
142 
143 	ret = sa1111_enable_device(ps2if->dev);
144 	if (ret)
145 		return ret;
146 
147 	ret = request_irq(ps2if->rx_irq, ps2_rxint, 0,
148 			  SA1111_DRIVER_NAME(ps2if->dev), ps2if);
149 	if (ret) {
150 		printk(KERN_ERR "sa1111ps2: could not allocate IRQ%d: %d\n",
151 			ps2if->rx_irq, ret);
152 		sa1111_disable_device(ps2if->dev);
153 		return ret;
154 	}
155 
156 	ret = request_irq(ps2if->tx_irq, ps2_txint, 0,
157 			  SA1111_DRIVER_NAME(ps2if->dev), ps2if);
158 	if (ret) {
159 		printk(KERN_ERR "sa1111ps2: could not allocate IRQ%d: %d\n",
160 			ps2if->tx_irq, ret);
161 		free_irq(ps2if->rx_irq, ps2if);
162 		sa1111_disable_device(ps2if->dev);
163 		return ret;
164 	}
165 
166 	ps2if->open = 1;
167 
168 	enable_irq_wake(ps2if->rx_irq);
169 
170 	writel_relaxed(PS2CR_ENA, ps2if->base + PS2CR);
171 	return 0;
172 }
173 
ps2_close(struct serio * io)174 static void ps2_close(struct serio *io)
175 {
176 	struct ps2if *ps2if = io->port_data;
177 
178 	writel_relaxed(0, ps2if->base + PS2CR);
179 
180 	disable_irq_wake(ps2if->rx_irq);
181 
182 	ps2if->open = 0;
183 
184 	free_irq(ps2if->tx_irq, ps2if);
185 	free_irq(ps2if->rx_irq, ps2if);
186 
187 	sa1111_disable_device(ps2if->dev);
188 }
189 
190 /*
191  * Clear the input buffer.
192  */
ps2_clear_input(struct ps2if * ps2if)193 static void ps2_clear_input(struct ps2if *ps2if)
194 {
195 	int maxread = 100;
196 
197 	while (maxread--) {
198 		if ((readl_relaxed(ps2if->base + PS2DATA) & 0xff) == 0xff)
199 			break;
200 	}
201 }
202 
ps2_test_one(struct ps2if * ps2if,unsigned int mask)203 static unsigned int ps2_test_one(struct ps2if *ps2if,
204 					   unsigned int mask)
205 {
206 	unsigned int val;
207 
208 	writel_relaxed(PS2CR_ENA | mask, ps2if->base + PS2CR);
209 
210 	udelay(10);
211 
212 	val = readl_relaxed(ps2if->base + PS2STAT);
213 	return val & (PS2STAT_KBC | PS2STAT_KBD);
214 }
215 
216 /*
217  * Test the keyboard interface.  We basically check to make sure that
218  * we can drive each line to the keyboard independently of each other.
219  */
ps2_test(struct ps2if * ps2if)220 static int ps2_test(struct ps2if *ps2if)
221 {
222 	unsigned int stat;
223 	int ret = 0;
224 
225 	stat = ps2_test_one(ps2if, PS2CR_FKC);
226 	if (stat != PS2STAT_KBD) {
227 		printk("PS/2 interface test failed[1]: %02x\n", stat);
228 		ret = -ENODEV;
229 	}
230 
231 	stat = ps2_test_one(ps2if, 0);
232 	if (stat != (PS2STAT_KBC | PS2STAT_KBD)) {
233 		printk("PS/2 interface test failed[2]: %02x\n", stat);
234 		ret = -ENODEV;
235 	}
236 
237 	stat = ps2_test_one(ps2if, PS2CR_FKD);
238 	if (stat != PS2STAT_KBC) {
239 		printk("PS/2 interface test failed[3]: %02x\n", stat);
240 		ret = -ENODEV;
241 	}
242 
243 	writel_relaxed(0, ps2if->base + PS2CR);
244 
245 	return ret;
246 }
247 
248 /*
249  * Add one device to this driver.
250  */
ps2_probe(struct sa1111_dev * dev)251 static int ps2_probe(struct sa1111_dev *dev)
252 {
253 	struct ps2if *ps2if;
254 	struct serio *serio;
255 	int ret;
256 
257 	ps2if = kzalloc(sizeof(*ps2if), GFP_KERNEL);
258 	serio = kzalloc(sizeof(*serio), GFP_KERNEL);
259 	if (!ps2if || !serio) {
260 		ret = -ENOMEM;
261 		goto free;
262 	}
263 
264 	serio->id.type		= SERIO_8042;
265 	serio->write		= ps2_write;
266 	serio->open		= ps2_open;
267 	serio->close		= ps2_close;
268 	strscpy(serio->name, dev_name(&dev->dev), sizeof(serio->name));
269 	strscpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
270 	serio->port_data	= ps2if;
271 	serio->dev.parent	= &dev->dev;
272 	ps2if->io		= serio;
273 	ps2if->dev		= dev;
274 	sa1111_set_drvdata(dev, ps2if);
275 
276 	spin_lock_init(&ps2if->lock);
277 
278 	ps2if->rx_irq = sa1111_get_irq(dev, 0);
279 	if (ps2if->rx_irq <= 0) {
280 		ret = ps2if->rx_irq ? : -ENXIO;
281 		goto free;
282 	}
283 
284 	ps2if->tx_irq = sa1111_get_irq(dev, 1);
285 	if (ps2if->tx_irq <= 0) {
286 		ret = ps2if->tx_irq ? : -ENXIO;
287 		goto free;
288 	}
289 
290 	/*
291 	 * Request the physical region for this PS2 port.
292 	 */
293 	if (!request_mem_region(dev->res.start,
294 				dev->res.end - dev->res.start + 1,
295 				SA1111_DRIVER_NAME(dev))) {
296 		ret = -EBUSY;
297 		goto free;
298 	}
299 
300 	/*
301 	 * Our parent device has already mapped the region.
302 	 */
303 	ps2if->base = dev->mapbase;
304 
305 	sa1111_enable_device(ps2if->dev);
306 
307 	/* Incoming clock is 8MHz */
308 	writel_relaxed(0, ps2if->base + PS2CLKDIV);
309 	writel_relaxed(127, ps2if->base + PS2PRECNT);
310 
311 	/*
312 	 * Flush any pending input.
313 	 */
314 	ps2_clear_input(ps2if);
315 
316 	/*
317 	 * Test the keyboard interface.
318 	 */
319 	ret = ps2_test(ps2if);
320 	if (ret)
321 		goto out;
322 
323 	/*
324 	 * Flush any pending input.
325 	 */
326 	ps2_clear_input(ps2if);
327 
328 	sa1111_disable_device(ps2if->dev);
329 	serio_register_port(ps2if->io);
330 	return 0;
331 
332  out:
333 	sa1111_disable_device(ps2if->dev);
334 	release_mem_region(dev->res.start, resource_size(&dev->res));
335  free:
336 	sa1111_set_drvdata(dev, NULL);
337 	kfree(ps2if);
338 	kfree(serio);
339 	return ret;
340 }
341 
342 /*
343  * Remove one device from this driver.
344  */
ps2_remove(struct sa1111_dev * dev)345 static void ps2_remove(struct sa1111_dev *dev)
346 {
347 	struct ps2if *ps2if = sa1111_get_drvdata(dev);
348 
349 	serio_unregister_port(ps2if->io);
350 	release_mem_region(dev->res.start, resource_size(&dev->res));
351 	sa1111_set_drvdata(dev, NULL);
352 
353 	kfree(ps2if);
354 }
355 
356 /*
357  * Our device driver structure
358  */
359 static struct sa1111_driver ps2_driver = {
360 	.drv = {
361 		.name	= "sa1111-ps2",
362 		.owner	= THIS_MODULE,
363 	},
364 	.devid		= SA1111_DEVID_PS2,
365 	.probe		= ps2_probe,
366 	.remove		= ps2_remove,
367 };
368 
ps2_init(void)369 static int __init ps2_init(void)
370 {
371 	return sa1111_driver_register(&ps2_driver);
372 }
373 
ps2_exit(void)374 static void __exit ps2_exit(void)
375 {
376 	sa1111_driver_unregister(&ps2_driver);
377 }
378 
379 module_init(ps2_init);
380 module_exit(ps2_exit);
381 
382 MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
383 MODULE_DESCRIPTION("SA1111 PS2 controller driver");
384 MODULE_LICENSE("GPL");
385