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