OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [input/] [serio/] [rpckbd.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * $Id: rpckbd.c,v 1.7 2001/09/25 10:12:07 vojtech Exp $
3
 *
4
 *  Copyright (c) 2000-2001 Vojtech Pavlik
5
 *  Copyright (c) 2002 Russell King
6
 */
7
 
8
/*
9
 * Acorn RiscPC PS/2 keyboard controller driver for Linux/ARM
10
 */
11
 
12
/*
13
 * This program is free software; you can redistribute it and/or modify
14
 * it under the terms of the GNU General Public License as published by
15
 * the Free Software Foundation; either version 2 of the License, or
16
 * (at your option) any later version.
17
 *
18
 * This program is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 * GNU General Public License for more details.
22
 *
23
 * You should have received a copy of the GNU General Public License
24
 * along with this program; if not, write to the Free Software
25
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
 *
27
 * Should you need to contact me, the author, you can do so either by
28
 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
29
 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
30
 */
31
 
32
#include <linux/module.h>
33
#include <linux/interrupt.h>
34
#include <linux/init.h>
35
#include <linux/serio.h>
36
#include <linux/err.h>
37
#include <linux/platform_device.h>
38
 
39
#include <asm/irq.h>
40
#include <asm/hardware.h>
41
#include <asm/io.h>
42
#include <asm/hardware/iomd.h>
43
#include <asm/system.h>
44
 
45
MODULE_AUTHOR("Vojtech Pavlik, Russell King");
46
MODULE_DESCRIPTION("Acorn RiscPC PS/2 keyboard controller driver");
47
MODULE_LICENSE("GPL");
48
 
49
static int rpckbd_write(struct serio *port, unsigned char val)
50
{
51
        while (!(iomd_readb(IOMD_KCTRL) & (1 << 7)))
52
                cpu_relax();
53
 
54
        iomd_writeb(val, IOMD_KARTTX);
55
 
56
        return 0;
57
}
58
 
59
static irqreturn_t rpckbd_rx(int irq, void *dev_id)
60
{
61
        struct serio *port = dev_id;
62
        unsigned int byte;
63
        int handled = IRQ_NONE;
64
 
65
        while (iomd_readb(IOMD_KCTRL) & (1 << 5)) {
66
                byte = iomd_readb(IOMD_KARTRX);
67
 
68
                serio_interrupt(port, byte, 0);
69
                handled = IRQ_HANDLED;
70
        }
71
        return handled;
72
}
73
 
74
static irqreturn_t rpckbd_tx(int irq, void *dev_id)
75
{
76
        return IRQ_HANDLED;
77
}
78
 
79
static int rpckbd_open(struct serio *port)
80
{
81
        /* Reset the keyboard state machine. */
82
        iomd_writeb(0, IOMD_KCTRL);
83
        iomd_writeb(8, IOMD_KCTRL);
84
        iomd_readb(IOMD_KARTRX);
85
 
86
        if (request_irq(IRQ_KEYBOARDRX, rpckbd_rx, 0, "rpckbd", port) != 0) {
87
                printk(KERN_ERR "rpckbd.c: Could not allocate keyboard receive IRQ\n");
88
                return -EBUSY;
89
        }
90
 
91
        if (request_irq(IRQ_KEYBOARDTX, rpckbd_tx, 0, "rpckbd", port) != 0) {
92
                printk(KERN_ERR "rpckbd.c: Could not allocate keyboard transmit IRQ\n");
93
                free_irq(IRQ_KEYBOARDRX, NULL);
94
                return -EBUSY;
95
        }
96
 
97
        return 0;
98
}
99
 
100
static void rpckbd_close(struct serio *port)
101
{
102
        free_irq(IRQ_KEYBOARDRX, port);
103
        free_irq(IRQ_KEYBOARDTX, port);
104
}
105
 
106
/*
107
 * Allocate and initialize serio structure for subsequent registration
108
 * with serio core.
109
 */
110
static int __devinit rpckbd_probe(struct platform_device *dev)
111
{
112
        struct serio *serio;
113
 
114
        serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
115
        if (!serio)
116
                return -ENOMEM;
117
 
118
        serio->id.type          = SERIO_8042;
119
        serio->write            = rpckbd_write;
120
        serio->open             = rpckbd_open;
121
        serio->close            = rpckbd_close;
122
        serio->dev.parent       = &dev->dev;
123
        strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name));
124
        strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys));
125
 
126
        platform_set_drvdata(dev, serio);
127
        serio_register_port(serio);
128
        return 0;
129
}
130
 
131
static int __devexit rpckbd_remove(struct platform_device *dev)
132
{
133
        struct serio *serio = platform_get_drvdata(dev);
134
        serio_unregister_port(serio);
135
        return 0;
136
}
137
 
138
static struct platform_driver rpckbd_driver = {
139
        .probe          = rpckbd_probe,
140
        .remove         = __devexit_p(rpckbd_remove),
141
        .driver         = {
142
                .name   = "kart",
143
        },
144
};
145
 
146
static int __init rpckbd_init(void)
147
{
148
        return platform_driver_register(&rpckbd_driver);
149
}
150
 
151
static void __exit rpckbd_exit(void)
152
{
153
        platform_driver_unregister(&rpckbd_driver);
154
}
155
 
156
module_init(rpckbd_init);
157
module_exit(rpckbd_exit);

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.